OpenStack DVR 原理深刻分析

1、DVR實驗環境

一套vlan模式的openstack環境,interface_driver使用openvswitch,並在計算節點添加br-ex,用於計算節點虛擬機出外網。linux

2、DVR配置

一、控制節點網絡

a、編輯/etc/neutron/neutron.conf
[DEFAULT]
router_distributed = Trueide

b、重啓neutron-server服務學習

二、網絡節點測試

a、編輯/etc/neutron/l3_agent.ini
[DEFAULT]
agent_mode = dvr_snatspa

b、編輯
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True3d

c、重啓neutron-l3-agent和neutron-openvswitch-agent服務router

三、計算節點server

a、編輯/etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0blog

b、執行命令sysctl –p

c、編輯/etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver=neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge =
agent_mode = dvr

d、編輯
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True

e、重啓neutron-l3-agent和neutron-openvswitch-agent服務

3、啓用dhcp實現metadata功能

一、默認狀況下,metadata功能經過l3實現,在dvr模式下,若是使用l3實現的話,須要額外配置metadata agent,爲了簡化,該實驗啓用dhcp agent來實現metadata功能。

a、在網絡節點上編輯/etc/neutron/dhcp_agent.ini
[DEFAULT]
force_metadata = True

b、重啓neutron-dhcp-agent服務。

4、DVR到網關流表分析

一、建立router,關聯到test1網絡(網關192.168.1.1),並在test1網絡內建立instance(192.168.1.9),網絡模型以下:

OpenStack DVR 原理深刻分析

執行上述操做以後,neutron會在網絡節點和計算節點(有instance運行)上都建立一個router的namespace,且配置徹底同樣。

也就是說,平臺中會出現多個相同的router namespace,那麼neutron如何實現虛擬機到網關的流量只到本地的router namespace呢?答案是flow table

二、舉個例子:

a、在test1內ping網關(192.168.1.1),虛擬機會先發送arp請求去學習網關的mac地址,arp報文會從qvo-xxx端口進入br-int的table0,匹配arp和in_port,根據流表項,resubmit到table24。

b、在table24中匹配arp、in_port和arp_spa,命中以後,resubmit到table25。

c、在table25中匹配in_port和dl_src,命中以後,resubmit到table60。

d、在table60中,命中table-miss flow entry,根據action執行NORMAL。

e、網關地址是配置在router namespace中的qr-xxx上,而qr-xxx是br-int上的。

端口,因此qr-xxx會收到arp請求,並進行相應,arp相應報文會從qr-xxx端口再次進入br-int table0,命中table-miss flow entry,從而進行NORMAL轉發,將報文轉發給虛擬機的qvo-xxx。

f、虛擬機學到網關的mac地址以後,將icmp報文經過流表,轉發給網關,ping流程完成。

三、如今分析neutron如何經過flow table 實現虛擬機到網關的流量只到本地的router namespace。

在上述的d步驟中,命中table-miss flow entry,根據action執行NORMAL,報文可能經過正常轉發,到達br-vlan。

a、報文到達br-vlan後,會進入table=0,匹配in_port,命中後,resubmit到table1

b、在table1中,匹配dl_vlan、arp_tpa(arp報文)或者dl_dst,從而把到網關的報文,所有drop。

c、經過上述流表,保證到達網關的報文所有終結在宿主機本地。

5、虛擬機內網通訊分析

DVR模式下,虛擬機的內網通訊通常有四種場景:同網絡同宿主機,同網絡不一樣宿主機,不一樣網絡同宿主機,不一樣網絡不一樣宿主機,下面將對這四種場景逐一進行分析:

一、同網絡同宿主機,不須要經過router,實驗模型以下:

OpenStack DVR 原理深刻分析

test1和test2運行在同一臺宿主上,執行test1 ping test2。

a、test1經過arp學習到test2的mac地址,流表匹配過程和步驟4(DVR到網關流表分析)中arp學習相同,而後封裝icmp報文,從qvo-xxx port進入br-int的table0,匹配in_port,命中後,resubmit到table25。

b、在table25中,匹配in_port和dl_src,命中後,resubmit到table60。

c、在table60,命中table-miss,執行NORMAL轉發。

d、test2的qvo-yyy port也在br-int上,報文經過qvo-yyy發送到test2,test2回包給test流程和test1到test2相同。ping流程結束。

二、同網絡不一樣宿主機,不須要router,實驗模型以下:

OpenStack DVR 原理深刻分析

test1和test2運行在不一樣宿主上,執行test1 ping test2。

此場景下,步驟a,b,c和同網絡同宿主機場景步驟徹底相同,報文會在br-int的table60執行NORMAL,此處再也不贅述。

d、執行NORMAL後,報文會從phy-br-vlan port進入br-vlan的table0,匹配in_port,命中後,resubmit到table1。

e、在table1中,命中table-miss,resubmit table2。

f、在table2中,匹配in_port和dl_vlan,命中後,修改local vlan 1爲全局vlan 196,而後執行NORMAL,此時報文會離開宿主機,從業務口發出去。

g、報文會被送到運行test2的宿主機業務口,而後進入br-vlan的table0,命中後,resubmit到table3。

h、在table3中,命中後,執行NORMAL,報文被送到br-int。

i、在br-int的table0中,匹配in_port和dl_vlan,命中後,修改全局vlan 196 爲local vlan 1,而後執行NORMAL,報文會從qvo-yyy進入虛擬機test2。

j、test2回包和test1發包過程相同,至此,ping操做完成。

三、不一樣網絡同宿主機,須要router,實驗模型以下:

OpenStack DVR 原理深刻分析

建立router分別鏈接兩個網絡,每一個網絡上個各建立一臺instance,執行上述操做以後,neutron會在網絡節點和計算節點(有instance運行)上都建立一個router的namespace,且配置徹底同樣,qr-設備會被配置上對應網關ip地址。

test1和test2運行在同宿主上,執行test1 ping test2。

a、test1 經過計算知道要到達test2須要走三層,它會先發arp請求,學習網關的mac地址,而後封裝icmp報文(目的ip是test2的ip,目的mac是網關的mac地址),經過默認路由,將報文送到本地的router namespace。
(學習網關過程當中匹配流表的過程請參考 <四、DVR到網關流表分析>章節)。

b、報文從qr-test1進入router的PREROUTING鏈,而後查找到test2的路由,命中以後,進入POSTROUTING鏈,並從qr-test2從新進入br-int的table0。

c、在table0中,命中table-miss,resubmit到table60。

d、在table60中,命中後,執行NORMAL,將報文從qvo-xxx送到test2。

e、test2回包的過程和test1發包過程相同,至此,ping操做完成。

四、不一樣網絡不一樣宿主機,須要router,實驗模型以下:

OpenStack DVR 原理深刻分析

test1和test2運行在不一樣宿主上,執行test1 ping test2。

此場景下,步驟a,b,c和不一樣網絡同宿主機場景步驟徹底相同,
報文從qr-test2出來以後,在br-int的table60執行NORMAL,此處再也不贅述。

d、在c中執行NORMAL以後,報文經過int-br-vlan port進入br-vlan的table0。

e、在table0中,匹配in_port,命中以後,resubmit到table1。

f、在table1中,匹配dl_vlan和dl_src,命中以後,修改源mac地址爲neutron分配給宿主機mac,resubmit到table2。

注:開啓DVR以後,neutron會給每一個compute節點分配一個惟一的mac地址,避免物理交換機出現mac地址衝突的問題。

g、在table2中,匹配in_port和dl_vlan,命中以後,修改local vlan 2爲全局
vlan 148,執行NORMAL,此時報文會從業務口eth1離開宿主機。

h、報文會進入運行test2的宿主機的業務口eth1進入br-vlan的table0。

i、在table0中,命中以後,resubmit到table3。

j、在table3中,匹配dl_src(neutron分配給宿主機的mac),將報文從phy-br-vlan送出給br-int table0。

k、在br-int的table0中,匹配in_port和dl_src(neturon分配給宿主機的mac),resubmit給table2。

l、在table2中,匹配dl_vlan和dl_dst,修改源mac爲test2網關的mac,resubmit到table60。

m、在table60中,匹配dl_vlan和dl_dst ,剝去vlan,經過output將報文直接送到test2。

n、test2回包的過程和test1發包過程相同,至此,ping操做完成。

6、虛擬機出外網原理分析

一、建立一個router,並綁定內部網絡test1,設置路由器的網關外網爲external,在內網,外網上各建立一臺虛擬機,用於測試,實驗模型以下:

OpenStack DVR 原理深刻分析

執行上述操做以後,neutron會在網絡節點建立三個namespace:qrouter-xxx、fip-yyy、snat-xxx。

計算節點(instance運行)建立qrouter-xxx、fip-yyy。

ps:各節點的namespace會在接下來的分析中說明其做用。

二、虛擬機test1的報文被送到本宿主機router namespace的qr-xxx設備上(上述已經說明,此處再也不贅述),進入PREROUTING鏈(未命中,不作任何修改),查看策略路由,使用默認路由準備進行轉發,而後進入POSTROUTING鏈(未命中),報文從qr-xxx發出,送往192.168.1.11進行處理(流表所有命中NORMAL)。

三、可能有人會有疑問,這裏的192.168.1.11是啥?

事實上這個ip地址是neutron分配給snap-yyy namespace的一個ip,被配置在sg-zzz上,snap-yyy namespace在網絡節點上,neutron經過策略路由和sg-zzz port將計算節點router namespace中的報文,轉發到網絡節點的snat-yyy中。

四、此時報文到達網絡節點的snat-yyy namespace中的sg-zzz port上,在路由以前報文會進入PREROUTING鏈(未命中),而後查找路由。

隨後進入POSTROUTING鏈,進行snat,並作鏈接跟蹤,以後報文進行轉發。

五、通過上述操做,虛擬機經過snat-yyy中的qg-設備出外網,經過鏈接跟蹤返回(流表命中NORMAL)。

7、Floating ip原理分析

一、在章節6的基礎上,從外網分配一個floating ip(10.100.0.7),並關聯到虛擬機test1(192.168.1.9)上,並須要自行配置br-ex,用於虛擬機出外網,實驗模型以下:

OpenStack DVR 原理深刻分析

執行上述操做以後,neutron會在對應的namespace裏面添加若干策略,下面的分析中會逐一說明:

一、虛擬機test1的報文被送到本宿主機router namespace的qr-xxx設備上(上述已經說明,此處再也不贅述),進入PREROUTING鏈(未命中,不作任何修改),查看策略路由。

經過策略路由,將報文經過rfp-6347c62b-2轉發給169.254.109.47處理,隨後進入POSTROUTING鏈,作snat修改。

二、到這裏,你們可能會有一個疑問,這個rfp-6347c62b-2設備是啥?
事實上這個是veth pair的一端,它的另外一端在fip-xxx namespace裏面

neutron 使用這對veth pair,將報文從router的namespace裏面,經過策略路由,轉發到fip-yyy的namespace裏。

三、至此,報文到達fip-yyy namespace,進入PREROUTING鏈(未命中),查看路由。

再進入POSTROUTING鏈(未命中),從而將報文從fg-7ec56cee-b5設備轉發到外網。

四、至此,報文順利從fg port發送到外網(流表命中NORMAL)。

五、如今開始分析外網設備經過floating ip進入虛擬機的狀況。

假設存在一臺外網設備external(10.100.0.14)去ping floating ip(10.100.0.7),外網設備首先會經過arp學習10.100.0.7的mac地址,而上述描述中,neutron並無配置10.100.0.7的ip地址在任何設備上,也就是說,10.100.0.7並不存在,那報文是如何準確的送到fg口的呢?

事實上,neutron在fg port上開啓了arp_haproxy功能,至關於進行了arp欺騙,這樣,外網設備就將fg的mac地址學習成10.100.0.7的mac,並更新到本身的mac表中。

六、外網報文到達fg口以後,進入PREROUTING鏈(未命中),查看route表,準備將目的ip爲floating ip的報文從fpr-6347c62b-2發送169.254.109.46。

隨後進入POSTROUTING鏈(未命中),報文轉發到router的namespace中。

七、報文到達router的namespace中的rfp-6347c62b-2設備,進入PREROUTING鏈,進行dnat操做。將目的ip從floating ip轉換成內部fix ip(192.168.1.9)

隨後查看route,準備將報文從qr-xxx port轉發。

而後進入POSTROUTING鏈(未命中),將報文從qr- port轉發到虛擬機test1。

八、至此,實現外網設備到內部ip的轉發完成。

相關文章
相關標籤/搜索