neutron之DVR(distributed virtual router)學習筆記
何為網路南北東西向:
Northexternal
|
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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::a4a5:a3ff:fe8d:1cc prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::403:aaff:feb2:ad5a prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet6 fe80::a4a5:a3ff:fe8d:1cc prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet6 fe80::403:aaff:feb2:ad5a prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet6 fe80::f897:d5ff:febc:b66 prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet6 fe80::1ccc:17ff:fe35:db51 prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc16:3eff:fe78:c0b8 prefixlen 64 scopeid 0x20<link>
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<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc16:3eff:fe11:36f4 prefixlen 64 scopeid 0x20<link>
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均相同:
[
snat-aa791a83-c11c-4bef-b454-b1c53502e323
qdhcp-d6d20c19-1cb7-477c-90e9-249df278869a
qdhcp-d1023ea3-a090-4e3b-a335-f43a8a1631c0
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323
[[email protected] ~]# ip netns
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323
[[email protected]
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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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:
[
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:
[[email protected] /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route list table 3232235777
default via 192.168.1.7 dev qr-52218be2-97
[[email protected] /]# 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在什麼裝置上呢?
我們來看網路節點的網路名稱空間:
[[email protected] ~]# ip netns exec snat-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
11: sg-416d8a05-df: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 可以通過命令檢視:
[[email protected] ~]# 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
[[email protected] ~]# 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
[[email protected] /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
18: qr-52218be2-97: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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上的路由:
[[email protected] /]# 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配置前:
[[email protected] ~]# 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配置後:
[[email protected] ~]# 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的變化:
[[email protected] ~]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
10: qr-3aeb9186-67: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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沒有任何變化。
[[email protected] ~]# ip netns exec snat-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
11: sg-416d8a05-df: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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節點上的名稱空間不會有任變化;
[[email protected] /]# ip netns
fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b
qrouter-aa791a83-c11c-4bef-b454-b1c53502e323
compute節點上增加了fip名稱空間,fip名稱空間的ID是外部網路的ID。
[[email protected]ute /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip addr
2: rfp-aa791a83-c: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
[[email protected] /]# ip netns exec fip-282bbb70-6903-4d3d-84ea-c2c8349ff11b ip addr
2: fpr-aa791a83-c: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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內
[[email protected] ~]# 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名稱空間的路由:
[[email protected] /]# 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的名稱空間路由:
[[email protected] /]# 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過程,轉換後進入路由:
[[email protected] /]# 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:
[[email protected] /]# 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
[[email protected] /]# ip netns exec qrouter-aa791a83-c11c-4bef-b454-b1c53502e323 ip route list table 16
default via 169.254.31.29 dev rfp-aa791a83-c
[[email protected] /]# 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
相關推薦
neutron之DVR(distributed virtual router)學習筆記
何為網路南北東西向: North external |
html之css選擇器語法學習筆記
mil post ges inf important 類名 想要 geo none 相關內容: css選擇器的用法: 選擇器的語法 標簽選擇器 類選擇器 id選擇器 選擇器的分組 嵌套選擇 屬性選擇器 子標簽選擇器 相鄰兄弟選擇器 參考資料:w3school
《逐夢旅程:Windows遊戲編程之從零開始》學習筆記之二:GDI框架
register 開發 操作 程序 turn use 繪制 cal 完整 1 //===========================================【程序說明】=================================== 2 //
vue-router學習筆記(一)
改變 from 發生 回調 筆記 win 存在 下一個 表示 學習vue-router首先要認識的兩個屬性 $router 和 $route。 $router指的是router實例,$route則是當前激活的路由信息對象,是只讀屬性,不可更改,但是可以watch(監聽)。
多線程之同步代碼塊學習筆記
dem 結束 pre 情況下 int 之前 pub 並發 代碼 1.什麽情況下需要同步 * 當多線程並發, 有多段代碼同時執行時, 我們希望某一段代碼執行的過程中CPU不要切換到其他線程工作. 這時就需要同步. * 如果兩段代碼是同步的, 那麽同一時間只能執
集合嵌套之HashMap嵌套HashMap學習筆記
值對象 compareto oid 都是 final get 上海 @override pri 學習筆記 /** * * A:案例演示 * 集合嵌套之HashMap嵌套HashMap * * 需求: * 雙元課堂有很多基礎
2018-2019-1 20189206 《構建之法》第二章學習筆記
2018-2019-1 20189206 《構建之法》第二章 學習筆記 第二章 個人技術和流程 單元測試 單元測試應該準確、快速地保證程式及本模組的正確性。 單元測試的標準 單元測試應該在最基本的功能、引數上驗證程式的正確性。 單元測試應該測試的是程式中最
【分散式】一致性雜湊 Distributed Hash Table 學習筆記
目錄 一致性雜湊介紹 一致性雜湊原理 一致性雜湊應用 1、一致性雜湊介紹 一致性雜湊,英文:distributed hashtable, 簡稱DHT, 是麻省理工提出的一種演算法,該演算法可以有效解決分散式儲存結
《深入淺出MySQL:資料庫開發、優化與管理維護(2nd)》第31章之MySQL非同步複製搭建學習筆記
MySQL的複製原理大致如下: (1)首先,MySQL主庫在事務提交時會把資料變更作為事件Events記錄在二進位制日誌檔案Binlog中;MySQL主庫上的sync_binlog引數控制Binlog日誌重新整理到磁碟。 (2)主庫推送二進位制日誌檔案Binlog中的事件到從庫的中繼日誌Re
《構建之法》第二章學習筆記
單元測試 目的:使模組功能定義儘量明確 主要步驟: (1)設定資料 (2)使用被測試型別功能 (3)比較實際結果和預期結果 標準: (1)在最基本的功能/引數上驗證程式的正確性,測試程式中最基本的單元,測試API中的每一個方法及引數 (2)由程式作者來寫,設計時就寫好單元測試 (3)單元測試過後,機
小白學python之獲取物件資訊_學習筆記
本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。 本文是學習到python的獲取物件資訊。參考連結廖雪峰python獲取物件資訊。 使用type() print(type(123)) print(type('str')) print(type(
小白學python之使用列舉類_學習筆記
本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。 本文是學習到python的多重繼承。參考連結廖雪峰python使用列舉類。 本學習筆記僅供參考。 >>> from enum import Enum >>>
Vue-Router學習筆記
一、基礎 1. 介紹 Vue Router 是 Vue.js官方的路由管理器。是我們使用Vue構建的SPA(單頁應用 Single Page Application)的路徑管理器。本質上就是建立頁面Url與元件之間的對映關係。 2. 基本使用 2.1 安裝 npm install
機器學習十大經典演算法之K-近鄰演算法(學習筆記)
演算法概述 K-近鄰演算法(k-Nearest Neighbor,KNN)是機器學習演算法中最簡單最容易理解的演算法。該演算法的思路是:給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項, 這K個例項的多數屬於某個類,就把該輸入例項分
React-router學習筆記
之前用react開發了一些模組,對react的使用也更加熟悉了。最近有空,來總結記錄一下react相關生態,系統的梳理一下,便於更好的理解和記憶。 首先看一個配置示例: const routeCon
STM32之記憶體保護單元MPU學習筆記
STM32的Cortex M4(STM32F3/F4系列)和Cortex M7(STM32F7系列)系列的產品,都帶有記憶體保護單元(memory protection unit),簡稱:MPU。使用MPU可以設定不同儲存區域的儲存訪問特性(如只支援特權訪問或全訪問)
JavaScript設計模式之觀察者模式(學習筆記)
設計模式(Design Pattern)對於軟體開發來說其重要性不言而喻,程式碼可複用、可維護、可擴充套件一直都是軟體工程中的追求!對於我一個學javascript的人來說,理解設計模式似乎有些困難,對僅切圖、做少量互動效果的FE甚至可能不會用到,但是當你開始使用Angula
Vue-router學習筆記——遇到的坑(一)history模式重新整理/設定巢狀路由顯示404/cannot find(webpack配置)
前端路由有兩種,一種是hash模式,一種是history模式。 這兩種模式的url路徑都不需要真實存在,只需要為前端跳轉做一個顯示。 hash模式的url路徑會帶有#,看起來不太舒服且不好做SEO,但是因為瀏覽器向伺服器請求時會自動忽略#後面的值,所以在瀏覽器中重新整理還是
【小小何先生的學習之旅】自己的學習筆記,歡迎志同道合的朋友聯絡我,一起學習交流。
自我介紹 相關學習資源: 機器學習:https://github.com/18279406017/awesome-machine-learning;強化學習:https://github.com/18279406017/awesome-reinforcement-lear
友善之臂最新版mini2440學習筆記——u-boot 1.1.6移植(一)
從本文開始,將記錄博主在進行u-boot 1.1.6移植過程中遇到的問題。本文將涉及兩個問題: 1. u-boot中新增開發板 2. u-boot第一階段啟動程式碼 1. u-boot中新增開發板 1.1. Makefile更改 1.1.1. 增加反彙編檔案輸出 Makef