linux笔记——docker运行Udp2raw

  • docker 打包运行 Udp2raw,以及附带的一些坑.

  • 资料来源:

    https://github.com/wangyu-/udp2raw-tunnel/blob/master/doc/README.zh-cn.md
    issues等

  • 更新

    1
    2
    3
    4
    5
    6
    2019.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
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

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
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 可以尝试将缓存加到最大.