iptables状态转发规则配置问题:虚拟机通过网桥br0无法访问互联网
iptables状态转发规则配置问题:虚拟机通过网桥br0无法访问互联网
看起来你遇到的是典型的iptables状态规则方向搞反导致的问题,咱们来拆解一下:
首先得说清楚你现有规则的核心问题:你写的第一条FORWARD规则是针对-o br0(也就是流量发往br0)的新连接和已建立连接,但虚拟机发起的互联网访问,流量方向是从br0进入宿主机,再从宿主机的外网网卡出去,这条规则完全匹配不到虚拟机的出站请求,所以这类新连接直接被FORWARD链的默认DROP策略(从现象能推断你是设置了这个)给拦截了。
给你修正后的规则,直接替换掉你原来的那两条FORWARD规则就行:
# 允许虚拟机侧(br0)发起的所有新连接、以及相关/已建立的后续流量 iptables -A FORWARD -i br0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT # 只允许外网返回的、和br0侧已建立连接相关的流量(拒绝外网主动发起的新连接) iptables -A FORWARD -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 你的NAT规则是正确的,保留即可 iptables -A POSTROUTING -t nat -s 172.16.0.0/16 -j MASQUERADE
简单解释下规则逻辑:
- 虚拟机要访问外网,首先得发起新连接,这类流量从br0进入宿主机,所以我们允许
-i br0的NEW状态流量,同时包含RELATED/ESTABLISHED是为了覆盖同一连接内的后续数据包 - 外网返回的流量是发往br0的,我们只允许已建立连接的返程包(RELATED/ESTABLISHED状态),这样就能彻底拒绝外网主动打进来的陌生连接
- 你的MASQUERADE规则负责把虚拟机的私网地址转换成宿主机的公网地址,这部分逻辑没问题不用改
应用完新规则后,你可以用iptables -L FORWARD -v查看规则匹配情况,然后让虚拟机ping个外网地址(比如8.8.8.8),就能看到对应规则的匹配数在增加,这就说明规则生效了。
之前你用iptables -A FORWARD -i br0 -j ACCEPT能工作,是因为这条规则直接放行了所有从br0进来的流量,不管状态,虽然能上网但安全性很低,我们修正后的规则刚好满足你的需求:允许虚拟机发起的所有流量,拒绝外网主动的 incoming 流量。
备注:内容来源于stack exchange,提问作者dbergloev
相关产品推荐
相关产品推荐

