Neutron 的設計目標是實現(xiàn)“網(wǎng)絡即服務”,為了達到這一目標,在設計上遵循了基于“軟件定義網(wǎng)絡”實現(xiàn)網(wǎng)絡虛擬化的原則,在實現(xiàn)上充分利用了 Linux 系統(tǒng)上的各種網(wǎng)絡相關的技術(shù)
成都創(chuàng)新互聯(lián)公司服務項目包括華寧網(wǎng)站建設、華寧網(wǎng)站制作、華寧網(wǎng)頁制作以及華寧網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,華寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到華寧省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
涉及的linux網(wǎng)絡技術(shù)如下:
bridge:網(wǎng)橋,Linux中用于表示一個能連接不同網(wǎng)絡設備的虛擬設備,linux中傳統(tǒng)實現(xiàn)的網(wǎng)橋類似一個hub設備,而ovs管理的網(wǎng)橋一般類似交換機。
br-int:bridge-integration,綜合網(wǎng)橋,常用于表示實現(xiàn)主要內(nèi)部網(wǎng)絡功能的網(wǎng)橋。
br-ex:bridge-external,外部網(wǎng)橋,通常表示負責跟外部網(wǎng)絡通信的網(wǎng)橋。
GRE:General Routing Encapsulation,一種通過封裝來實現(xiàn)隧道的方式。在openstack中一般是基于L3的gre,即original pkt/GRE/IP/Ethernet
VETH:虛擬ethernet接口,通常以pair的方式出現(xiàn),一端發(fā)出的網(wǎng)包,會被另一端接收,可以形成兩個網(wǎng)橋之間的通道。
qvb:neutron veth, Linux Bridge-side
qvo:neutron veth, OVS-side
TAP設備:模擬一個二層的網(wǎng)絡設備,可以接受和發(fā)送二層網(wǎng)包。
TUN設備:模擬一個三層的網(wǎng)絡設備,可以接受和發(fā)送三層網(wǎng)包。
iptables:Linux 上常見的實現(xiàn)安全策略的防火墻軟件。
Vlan:虛擬 Lan,同一個物理 Lan 下用標簽實現(xiàn)隔離,可用標號為1-4094。
VXLAN:一套利用 UDP 協(xié)議作為底層傳輸協(xié)議的 Overlay 實現(xiàn)。一般認為作為 VLan 技術(shù)的延伸或替代者。
namespace:用來實現(xiàn)隔離的一套機制,不同 namespace 中的資源之間彼此不可
以neutron的gre模式為例,簡化示意如下
一、命名空間
在 Linux 中,命名空間(namespace)可以被認為是隔離的擁有單獨網(wǎng)絡棧(網(wǎng)卡、路由轉(zhuǎn)發(fā)表、iptables)的環(huán)境。網(wǎng)絡名字空間經(jīng)常用來隔離網(wǎng)絡設備和服務,只有擁有同樣網(wǎng)絡名字空間的設備,才能看到彼此。
可以用ip netns list命令來查看已經(jīng)存在的名字空間。
ip net list
qdhcp開頭的名字空間是dhcp服務器使用的,qrouter開頭的則是router服務使用的。 可以通過 ip netns exec namespaceid command 來在指定的網(wǎng)絡名字空
間中執(zhí)行網(wǎng)絡命令,例如
ip netns exec qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a ip addr
可以看到,dhcp服務的網(wǎng)絡命名空間只有有一個網(wǎng)絡接口"aa08fc00-39",它通過"tapa08fc00-39"連接到br-int上。
1.1DHCP服務
dhcp服務是通過DNSmasq進程(輕量級服務器,可以提供dns、dhcp、tftp等服務)來實現(xiàn)的,該進程綁定到dhcp名字空間中的br-int的接口上??梢圆榭聪嚓P的進程
例如查詢”qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a“的服務進程
ps -ef |grep 3bb9ca55-d2e5-45eb-b782-e4de1f60014a
此dhcp服務,主要是給租戶私有網(wǎng)絡提供dhcp服務,在openstack的dashboard顯示如下:
2.1 路由服務
router是提供跨 subnet 的互聯(lián)功能的。比如用戶的內(nèi)部網(wǎng)絡中主機想要訪問外部互聯(lián)網(wǎng)的地址,就需要router來轉(zhuǎn)發(fā)(因此,所有跟外部網(wǎng)絡的流量都必須經(jīng)過router)。目前router的實現(xiàn)是通過iptables進行的。
同樣的,router服務也運行在自己的名字空間中,可以通過如下命令查看:
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 ip addr
可以看出,該名字空間中包括兩個網(wǎng)絡接口。
第一個接口 qr-d1a40252-8b(192.168.1.1/24)跟 br-int 上的接口相連。即任何從 br-int 來的找 192.168.1.0/24 (租戶的私有網(wǎng)段)的網(wǎng)包都會到達這個接口。
第一個接口 qg-2fe564e2-cd 連接到 br-ex 上的接口,即任何從外部來的網(wǎng)包,詢問 172.31.208.102(默認的靜態(tài) NAT 外部地址)或 172.31.208.110(租戶申請的
floating IP 地址),都會到達這個接口。
在dashboard上也可以看到
查看該名字空間中的路由表
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 ip route
默認情況,以及訪問外部網(wǎng)絡的時候,休會從 qg-xxx 接口發(fā)出,經(jīng)過 br-ex 發(fā)布到
外網(wǎng)。訪問租戶內(nèi)網(wǎng)的時候,會從 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出來的流量都映射到外部IP172.31.208.102。這樣即使在內(nèi)部虛擬機沒有外部浮動IP的情況下,也可以發(fā)起對外網(wǎng)的訪
問
二、安全組
Security group通過Linux IPtables來實現(xiàn),為此,在控制節(jié)點上引入了qbr*這樣的Linux傳統(tǒng)bridge(iptables規(guī)則目前無法加載到直接掛在到ovs的tap設備上)。 首先在控制節(jié)點上用neutron port-list命令列出虛擬機的端口id
neutron port-list
其中id的前10位數(shù)字被用作虛機對外連接的qbr(同時也是tap口)的id。i或o加上前9位數(shù)字被用作安全組chain的id。
所有的規(guī)則默認都在Compute節(jié)點上的filter表(默認表)中實現(xiàn),分別來查看filter表的INPUT、OUTPUT、FORWARD三條鏈上的規(guī)則。
在Compute節(jié)點上,可以用 iptables --line-numbers -vnL [CHAIN] 來獲得filter表(可以指定某個鏈上的)規(guī)則。
2.1INPUT
iptables --line-numbers -vnL INPUT
可以看到,跟安全組相關的規(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請求,直接通過,否則轉(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鏈是跳轉(zhuǎn)到neutron-openvswi-local。
查看neutron-openvswi-OUTPUT
iptables --line-numbers -vnL neutron-openvswi-OUTPUT
可以看到 output 鏈無規(guī)則
同時查看neutron-openvswi-local鏈規(guī)則
iptables --line-numbers -vnL neutron-openvswi-local
可以看到neutron-oenvswi-local鏈也是無規(guī)則
2.3 FORWARD
FORWARD chain上主要實現(xiàn)安全組的功能。用戶在配置缺省安全規(guī)則時候(例如允許ssh到vm,允許ping到vm),影響該chain
iptables --line-numbers -vnL FORWARD
同樣跳轉(zhuǎn)到neutron-filter-top,無規(guī)則。跳轉(zhuǎn)到neutron-openvswi-FORWARD。
iptables --line-numbers -vnL neutron-openvswi-FORWARD
neutron-openvswi-FORWARD將匹配所有進出tapcleef425端口的流量。
iptables --line-numbers -vnL neutron-openvswi-sg-chain
如果是網(wǎng)橋從tap-cleef425端口發(fā)出到VM的流量,則跳轉(zhuǎn)到neutron-openvswi-icleef425-c;如果是從tap-cleef425端口進入到網(wǎng)橋的(即vm發(fā)出來的)流量,則跳轉(zhuǎn)到neutron-openvswi-ocleef425。
iptables --line-numbers -vnL neutron-openvswi-ic1eef425-c
neutron-openvswi-icleef425-c允許安全組中配置的策略(允許ssh、ping等)和dhcp reply通過。默認的neutron-openvswi-sg-fallback將drop所有流量。
可以看到,還有一個編號為4的規(guī)則,是允許tcp協(xié)議的目的端口22,這個就是我們開放的端口組進行ssh協(xié)議使用22端口進行登陸
iptables --line-numbers -vnL neutron-openvswi-oc1eef425-c
neutron-openvswi-ocleef425-c將跳轉(zhuǎn)到neutron-openvswi-scleef425-c,允許DHCP Request和匹配VM的源IP和源MAC的流量通過。
2.4整體邏輯
整體邏輯如下所示:
2.5 快速查找安全組規(guī)則
從前面分析可以看出,某個vm的安全組相關規(guī)則的chain的名字,跟vm的id的前9個字符有關。因此,要快速查找qbr-XXX上相關的iptables規(guī)則,可以用iptables -S列出(默認是
filter表)所有鏈上的規(guī)則,其中含有id的鏈即為虛擬機相關的安全組規(guī)則。其中--physdev-in表示即將進入某個網(wǎng)橋的端口,--physdev-out表示即將從某個網(wǎng)橋端口發(fā)出
iptables -S |grep tapc1eef425-c0
可以看出,進出tap-cleef425-c0 口的FORWARD鏈上的流量都被扔到了neutron-openvswi-sg-chain這個鏈,neutron-openvswi-sg-chain上是security group具體的實現(xiàn)(兩條
規(guī)則,訪問虛擬機的流量扔給neutron-openvswi-icleef425-c;從虛擬機出來的扔給neutron-openvswi-ocleef4250-c。