OpenStack 网络里 iptables 主要是在 Neutron 的各个 Agent 管理的 namespace 中生效,它并不在物理机全局直接写规则(除了少量 SNAT/DNAT 转发),所以不同的场景里 iptables 的作用也不同。以下是几个典型场景:
1. VM → 外网
路径:
VM → br-int → qrouter → qg-xxx → br-ex → 物理网卡 → 外部网关
iptables 作用点:
qrouter-namespace (L3 agent)
SNAT:把 VM 的私网 IP 转换成 qg-xxx 的外网 IP。
规则在
iptables -t nat -S
里,形如:-A neutron-l3-agent-snat -s 172.24.30.0/24 -j SNAT --to-source 10.0.19.106
- 安全组规则不会在这里生效(只在 qbr)。
2. 外网 → VM(比如公网访问 VM 浮动IP)
路径:
外部请求 → br-ex → qrouter → DNAT (浮动IP → 内网IP) → qbr → VM
iptables 作用点:
qrouter-namespace
DNAT:把浮动 IP 转换成 VM 内网 IP。
-A neutron-l3-agent-float-snat -d 10.0.19.150/32 -j DNAT --to-destination 172.24.30.10
qbr-xxx (Linux bridge)
VM 的安全组规则在这里:
- INPUT/FORWARD:控制是否允许 ICMP、TCP/22、TCP/80 等。
- 如果没放通,会被 DROP。
3. VM → VM(同一台宿主机)
路径:
VM1 → br-int → qbr → VM2
iptables 作用点:
qbr-xxx(安全组网桥)
- 安全组规则生效,控制 VM1 是否能访问 VM2。
- 默认情况下安全组是 stateful 的,允许已建立连接返回。
4. VM → VM(不同宿主机)
路径:
VM1 → br-int → br-tun (VXLAN/GRE) → 物理网卡 → br-tun → br-int → qbr → VM2
iptables 作用点:
源宿主机
- qbr-xxx:安全组检查,决定报文能不能发出去。
目标宿主机
- qbr-xxx:安全组检查,决定报文能不能送给 VM。
- qrouter 不参与,因为这是同网段内的 L2 通信。
5. 外网 → 内部网络(不经过浮动IP,而是直连路由器网关)
比如你把外部网络直接配置成 provider network,VM 拥有真实的外网 IP。
iptables 作用点:
qbr-xxx
- 安全组规则依然生效。
qrouter
- 不需要 NAT,但可能会有防火墙规则拦截伪造的源地址。
6. DHCP 分配场景
VM → DHCP 请求 → qdhcp-namespace
iptables 作用点:
qdhcp-namespace
- 只负责 DHCP 服务的封装,不会有安全组规则。
qbr-xxx
- 会允许 DHCP 报文(67/68端口),如果安全组里没允许 DHCP,VM 拿不到地址。
总结(iptables 的核心职责)
- NAT:在 qrouter-namespace 做 SNAT/DNAT。
- 安全组:在每个 VM 对应的 qbr-xxx 上做 ACL。
- 隔离控制:L3 agent 可能加额外的过滤,比如防止伪造源 IP。