一套vlan模式的openstack環境,interface_driver使用openvswitch,並在計算節點添加br-ex,用於計算節點虛擬機出外網。linux
一、控制節點網絡
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服務
一、默認狀況下,metadata功能經過l3實現,在dvr模式下,若是使用l3實現的話,須要額外配置metadata agent,爲了簡化,該實驗啓用dhcp agent來實現metadata功能。
a、在網絡節點上編輯/etc/neutron/dhcp_agent.ini
[DEFAULT]
force_metadata = True
b、重啓neutron-dhcp-agent服務。
一、建立router,關聯到test1網絡(網關192.168.1.1),並在test1網絡內建立instance(192.168.1.9),網絡模型以下:
執行上述操做以後,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、經過上述流表,保證到達網關的報文所有終結在宿主機本地。
DVR模式下,虛擬機的內網通訊通常有四種場景:同網絡同宿主機,同網絡不一樣宿主機,不一樣網絡同宿主機,不一樣網絡不一樣宿主機,下面將對這四種場景逐一進行分析:
一、同網絡同宿主機,不須要經過router,實驗模型以下:
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,實驗模型以下:
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,實驗模型以下:
建立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,實驗模型以下:
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操做完成。
一、建立一個router,並綁定內部網絡test1,設置路由器的網關外網爲external,在內網,外網上各建立一臺虛擬機,用於測試,實驗模型以下:
執行上述操做以後,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)。
一、在章節6的基礎上,從外網分配一個floating ip(10.100.0.7),並關聯到虛擬機test1(192.168.1.9)上,並須要自行配置br-ex,用於虛擬機出外網,實驗模型以下:
執行上述操做以後,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的轉發完成。