一直使用自建的Shadowsocks服务进行游戏加速,我也写过文章展示如何用Docker部署(传送门)用起来没什么问题,但是最近玩GTA 5的时候却发现几乎无法与他人联机。使用NatTypeTester显示NAT类型为Symmetric,游戏内显示为严格

推测原因

使用Bridge模式的容器在将内部端口映射到外部时相当于做了一次NAT,而Linux内核默认是没有实现FullCone NAT

解决方案

同时运行两个Shadowsocks容器,分别用来处理TCP流量和UDP流量,其中用来处理UDP流量的容器使用Host网络模式,直接使用宿主机的网络,避免NAT,而另一个容器配置保持不变

dokcer-compose.yml(部分)

shadowsocks-libev-tcp:
  image: teddysun/shadowsocks-libev
  volumes:
    - ./shadowsocks-libev/config/config_tcp.json:/etc/shadowsocks-libev/config.json
  restart: always
  container_name: shadowsocks-libev-tcp
#shadowsocks udp服务 监听 443/udp 解决NAT类型问题
shadowsocks-libev-udp:
  image: teddysun/shadowsocks-libev
  volumes:
    - ./shadowsocks-libev/config/config_udp.json:/etc/shadowsocks-libev/config.json
  network_mode: host
  restart: always
  container_name: shadowsocks-libev-udp

config_tcp.json

{
    "server": "0.0.0.0",
    "mode": "tcp_only",
    "server_port": 8080,
    "password": "password",
    "method": "aes-256-gcm",
    "fast_open": true,
    "no_delay": true,
    "timeout": 60,
    "plugin": "v2ray-plugin",
    "plugin_opts": "server;path=/proxy"
}

config_udp.json

{
    "server": "0.0.0.0",
    "mode": "udp_only",
    "server_port": 443,
    "password": "password",
    "method": "aes-256-gcm",
    "fast_open": true,
    "no_delay": true,
    "timeout": 60
}

这样处理之后,测试NAT类型变为FullCone,游戏内变为开放