linux笔记——docker运行Udp2raw
docker 打包运行 Udp2raw,以及附带的一些坑.
资料来源:
https://github.com/wangyu-/udp2raw-tunnel/blob/master/doc/README.zh-cn.md
issues等更新
1
2
3
4
5
62019.02.20 初始化.
2019.06.28 修正错误
2019.07.22 添加dockerhub相关内容,修正错误
2019.09.18 更新docker-compose,修正错误.
2020.02.05 添加通过 icmp 及 ipv6 连接,重新整理内容.
2021.01.22 同步更新
导语
- 二级运营商,各种污染,丢包限速.延迟上千.一个惨字了得…我就想打会lol…
- 最后选择了 Udp2raw + UDPspeeder.扔到 docker 里面.这里仅涉及 Udp2raw + docker.
- 最后终于可以正常连接,虽然延迟350.
最后注意,mac 和 win 用户请看这里 udp2raw-multiplatform.
Udp2raw-tunnel
简介(来自官方):
- udp2raw tunnel,通过 raw socket给 UDP 包加上 TCP 或 ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用 kcptun 或者 finalspeed 的情况下udp端口被运营商限速.
- 简单来说糊弄运营商把 udp 当成 tcp,icmp 等,绕过各种限制.
- Udp2raw 仅绕过各种限速,不涉及多倍发包,疯狂加速等.
配置
前提条件
- 假设在 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 | # 你可以像这样添加注释 |
客户端: 使用 -a 可以保证网络切换后不掉线,不在乎这一点,直接使用 --lower-level auto
也是可以.
1 | # 你可以像这样添加注释 |
tcp-v6
服务端
1 | # 你可以像这样添加注释 |
客户端:使用 -a 可以保证网络切换后不掉线,不在乎这一点,直接使用 --lower-level auto
也是可以.
1 | # 你可以像这样添加注释 |
icmp
icmp 比较特殊,必须使用 -a 才能运行,且运行 docker 时必须添加 privileged
参数提权.无所谓端口号.
服务端
1 | # 你可以像这样添加注释 |
客户端
1 | # 你可以像这样添加注释 |
docker
项目开源在 docker_udp2raw-tunnel.
目前只支持 linux_x64
可以直接
1 | docker pull jasperhale/udp2raw:latest |
运行
直接运行
直接运行
1 | docker run -d -it --rm -privileged --network=host -v /root/server-s.conf:/config.conf jasperhale/udp2raw:latest |
docker-compose
其他架构自行改改 dockerfile 应该也行.
克隆项目到本地
1 | git clone https://github.com/Jasper-1024/Dockerfile.git |
步骤
修改
/config/client-xx.conf
的 服务器 ip地址.修改
/config/server-xx.conf
的 服务器 ip地址.将你需要加速的 udp 程序,服务端监听服务器本地的901端口.客户端监听本地 901 端口.
注释掉其他不需要的配置,把文件夹拷贝到服务器一份.
启动docker
1 | # 服务端 |
性能
没有详尽的性能测试,基本跑满了本地带宽,可以认为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 可以尝试将缓存加到最大.