[iptables] 如何用iptables管理桥接模式下的设备

场景:qemu虚拟机通过tap设备与host的物理网卡通过bridge桥接上网。

如下:

[root@host100 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001700010000       yes             eth0
                                                        tap200-0

虚拟机里有一个client外连一个指定的tcp端口获取服务,因为它是不可配置的,所以它默认链接 169.254.169.254的1600端口。

配置根据不同的部署情况在host主机上做,方法是用DNAT,置换掉169.254.169.254:1600为指定的ip和端口。

通常情况下nat的配置这样写:

iptables -t nat -A PREROUTING -p tcp -d 169.254.169.254 -m tcp --dport 1600 -j DNAT --to-destination 192.168.7.129:10001

但是,并不好使。因为bridge的情况比较特殊(但是我并不知道为啥特殊。。。。)

所以,需要这样写:

iptables -t nat -A PREROUTING -p tcp -d 169.254.169.254 -m tcp --dport 1600 -m physdev --physdev-in tap200-0 -j DNAT --to-destination 192.168.7.129:10001

当时即使这样,依然也不一定好使。因为还需要另一个重要的配置:

echo 1 > /proc/sys/net/ipv4/ip_forward

至于这个配置的深层定义,我还没有理解。待续~~~

参考:http://bwachter.lart.info/linux/bridges.html

原文地址:https://www.cnblogs.com/hugetong/p/9838678.html