最近在研究openstack中的nova network,看了一篇文章
https://www.mirantis.com/blog/vlanmanager-network-flow-analysis/
其中的场景2描述的是:vm是如何通过固定ip上网的。
固定ip通过一条snat规则,然后由宿主机的公网口出去。
那么以前我们的网络配置方式就是错误的。我在固定ip的br100网桥上设置了网关,使得vm可以通过这个固定ip连接到了公网。所以在现在的网络配置中,我去掉了固定ip的网关,但是却发现还是有问题。
我的路由表是这样的
root@debian226:~# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.10.82.254 0.0.0.0 UG 0 0 0 vlan82 10.10.82.0 0.0.0.0 255.255.255.0 U 0 0 0 vlan82 192.168.138.0 0.0.0.0 255.255.255.0 U 0 0 0 br100 192.168.139.0 0.0.0.0 255.255.255.0 U 0 0 0 vlan201
宿主机的默认网关是10.10.82.254。
我的虚拟机ip为192.168.138.0 。这里不停的ping 8.8.8.8
在宿主机上抓包可以发现。
root@debian226:~# tcpdump -i br100 -n|grep 8.8.8.8 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br100, link-type EN10MB (Ethernet), capture size 65535 bytes 20:35:36.809586 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10834, length 64 20:35:37.817722 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10835, length 64 20:35:38.825598 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10836, length 64 20:35:38.890643 IP 8.8.8.8 > 192.168.138.14: ICMP echo reply, id 2546, seq 10836, length 64 20:35:39.827326 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10837, length 64
在br100上没有做snat。
在vlan82上也还是没有snat
root@debian226:~# tcpdump -i vlan82 -n|grep 8.8.8.8 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on vlan82, link-type EN10MB (Ethernet), capture size 65535 bytes 20:36:31.957566 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10889, length 64 20:36:32.965583 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10890, length 64 20:36:33.967535 IP 192.168.138.14 > 8.8.8.8: ICMP echo request, id 2546, seq 10891, length 64
查看iptables的snat规则发现
root@debian226:~# iptables -t nat -L -v -n 11826 710K nova-network-float-snat all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 MASQUERADE all -- * * 192.168.138.0/24 0.0.0.0/0 match-set nova-private-snat-dst dst 322 19320 SNAT all -- * eth0 192.168.138.0/24 0.0.0.0/0 to:10.10.82.226
是对出口在eth0上的包进行了snat,就是根本就没有做snat?
查看代码发现,默认的CONF.public_interface就是eth0,nova是根据这个来写入snat的。这就是不合理的地方。也就是我们要在nova.conf中申明合适的public_interface,才能执行正确的snat。不过貌似这个snat没有,也可以上网啊。。
在配置文件中加入public_interface=vlan82这样就能够执行snat了
root@debian226:~# tcpdump -i vlan82 -n|grep 8.8.8.8 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on vlan82, link-type EN10MB (Ethernet), capture size 65535 bytes 20:55:29.897022 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 117, length 64 20:55:30.897002 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 118, length 64 20:55:31.896984 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 119, length 64 20:55:32.897018 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 120, length 64 20:55:33.896995 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 121, length 64 20:55:34.897016 IP 10.10.82.226 > 8.8.8.8: ICMP echo request, id 10012, seq 122, length 64
但是这样的意义又是什么?没有这个snat还是可以上网的啊。
私以为,这样做的原因是:实际环境中网关可能设置了防火墙,只能让10.10.82.0/24过来的包进入网关,如果没有这个snat,就不能上网了