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