docker打包运行Udp2raw,绕过udp限速.以及附带的一些坑.
资料来源:
http://github.com/wangyu-/udp2raw-tunnel/blob/master/doc/README.zh-cn.md
issues等更新
1
2
3
4
52019.02.20 初始化.
2019.06.28 修正错误
2019.07.22 添加dockerhub相关内容,修正错误
2019.09.18 更新docker-compose,修正错误.
2020-02-05 添加通过 icmp 及 ipv6 连接,重新整理内容.
导语
- 二级运营商,各种污染,丢包限速.延迟上千.一个惨字了得..我就想打会lol…
- 最后选择了 Udp2raw + UDPspeeder.扔到 docker 里面.这里仅涉及 Udp2raw + docker.
- 最后终于可以正常连接,虽然延迟350.
Udp2raw-tunnel
简介(来自官方):
- udp2raw tunnel,通过 raw socket给 UDP 包加上 TCP 或 ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用 kcptun 或者 finalspeed 的情况下udp端口被运营商限速.
- 简单来说糊弄运营商把 udp 当成 tcp,icmp 等,绕过各种限制.
- Udp2raw 仅绕过各种限速,不涉及多倍发包,疯狂加速等.
目标
- Udp2raw 打包 docker.
- 托管到 Docker Compose.
- 支持 tcp v4 & v6 , icmp .
Dockerfile
不折腾直接看 docker-compose 一节.
不想自行编译可以直接
docker pull jasperhale/udp2raw
相关代码在 udp2raw
准备
- 官方已经提供了编译好的程序包,下载解压.
- Udp2raw 支持配置文件,需要在镜像中写入一个对排港博客认配置文件.
- 基于alpine:latest构建.
- 这里是 amd64 架构,其他的需要自行修改.
- (20.02.04) 添加 iptables ip6tables (icmp模式 需要)
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17FROM alpine:latest
LABEL authors "jasperhale <ljy087621@gmail.com>"
ENV VERSION="20181113.0"
RUN set -xe && \
apk add --no-cache iptables ip6tables curl && \
curl -fsSLO --compressed "http://github.com/wangyu-/udp2raw-tunnel/releases/download/$VERSION/udp2raw_binaries.tar.gz" && \
tar -zxvf udp2raw_binaries.tar.gz && \
mv udp2raw_amd64 usr/ && \
rm udp2raw_* && \
mv /usr/udp2raw_amd64 / &&\
apk del curl
COPY server.conf /server.conf
EXPOSE 900
CMD ./udp2raw_amd64 --conf-file server.confserver.conf 是上面对排港博客认的配置文件.
编译
1
docker build -t udp2raw:latest .
配置
假设在 vps 的 ipv4 地址是 9.9.9.9 ,ipv6 地址是 2001:999:::9
v4的端口是 900 ,v6 的端口是 1000.
服务端程序监听在 vps 的 127.0.0.1:901 端口.
客户端程序也监听在本机的 127.0.0.1:901 端口.
配置说明:
- -k : 在以命令行运行时带 “”,但配置文件中不能带 “”.
- –cipher-mode –auth-mode : 最大的安全性建议用 aes128cbc+hmac_sha1 ,路由器建议 xor+simple (这样只能骗骗防火墙)
- –raw-mode: udp 伪装模式,有 faketcp icmp 和 udp 可选.
- –seq-mode : faketcp 下 seq ack 行为,faketcp 毕竟不是真正的tcp,为防止深度包检测,–seq-mode,可以设置一些faketcp 下 seq ack的行为.可选有 1~4,对排港博客认3,本地测试,速度均正常.
- -a: 自动添加 iptables ,一般都需要此项, docker 中 特殊一点.
- –keep-rule: 定期检查 iptables ,一般配置此项.
- –lower-level : 允许 udp2raw 绕过 iptables 直接获取网卡信息.仅在 iptables 无法使用时配置.
模式
- faketcp 模式: 用来绕过 udp 限速.
- icmp 模式: udp2raw 会接管 icmp 报文,使得主机无法 ping 通,但是还有大量流向主机的 icmp 报文,这可能是个特征.
- udp 模式: 没有伪装,仅仅加密 udp 数据包.
如果 配置了
-a
,需要在运行 docker 时添加privileged
参数,否则会权限不足.
tcp-v4
服务端:
1
2
3
4
5
6
7
8
9
10
11
12# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-s
-l 0.0.0.0:900
-r 127.0.0.1:901
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode faketcp
--seq-mode 3
--lower-level auto客户端: * 客户端:使用 -a 可以保证网络切换后不掉线,不在乎这一点,直接使用
--lower-level auto
也是可以.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-c
-l 127.0.0.1:10601
-r 9.9.9.9:900
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode faketcp
--seq-mode 3
#--lower-level auto
# 自动添加 iptables
-a
# 定期检查规则
--keep-rule
--sock-buf 10240
tcp-v6
服务端
1
2
3
4
5
6
7
8
9
10
11
12# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-s
-l [::]:1000
-r 127.0.0.1:10601
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode faketcp
--seq-mode 3
--lower-level auto客户端:使用 -a 可以保证网络切换后不掉线,不在乎这一点,直接使用
--lower-level auto
也是可以.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-c
-l 127.0.0.1:10601
-r [2001:999:::9]:1000
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode faketcp
--seq-mode 3
#--lower-level auto
# 自动添加 iptables
-a
# 定期检查规则
--keep-rule
--sock-buf 10240
icmp
icmp 比较特殊,必须使用 -a 才能运行,且运行 docker 时必须添加
privileged
参数提权.服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-s
# 无所谓端口号
-l 0.0.0.0:9999
-r 127.0.0.1:10601
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode icmp
#--lower-level auto
# 自动添加 iptables
-a
# 定期检查规则
--keep-rule
--sock-buf 10240客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 你可以像这样添加注释
# 注意,只有整行注释才能在配置文件里使用
# 注释必须独占一行
-c
-l 127.0.0.1:10601
# icmp 不存在端口一说,端口随意
-r 9.9.9.9:9000
-k password
--cipher-mode aes128cbc
--auth-mode hmac_sha1
--raw-mode icmp
#--lower-level auto
# 自动添加 iptables
-a
# 定期检查规则
--keep-rule
--sock-buf 10240
运行
直接运行
直接运行
1
docker run -d -it --rm -privileged --network=host -v /root/server-s.conf:/server.conf jasperhale/udp2raw:latest
docker-compose(9.18)
整理了 docker-compose ,x64架构 可以一键运行.
其他架构自行改改 dockerfile 应该也行.
克隆项目到本地
1
git clone http://github.com/Jasper-1024/Dockerfile.git
修改
/config/client-xx.conf
的 服务器 ip地址.修改
/config/server-xx.conf
的 服务器 ip地址.将你需要加速的 udp 程序,服务端监听服务器本地的901端口.客户端监听本地 901 端口.
注释掉其他不需要的配置.
把文件夹拷贝到服务器一份.
启动docker
1
2
3
4# 服务端
docker-compose -f server.yml up -d
# 客户端
docker-compose -f client.yml up -d
性能
- 没有详尽的性能测试,基本跑满了本地带宽,可以认为docker运行,没有影响性能.
- docker网络模式我只用了host模式,其他模式自行测试.
- (20.02.05) 最后的是 icmp 模式最稳..可能是 isp 基本没有对 icmp 限速吧, lol 等游戏对带宽占用很低.
坑
log大量
rst==1
- 如果服务/客户端不带
-a
选项,有大量rst==1
.有两种办法- 服务端,配置去掉
-a
docker 运行,客户端配置privileged
使用 docker,配置有-a
. - 客户/服务端,配置
--lower-level auto
, 直接绕过 iptables.- –lower-level参数: if_name#dest_mac_adress,例如 eth0#00:23:45:67:89:b9 .客户端/服务端应当首先填写 auto,无法使用时,再手动填写.
- 服务端,配置去掉
- 本地测试两种都可正常使用.
- 如果服务/客户端不带
docker互联.and.吞吐量瓶颈.
- 对排港博客认上docker会把容器挂载到 docker0 虚拟网桥上,不同容器之间通过ip地址即可互相访问,但配置文件一般不会频繁更改,直接通过ip地址互访行不通.
- docker0 虚拟网桥,在我那个垃圾vps上,有性能问题.
- 将容器的网络设置为
host
, 这样容器直接共享宿主机的网络栈,不同容器之间直接127.0.0.1
. 性能问题一块解决了.
icmp 模式(19.6.28)
从github issue来看,udp2raw 使用 icmp 会接管 linux 对 icmp 的响应,远程无法再 ping 通.docker下运行的 udp2raw 测试来看无论服务端/客户端,都无法使用,遂放弃,等待日后解决.- (20.02.05) docker image 中构建时添加 iptables .运行时配置
privileged
,这样可以正常使用 icmp 模式. - (20.02.05) 但是 v4 和 v6 的 icmp 只能监听一个,同时运行时报错.原因还未深究,等待日后解决.
网络情况变动后无法连接.(6.28)
- 这与没有使用 -a 配置 iptable 有关.
- 网络环境变化,一般会切换网卡.
- 如果使用的是
--lower-level auto
,重启一下容器,重新获取网卡信息即可. - (20.02.05) docker 运行时配置
privileged
,配置文件启用-a
,可以在网卡切换时正常使用.
连接非常缓慢(6.28)
- 如果走 udp2raw ,会串联一串应用,那一个都会成为瓶颈.
- 走 udp2raw 可以尝试将缓存加到最大.