linux笔记——docker运行Udp2raw

  • docker打包运行Udp2raw,绕过udp限速.以及附带的一些坑.

  • 资料来源:

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

  • 更新

    1
    2
    3
    4
    5
    2019.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
    17
    FROM 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 "https://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.conf
  • server.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 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 可以尝试将缓存加到最大.