他的回复:
前面几位已经把 DNAT 的标准写法讲全了(固定容器 IP、打开 ip_forward、PREROUTING 做 DNAT、POSTROUTING 做 MASQUERADE、FORWARD 放行、再放行安全组),我补三个在你这种“小内存 + 两个容器 + lxcbr0”场景里真正容易翻车、且上面没展开的点: 1. 固定 IP 别掉进 lxcbr0 的 DHCP 地址池里Debian 12 上 lxc-net 自带的 dnsmasq 默认地址池是 10.0.3.2–10.0.3.254。你给容器 A 在 config 里写死 10.0.3.101 后,另一个容器仍走 DHCP,完全可能被分到同一个 .101,出现“转发一会儿通、一会儿不通”。稳妥做法二选一:改 /etc/default/lxc-net 里的 LXC_DHCP_RANGE 把池子收窄(如 10.0.3.100,10.0.3.200),静态地址放在池外;或在 /etc/lxc/dnsmasq.conf 里按容器网卡 MAC 写 dhcp-host 保留,让 dnsmasq 统一管地址。 2. 重启后“规则还在却不通”,先查 lxc-net 再查规则lxcbr0 是 lxc-net 服务启动时才创建的,lxc-net 每次启动还会自己补一条针对 10.0.3.0/24 的 MASQUERADE。重启后不通,先用 systemctl status lxc-net 和 ip addr show lxcbr0 确认网桥和网关 10.0.3.1 在不在,再看 nft list ruleset 里你的 DNAT 表有没有被 nftables.service 正常加载。这两个服务互相独立,任何一个没起来,症状都和“规则丢了”一模一样。 3. 验证转发别只看规则列表,要看 conntrack 和网桥抓包规则存在不等于流量走通。外网发一次请求后:cat /proc/net/nf_conntrack | grep 8080(或装 conntrack 工具后用 conntrack -L),能看到一条目标被改写到 10.0.3.101:80 的条目,才说明 DNAT 真正生效。再跑 tcpdump -i lxcbr0 -nn tcp port 80:SYN 能进网桥但没有 SYN-ACK 回来,多半是容器内服务监听问题(用 lxc-attach -n 容器名 -- ss -lntp 看是不是只绑了 127.0.0.1);SYN 根本没出现在 lxcbr0 上,再回头查 DNAT 和 FORWARD。 另外同意楼上的结论:config 里的 lxc.net.0.ipv4.nat 只负责容器出网 NAT,LXC 本身没有入向端口映射的配置项,这条路不用再试。