1. 环境假设

  • 宿主机公网 IP:154.19.xx.xx/24
  • 公网网关:154.19.xx.1
  • 宿主机物理网卡:ens17
  • 宿主机网桥:vmbr0
  • 容器使用内网网段:192.168.100.0/24
  • NAT 出口:宿主机公网 IP 154.19.xx.xx

2. 宿主机网络配置

编辑 /etc/network/interfaces,配置如下:

auto loiface lo inet loopback# 物理网卡,不直接拿 IPauto ens17iface ens17 inet manual# 公网桥接,同时增加一个内网网关auto vmbr0iface vmbr0 inet static    address 154.19.xx.xx/24    gateway 154.19.xx.1    bridge_ports ens17    bridge_stp off    bridge_fd 0    # 给容器提供内网网关    post-up   ip addr add 192.168.100.1/24 dev vmbr0    pre-down  ip addr del 192.168.100.1/24 dev vmbr0

应用配置:

ifreload -a

3. 宿主机启用 NAT 转发

3.1 开启 IPv4 转发

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.confsysctl -p

3.2 关闭 ICMP Redirect 与 rp_filter

cat >> /etc/sysctl.conf <<EOFnet.ipv4.conf.all.send_redirects=0net.ipv4.conf.default.send_redirects=0net.ipv4.conf.all.rp_filter=0net.ipv4.conf.default.rp_filter=0EOFsysctl -p

3.3 添加 SNAT 规则

iptables -t nat -F POSTROUTINGiptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o vmbr0 -j SNAT --to-source 154.19.xx.xx# 放通内外转发iptables -A FORWARD -s 192.168.100.0/24 -j ACCEPTiptables -A FORWARD -d 192.168.100.0/24 -j ACCEPT

持久化规则:

apt install -y iptables-persistentnetfilter-persistent save

或推荐使用 nftables

table ip nat {    chain postrouting {        type nat hook postrouting priority 100; policy accept;        ip saddr 192.168.100.0/24 oifname "vmbr0" snat to 154.19.xx.xx    }}
systemctl enable --now nftables

4. 容器网络配置

编辑 /etc/pve/lxc/100.conf(假设容器 ID = 100):

net0: name=eth0,bridge=vmbr0,ip=192.168.100.100/24,gw=192.168.100.1

进入容器后,确认:

ip aip routecat /etc/resolv.conf

建议 /etc/resolv.conf 设置:

nameserver 1.1.1.1nameserver 8.8.8.8

5. 验证

容器内执行:

ping -c 3 192.168.100.1     # 宿主机网关ping -c 3 8.8.8.8           # 公网 IPping -c 3 google.com        # 域名解析

宿主机查看 NAT 命中:

iptables -t nat -L POSTROUTING -n -v

SNAT 那行的 pkts/bytes 应该随着容器访问递增。


✅ 总结

  1. 公网 IP 只配置在 vmbr0,物理网卡 ens17 不要配 IP。
  2. vmbr0 既有公网地址,又额外添加 192.168.100.1 作为容器网关。
  3. NAT 出口必须指定 vmbr0,否则不会生效。
  4. 单公网 IP 场景下,建议使用 SNAT 固定公网 IP,比 MASQUERADE 更稳定。