这篇只解决一个问题:在 Proxmox VE 的 Alpine LXC 里部署 sing-box 时,先判断这台 LXC 到底是 旁路网关,还是 TProxy + FakeIP 透明代理入口。
这一步要先弄清楚。角色判断错了,后面的 sysctl、路由、TProxy、FakeIP、PVE firewall、rp_filter 都容易越调越乱。
具体的 sysctl、UDP 缓冲、GSO/GRO、PVE 宿主机接口、Alpine BusyBox sysctl、OpenRC 限制和实际验证,统一看主文:
PVE LXC sing-box 网关 sysctl 与 UDP 性能优化
这篇不再重复具体配置,避免两篇文章参数互相打架。
一、先判断 sing-box 的角色
最简单的判断标准:
客户端默认网关 = Alpine LXC 的 IP -> 网关模式
客户端默认网关 = 主路由的 IP -> TProxy + FakeIP 入口模式这里的“客户端”可以是手机、电脑、电视、游戏机,也可以是某个 VLAN 或子网里的设备。
二、模式一:Alpine LXC 是旁路网关
如果第三方设备的默认网关直接指向 Alpine LXC,或者主路由上有静态路由把某些网段交给这台 LXC 转发,那么它就是网关模式。
典型链路:
客户端
|
| 默认网关 = Alpine LXC IP
v
Alpine LXC sing-box
|
| 转发 / TProxy / 代理出站
v
主路由 / PVE 网桥 / 上游网络网关模式下,Alpine LXC 至少要满足:
- 容器内 IPv4 转发开启,必要时 IPv6 转发也开启。
- PVE 宿主机、PVE bridge、LXC veth、容器内 eth0 的
rp_filter不误丢非对称路径流量。 - sing-box 的 TProxy、route、DNS、FakeIP、nftables 或 iptables 规则完整。
- 客户端真的把默认网关或目标路由指向 LXC。
这种模式最容易受 rp_filter、TProxy 策略路由、PVE firewall 路径影响。具体检查和配置看主文的这些部分:
- PVE 宿主机
/etc/sysctl.d/99-sing-box-gateway.conf - PVE 宿主机
/etc/sysctl.d/98-sing-box-pve-bypass.conf - Alpine 容器
/etc/sysctl.d/local.conf veth101i0、vmbr0、enp2s0这类接口识别- Alpine BusyBox
sysctl -p /etc/sysctl.d/local.conf
三、模式二:Alpine LXC 只是 TProxy + FakeIP 入口
如果客户端默认网关仍然是 RouterOS、OpenWrt、VyOS 或其它主路由,只是 DNS 指向 sing-box,FakeIP 段流量再由主路由转发到 Alpine LXC,那么这台 LXC 更准确地说是透明代理入口,不是完整旁路网关。
典型链路:
客户端
|
| 默认网关 = 主路由 IP
| DNS 查询到 sing-box,拿到 FakeIP
v
主路由
|
| 把 FakeIP 段路由到 Alpine LXC
v
Alpine LXC sing-box
|
| TProxy 接住连接并代理出站
v
上游网络这个模式的关键不是“把 LXC 调成完整网关”,而是确认 FakeIP 流量路径完整:
- 客户端 DNS 查询能到达 sing-box DNS 入站。
- sing-box 返回的 FakeIP 段和路由器上的静态路由一致。
- 主路由把 FakeIP 段转发给 Alpine LXC。
- Alpine LXC 内的 sing-box TProxy 入站能接住连接。
- nftables / iptables 没有把回程或透明代理流量误丢。
如果这些路由和防火墙规则没有打通,单纯打开更多 sysctl 参数也不会让 FakeIP 透明代理自动工作。
四、怎么确认 PVE 上 LXC 101 的真实接口
在 PVE 宿主机执行:
pct config 101 | grep '^net0'
ip -br link | grep -E 'vmbr|veth101|fwbr101|fwpr101|fwln101|tap'如果输出里只有:
vmbr0 UP ...
veth101i0 UP ... master vmbr0 ...通常说明:
- LXC 101 挂在
vmbr0。 - PVE firewall 对这个 LXC 没有走
fwbr/fwpr/fwln链路。 - PVE 宿主机侧容器网卡是
veth101i0。
如果还能看到:
fwbr101i0
fwpr101p0
fwln101i0说明这个 LXC 仍在 PVE firewall 路径里。此时 rp_filter 和 offload 检查要按实际存在的接口写,不要把不存在的接口预先塞进 sysctl 文件。
如果看到 tap100i0、tap100i1,那是 VM 100 的 tap 网卡,不是 LXC 101。不要拿 tap100i0 去判断 sing-box LXC 的链路。
五、这篇和主文如何分工
这篇只负责判断模式:
- 设备默认网关是不是 LXC?
- FakeIP 段是不是由主路由转发给 LXC?
- LXC 101 在 PVE 宿主机侧到底叫哪个接口?
- 是否走了 PVE firewall 的
fwbr/fwpr/fwln链路?
主文负责具体执行:
- sysctl 文件分别写在 PVE 宿主机还是 Alpine 容器内
- Alpine BusyBox
sysctl不支持--system怎么处理 - OpenRC
sysctl的 LXC 只读提示怎么判断 - GSO / GRO /
tx-udp-segmentation怎么看 - sing-box OpenRC 文件句柄限制怎么看
主文链接:
PVE LXC sing-box 网关 sysctl 与 UDP 性能优化
六、最终建议
如果你是网关模式,先按这篇确认角色,再去主文执行 PVE 宿主机和 Alpine 容器两层配置。
如果你只是 TProxy + FakeIP 入口模式,不要把所有“网关模式”参数都照搬进容器。重点先查 DNS、FakeIP 段路由、主路由静态路由和 sing-box TProxy 入站。
如果不确定自己是哪种模式,先回答两个问题:
- 客户端的默认网关是谁?
- FakeIP 段的下一跳是谁?
这两个答案确定以后,再决定该按哪条链路排查。