在1台linux主机的linux网桥br100中,vnet0是连接1个内部linux VM的接口。
br100 是 1 个 Linux 桥,它有 3 个 IP 地址:
10.11.13.1/24 是 Linux VM 的网关(该 VM 的内部地址为 10.11.13.2/24)
192.168.57.102/24 是通过物理接口 eth1 连接到远程端口 192.168.57.1/24 的桥接本地地址。
192.168.57.225/32是VM内部地址10.11.13.2/24的外部IP地址,通过openstack的浮动IP实现。
打印输出如下:(仅显示必要信息)
# ip addr
2: eth0: 10.0.1.15/24
3: eth1:
5: br100:
inet 10.11.13.1/24 brd 10.11.13.255 scope global br100
inet 192.168.57.102/24 brd 192.168.57.255 scope global br100
inet 192.168.57.225/32 scope global br100
6: vnet0:
7: virbr0:
# brctl show
bridge name bridge id STP enabled interfaces
br100 8000.0800270c1456 no eth1
vnet0
virbr0 8000.000000000000 yes
现在只有通过 eth0 发出的数据包可以连接到互联网。
考虑到网桥 br100 连接到物理接口 eth1,我可以使用什么方法使从 linux VM 发送的具有公共地址目标的数据包通过 eth1 接口而不是 eth0 接口发送?现在,即使默认路由是通过 eth0,数据包也不会离开 eth1,也不会离开 eth0。
请注意,默认路由是通过 eth0,但问题不在于路由,而在于如何将传出的数据包从 eth1 转发到 eth0,因为网桥没有连接到 eth0。
iptables或者策略路由可以实现吗?
答案1
您必须在 iptables 上配置 NAT。尝试一下:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
如果有效,您必须将这些规则设置为持久的,因为重启后它将被删除。如果不行,您必须自定义 NAT 规则以满足您的要求。