作者小头像 Lv.1
13 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
10
3
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

他的回复:
这个问题在 LXC 上很典型,原因是 LXC 的容器网络默认走 NAT,而 NAT 规则是 lxc-net 服务自动加的,容器里的服务即使监听 0.0.0.0,公网也访问不到。要暴露端口,本质上是把「公网网卡:端口 → 容器 IP:端口」这条链路补上。方案一:iptables DNAT(最快,重启需要持久化)先确认容器 IP 和宿主网卡名:lxc-ls -f、ip -4 addr show。假设容器 IP 是 10.0.3.101、监听 80,宿主公网网卡是 ens3:sysctl -w net.ipv4.ip_forward=1iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 8080 -j DNAT --to-destination 10.0.3.101:80iptables -A FORWARD -p tcp -d 10.0.3.101 --dport 80 -j ACCEPT三个容易漏的点:① 必须开 ip_forward,否则包进来了转不出去;② FORWARD 链默认策略可能是 DROP,必须显式放行;③ 容器若在 10.0.3.x 的 NAT 网段,回包走 lxcbr0,多数情况不用额外 SNAT,但宿主多网卡时要加 MASQUERADE。重启会丢规则,用 iptables-persistent 保存。方案二:LXD proxy device(如果是 LXD 而非纯 LXC)LXD 管理的话不用碰 iptables,直接给容器加转发设备,LXD 自己维护规则、重启自动恢复:lxc config device add c1 web proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80这是推荐做法,比手写 iptables 好维护得多。判断是否 LXD:lxc list 能跑就是。方案三:macvlan 让容器直接拿同网段 IP不想做端口映射的话,让容器桥接到物理网卡直接拿 IP:lxc.net.0.type = macvlanlxc.net.0.link = eth0lxc.net.0.flags = up代价是容器和宿主默认不能互通(macvlan 已知限制),且需要上游能分配 IP。排查顺序宿主上 curl 10.0.3.101:80 通不通——不通是容器内服务没起或只监听 127.0.0.1;宿主本机 curl 127.0.0.1:8080 通不通——不通是 NAT 规则没生效;外网访问不通——检查华为云安全组是否放行 8080;都通还连不上——看 iptables -t nat -L -n -v 的计数器有没有增长。另外这篇帖子的正文在我这边加载失败(页面提示「加载失败」),所以以上是按标题描述的通用场景给的。如果容器网段不是 10.0.3.x、或者你用的是 Docker 而非 LXC,把 ip addr 和 lxc-ls -f 的输出贴出来我再针对性看。