Docker 中的 3x-ui 使用宿主机 WARP SOCKS5 分流 Netflix 教程
本教程适用于在 Debian 12 VPS 上,将 Cloudflare WARP 安装在宿主机,通过 SOCKS5 代理只让 Netflix 流量走 WARP,而其他流量保持原有线路。特别解决了 WARP 在宿主机、3x-ui 在 Docker 容器内时,无法直接使用 127.0.0.1:40000 的问题,并确保安全性(不暴露公网)与开机自启。
一、整体思路
核心只做 3 层转发,结构如下:
↓
172.20.0.1:40000
↓
socat
↓
127.0.0.1:40000
↓
Cloudflare WARP SOCKS5
其中:
- WARP 自己只监听
127.0.0.1:40000 - socat 在 Docker 网关
172.20.0.1:40000上监听 - iptables 只允许 Docker 网段访问这个
40000端口 - systemd 负责让 socat 开机自动运行
- netfilter-persistent 负责让 iptables 规则重启后自动恢复
最终 Xray 只需要把 Netflix 域名指向 172.20.0.1:40000,其他流量完全不改变。
二、最简化部署命令
1. 安装 WARP SOCKS5
首先下载 fscarmen WARP 菜单脚本:
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh
wget,请先安装:apt update && apt install -y wget
给脚本执行权限并启动菜单:
chmod +x menu.sh
bash menu.sh
进入菜单后,选择 c:
c = Install Cloudflare WARP Linux Client + SOCKS5 Proxy 模式
安装完成后,WARP 会提供 SOCKS5 代理,默认监听:
127.0.0.1:40000
即:
WARP SOCKS5
127.0.0.1:40000
2. 放行 Docker → WARP
iptables -I INPUT 1 -i br-99deaf478bda -s 172.20.0.0/16 -p tcp -d 172.20.0.1 --dport 40000 -j ACCEPT
作用:只允许 Docker 网络 172.20.0.0/16 通过网桥 br-99deaf478bda 访问宿主机 172.20.0.1:40000,不会将 40000 开放到公网。
ip addr show 查看,通常网桥名类似 br-xxxx,网段为 172.20.0.0/16。
3. 保存 iptables 规则
iptables-save > /etc/iptables/rules.v4
将当前规则保存到文件,如果你的系统已安装 netfilter-persistent,重启后会自动恢复。
4. 创建 socat 开机服务
cat > /etc/systemd/system/warp-socks-docker.service <<'EOF'
[Unit]
Description=WARP SOCKS5 Docker Bridge Forward
After=warp-svc.service docker.service
Wants=warp-svc.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/usr/bin/socat TCP-LISTEN:40000,bind=172.20.0.1,reuseaddr,fork TCP:127.0.0.1:40000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
作用:将 Docker 网关上的 40000 端口请求转发给本机 WARP 的 127.0.0.1:40000。
5. 启用服务
systemctl daemon-reload
systemctl enable --now warp-socks-docker.service
daemon-reload 让 systemd 读取新服务,enable 设置开机自启,--now 立即启动。
三、以后最核心的配置
完成上面步骤后,你的 WARP Docker SOCKS5 地址就是:
172.20.0.1:40000
而不是 127.0.0.1:40000,因为对于 3x-ui 容器来说,127.0.0.1 是容器自身。
四、3x-ui/Xray 最终配置
在 3x-ui 面板中增加一个 SOCKS 出站,并添加 Netflix 路由规则。以下提供两种方式,推荐使用面板操作。
方式一:面板配置(推荐)
- 登录 3x-ui 面板(通常是
http://你的VPS_IP:12700或你自定义的端口)。 - 进入 Xray 设置 → 出站设置(或 Outbounds)。
- 点击“添加出站”,填写:
- 协议:
socks - 标签:
warp(可自定义) - 地址:
172.20.0.1 - 端口:
40000
其余保持默认,保存。
- 协议:
- 进入 路由设置(或 Routing)。
- 添加规则:
- 域名:
geosite:netflix - 出站:选择刚创建的
warp
确保该规则在列表中的顺序足够靠前。
- 域名:
- 保存并重启 Xray(或重启 3x-ui 容器)。
方式二:手动编辑配置文件
如果更习惯直接编辑 Xray 配置文件(通常位于容器内的 /etc/x-ui/xray.json 或通过面板修改),可以在 outbounds 中添加:
{
"tag": "warp",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "172.20.0.1",
"port": 40000
}
]
}
}
在 routing 的 rules 中添加:
{
"type": "field",
"domain": [
"geosite:netflix"
],
"outboundTag": "warp"
}
然后重启 Xray。
geosite:netflix → warp → 172.20.0.1:40000 → socat → WARP → 香港出口。其他流量 → 保持原来的 Xray 出站。
五、验证与排错
宿主机测试 WARP:
curl --socks5 127.0.0.1:40000 https://www.cloudflare.com/cdn-cgi/trace
应看到 warp=on 且 colo=HKG(或其他你选择的地区)。
容器内测试转发:
docker exec 3xui sh -c 'curl --connect-timeout 10 --socks5 172.20.0.1:40000 https://www.cloudflare.com/cdn-cgi/trace'
如果成功,说明链路打通。
检查 socat 服务状态:
systemctl status warp-socks-docker.service
应为 active (running) 且已 enabled。
六、注意事项
- 绝对不要将 WARP 的 SOCKS5 监听地址改为
0.0.0.0,否则可能成为公开代理。 - 不要在云服务商安全组中开放
40000/TCP端口。 - 如果 Netflix 无法解锁,可以尝试更换 WARP 出口 IP(使用
warp i或warp i hk等命令)。 - 确保
iptables-persistent已安装并启用,否则重启后规则丢失。可用apt install iptables-persistent -y安装并netfilter-persistent save保存。 - 如果 Docker 网桥不是
br-99deaf478bda,请根据ip addr show的实际名称修改。
七、总结
本方案通过 socat 和 iptables 巧妙地将宿主机 WARP SOCKS5 暴露给 Docker 容器,同时保持了安全性和开机自启。配置完成后,Netflix 流量自动走 WARP 香港出口,其余流量不受影响,非常适合需要流媒体解锁的 VPS 用户。
教程结束。如有疑问,欢迎交流。
评论(0)
暂无评论