Proxmox VE 下 Alpine LXC sing-box:先判断网关模式还是 TProxy FakeIP 入口模式

先判断 Alpine LXC 里的 sing-box 是旁路网关,还是只接收主路由转发来的 TProxy FakeIP 流量;具体 sysctl 与 UDP 优化统一参考主文。

这篇只解决一个问题:在 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
  • veth101i0vmbr0enp2s0 这类接口识别
  • 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 文件。

如果看到 tap100i0tap100i1,那是 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 段的下一跳是谁?

这两个答案确定以后,再决定该按哪条链路排查。