为什么我们要安装WsTunnel服务?因为Wireguard使用的是UDP端口进行的通信,我本地通过UDP进行Wireguard通信,网速只能达到100K/s,但是我的实际带宽有100M+。为什么UDP这么慢?因为运营商对于UDP有QOS限速,但是对于TCP流量通常是正常的,如果我们将流量通过TCP进行封装一层,就能避免运营商的QOS。常见的将UDP转成TCP的工具包括udp2raw,wstunnel,gost等。本文介绍的是使用wstunnel进行UDP流量的封装。

配置好了WsTunnel之后,速度从100K/s->10M/s,提高100倍。

WsTunnel的Github仓库地址:GitHub-WsTunnel

1.安装wstunnel

wstunnel需要在客户端和服务端(一般是有公网IP的机器,比如VPS)同时安装。

使用如下的命令下载wstunnel。

mkdir wstunnel

wget https://github.com/erebe/wstunnel/releases/download/v10.4.4/wstunnel_10.4.4_linux_amd64.tar.gz

安装wstunnel:

# 解压缩
tar -xvzf wstunnel_*.tar.gz 

# 给wstunnel加上可执行权限
chmod a+x wstunnel 

2.启动wstunnel

2.1 在Linux启动服务端

wstunnel server --restrict-to localhost:31820 wss://[::]:1443

需要将31820修改为自己的Wireguard服务所启动的端口(通常默认为51820,如果有修改过的话,需要手动修改)。

后面的wss://[::]:1443代表,需要在1443端口上启动一个WebSocket服务。客户端到时候会将流量发送到这个端口上,WSTunnel再将流量转发到31820端口上。

可以通过如下的步骤去配置开机自启动。

首先要新增一个wstunnel的Service。

sudo vim /etc/systemd/system/wstunnel.service

往其中去启动添加如下的内容(ExecStart部分需要和上面的启动命令一致):

[Unit]
Description=wstunnel Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/wstunnel
ExecStart=/root/wstunnel/wstunnel server --restrict-to localhost:31820 wss://[::]:1443
StandardOutput=append:/root/wstunnel/wstunnel.log
StandardError=inherit
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

接着我们使用如下的命令去配置好开机自启动wstunnel服务。

# 重新加载配置文件
sudo systemctl daemon-reload
# 启动wstunnel服务
sudo systemctl start wstunnel
# 配置开机自启动
sudo systemctl enable wstunnel
# 查看wstunnel服务的状态
sudo systemctl status wstunnel

2.2 在Linux启动客户端

服务端当中,配置了接收1443的WebSocket请求,1443将请求转发给UDP的31820端口。接下面我们来配置wstunnel客户端,我们使用如下的命令启动wstunnel客户端。

 wstunnel client -L 'udp://31820:localhost:31820?timeout_sec=0' wss://{wstunnel-server-ip}:1443
  • udp://31820代表我需要wstunnel帮我把远程服务器的31820端口的流量转发给当前机器。
  • 配置转发转发给当前机器的哪个端口呢?通过localhost:31820去配置转发的目标地址(也是UDP协议的端口)。
  • wss://{wstunnel-server-ip}:1443则是配置远程服务器的WebSocket地址。

因此上面的命令的含义就是,告诉wss://{wstunnel-server-ip}:1443这台机器,请将你的udp://31820的流量转发给UDP端口localhost:31820

可以通过如下的命令配置开机自启动:

sudo vim /etc/systemd/system/wstunnel.service

往其中加入如下的内容,ExecStart需要换成刚刚我们的启动命令。

[Unit]
Description=wstunnel Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/wanna/wg/wstunnel-wg
ExecStart=/home/wanna/wg/wstunnel-wg/wstunnel client -L 'udp://31820:localhost:31820?timeout_sec=0' wss://{wstunel-server-ip}:1443
StandardOutput=append:/home/wanna/wg/wstunnel-wg/wstunnel.log
StandardError=inherit
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

接着我们使用如下的命令去配置好开机自启动wstunnel服务。

# 重新加载配置文件
sudo systemctl daemon-reload
# 启动wstunnel服务
sudo systemctl start wstunnel
# 配置开机自启动
sudo systemctl enable wstunnel
# 查看wstunnel服务的状态
sudo systemctl status wstunnel

2.3 在Mac设备启动客户端

Mac当中配置自启动,和Linux类似。

需要在~/Library/LaunchAgents下新建一个文件xxx.plist,这里起名叫com.wanna.wstunnel.plist

vim ~/Library/LaunchAgents/com.wanna.wstunnel.plist

往其中加入如下的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>AbandonProcessGroup</key>
 <true/>
 <key>Label</key>
 <string>com.wanna.wstunnel</string>
 <key>ProgramArguments</key>
 <array>
  <string>/path/to/wstunnel_10.4.4_darwin_arm64/wstunnel</string>
  <string>client</string>
  <string>-L</string>
  <string>udp://31820:localhost:31820?timeout_sec=0</string>
  <string>wss://{wstunnel-server-ip}:1443</string>
 </array>
 <key>StartInterval</key>
 <integer>3600</integer>
</dict>
</plist>

使用如下的命令启动服务。

launchctl load ~/Library/LaunchAgents/com.wanna.wstunnel.plist
launchctl start com.wanna.wstunne