一直使用自建的Shadowsocks
服务进行游戏加速,我也写过文章展示如何用Docker部署(传送门)用起来没什么问题,但是最近玩GTA 5的时候却发现几乎无法与他人联机。使用NatTypeTester
显示NAT
类型为Symmetric
,游戏内显示为严格
推测原因
使用Bridge
模式的容器在将内部端口映射到外部时相当于做了一次NAT
,而Linux
内核默认是没有实现FullCone NAT
的
解决方案
同时运行两个Shadowsocks
容器,分别用来处理TCP
流量和UDP
流量,其中用来处理UDP
流量的容器使用Host
网络模式,直接使用宿主机的网络,避免NAT
,而另一个容器配置保持不变
dokcer-compose.yml(部分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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-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
1 2 3 4 5 6 7 8 9 10 11 12
| { "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
1 2 3 4 5 6 7 8 9 10
| { "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
,游戏内变为开放