0%

linux笔记——docker运行Udp2raw

导语

  • 二级运营商,各种污染,丢包限速.延迟上千.一个惨字了得..我就想打会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,绕过各种限制.
    • Udp2raw 仅绕过各种限速,不涉及多倍发包,疯狂加速等.
  • 目标

    • Udp2raw 打包 docker.
    • 托管到 Docker Compose.

配置

  • 假设在vps,ip地址是 9.9.9.9 ,你的服务监听在 901 端口,900端口是预留给 Udp2raw 端口.

  • 服务端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 注释必须独占一行
    # 服务端模式
    -s
    # 监听 900 端口
    -l 0.0.0.0:900
    # 解密数据后转发到901端口(目的地)
    -r 127.0.0.1:901
    # 密码
    -k passwd
    # 加密方式
    --cipher-mode aes128cbc
    # 加密方式
    --auth-mode hmac_sha1
    # 工作方式,模拟成 tcp/udp/icmp
    --raw-mode faketcp
    # faketcp 下 seq ack 行为,保持默认3即可.
    --seq-mode 3
    # 允许绕过本地iptables,docker下无法配置iptables或非常困难.
    --lower-level auto
  • 客户端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 注释必须独占一行
    # 客户端模式
    -c
    # 监听本地端口
    -l 0.0.0.0:901
    # 服务器ip:port
    -r 9.9.9.9:900
    # 密码
    -k passwd
    # 加密方式
    --cipher-mode aes128cbc
    # 加密方式
    --auth-mode hmac_sha1
    # 工作方式,模拟成 tcp/udp/icmp
    --raw-mode faketcp
    # faketcp 下 seq ack 行为,保持默认3即可.
    --seq-mode 3
    # 允许绕过本地iptables,docker下无法配置iptables或非常困难.
    --lower-level auto
  • 说明:

    • -k : 在以命令行运行时带 “”,但配置文件中不能带 “”.
    • –cipher-mode –auth-mode : 最大的安全性建议用 aes128cbc+hmac_sha1 ,路由器建议 xor+simple (这样只能骗骗防火墙)
    • –seq-mode : faketcp 下 seq ack 行为,faketcp 毕竟不是真正的tcp,为防止深度包检测,–seq-mode,可以设置一些seq ack的行为.可选有 1~4,默认3,本地测试,速度均正常.

容器

  • 不折腾直接看 docker-compose 一节.

  • 不想自行编译可以直接 docker pull jasperhale/udp2raw

  • 相关代码在 udp2raw

  • 准备

    • 官方已经提供了编译好的程序包,下载解压.
    • Udp2raw 同时支持配置文件,需要在镜像中写入一个默认配置文件.
    • 基于alpine:latest构建.
    • 这里是 amd64 架构,其他的需要自行修改.
  • Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FROM alpine:latest
    LABEL authors "jasperhale <ljy087621@gmail.com>"
    ENV VERSION="20181113.0"

    RUN wget 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 /

    COPY server.conf /server.conf
    EXPOSE 900

    CMD ./udp2raw_amd64 --conf-file server.conf
  • server.conf 是上面默认的配置文件.

  • 编译

    1
    docker build  -t udp2raw:latest .

运行

直接运行

  • 直接运行

    1
    docker run -d -it --rm --network=host -v /root/server-s.conf:/server.conf udp2raw:last

docker-compose(9.18)

  • 整理了 docker-compose ,x64架构 可以一键运行.

  • 其他架构自行改改 dockerfile 应该也行.

  • 克隆项目到本地

    1
    git clone https://github.com/Jasper-1024/Dockerfile.git
  • 修改 client.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模式,其他模式自行测试.

  • log大量 rst==1

    • 不使用docker情况下,一般会代 -a 选项,即自动配置 iptables,退出后删除对应规则.
    • 但在docker基础镜像都是最小镜像,基本不带 iptables.如果服务/客户端都是docker运行,且不带-a 选项,会有大量 rst==1.有两种办法
      • 服务端,配置去掉 -a docker 运行,客户端不使用 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 (6.28)

    • 从github issue来看,udp2raw 使用 icmp 会接管 linux 对 icmp 的响应,远程无法再 ping 通.
    • docker下运行的 udp2raw 测试来看无论服务端/客户端,都无法使用,遂放弃,等待日后解决.
  • 网络情况变动后无法连接.(6.28)

    • 这与在 docker 下运行 udp2raw 没有使用 -a 配置 iptable 有关.
    • 网络环境变化,一般会切换网卡.
    • 如果使用的是 --lower-level auto ,重启一下容器,重新获取网卡信息即可.
  • 连接非常缓慢(6.28)

    • 如果走 udp2raw ,会串联一串应用,那一个都会成为瓶颈.
    • 走 udp2raw 可以尝试将缓存加到最大.