neutron之DVR(distributed virtual router)学习笔记


何为网络南北东西向:

                                                 North
                     external           
                           |                
    East  <——|route|—————————>West
                   /          \         
                VM1             VM2      
                subnet1          subnet2          South
                
内部网络subnet1的流量通过路由到另一个内部网络subnet2去或反之,则称为东西流量;外部网络通过路由进入内部网络或者反之则称为南北流量;
在Juno之前,openstack全部的compute的VM东西南北流量都需要通过network node进行处理之后才能转发,东西流量的汇聚势必增加网络节点的负载导致性能问题,南北流量的汇聚
同时还导致spof单点故障,南北转发又分为不需floatingip的源地址SNAT和需要floatingip的目的地址转发DNAT,Juno之前SNAT和DNAT都得通过网络节点上的L3 agent实现,在Juno版本
之后,可以配置DVR,distributed virtual route,即在每一个nova节点上都配置L3 agent,这样compute节点上的VM就通过local的L3 agent直接走tunnel内部网络到达位于另一个compute上
的VM上,分支亦然,而具有floatingip的DNAT直接通过local的L3 agent通过外部网桥br-ext直接到达外网,反之亦然。由于DVR下SNAT无法实现FWaaS,SNAT还是保持继续流向网络节点在到达外网。


DVR的出现使得neutron的路由具有了高可用性和扩展性,网络通过compute节点直接出去,甚至可以不要网络节点的存在;


启用DVR需要在compute node上安装neutron-l3-agent,并且要打开DVR mode。同时需要修改neutron-openvswitch-agent为DVR mode:


SNAT与DNAT:
SNAT主要应用场景是:局域网内部的多个VM的私网IP通过共享一个public IP来实现外网访问,内外可以出去访问外网,但是外网不能访问内网IP
具体原理就是: 私网IP在通过路由或者访火墙问外网的时候,IP包中的源私有地址会被更改为这个共享的public IP,这样公网就会认为这个IP包是由公网发出来的而不是私网发出的数据包,
这类NAT是在研究路由之后在修改源地址,称为postrouting


DNAT主要应用场景:在内网里面的VM上部署应用,并将应用接口发布到公网中去,这样Internet上的客户便可以访问企业私网里的应用服务,目前公有云都是这种场景;
具体原理就是:外部网络通过路由或者网关访问内网私网IP的时候,在外部网络IP包进入路由之前,将目的IP由路由或者网关上的public IP更改为内网私有IP,这样数据包进入路由之后就能够
正确路由到内部私有IP上,这类NAT是在进入路由之前,将目的IP替换成为内网私有IP,发生在路由之前,称为prerouting


两种方式都需要在内部私网和外部公网之间存在一个可以充当网关路由的设备,该设备至少需要两个网卡,一个连接内部私网,配置与私网同网段的IP并作为私网网关,一个连接外部公网,配置可以
访问外网公网IP。在私网访问公网IP的时候,一旦数据包经过网关设备路由出去之后,就把网关设备的公网IP替换成为数据包中的源IP(源IP一开始时候是私网IP),这样公网中的IP在返回数据包
时候就把网关设备的公网IP作为目的IP发送数据包,公网数据包到达网关设备经过路由之后,就把目的IP(当前为网关设备的公网IP)替换为私网真正需要访问的IP,这样就实现了私网与公网的相互
访问。


SNAT:   private net ——————>route->source ip takeover————————> public net   私网发起数据包访问外网,源地址转换,postrouting


DNAT:  private net <——————route<—destination ip takeover<———————— public net  外网发起数据包访问内网,目的地址转换,prerouting




在实现了DVR后:
1)对于东西向的流量, 流量会直接在计算节点之间传递。
2)对于南北向的流量,如果有floating ip,流量就直接走计算节点。如果没有floating ip,则会走网络节点。




namespace:
命名空间,Linux中一个命名空间就是一个虚拟的网络设备,namespace有独立的路由表,iptables策略,设备管理机构,和其它的namespace完全隔离,如果系统里面有eth0和eth1两个网卡,
eth0加入namespace1,而eth1加入namespace2,则eth1和eth2就相当于位于两个网络设备上的接口,在系统中ifconfig是看不到这两个网卡的在他们加入namespace之后。
在Linux中,使用命令:ip netns 查看系统中的全部netns,即命名空间。要在命名空间中执行命令,需要指定特定的命名空间:ip netns exec netns_name command
exp:ip netns exec ns1 ip address


DVR中为什么需要保留中心化的SNAT而不是做成distributed形式:
SNAT的主要目的是让私网VM可以访问外部网络,访问外部网络的方式就是将内部VM的源IP替换成为router的外网网关IP,即只需要一个外部网络的ip地址作为route的外部gateway,即可实现全部的
VM对外访问,如果将SNAT做成distributed的,则每个compute的route上都要指配一个外网IP作为SNAT的源IP,将会耗用太多的外网IP,因此最好的方式就是将SNAT 使用的IP集中化到网络节点上,
可以通过DVR+HA的实现构建DNAT和SNAT的router高可用。
只要将router同私网subnet连接并设置router的外部网关臂,则私网中的VM就可以通过外部网关臂访问外网,并不是一定要设置floatingIP才可以访问外网。


DVR创建过程:
在部署DVR时候,network节点的L3 agent 设置为DVR_SNAT model,compute节点设置为DVR模式,在controler节点创建router的时候,会在network节点创建snat_router命名空间和qroute命名空间;
snat_router命名空间会根据路由接入的子网数目创建接口,即对于接入到router的每一个外部或者内部网络,在该命名空间中都会生成一个sq或者qg接口。通常,其中一个接口上配置了外网IP,
而其余接口配置的是各个内网IP(这几个IP并不是各个子网段的网关IP,而是网段可以使用的第一个IP地址)。在SNAT转换的时候,来自内部网络的源IP会以postrouting的形式被替换成router接口
上的这个外网IP,这个规则可以在snat_router的iptables中看到:
ip netns exec snat_id iptables -t nat -S
同时可以查看snat_router命名空间中的接口IP:ip netns exec snat_id ip addr
除了snat_router命名空间外,还会创建一个qrouter命名空间,此命名空间不会接入外部网络,而是内部子网,并且ip netns exec qrouter_id ip addr看到的ip地址是子网的网关IP,qrouter
命名空间内部不会存在SNAT规则;
当在compute节点上创建VM的时候,该节点上会创建一个qrouter命名空间,此命名空间与network节点上的qrouter命名空间完全一样,命名空间内部的接口名称即IP mac地址均一样;在为此VM
associate一个floatingIP的时候,会在此compute节点上生成一个fip命名空间,该空间的名字为fip_id-of-ext-net,于此同时会在计算节点的qrouter中增加一个rfp接口,此qrouter接口与fip命名空间
中的fpr接口是一对vethpair,同时,fip命名空间和qrouter命名空间中的fpr和rfp的接口都会被配置上外部IP,qrouter的rfp上是用户生成的FIP,fip命名空间上的fpr是FIP按1递增后的IP,并且
在qrouter的命名空间中有一条FIP与VM fixIP的DNAT规则。但是network节点上的qrouter命名空间没有因为compute的qrouter更改而出现更改。




##############################openstack网络之neutron网络节点上功能flow分析########################################################
br-tun和br-int与br-ex之间的通信:
安装openvswitch之后,OVS会虚拟出三个交换机,br-tun/br-int/be-ex,及隧道网桥,集成网桥,外部网桥;从compute节点进来的package是经过tunnel封装的,具有tunnel ID,即在GRE网络
中,不同网络在节点之间的通信并不是通过VLAN ID来区别不同网络的包,而是通过tunnel ID,因此,br-tun网桥的作用就是根据tunnel ID来设置VLAN ID(此处VLANid与tunnel ID为一一对应
关系,是某一网络的不同标志),并将打上的VLAN tag的包发送到br-int上。反之,从br-int上来的具有VLNA tag的包会被br-tun将VLAN ID转换为tunnelID并通过GRE网络发送到compute节点上去。
假设有N个网络,则在br-int上就有N个网络命名空间namespace,namespace中有router和dhcp虚拟设备负责该网络的IP地址分发管理和路由功能,namespace中的router将属于该网络的包路由
到br-ex网桥上,br-ex网桥上绑定了可以访问外部网络的物理网卡,br-ex网桥将经过SNAT的包发送到外部网络去。


查看有哪些命名空间:ip netns
qrouter-74402efc-9917-4137-ac7d-106a72e58f93
qdhcp-08edfbf9-1cf3-4c79-a3c2-99bac11e1ce8


查看命名空间qrouter中的接口:ip netns exec qrouter-74402efc-9917-4137-ac7d-106a72e58f93 ip addr
63: qr-8bac7f2a-1e: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:ff:82:b0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.1/24 brd 192.168.5.255 scope global qr-8bac7f2a-1e
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feff:82b0/64 scope link 
       valid_lft forever preferred_lft forever
77: qg-c16788da-f3: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:50:58:43 brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.102/24 brd 192.168.115.255 scope global qg-c16788da-f3
       valid_lft forever preferred_lft forever
    inet 192.168.115.120/32 brd 192.168.115.120 scope global qg-c16788da-f3
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe50:5843/64 scope link 
       valid_lft forever preferred_lft forever


在命名空间qrouter的接口中,qr-xxx是连接br-int的接口,qg-xxx是连接br-ex的接口,这两个接口在:ovs-vsctl show的br-int网桥接口中会被显示出来,如果设置了floatingip,qg-xxx接口
上会有两个外部网络IP,一个是在neutron router-gateway-set router_name net_name设置网关臂的时候配置的,一个是在此网络下创建VM并生成floatingIP和associate的时候配置的,其中
网关臂IP是必须的对于SNAT功能,如果外部网络要访问内部VM,则floatingIP是用于DNAT所必须的。此列中,网关臂IP配置在qg-c16788da-f3上,此接口即是路由器连接外部网络的接口,
在neutron中表现为连接br-ex网桥的接口,IP为192.168.115.102,因此全部经过qr-8bac7f2a-1e进入路由的来自内部VM的网络包都会被此router通过SNAT转发到qg-c16788da-f3并进入br-ex然后
到达外部,从qg-c16788da-f3出去的包的源地址都被SNAT后替换成了192.168.115.102。
查看路由规则:ip netns exec qrouter-74402efc-9917-4137-ac7d-106a72e58f93 route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.115.254 0.0.0.0         UG    0      0        0 qg-c16788da-f3
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 qr-8bac7f2a-1e
192.168.115.0   0.0.0.0         255.255.255.0   U     0      0        0 qg-c16788da-f3
可以看出,不属于本网络的包全通过网关臂接口qg-c16788da-f3转发到默认路由网关192.168.115.254 (此处为外部网络网关),属于本网络(192.168.5.0)的包通过路由内部接口qr-8bac7f2a-1e
转发到默认网关(0.0.0.0)192.168.5.1,目的为192.168.115.0网络的包也被接口qg-c16788da-f3转发到默认网关192.168.115.254。


关于路由器上接口IP的说明:
与家用物理路由一致,路由器一端是电信等运行商提供的可以访问Internet的IP,此IP需要购买,此IP段的网关服务器在电信机房,源为此IP的包自动发送到电信网关服务器(路由);家用路由的
另一端连接家庭LAN的设备,路由器通过DHCP可以自动分配家庭私网ip,对于家庭私网来说,此路由就是网关服务器,家庭设备的网络包都会发送到网关服务器(路由),然后路由通过SNAT将家庭设备
上的的私网IP替换为购买到的电信IP,然后发送到电信网关服务器,即可上网。对于neutron,Linux系统中可以有多个router,每个router是一个命名空间qrouter-xxx,qrouter-xxx其实就和家庭
路由器功能类似,一端是可以访问外网的IP地址(不是外网网关IP,外网网关IP在运行商网关设备上),一端是连接内网的网关,即内网网关在此路由上,此路由的接口是内网网关IP。


查看路由iptables规则:ip netns exec qrouter-74402efc-9917-4137-ac7d-106a72e58f93 iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-POSTROUTING
-N neutron-l3-agent-PREROUTING
-N neutron-l3-agent-float-snat
-N neutron-l3-agent-snat
-N neutron-postrouting-bottom
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-OUTPUT -d 192.168.115.120/32 -j DNAT --to-destination 192.168.5.5
-A neutron-l3-agent-OUTPUT -d 192.168.115.130/32 -j DNAT --to-destination 192.168.5.4
-A neutron-l3-agent-POSTROUTING ! -i qg-c16788da-f3 ! -o qg-c16788da-f3 -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-PREROUTING -d 192.168.115.120/32 -j DNAT --to-destination 192.168.5.5
-A neutron-l3-agent-PREROUTING -d 192.168.115.130/32 -j DNAT --to-destination 192.168.5.4
-A neutron-l3-agent-float-snat -s 192.168.5.5/32 -j SNAT --to-source 192.168.115.120
-A neutron-l3-agent-float-snat -s 192.168.5.4/32 -j SNAT --to-source 192.168.115.130
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-l3-agent-snat -o qg-c16788da-f3 -j SNAT --to-source 192.168.115.102
-A neutron-l3-agent-snat -m mark ! --mark 0x2 -m conntrack --ctstate DNAT -j SNAT --to-source 192.168.115.102
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat


该网络中创建了两个VM,固定IP分别为192.168.5.5和192.168.5.4,floating-ip分别为192.168.115.120/32和192.168.115.130/32,在qrouter-xxx的规则中,有两条DNAT的PREROUTING:
-A neutron-l3-agent-PREROUTING -d 192.168.115.120/32 -j DNAT --to-destination 192.168.5.5
-A neutron-l3-agent-PREROUTING -d 192.168.115.130/32 -j DNAT --to-destination 192.168.5.4
这两条用于将外部网络包中的目的地址192.168.115.120/32和192.168.115.130/32通过DNAT转换为192.168.5.5和192.168.5.4,在经过router转发到br-int,然后经过br-tun出去到达hold
 vm的compute节点;
另外还有两条SNAT规则:
-A neutron-l3-agent-float-snat -s 192.168.5.5/32 -j SNAT --to-source 192.168.115.120
-A neutron-l3-agent-float-snat -s 192.168.5.4/32 -j SNAT --to-source 192.168.115.130
来自两个VM上的源地址分别为192.168.5.5和192.168.5.4的包被路由之后又被SNAT将源地址分别替换为 192.168.115.120/32和192.168.115.130/32,之后进入br-ex然后出去到达外网。
如果VM没有配置floating IP,则采用规则对固定IP进行SNAT转换:
-A neutron-l3-agent-snat -o qg-c16788da-f3 -j SNAT --to-source 192.168.115.102
如果此私有网络内有N个VM,则这N个VM的包中的源地址都被SNAT成为router的网关臂IP:192.168.115.102,然后进入br-ex后出去到达外网。


DHCP-server实现:
每个具有DHCP功能的网络都会在Linux系统中创建一个dhcp命名空间,以qdhcp-xxx命名,xxx是该网络ID,dhcp表现为Linux中的一个dnsmasq进程,dhcp命名空间通过tap设备与br-int中的tap
设备连接,dhcp的主机IP分配记录存放在:/var/lib/neutron/dhcp/08edfbf9-1cf3-4c79-a3c2-99bac11e1ce8/host文件中,其中08edfbf9-1cf3-4c79-a3c2-99bac11e1ce8为该网络的ID,
此host文件中记录了dhcp各个client端的mac地址与得到的IP地址:more /var/lib/neutron/dhcp/08edfbf9-1cf3-4c79-a3c2-99bac11e1ce8/host
fa:16:3e:bc:0b:7f,host-192-168-5-2.openstacklocal,192.168.5.2
fa:16:3e:ff:82:b0,host-192-168-5-1.openstacklocal,192.168.5.1
fa:16:3e:78:c0:b8,host-192-168-5-4.openstacklocal,192.168.5.4
fa:16:3e:11:36:f4,host-192-168-5-5.openstacklocal,192.168.5.5
其中,5.1行为router接口的IP和端口MAC地址;5.2行为dhcp-server的端口MAC地址和IP,剩余两行为两个VM的IP和MAC地址;可以看到:路由器上获得的是该网络的网关地址,DHCP-server上
获得的是此网络子网中第一个可以使用的IP地址,即VM的IP地址必然是从地址池中第二个可用地址开始分配。


##########################################################网络节点分析完成################################################################################


##############################openstack网络之neutron计算compute节点上功能flow分析########################################################
此compute上了两个VM,位于同一网段:ovs-vsctl show
a4ca2f55-8f3d-49b1-bf89-8b17068ab12e
    Bridge br-tun                        #tunnel 隧道网桥
        fail_mode: secure
        Port patch-int                  #同br-int上的path-tun是一对veth-pair
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port br-tun
            Interface br-tun
                type: internal
        Port "gre-c0a88e0d"
            Interface "gre-c0a88e0d"
                type: gre
                options: {df_default="true", in_key=flow, local_ip="192.168.142.11", out_key=flow, remote_ip="192.168.142.13"}
        Port "gre-c0a88e0a"
            Interface "gre-c0a88e0a"
                type: gre
                options: {df_default="true", in_key=flow, local_ip="192.168.142.11", out_key=flow, remote_ip="192.168.142.10"}
    Bridge br-int                     #集成网桥
        fail_mode: secure
        Port "qvo9057cb6a-18"         #br-int上与Linux-bridge的qvbxxxx连接的端口,每个VM会自动生成一个Linux-bridge,命名为qbrxxx
            tag: 2                    #此网络的VLAN ID是2(neutron net-create 时候分配),即进入br-int的包VLAN-ID会被设置为tag=2
            Interface "qvo9057cb6a-18"
        Port "qvod0a3a5b7-75"         #br-int上与Linux-bridge的qvbyyyy连接的端口,每个VM会自动生成一个Linux-bridge,命名为qbryyy
            tag: 2
            Interface "qvod0a3a5b7-75"
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port br-int
            Interface br-int
                type: internal
    ovs_version: "2.3.1"
查看该compute节点中有哪些新增虚拟IP接口:ifconfig
qbr9057cb6a-18: flags=4163  mtu 1500
        inet6 fe80::a4a5:a3ff:fe8d:1cc  prefixlen 64  scopeid 0x20
        ether a6:a5:a3:8d:01:cc  txqueuelen 0  (Ethernet)
        RX packets 26  bytes 1860 (1.8 KiB)
        RX errors 0  dropped 5  overruns 0  frame 0
        TX packets 9  bytes 738 (738.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


qbrd0a3a5b7-75: flags=4163  mtu 1500
        inet6 fe80::403:aaff:feb2:ad5a  prefixlen 64  scopeid 0x20
        ether 06:03:aa:b2:ad:5a  txqueuelen 0  (Ethernet)
        RX packets 40  bytes 3156 (3.0 KiB)
        RX errors 0  dropped 5  overruns 0  frame 0
        TX packets 9  bytes 738 (738.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


qvb9057cb6a-18: flags=4419  mtu 1500
        inet6 fe80::a4a5:a3ff:fe8d:1cc  prefixlen 64  scopeid 0x20
        ether a6:a5:a3:8d:01:cc  txqueuelen 1000  (Ethernet)
        RX packets 132  bytes 13383 (13.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 267  bytes 24806 (24.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


qvbd0a3a5b7-75: flags=4419  mtu 1500
        inet6 fe80::403:aaff:feb2:ad5a  prefixlen 64  scopeid 0x20
        ether 06:03:aa:b2:ad:5a  txqueuelen 1000  (Ethernet)
        RX packets 172  bytes 18678 (18.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 184  bytes 17657 (17.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


qvo9057cb6a-18: flags=4419  mtu 1500
        inet6 fe80::f897:d5ff:febc:b66  prefixlen 64  scopeid 0x20
        ether fa:97:d5:bc:0b:66  txqueuelen 1000  (Ethernet)
        RX packets 267  bytes 24806 (24.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 132  bytes 13383 (13.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


qvod0a3a5b7-75: flags=4419  mtu 1500
        inet6 fe80::1ccc:17ff:fe35:db51  prefixlen 64  scopeid 0x20
        ether 1e:cc:17:35:db:51  txqueuelen 1000  (Ethernet)
        RX packets 184  bytes 17657 (17.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 172  bytes 18678 (18.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


tap9057cb6a-18: flags=4163  mtu 1500
        inet6 fe80::fc16:3eff:fe78:c0b8  prefixlen 64  scopeid 0x20
        ether fe:16:3e:78:c0:b8  txqueuelen 500  (Ethernet)
        RX packets 251  bytes 23510 (22.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 140  bytes 14023 (13.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


tapd0a3a5b7-75: flags=4163  mtu 1500
        inet6 fe80::fc16:3eff:fe11:36f4  prefixlen 64  scopeid 0x20
        ether fe:16:3e:11:36:f4  txqueuelen 500  (Ethernet)
        RX packets 168  bytes 16361 (15.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 153  bytes 14676 (14.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 根据端口ID来划分,可以分为两类端口,一类的ID是形如:device_named0a3a5b7-75 ;另一类形如:device_name9057cb6a-18。对于一个compute节点,创建完成一个VM1后,假设此VM的网卡
 端口ID前11为是以xxx开头的,则系统中会多出如下几种接口设备:qbrxxx,tabxxx,qvbxxx,qvoxxx;如果在创建另外一个VM2,假设此VM的网卡 端口ID前11为是以yyy开头的,则系统中会再多出
 如下几种接口设备:qbryyy,tabyyy,qvbyyy,qvoyyy。即VM1中数据流从VM1的xxx网卡端口流出后,会经过tabxxx->qbrxxx->qvbxxx->qvoxxx->br-tun后流出此compute节点,VM2中的数据流会从
 VM2的yyy网卡端口流出后,会经过tabyyy->qbryyy->qvbyyy->qvoyyy->br-tun后流出此compute节点。此列中我们在compute上有两个VM,每个VM一个虚拟网卡,此虚拟网卡的网口ID在neutron中可以
 看到:neutron port-list
+--------------------------------------+------+-------------------+----------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                              |
+--------------------------------------+------+-------------------+----------------------------------------------------------------------------------------+
 9057cb6a-1884-4e27-8ae8-7f9ad2ea8ebe |      | fa:16:3e:78:c0:b8 | {"subnet_id": "2332c020-6f86-45dd-8713-fbafa8655ee0", "ip_address": "192.168.5.4"}  #VM1 
 d0a3a5b7-75d2-4824-8f25-1dcd39500414 |      | fa:16:3e:11:36:f4 | {"subnet_id": "2332c020-6f86-45dd-8713-fbafa8655ee0", "ip_address": "192.168.5.5"}  #VM2
       
通过此端口ID,我们可以看到ifconfig中那些device是处理VM1的流量,而那些device是处理VM2的流量的。VM的数据包在compute的内部处理过程为:从VM的tap设备进入Linux-bridge的tab,这是
一对veth-pair,然后经过Linux-bridge中security-group的filter后,再从Linux-bridge(qbrxxx)的qvbxxx流入br-int的qvoxxx,这是一对veth-pair,最后再从br-int的patch-tun进入
br-tun的patch-int,最后将VLAN ID丢弃并设置GRE ID后经过GRE tunnel流出compute节点。


各个device在compute中的作用:Linux-bridge设备qbrxxx,openstack使用qbrxxx的tap设备来设置安全组,br-int网桥负责流入流出数据包的VALN-ID添加和删除,即出去的包打上VLAN tag,
进来的包出去VLAN tag,br-tun负责VLAN tag与GRE tunnel ID的转换,即进来的带有GRE id包被转换成为对应的VLAN ID,流出的包中的VLAN tag被转换成为GRE ID 然后从隧道中流出。


          VM1               VM2
          |                  |
      Linux-bridge      Linux-bridge
               \         /
                 br-int
                   |
                 br-tun
                   |                                  
                 phy-eth————————>neutron node
######################################compute 网络完成###########################################




#################################DVR 模式没有配置floating IP################################################################################
在DVR模式中,没有配置floating-ip的情况下,VM内部的网络是如何访问的外网的,即VM的南北流量走向:
假设租户demo有两个私有网络,每个网络上挂载一个VM,VM在不同的compute节点上,当compute1中的VM1 ping www.baidu.com的时候,流量包走向如下分析:
首先通过命令确认路由已经发布到计算节点:neutron l3-agent-list-hosting-router demo-router
+--------------------------------------+------------+----------------+-------+----------+
| id                                   | host       | admin_state_up | alive | ha_state |
+--------------------------------------+------------+----------------+-------+----------+
| 81fd7fb0-917b-4fe7-b954-dde77b6555e3 | network    | True           | :-)   |          |
| de073487-4341-4abc-98f9-754118396014 | compute    | True           | :-)   |          |
| e9e22757-fcb6-4f0c-8945-26bce7d9eeb5 | controller | True           | :-)   |          |
+--------------------------------------+------------+----------------+-------+----------+
本例中controler同时充当了compute的角色。
之后通过 ip netns可以看到在network,computer,controler节点上都有一个一模一样的qrouter,qrouter的端口和IP均相同:
[root@network ~]# ip netns
snat-aa791a83-c11c-4bef-b454-b1c53502e323
qdhcp-d6d20c19-1cb7-477c-90e9-249df278869a
qdhcp-d1023ea3-a090-4e3b-a335-f43a8a1631c0
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323


[root@controller ~]# ip netns
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323


[root@compute /]# ip netns
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323


其中,网络节点由于agent工作在dvr_snat模式下,因此还有一个snatxxx 命名空间,xxx为路由ID;由于有两个租户网络,因此出现了两个qdhcpxxx命名空间,xxx为网络ID。
现在才看compute上的qrouter:
ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr


18: qr-52218be2-97: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:b2:50:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global qr-52218be2-97
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feb2:509a/64 scope link 
       valid_lft forever preferred_lft forever
20: qr-3aeb9186-67: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:32:c5:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global qr-3aeb9186-67
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe32:c5eb/64 scope link 
       valid_lft forever preferred_lft forever
出现了两个qr设备,设备IP均为对应两个私有网络的gateway IP,然后才看此路由的rule:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip rule
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
3232235777:     from 192.168.1.1/24 lookup 3232235777 
3232236033:     from 192.168.2.1/24 lookup 3232236033 


才看对应路由table:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route list table 3232235777
default via 192.168.1.7 dev qr-52218be2-97 
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route list table 3232236033
default via 192.168.2.3 dev qr-3aeb9186-67 


通过qrouter的rule可以发现,来自from 192.168.1.1/24即192.168.1.0/24网络的包将会通过路由端口qr-52218be2-97 转发到ip地址为192.168.1.7 端口设备去,
来自from 192.168.2.1/24即192.168.2.0/24网络的包将会通过路由端口qr-52218be2-97 转发到ip地址为192.168.2.3 端口设备去。那么192.168.1.7和192.168.2.3在什么设备上呢?
我们来看网络节点的网络命名空间:
[root@network ~]# ip netns exec snat-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
11: sg-416d8a05-df: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:18:4a:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global sg-416d8a05-df
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe18:4a21/64 scope link 
       valid_lft forever preferred_lft forever
13: sg-f3407fd3-81: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:28:98:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.7/24 brd 192.168.1.255 scope global sg-f3407fd3-81
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe28:987d/64 scope link 
       valid_lft forever preferred_lft forever
14: qg-1b3cd60f-f5: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:c7:2a:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.156/24 brd 192.168.115.255 scope global qg-1b3cd60f-f5
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fec7:2a6a/64 scope link 
       valid_lft forever preferred_lft forever
可以看到:192.168.1.7和192.168.2.3出现在network节点上的snat命名空间里面,对应的端口设备是sg-f3407fd3-81和sg-416d8a05-df,而此snat命名空间连接外网的端口是qg-1b3cd60f-f5,
对应的外网固定IP是192.168.115.156,此ip是在neutron router-gateway-set demo-router ext-net命令设置的,此IP 可以通过命令查看:
[root@controller ~]# neutron router-list
+--------------------------------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
| id                                   | name        | external_gateway_info                                                                                                                                                                       | distributed | ha    |
+--------------------------------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
| aa791a83-c11c-4bef-b454-b1c53502e323 | demo-router | {"network_id": "282bbb70-6903-4d3d-84ea-c2c8349ff11b", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "ac8b9f0a-0309-495a-98d6-325017a5d8b2", "ip_address": "192.168.115.156"}]} | True        | False |
+--------------------------------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
查看snat命名空间的转发规则:
       valid_lft forever preferred_lft forever
[root@network ~]# ip netns exec snat-aa791a83-c11c-4bef-b454-b1c53502e323 iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-POSTROUTING
-N neutron-l3-agent-PREROUTING
-N neutron-l3-agent-float-snat
-N neutron-l3-agent-snat
-N neutron-postrouting-bottom
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-POSTROUTING ! -i qg-1b3cd60f-f5 ! -o qg-1b3cd60f-f5 -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-l3-agent-snat -o qg-1b3cd60f-f5 -j SNAT --to-source 192.168.115.156
-A neutron-l3-agent-snat -m mark ! --mark 0x2 -m conntrack --ctstate DNAT -j SNAT --to-source 192.168.115.156
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat


规则:-A neutron-l3-agent-snat -o qg-1b3cd60f-f5 -j SNAT --to-source 192.168.115.156 将私网数据包进行SNAT之后从qg-1b3cd60f-f5出去。


总结:在没有设置floating-ip的情况下,vm的数据包走向如下:
        br-int                         gre
 |VM-------------->qrouter(local)|------------------->SNAT(network)|------------>external
 |           compute node        |            network node          |


                                                                     |                                                       snat                                      | 
192.168.2.4(VM's IP)----->192.168.2.1(qrouter's qr-3aeb9186-67 IP) |---------->192.168.2.3(SNAT's sg-416d8a05-df ip IP)--------->192.168.115.156(router's gateway)|-------->external
                         compute node                                |                                network node                                                     |


在DVR部署下,租户不同网络之间的VM数据流是如何走向的,即VM之间的东西流向分析如下:
在DVR情况下,每一个compute上都有一个和network节点上一模一样的router,假如租户的两个网络同事接入一个router里面,那么这个router必然有两个内部网络接口,命令查看如下(每个node都一样):
You have new mail in /var/spool/mail/root
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
18: qr-52218be2-97: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:b2:50:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global qr-52218be2-97
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feb2:509a/64 scope link 
       valid_lft forever preferred_lft forever
20: qr-3aeb9186-67: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:32:c5:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global qr-3aeb9186-67
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe32:c5eb/64 scope link 
       valid_lft forever preferred_lft forever
即路由上有两个qr接口,ip分别为两个私网的gateway IP,查看此qrouter上的路由:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route
192.168.1.0/24 dev qr-52218be2-97  proto kernel  scope link  src 192.168.1.1 
192.168.2.0/24 dev qr-3aeb9186-67  proto kernel  scope link  src 192.168.2.1


目的为192.168.2.0/24网络的包,通过设备qr-3aeb9186-67 转发,目的地址为192.168.1.0/24的包,通过设备qr-52218be2-97 转发,转发之后直接进入另一个compute 的br-int,然后进入VM2;
因此,在DVR中,东西流量是不经过network节点的,从vm流出的包直接在local的qrouter上转发后进入位于另一个compute上的VM中。


以上结论的证明:
1.在租户demo下创建两个网络;
2.在demo租户下创建一个router;
3.将两个网络连接到router上;
4.将router与外网连接;
5.在net2和net2上分别创建一个VM,VM最好在两个compute节点上;
6.在VM1和VM2中ping 8.8.8.8,成功;
7.在VM1中pingVM2中的私网IP,成功;
8.shutdown网络节点;
9.在VM1和VM2中ping 8.8.8.8,由于SNAT不存在,失败;
10.在VM1中ping VM2中的私网IP,或者VM2中ping VM1中的的私网IP,尽管network上的SNAT和qrouter命名空间均消失,但是compute1和compute2上的qrouter均存在,而且东西流量不经过network
节点,因此互ping是成功的。


############################################DVR 没有配置floating IP场景分析完成####################################################################


##########################################DVR 配置有floating-ip分析###############################################################################
在以上分析的基础上,为VM1和VM2配置floating IP,这样,外网即可以访问租户的VM,随便指出,从kilo开始,用户可以指定floating IP了,以前是openstack neutron随即生成的,
用户无法指定具体的IP。
floating ip配置前:
[root@controller ~]# nova list    
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks              |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| 8d7db991-bd78-41ca-bf06-1c6c2869368a | test1 | ACTIVE | -          | Running     | demo-net=192.168.1.5  |
| 7b086c8a-9a94-4360-8148-6099cb6b5388 | test2 | ACTIVE | -          | Running     | demo-net2=192.168.2.4 |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
floating ip配置后:
[root@controller ~]# nova list
+--------------------------------------+-------+--------+------------+-------------+----------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                               |
+--------------------------------------+-------+--------+------------+-------------+----------------------------------------+
| 8d7db991-bd78-41ca-bf06-1c6c2869368a | test1 | ACTIVE | -          | Running     | demo-net=192.168.1.5, 192.168.115.157  |
| 7b086c8a-9a94-4360-8148-6099cb6b5388 | test2 | ACTIVE | -          | Running     | demo-net2=192.168.2.4, 192.168.115.159 |
+--------------------------------------+-------+--------+------------+-------------+----------------------------------------+
在compute节点和network节点上观察网络命名空间namespace的变化:
[root@network ~]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr        
10: qr-3aeb9186-67: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:32:c5:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global qr-3aeb9186-67
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe32:c5eb/64 scope link 
       valid_lft forever preferred_lft forever
12: qr-52218be2-97: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:b2:50:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global qr-52218be2-97
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feb2:509a/64 scope link 
       valid_lft forever preferred_lft forever
网络节点上的qrouter没有任何变化。


[root@network ~]# ip netns exec snat-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
11: sg-416d8a05-df: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:18:4a:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global sg-416d8a05-df
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe18:4a21/64 scope link 
       valid_lft forever preferred_lft forever
13: sg-f3407fd3-81: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:28:98:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.7/24 brd 192.168.1.255 scope global sg-f3407fd3-81
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe28:987d/64 scope link 
       valid_lft forever preferred_lft forever
14: qg-1b3cd60f-f5: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:c7:2a:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.156/24 brd 192.168.115.255 scope global qg-1b3cd60f-f5
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fec7:2a6a/64 scope link 
       valid_lft forever preferred_lft forever       
网络节点上的SNAT命名空间没有任何变化。
总结:为VM增加floating-IP后,network节点上的命名空间不会有任变化;


[root@compute /]# ip netns
fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323


compute节点上增加了fip命名空间,fip命名空间的ID是外部网络的ID。
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
2: rfp-aa791a83-c: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 2a:5c:29:62:5e:ee brd ff:ff:ff:ff:ff:ff
    inet 169.254.31.28/31 scope global rfp-aa791a83-c
       valid_lft forever preferred_lft forever
    inet 192.168.115.157/32 brd 192.168.115.157 scope global rfp-aa791a83-c
       valid_lft forever preferred_lft forever
    inet6 fe80::285c:29ff:fe62:5eee/64 scope link 
       valid_lft forever preferred_lft forever
18: qr-52218be2-97: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:b2:50:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global qr-52218be2-97
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feb2:509a/64 scope link 
       valid_lft forever preferred_lft forever
20: qr-3aeb9186-67: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:32:c5:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global qr-3aeb9186-67
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe32:c5eb/64 scope link 
       valid_lft forever preferred_lft forever
       
[root@compute /]# ip netns exec fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b ip addr
2: fpr-aa791a83-c: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 76:90:74:f5:eb:86 brd ff:ff:ff:ff:ff:ff
    inet 169.254.31.29/31 scope global fpr-aa791a83-c
       valid_lft forever preferred_lft forever
    inet6 fe80::7490:74ff:fef5:eb86/64 scope link 
       valid_lft forever preferred_lft forever
21: fg-d991b7a6-14: mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:ca:d2:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.158/24 brd 192.168.115.255 scope global fg-d991b7a6-14
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feca:d20a/64 scope link 
       valid_lft forever preferred_lft forever       


1.外部网络如何通过floating ip进入私网中的VM内
[root@storage ~]# traceroute 192.168.115.157
traceroute to 192.168.115.157 (192.168.115.157), 30 hops max, 60 byte packets
 1  192.168.115.158 (192.168.115.158)  1.898 ms  1.797 ms  1.717 ms
 2  * * *
 3  * * *
 4  * * *
 网络包首先到达192.168.115.158,不是157,这里存在一个arp欺骗,即外部网络通过floating ip进行ARP时候,获得的MAC并不是floating ip对应的接口MAC,而是fip命名空间中的fg接口的MAC
 地址,这是因为在fip的fg接口上配置了ARP proxy的缘故。外部网络获得floatip的mac 地址后(实际上是fg接口的欺骗mac地址),开始向它解析到的MAC地址发送包,包通过br-ex后到达fip命名空间,
 查询fip命名空间的路由:
 [root@compute /]# ip netns exec fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b ip route
default via 192.168.115.254 dev fg-d991b7a6-14 
169.254.31.28/31 dev fpr-aa791a83-c  proto kernel  scope link  src 169.254.31.29 
192.168.115.0/24 dev fg-d991b7a6-14  proto kernel  scope link  src 192.168.115.158 
192.168.115.157 via 169.254.31.28 dev fpr-aa791a83-c 


可以看到到192.168.115.157的包需要经过fpr-aa791a83-c 设备先发送到169.254.31.28 ,而169.254.31.28 ip地址在qrouter的rfp-aa791a83-c接口上,因此外部网络包被fip转发到qrouter
命名空间中。
查看qrouter的命名空间路由:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-POSTROUTING
-N neutron-l3-agent-PREROUTING
-N neutron-l3-agent-float-snat
-N neutron-l3-agent-snat
-N neutron-postrouting-bottom
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-OUTPUT -d 192.168.115.157/32 -j DNAT --to-destination 192.168.1.5
-A neutron-l3-agent-POSTROUTING ! -i rfp-aa791a83-c ! -o rfp-aa791a83-c -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-PREROUTING -d 192.168.115.157/32 -j DNAT --to-destination 192.168.1.5
-A neutron-l3-agent-float-snat -s 192.168.1.5/32 -j SNAT --to-source 192.168.115.157
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat


通过规则:-A neutron-l3-agent-OUTPUT -d 192.168.115.157/32 -j DNAT --to-destination 192.168.1.5 进行DNAT转换,这是一个prerouting过程,转换后进入路由:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route
169.254.31.28/31 dev rfp-aa791a83-c  proto kernel  scope link  src 169.254.31.28 
192.168.1.0/24 dev qr-52218be2-97  proto kernel  scope link  src 192.168.1.1 
192.168.2.0/24 dev qr-3aeb9186-67  proto kernel  scope link  src 192.168.2.1 


到私有网络192.168.1.0/24的包被qrouter的qr-52218be2-97接口转发出去。
总结:外部网络首先从fip命名空间的fg接口处获得arp欺骗后的MAC地址,然后发送包到该地址,进入fip后,fip根据路由规则将来自fg的包从fpr接口路由到qrouter命名空间的的rfp接口,
然后在qrouter中进行DNAT转换,之后从qrouter的qr接口转发到br-int然后进入VM内部。


2.VM中的包如何通过floating ip进入外网
网络包从虚机触发,进入本服务器所在的 qrouter 的 qr interface,首先经过DNAT,没有命中,然后查路由表,local,main,default 中没有命中的路由规则,查表 16,命中默认路由,
需要经过 rfp 端口发到下一个路由器169.254.31.29:
[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip rule
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
32768:  from 192.168.1.5 lookup 16 
3232235777:     from 192.168.1.1/24 lookup 3232235777 
3232236033:     from 192.168.2.1/24 lookup 3232236033


[root@compute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route list table 16
default via 169.254.31.29 dev rfp-aa791a83-c 


[root@compute /]# ip netns exec fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b ip route              
default via 192.168.115.254 dev fg-d991b7a6-14 
169.254.31.28/31 dev fpr-aa791a83-c  proto kernel  scope link  src 169.254.31.29 
192.168.115.0/24 dev fg-d991b7a6-14  proto kernel  scope link  src 192.168.115.158 
192.168.115.157 via 169.254.31.28 dev fpr-aa791a83-c 
 
 路由器169.254.31.29位于fip命名空间的fpr接口,进入fip后,根据路由规则:192.168.115.0/24 dev fg-d991b7a6-14  proto kernel  scope link  src 192.168.115.158 ,由fip命名空间
 中的fg-d991b7a6-14接口转发到192.168.115.0/24网络的包,路由后进行SNAT,将源地址替换发送到外部网络。
 
 
 floating-ip下南北网络不走网络节点的证明:
 1.为两个VM创建floating IP,并关联到VM上;
 2.从 两个VM内部ping www.baidu.com,成功;
 3.从外部网络ping 两个VM的floating IP,成功;
 4.shutdown network节点;
 5.从外部ping 两个VM的floating IP,成功;
 6.从两个VM内部ping外部ip,成功;
 
 ###############################################DVR floating ip分析完成###########################################################
DVR分布式虚拟路由总结:
在传统未使用DVR的情况下,存在以下不足:
1.网络流量集中在网络节点,东西南北流向都要流过network节点再转发,增加network的负载;
2.流量全集中在network节点,容易造成单点故障;
3.在大规模扩展compute节点的时候,network的网络瓶颈愈发明显,即传统neutron难以适应扩展性需求;
总结起来就是:流量集中,单点故障,难以扩展


使用DVR后:
1.东西流量分流到每一个compute节点上,不再经过network节点;
2.在使用floating的情况下,南北流量也分流到compute节点,此时根本无需network节点的存在,VM的流量完全可以从本地compute节点进出;
3.在不使用floatingip的情况下,SNAT仍然需要经过network节点,但是东西流量无需经过;
4.流量分散后,单点故障也被分散;

5.compute节点扩展多少个,network也随之而扩展,不存在传统neutron网络限制compute扩展的情况。


参考链接:
http://docs.openstack.org/networking-guide/scenario_dvr_ovs.html
http://www.cnblogs.com/sammyliu/p/4713562.html



 





























你可能感兴趣的:(云计算&openstack)