您好,登錄后才能下訂單哦!
Neutron 的設(shè)計(jì)目標(biāo)是實(shí)現(xiàn)“網(wǎng)絡(luò)即服務(wù)”,為了達(dá)到這一目標(biāo),在設(shè)計(jì)上遵循了基于“軟件定義網(wǎng)絡(luò)”實(shí)現(xiàn)網(wǎng)絡(luò)虛擬化的原則,在實(shí)現(xiàn)上充分利用了 Linux 系統(tǒng)上的各種網(wǎng)絡(luò)相關(guān)的技術(shù)
涉及的linux網(wǎng)絡(luò)技術(shù)如下:
bridge:網(wǎng)橋,Linux中用于表示一個(gè)能連接不同網(wǎng)絡(luò)設(shè)備的虛擬設(shè)備,linux中傳統(tǒng)實(shí)現(xiàn)的網(wǎng)橋類似一個(gè)hub設(shè)備,而ovs管理的網(wǎng)橋一般類似交換機(jī)。
br-int:bridge-integration,綜合網(wǎng)橋,常用于表示實(shí)現(xiàn)主要內(nèi)部網(wǎng)絡(luò)功能的網(wǎng)橋。
br-ex:bridge-external,外部網(wǎng)橋,通常表示負(fù)責(zé)跟外部網(wǎng)絡(luò)通信的網(wǎng)橋。
GRE:General Routing Encapsulation,一種通過(guò)封裝來(lái)實(shí)現(xiàn)隧道的方式。在openstack中一般是基于L3的gre,即original pkt/GRE/IP/Ethernet
VETH:虛擬ethernet接口,通常以pair的方式出現(xiàn),一端發(fā)出的網(wǎng)包,會(huì)被另一端接收,可以形成兩個(gè)網(wǎng)橋之間的通道。
qvb:neutron veth, Linux Bridge-side
qvo:neutron veth, OVS-side
TAP設(shè)備:模擬一個(gè)二層的網(wǎng)絡(luò)設(shè)備,可以接受和發(fā)送二層網(wǎng)包。
TUN設(shè)備:模擬一個(gè)三層的網(wǎng)絡(luò)設(shè)備,可以接受和發(fā)送三層網(wǎng)包。
iptables:Linux 上常見的實(shí)現(xiàn)安全策略的防火墻軟件。
Vlan:虛擬 Lan,同一個(gè)物理 Lan 下用標(biāo)簽實(shí)現(xiàn)隔離,可用標(biāo)號(hào)為1-4094。
VXLAN:一套利用 UDP 協(xié)議作為底層傳輸協(xié)議的 Overlay 實(shí)現(xiàn)。一般認(rèn)為作為 VLan 技術(shù)的延伸或替代者。
namespace:用來(lái)實(shí)現(xiàn)隔離的一套機(jī)制,不同 namespace 中的資源之間彼此不可
以neutron的gre模式為例,簡(jiǎn)化示意如下
一、命名空間
在 Linux 中,命名空間(namespace)可以被認(rèn)為是隔離的擁有單獨(dú)網(wǎng)絡(luò)棧(網(wǎng)卡、路由轉(zhuǎn)發(fā)表、iptables)的環(huán)境。網(wǎng)絡(luò)名字空間經(jīng)常用來(lái)隔離網(wǎng)絡(luò)設(shè)備和服務(wù),只有擁有同樣網(wǎng)絡(luò)名字空間的設(shè)備,才能看到彼此。
可以用ip netns list命令來(lái)查看已經(jīng)存在的名字空間。
ip net list
qdhcp開頭的名字空間是dhcp服務(wù)器使用的,qrouter開頭的則是router服務(wù)使用的。 可以通過(guò) ip netns exec namespaceid command 來(lái)在指定的網(wǎng)絡(luò)名字空
間中執(zhí)行網(wǎng)絡(luò)命令,例如
ip netns exec qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a ip addr
可以看到,dhcp服務(wù)的網(wǎng)絡(luò)命名空間只有有一個(gè)網(wǎng)絡(luò)接口"aa08fc00-39",它通過(guò)"tapa08fc00-39"連接到br-int上。
1.1DHCP服務(wù)
dhcp服務(wù)是通過(guò)dnsmasq進(jìn)程(輕量級(jí)服務(wù)器,可以提供dns、dhcp、tftp等服務(wù))來(lái)實(shí)現(xiàn)的,該進(jìn)程綁定到dhcp名字空間中的br-int的接口上??梢圆榭聪嚓P(guān)的進(jìn)程
例如查詢”qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a“的服務(wù)進(jìn)程
ps -ef |grep 3bb9ca55-d2e5-45eb-b782-e4de1f60014a
此dhcp服務(wù),主要是給租戶私有網(wǎng)絡(luò)提供dhcp服務(wù),在openstack的dashboard顯示如下:
2.1 路由服務(wù)
router是提供跨 subnet 的互聯(lián)功能的。比如用戶的內(nèi)部網(wǎng)絡(luò)中主機(jī)想要訪問(wèn)外部互聯(lián)網(wǎng)的地址,就需要router來(lái)轉(zhuǎn)發(fā)(因此,所有跟外部網(wǎng)絡(luò)的流量都必須經(jīng)過(guò)router)。目前router的實(shí)現(xiàn)是通過(guò)iptables進(jìn)行的。
同樣的,router服務(wù)也運(yùn)行在自己的名字空間中,可以通過(guò)如下命令查看:
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 ip addr
可以看出,該名字空間中包括兩個(gè)網(wǎng)絡(luò)接口。
第一個(gè)接口 qr-d1a40252-8b(192.168.1.1/24)跟 br-int 上的接口相連。即任何從 br-int 來(lái)的找 192.168.1.0/24 (租戶的私有網(wǎng)段)的網(wǎng)包都會(huì)到達(dá)這個(gè)接口。
第一個(gè)接口 qg-2fe564e2-cd 連接到 br-ex 上的接口,即任何從外部來(lái)的網(wǎng)包,詢問(wèn) 172.31.208.102(默認(rèn)的靜態(tài) NAT 外部地址)或 172.31.208.110(租戶申請(qǐng)的
floating IP 地址),都會(huì)到達(dá)這個(gè)接口。
在dashboard上也可以看到
查看該名字空間中的路由表
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 ip route
默認(rèn)情況,以及訪問(wèn)外部網(wǎng)絡(luò)的時(shí)候,休會(huì)從 qg-xxx 接口發(fā)出,經(jīng)過(guò) br-ex 發(fā)布到
外網(wǎng)。訪問(wèn)租戶內(nèi)網(wǎng)的時(shí)候,會(huì)從 qr-xxx 接口發(fā)出,發(fā)給 br-int
查看路由的snat和dnat規(guī)則
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 iptables -t nat -S
其中SNAT和DNAT規(guī)則完成外部 floating ip (172.31.208.110)到內(nèi)部ip(192.168.1.17) 的映射
另外有一條SNAT規(guī)則把所有其他的內(nèi)部IP出來(lái)的流量都映射到外部IP172.31.208.102。這樣即使在內(nèi)部虛擬機(jī)沒(méi)有外部浮動(dòng)IP的情況下,也可以發(fā)起對(duì)外網(wǎng)的訪
問(wèn)
二、安全組
Security group通過(guò)Linux IPtables來(lái)實(shí)現(xiàn),為此,在控制節(jié)點(diǎn)上引入了qbr*這樣的Linux傳統(tǒng)bridge(iptables規(guī)則目前無(wú)法加載到直接掛在到ovs的tap設(shè)備上)。 首先在控制節(jié)點(diǎn)上用neutron port-list命令列出虛擬機(jī)的端口id
neutron port-list
其中id的前10位數(shù)字被用作虛機(jī)對(duì)外連接的qbr(同時(shí)也是tap口)的id。i或o加上前9位數(shù)字被用作安全組chain的id。
所有的規(guī)則默認(rèn)都在Compute節(jié)點(diǎn)上的filter表(默認(rèn)表)中實(shí)現(xiàn),分別來(lái)查看filter表的INPUT、OUTPUT、FORWARD三條鏈上的規(guī)則。
在Compute節(jié)點(diǎn)上,可以用 iptables --line-numbers -vnL [CHAIN] 來(lái)獲得filter表(可以指定某個(gè)鏈上的)規(guī)則。
2.1INPUT
iptables --line-numbers -vnL INPUT
可以看到,跟安全組相關(guān)的規(guī)則被重定向到neutron-openvswi-INPUT。 查看其規(guī)則,只有一條
iptables --line-numbers -vnL neutron-openvswi-INPUT
重定向到neutron-openvswi-ocleef425-c
iptables --line-numbers -vnL neutron-openvswi-oc1eef425-c
如果是vm發(fā)出的dhcp請(qǐng)求,直接通過(guò),否則轉(zhuǎn)到neutron-openvswi-ocleef424-c
2.2 OUTPUT
iptables --line-numbers -vnL OUTPUT
分別跳轉(zhuǎn)到neutron-filter-top和neutron-openvswi-OUTPUT。
iptables --line-numbers -vnL neutron-filter-top
neutron-filter-top鏈?zhǔn)翘D(zhuǎn)到neutron-openvswi-local。
查看neutron-openvswi-OUTPUT
iptables --line-numbers -vnL neutron-openvswi-OUTPUT
可以看到 output 鏈無(wú)規(guī)則
同時(shí)查看neutron-openvswi-local鏈規(guī)則
iptables --line-numbers -vnL neutron-openvswi-local
可以看到neutron-oenvswi-local鏈也是無(wú)規(guī)則
2.3 FORWARD
FORWARD chain上主要實(shí)現(xiàn)安全組的功能。用戶在配置缺省安全規(guī)則時(shí)候(例如允許ssh到vm,允許ping到vm),影響該chain
iptables --line-numbers -vnL FORWARD
同樣跳轉(zhuǎn)到neutron-filter-top,無(wú)規(guī)則。跳轉(zhuǎn)到neutron-openvswi-FORWARD。
iptables --line-numbers -vnL neutron-openvswi-FORWARD
neutron-openvswi-FORWARD將匹配所有進(jìn)出tapcleef425端口的流量。
iptables --line-numbers -vnL neutron-openvswi-sg-chain
如果是網(wǎng)橋從tap-cleef425端口發(fā)出到VM的流量,則跳轉(zhuǎn)到neutron-openvswi-icleef425-c;如果是從tap-cleef425端口進(jìn)入到網(wǎng)橋的(即vm發(fā)出來(lái)的)流量,則跳轉(zhuǎn)到neutron-openvswi-ocleef425。
iptables --line-numbers -vnL neutron-openvswi-ic1eef425-c
neutron-openvswi-icleef425-c允許安全組中配置的策略(允許ssh、ping等)和dhcp reply通過(guò)。默認(rèn)的neutron-openvswi-sg-fallback將drop所有流量。
可以看到,還有一個(gè)編號(hào)為4的規(guī)則,是允許tcp協(xié)議的目的端口22,這個(gè)就是我們開放的端口組進(jìn)行ssh協(xié)議使用22端口進(jìn)行登陸
iptables --line-numbers -vnL neutron-openvswi-oc1eef425-c
neutron-openvswi-ocleef425-c將跳轉(zhuǎn)到neutron-openvswi-scleef425-c,允許DHCP Request和匹配VM的源IP和源MAC的流量通過(guò)。
2.4整體邏輯
整體邏輯如下所示:
2.5 快速查找安全組規(guī)則
從前面分析可以看出,某個(gè)vm的安全組相關(guān)規(guī)則的chain的名字,跟vm的id的前9個(gè)字符有關(guān)。因此,要快速查找qbr-XXX上相關(guān)的iptables規(guī)則,可以用iptables -S列出(默認(rèn)是
filter表)所有鏈上的規(guī)則,其中含有id的鏈即為虛擬機(jī)相關(guān)的安全組規(guī)則。其中--physdev-in表示即將進(jìn)入某個(gè)網(wǎng)橋的端口,--physdev-out表示即將從某個(gè)網(wǎng)橋端口發(fā)出
iptables -S |grep tapc1eef425-c0
可以看出,進(jìn)出tap-cleef425-c0 口的FORWARD鏈上的流量都被扔到了neutron-openvswi-sg-chain這個(gè)鏈,neutron-openvswi-sg-chain上是security group具體的實(shí)現(xiàn)(兩條
規(guī)則,訪問(wèn)虛擬機(jī)的流量扔給neutron-openvswi-icleef425-c;從虛擬機(jī)出來(lái)的扔給neutron-openvswi-ocleef4250-c。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。