他的回复:
两种做法,选一个就行:方案 A:容器独立 IP + iptables DNAT(最通用)1) 宿主机建网桥 br0 并把 eth0 挂上去(/etc/network/interfaces):auto br0iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_fd 02) 容器配置 /var/lib/lxc//config 里指定桥和设备:lxc.net.0.type = vethlxc.net.0.link = br0lxc.net.0.flags = uplxc.net.0.ipv4.address = 10.0.3.101/24lxc.net.0.ipv4.gateway = 10.0.3.13) 宿主机开转发并做 DNAT(公网 8080 → 容器 80):sysctl -w net.ipv4.ip_forward=1(并写进 /etc/sysctl.d/99-lxc.conf)iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 10.0.3.101:80iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o eth0 -j MASQUERADEiptables -A FORWARD -d 10.0.3.101 -p tcp --dport 80 -j ACCEPT持久化用 iptables-persistent 的 netfilter-persistent saveDNAT 的 -i 要写实际收包那块网卡(云上一般就是 eth0),写错是最常见的「配了不生效」。方案 B:LXD 的 proxy device(最省事)lxc config device add c1 web proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80不用手写 iptables,转发由 LXD 自己维护,容器里的服务监听 127.0.0.1 也能通。三个最容易漏的点1. 容器内服务必须监听 0.0.0.0,而不是 127.0.0.1。否则宿主机 curl 通、外网永远 connection refused。2. 云上两层防火墙都要放行:安全组放开 8080,宿主机自身的 nftables/firewalld/ufw 也要放行(Debian 12 默认是 nftables)。3. 只做 DNAT 不做 SNAT/MASQUERADE 会缺回程:容器回包走默认网关,表现为能建连但一直超时。排查顺序:容器内 curl 127.0.0.1:80 → 宿主机 curl 10.0.3.101:80 → 宿主机 curl 127.0.0.1:8080 → 外部 curl 公网IP:8080。卡在哪一步就查那一步,tcpdump -i any -nn port 8080 看包到没到,conntrack -L 看 DNAT 有没有命中。