解决Docker下Shadowsocks NAT类型严格的问题

一直使用自建的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 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

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,游戏内变为开放

解决Docker下Shadowsocks NAT类型严格的问题

https://jktu.cc/解决Docker下Shadowsocks_NAT类型严格的问题/

作者

udp_bbr

发布于

2020-06-25

更新于

2020-06-26

许可协议