场景:qemu虚拟机通过tap设备与host的物理网卡通过bridge桥接上网。
如下:
[root@host100 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.001700010000 yes eth0
tap200-
虚拟机里有一个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 -j DNAT --to-destination 192.168.7.129:
但是,并不好使。因为bridge的情况比较特殊(但是我并不知道为啥特殊。。。。)
所以,需要这样写:
iptables -t nat -A PREROUTING -p tcp -d 169.254.169.254 -m tcp --dport -m physdev --physdev-in tap200- -j DNAT --to-destination 192.168.7.129:
当时即使这样,依然也不一定好使。因为还需要另一个重要的配置:
echo > /proc/sys/net/ipv4/ip_forward
至于这个配置的深层定义,我还没有理解。待续~~~
参考:http://bwachter.lart.info/linux/bridges.html