一套vlan模式的openstack環(huán)境,interface_driver使用openvswitch,并在計算節(jié)點添加br-ex,用于計算節(jié)點虛擬機出外網(wǎng)。
我們一直強調(diào)成都網(wǎng)站設(shè)計、成都做網(wǎng)站對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站制作公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。1、控制節(jié)點
a、編輯/etc/neutron/neutron.conf
[DEFAULT]
router_distributed = True
b、重啟neutron-server服務(wù)
2、網(wǎng)絡(luò)節(jié)點
a、編輯/etc/neutron/l3_agent.ini
[DEFAULT]
agent_mode = dvr_snat
b、編輯
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True
c、重啟neutron-l3-agent和neutron-openvswitch-agent服務(wù)
3、計算節(jié)點
a、編輯/etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
b、執(zhí)行命令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服務(wù)
1、默認(rèn)情況下,metadata功能通過l3實現(xiàn),在dvr模式下,如果使用l3實現(xiàn)的話,需要額外配置metadata agent,為了簡化,該實驗啟用dhcp agent來實現(xiàn)metadata功能。
a、在網(wǎng)絡(luò)節(jié)點上編輯/etc/neutron/dhcp_agent.ini
[DEFAULT]
force_metadata = True
b、重啟neutron-dhcp-agent服務(wù)。
1、創(chuàng)建router,關(guān)聯(lián)到test1網(wǎng)絡(luò)(網(wǎng)關(guān)192.168.1.1),并在test1網(wǎng)絡(luò)內(nèi)創(chuàng)建instance(192.168.1.9),網(wǎng)絡(luò)模型如下:
執(zhí)行上述操作之后,neutron會在網(wǎng)絡(luò)節(jié)點和計算節(jié)點(有instance運行)上都創(chuàng)建一個router的namespace,且配置完全一樣。
也就是說,平臺中會出現(xiàn)多個相同的router namespace,那么neutron如何實現(xiàn)虛擬機到網(wǎng)關(guān)的流量只到本地的router namespace呢?答案是flow table
2、舉個例子:
a、在test1內(nèi)ping網(wǎng)關(guān)(192.168.1.1),虛擬機會先發(fā)送arp請求去學(xué)習(xí)網(wǎng)關(guān)的mac地址,arp報文會從qvo-xxx端口進入br-int的table0,匹配arp和in_port,根據(jù)流表項,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,根據(jù)action執(zhí)行NORMAL。
e、網(wǎng)關(guān)地址是配置在router namespace中的qr-xxx上,而qr-xxx是br-int上的。
端口,所以qr-xxx會收到arp請求,并進行相應(yīng),arp相應(yīng)報文會從qr-xxx端口再次進入br-int table0,命中table-miss flow entry,從而進行NORMAL轉(zhuǎn)發(fā),將報文轉(zhuǎn)發(fā)給虛擬機的qvo-xxx。
f、虛擬機學(xué)到網(wǎng)關(guān)的mac地址之后,將icmp報文通過流表,轉(zhuǎn)發(fā)給網(wǎng)關(guān),ping流程完成。
3、現(xiàn)在分析neutron如何通過flow table 實現(xiàn)虛擬機到網(wǎng)關(guān)的流量只到本地的router namespace。
在上述的d步驟中,命中table-miss flow entry,根據(jù)action執(zhí)行NORMAL,報文可能通過正常轉(zhuǎn)發(fā),到達br-vlan。
a、報文到達br-vlan后,會進入table=0,匹配in_port,命中后,resubmit到table1
b、在table1中,匹配dl_vlan、arp_tpa(arp報文)或者dl_dst,從而把到網(wǎng)關(guān)的報文,全部drop。
c、通過上述流表,保證到達網(wǎng)關(guān)的報文全部終結(jié)在宿主機本地。
DVR模式下,虛擬機的內(nèi)網(wǎng)通信一般有四種場景:同網(wǎng)絡(luò)同宿主機,同網(wǎng)絡(luò)不同宿主機,不同網(wǎng)絡(luò)同宿主機,不同網(wǎng)絡(luò)不同宿主機,下面將對這四種場景逐一進行分析:
1、同網(wǎng)絡(luò)同宿主機,不需要通過router,實驗?zāi)P腿缦拢?/p>
test1和test2運行在同一臺宿主上,執(zhí)行test1 ping test2。
a、test1通過arp學(xué)習(xí)到test2的mac地址,流表匹配過程和步驟4(DVR到網(wǎng)關(guān)流表分析)中arp學(xué)習(xí)相同,然后封裝icmp報文,從qvo-xxx port進入br-int的table0,匹配in_port,命中后,resubmit到table25。
b、在table25中,匹配in_port和dl_src,命中后,resubmit到table60。
c、在table60,命中table-miss,執(zhí)行NORMAL轉(zhuǎn)發(fā)。
d、test2的qvo-yyy port也在br-int上,報文通過qvo-yyy發(fā)送到test2,test2回包給test流程和test1到test2相同。ping流程結(jié)束。
2、同網(wǎng)絡(luò)不同宿主機,不需要router,實驗?zāi)P腿缦拢?/p>
test1和test2運行在不同宿主上,執(zhí)行test1 ping test2。
此場景下,步驟a,b,c和同網(wǎng)絡(luò)同宿主機場景步驟完全相同,報文會在br-int的table60執(zhí)行NORMAL,此處不再贅述。
d、執(zhí)行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,然后執(zhí)行NORMAL,此時報文會離開宿主機,從業(yè)務(wù)口發(fā)出去。
g、報文會被送到運行test2的宿主機業(yè)務(wù)口,然后進入br-vlan的table0,命中后,resubmit到table3。
h、在table3中,命中后,執(zhí)行NORMAL,報文被送到br-int。
i、在br-int的table0中,匹配in_port和dl_vlan,命中后,修改全局vlan 196 為local vlan 1,然后執(zhí)行NORMAL,報文會從qvo-yyy進入虛擬機test2。
j、test2回包和test1發(fā)包過程相同,至此,ping操作完成。
3、不同網(wǎng)絡(luò)同宿主機,需要router,實驗?zāi)P腿缦拢?/p>
創(chuàng)建router分別連接兩個網(wǎng)絡(luò),每個網(wǎng)絡(luò)上個各創(chuàng)建一臺instance,執(zhí)行上述操作之后,neutron會在網(wǎng)絡(luò)節(jié)點和計算節(jié)點(有instance運行)上都創(chuàng)建一個router的namespace,且配置完全一樣,qr-設(shè)備會被配置上對應(yīng)網(wǎng)關(guān)ip地址。
test1和test2運行在同宿主上,執(zhí)行test1 ping test2。
a、test1 通過計算知道要到達test2需要走三層,它會先發(fā)arp請求,學(xué)習(xí)網(wǎng)關(guān)的mac地址,然后封裝icmp報文(目的ip是test2的ip,目的mac是網(wǎng)關(guān)的mac地址),通過默認(rèn)路由,將報文送到本地的router namespace。
(學(xué)習(xí)網(wǎng)關(guān)過程中匹配流表的過程請參考 <4、DVR到網(wǎng)關(guān)流表分析>章節(jié))。
b、報文從qr-test1進入router的PREROUTING鏈,然后查找到test2的路由,命中之后,進入POSTROUTING鏈,并從qr-test2重新進入br-int的table0。
c、在table0中,命中table-miss,resubmit到table60。
d、在table60中,命中后,執(zhí)行NORMAL,將報文從qvo-xxx送到test2。
e、test2回包的過程和test1發(fā)包過程相同,至此,ping操作完成。
4、不同網(wǎng)絡(luò)不同宿主機,需要router,實驗?zāi)P腿缦拢?/p>
test1和test2運行在不同宿主上,執(zhí)行test1 ping test2。
此場景下,步驟a,b,c和不同網(wǎng)絡(luò)同宿主機場景步驟完全相同,
報文從qr-test2出來之后,在br-int的table60執(zhí)行NORMAL,此處不再贅述。
d、在c中執(zhí)行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節(jié)點分配一個唯一的mac地址,避免物理交換機出現(xiàn)mac地址沖突的問題。
g、在table2中,匹配in_port和dl_vlan,命中之后,修改local vlan 2為全局
vlan 148,執(zhí)行NORMAL,此時報文會從業(yè)務(wù)口eth2離開宿主機。
h、報文會進入運行test2的宿主機的業(yè)務(wù)口eth2進入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網(wǎng)關(guān)的mac,resubmit到table60。
m、在table60中,匹配dl_vlan和dl_dst ,剝?nèi)lan,通過output將報文直接送到test2。
n、test2回包的過程和test1發(fā)包過程相同,至此,ping操作完成。
1、創(chuàng)建一個router,并綁定內(nèi)部網(wǎng)絡(luò)test1,設(shè)置路由器的網(wǎng)關(guān)外網(wǎng)為external,在內(nèi)網(wǎng),外網(wǎng)上各創(chuàng)建一臺虛擬機,用于測試,實驗?zāi)P腿缦拢?/p>
執(zhí)行上述操作之后,neutron會在網(wǎng)絡(luò)節(jié)點創(chuàng)建三個namespace:qrouter-xxx、fip-yyy、snat-xxx。
計算節(jié)點(instance運行)創(chuàng)建qrouter-xxx、fip-yyy。
ps:各節(jié)點的namespace會在接下來的分析中說明其作用。
2、虛擬機test1的報文被送到本宿主機router namespace的qr-xxx設(shè)備上(上述已經(jīng)說明,此處不再贅述),進入PREROUTING鏈(未命中,不做任何修改),查看策略路由,使用默認(rèn)路由準(zhǔn)備進行轉(zhuǎn)發(fā),然后進入POSTROUTING鏈(未命中),報文從qr-xxx發(fā)出,送往192.168.1.11進行處理(流表全部命中NORMAL)。
3、可能有人會有疑問,這里的192.168.1.11是啥?
事實上這個ip地址是neutron分配給snap-yyy namespace的一個ip,被配置在sg-zzz上,snap-yyy namespace在網(wǎng)絡(luò)節(jié)點上,neutron通過策略路由和sg-zzz port將計算節(jié)點router namespace中的報文,轉(zhuǎn)發(fā)到網(wǎng)絡(luò)節(jié)點的snat-yyy中。
4、此時報文到達網(wǎng)絡(luò)節(jié)點的snat-yyy namespace中的sg-zzz port上,在路由之前報文會進入PREROUTING鏈(未命中),然后查找路由。
隨后進入POSTROUTING鏈,進行snat,并做連接跟蹤,之后報文進行轉(zhuǎn)發(fā)。
5、經(jīng)過上述操作,虛擬機通過snat-yyy中的qg-設(shè)備出外網(wǎng),通過連接跟蹤返回(流表命中NORMAL)。
1、在章節(jié)6的基礎(chǔ)上,從外網(wǎng)分配一個floating ip(10.100.0.7),并關(guān)聯(lián)到虛擬機test1(192.168.1.9)上,并需要自行配置br-ex,用于虛擬機出外網(wǎng),實驗?zāi)P腿缦拢?/p>
執(zhí)行上述操作之后,neutron會在對應(yīng)的namespace里面添加若干策略,下面的分析中會逐一說明:
1、虛擬機test1的報文被送到本宿主機router namespace的qr-xxx設(shè)備上(上述已經(jīng)說明,此處不再贅述),進入PREROUTING鏈(未命中,不做任何修改),查看策略路由。
通過策略路由,將報文通過rfp-6347c62b-2轉(zhuǎn)發(fā)給169.254.109.47處理,隨后進入POSTROUTING鏈,做snat修改。
2、到這里,大家可能會有一個疑問,這個rfp-6347c62b-2設(shè)備是啥?
事實上這個是veth pair的一端,它的另一端在fip-xxx namespace里面
neutron 使用這對veth pair,將報文從router的namespace里面,通過策略路由,轉(zhuǎn)發(fā)到fip-yyy的namespace里。
3、至此,報文到達fip-yyy namespace,進入PREROUTING鏈(未命中),查看路由。
再進入POSTROUTING鏈(未命中),從而將報文從fg-7ec56cee-b5設(shè)備轉(zhuǎn)發(fā)到外網(wǎng)。
4、至此,報文順利從fg port發(fā)送到外網(wǎng)(流表命中NORMAL)。
5、現(xiàn)在開始分析外網(wǎng)設(shè)備通過floating ip進入虛擬機的情況。
假設(shè)存在一臺外網(wǎng)設(shè)備external(10.100.0.14)去ping floating ip(10.100.0.7),外網(wǎng)設(shè)備首先會通過arp學(xué)習(xí)10.100.0.7的mac地址,而上述描述中,neutron并沒有配置10.100.0.7的ip地址在任何設(shè)備上,也就是說,10.100.0.7并不存在,那報文是如何準(zhǔn)確的送到fg口的呢?
事實上,neutron在fg port上開啟了arp_haproxy功能,相當(dāng)于進行了arp欺騙,這樣,外網(wǎng)設(shè)備就將fg的mac地址學(xué)習(xí)成10.100.0.7的mac,并更新到自己的mac表中。
6、外網(wǎng)報文到達fg口之后,進入PREROUTING鏈(未命中),查看route表,準(zhǔn)備將目的ip為floating ip的報文從fpr-6347c62b-2發(fā)送169.254.109.46。
隨后進入POSTROUTING鏈(未命中),報文轉(zhuǎn)發(fā)到router的namespace中。
7、報文到達router的namespace中的rfp-6347c62b-2設(shè)備,進入PREROUTING鏈,進行dnat操作。將目的ip從floating ip轉(zhuǎn)換成內(nèi)部fix ip(192.168.1.9)
隨后查看route,準(zhǔn)備將報文從qr-xxx port轉(zhuǎn)發(fā)。
然后進入POSTROUTING鏈(未命中),將報文從qr- port轉(zhuǎn)發(fā)到虛擬機test1。
8、至此,實現(xiàn)外網(wǎng)設(shè)備到內(nèi)部ip的轉(zhuǎn)發(fā)完成。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。