openstack中的snat

最近在研究openstack中的nova network,看了一篇文章

https://www.mirantis.com/blog/vlanmanager-network-flow-analysis/

其中的场景2描述的是:vm是如何通过固定ip上网的。

openstack中的snat_第1张图片

固定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,就不能上网了


你可能感兴趣的:(openstack中的snat)