Neutron學(xué)習(xí)筆記
基本概念
1.涉及的Linux網(wǎng)絡(luò)技術(shù)
- bridge:網(wǎng)橋,Linux中用于表示一個能連接不同網(wǎng)絡(luò)設(shè)備的虛擬設(shè)備,Linux中傳統(tǒng)實現(xiàn)的網(wǎng)橋類似于一個hub設(shè)備,而ovs管理的網(wǎng)橋一般類似交換機。
- br-int:bridge-intergration,綜合網(wǎng)橋,常用于表示實現(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,一種通過封裝來實現(xiàn)隧道的方式。在openstack中一般是基于L3的GRE,即original pkt/GRE/IP/Ethernet
- VETH:虛擬Ethernet接口,通常以pair的方式出現(xiàn),一端發(fā)出的數(shù)據(jù)包,會被另一端接收,可以形成兩個網(wǎng)橋之間的通道。
- qvb:neutron veth,Linux Bridge-side
- qvo:neutron veth,OVS-side
- TAP設(shè)備:模擬一個二層的網(wǎng)絡(luò)設(shè)備,可以接受和發(fā)送二層數(shù)據(jù)包。
- TUN設(shè)備:模擬一個三層的網(wǎng)絡(luò)設(shè)備,可以接收和發(fā)送三層數(shù)據(jù)包。
- iptables:Linux上常見的實現(xiàn)安全策略的防火墻軟件。
- Vlan:虛擬局域網(wǎng),同一個物理局域網(wǎng)下用標(biāo)簽來實現(xiàn)隔離,可用標(biāo)號為1-4094.
- VXLAN:一套利用UDP協(xié)議作為底層傳輸協(xié)議的Overlay實現(xiàn)。一般認(rèn)為作為VLAN技術(shù)的延伸或替代者。
- namespace:用來實現(xiàn)隔離的一套機制,不同namespace中的資源之間彼此不可見。
1.1 tap
tap從功能定位上來講,位于數(shù)據(jù)鏈路層,數(shù)據(jù)鏈路層的主要協(xié)議有:
- 點對點協(xié)議(point-to-point Protocol)
- 以太網(wǎng)(Ethernet)
- 高級數(shù)據(jù)鏈路協(xié)議(High-Level Link Protocol)
- 幀中繼(Frame Relay)
- 異步傳輸模式(Asynchronous Rransfer Mode)
但在這些以太網(wǎng)協(xié)議中tap只與以太網(wǎng)(Ethernet)協(xié)議對應(yīng)。因此,tap有時也被稱為“虛擬以太網(wǎng)設(shè)備”
1.2 tun
tun是一個網(wǎng)絡(luò)層(IP)的點對點設(shè)備,它啟用了IP層隧道功能。
Linux一共支持5中三層隧道(tunnel)如下表:
| 隧道 | 簡述 |
|---|---|
| ipip | IP in IP,在IPV4報文的基礎(chǔ)上再封裝一個IPV4報文頭,屬于IPV4 in IPV4 |
| GRE | 通用路由封裝,定義了在任意一種網(wǎng)絡(luò)層協(xié)議上封裝任意一個其他網(wǎng)絡(luò)層協(xié)議的協(xié)議,數(shù)據(jù)IPV4/IPV6 over ipv4 |
| sit | 和ipip類似,只不過是一個IPV4的報文頭封裝IPV6的報文,屬于IPV6 overIPV4 |
| isatap | 站內(nèi)自動隧道尋址協(xié)議,一般用于IPV4網(wǎng)絡(luò)中的IPV6/IPV4節(jié)點間的通信 |
| vti | 全稱是Virtual Tunnel Interface,為IPsec隧道提供了一個可路由的接口類型 |
1.3 iptables
iptables與上面tap/tun等不同,它并不是一個網(wǎng)絡(luò)設(shè)備,通過iptables可以實現(xiàn)防火墻、NAT等功能。雖然實現(xiàn)防火墻和NAT功能是通過iptables相關(guān)命令實現(xiàn)的,但是真正實現(xiàn)這些功能的是運行在內(nèi)核空間的netfilter模塊。他們之間的關(guān)系可以如下圖所示。

iptables中內(nèi)置了五張表:nat、filter、mangle、raw和security。
1.3.1 NAT
NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換),就是從一個IP地址轉(zhuǎn)換為另一個IP地址。分為:靜態(tài)NAT、動態(tài)NAT和端口多路復(fù)用三種方案。
靜態(tài)NAT
靜態(tài)NAT兩個特征:
- 私有IP地址和公有IP地址的轉(zhuǎn)換規(guī)則是靜態(tài)指定的。
- 私有IP地址和公有IP地址的1:1的,即一個私有IP地址對應(yīng)一個公有IP地址。
動態(tài)NAT
一般公有地址比私有IP地址少時,用動態(tài)NAT方案。動態(tài)NAT,就是私有IP地址和公有IP地址不是固定的轉(zhuǎn)換關(guān)系,而是在ip轉(zhuǎn)換過程中動態(tài)分配。但要求同時在線的私有IP地址要少于公有IP地址。動態(tài)NAT的三個特征:
- 私有IP地址和公有IP地址的轉(zhuǎn)換規(guī)則不是靜態(tài)指定,而是變化的。
- 兩者之間的轉(zhuǎn)換規(guī)則不是靜態(tài)指定,而是動態(tài)匹配。
- 私有IP地址要小于公有IP地址的數(shù)量。
端口多路復(fù)用
當(dāng)公有IP地址只有一個,而私有IP地址有多個時,不同的私有IP地址通過端口號進(jìn)行區(qū)分,這里的端口號指TCP/UDP端口。端口多路復(fù)用特征:
- 私有IP地址大于共有IP地址的數(shù)量。
- 以公有IP地址的IP+端口號來區(qū)分私有IP地址。
SNAT(源地址轉(zhuǎn)換)
內(nèi)部地址要訪問公網(wǎng)上的服務(wù)時,內(nèi)部地址會主動發(fā)起連接,有路由器或者防火墻上的網(wǎng)關(guān)對內(nèi)部地址做地址轉(zhuǎn)換,將內(nèi)部地址的私有IP轉(zhuǎn)換為公網(wǎng)的公有IP,網(wǎng)關(guān)的這個地址轉(zhuǎn)換為SNAT,主要用于內(nèi)部共享IP訪問外部。
DNAT(目的地址轉(zhuǎn)換)
當(dāng)內(nèi)部網(wǎng)絡(luò)要提供對外服務(wù)時,外部地址發(fā)起主動連接,有路由器或防火墻的網(wǎng)關(guān)接收這個連接,然后將連接轉(zhuǎn)換到內(nèi)部,此過程由帶有公網(wǎng)IP的網(wǎng)關(guān)替代內(nèi)部服務(wù)來接收外部的連接。然后在內(nèi)部做地址轉(zhuǎn)換。此轉(zhuǎn)換稱為DNAT。主要用于內(nèi)部服務(wù)對外發(fā)布。
圖示如下:

NAT處理作用時刻點
| 流 | 流描述 | 處理時刻點 | NAT類型 | NAT說明 |
|---|---|---|---|---|
| 1 | 流從外部到達(dá)Linux用戶空間(私有IP) | PREROUTING | DNAT | 將目的IP從公有IP轉(zhuǎn)換到私有IP |
| 2 | 流從Linux用戶空間到達(dá)外部 | POSTROUTING | SNAT | 將源IP從私有IP轉(zhuǎn)換為公有IP |
| 3 | 流從Linux內(nèi)核空間到達(dá)外部 | OUTPUT | DNAT |
1.3.2 Firewall
iptables中的Firewall屬于網(wǎng)絡(luò)防火墻,通過制定基于TCP/IP協(xié)議的規(guī)則來實現(xiàn)其防火墻功能。這些功能有:
- in-interface(入網(wǎng)絡(luò)接口名):數(shù)據(jù)包從哪個接口進(jìn)入;
- out-interface(出網(wǎng)絡(luò)接口名):數(shù)據(jù)包從哪個網(wǎng)絡(luò)接口輸出;
- protocol(協(xié)議類型):數(shù)據(jù)包的協(xié)議,如TCP、UDP、ICMP等;
- source(源地址):數(shù)據(jù)包的源IP地址(或子網(wǎng));
- destination(目的地址(或子網(wǎng))):數(shù)據(jù)包的目的IP地址(或子網(wǎng));
- sport(源端口號):數(shù)據(jù)包的源端口號;
- dport(目的端口號):數(shù)據(jù)包的目的端口號。
處理時刻點
- INPUT
- FORWARD
- OUTPUT
1.3.3 mangle
mangle表主要用于修改數(shù)據(jù)包的TOS(服務(wù)類型),TTL(生存時間),以及數(shù)據(jù)包設(shè)置Mark標(biāo)記,以實現(xiàn)QOS(服務(wù)質(zhì)量)調(diào)整以及策略路由等應(yīng)用。
處理時刻點
- RPEROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
1.4 namespace
namespace是Linux虛擬網(wǎng)絡(luò)中的一個重要概念,其主要目的就是將Linux的許多全局資源進(jìn)行資源隔離。Linux可以在一個host中創(chuàng)建多個namespace,使那些原本的Linux全局資源變?yōu)閚amespace范圍內(nèi)的全局資源。并且各個namespace之間資源互不可見、相互透明。
namespace隔離的資源
| 資源 | 含義 |
|---|---|
| uts_ns | UTS為Unix Timesharing System的簡稱,包含內(nèi)存名稱、版本、底層體系結(jié)構(gòu)等信息 |
| ipc_ns | 所有與進(jìn)程間通信(IPC)有關(guān)的信息 |
| mnt_ns | 當(dāng)前裝載的文件系統(tǒng) |
| pid_ns | 有關(guān)進(jìn)程id的信息 |
| user_ns | 資源配額的信息 |
| net_ns | 網(wǎng)絡(luò)信息 |
示意圖:

每個namespace提供了一份獨立的網(wǎng)絡(luò)協(xié)議棧,一個設(shè)備只能位于一個namespace中,不同namespace中的設(shè)備可以通過veth pair進(jìn)行橋接。
1.5 veth pair
veth pair不是一個設(shè)備,而是一對設(shè)備,以連接兩個虛擬以太網(wǎng)端口。操作veth pair要和namespace配合使用,如圖所示。

2.Neutron管理的實體:
- 網(wǎng)絡(luò):隔離的L2域,可以是虛擬、邏輯或交換。
- 子網(wǎng):隔離的L3域,IP地址塊,其中每個機器有一個IP,同一個子網(wǎng)的主機彼此L3可見。
- 端口:網(wǎng)絡(luò)上虛擬、邏輯或交換端口。所有這些實體都是虛擬的,擁有自動生成的唯一標(biāo)識ID,支持CRUD(crud是指在做計算處理時的增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete) ),并在數(shù)據(jù)庫中跟蹤記錄狀態(tài)。
2.1 網(wǎng)絡(luò)
隔離的L2廣播域,一般是創(chuàng)建它的用戶所有。用戶可以擁有多個網(wǎng)絡(luò)。網(wǎng)絡(luò)是最基礎(chǔ)的,子網(wǎng)和端口都需要關(guān)聯(lián)到網(wǎng)絡(luò)上。
網(wǎng)絡(luò)上可以有多個子網(wǎng)。同一個網(wǎng)絡(luò)上的主機一般可以通過交換機或路由器連通起來。
2.2子網(wǎng)
隔離的L3域,子網(wǎng)代表了一組分配了IP的虛擬機。每個子網(wǎng)必須有一個CIDR和關(guān)聯(lián)到一個網(wǎng)絡(luò)。IP可以從CIDR或者用戶指定池中選取。
子網(wǎng)可能會有一個網(wǎng)關(guān)、一組DNS和主機路由。不同子網(wǎng)之間L3是互相不可見的,必須通過一個三層網(wǎng)關(guān)(路由器)經(jīng)過L3上進(jìn)行通信
2.3端口
可以進(jìn)出流量的接口,往往綁定上若干MAC地址和IP地址,以進(jìn)行尋址。一般為虛擬交換機上的虛擬接口。
虛擬機掛載網(wǎng)卡到端口上,通過端口訪問網(wǎng)絡(luò)。當(dāng)端口有IP時,意味它屬于某個子網(wǎng)。
3.抽象系統(tǒng)架構(gòu)
無論哪種具體的網(wǎng)絡(luò)虛擬化實現(xiàn),一個簡化和抽象后的系統(tǒng)架構(gòu)可以表述為下圖:

在啟用 DVR 特性(J 版本以后支持)之前,所有流量(東西向、南北向)都需要經(jīng)過網(wǎng)絡(luò)節(jié)點的轉(zhuǎn)發(fā);DVR 特性則允許東西向流量和帶有 Floating IP 的南北向流量不經(jīng)過網(wǎng)絡(luò)節(jié)點的轉(zhuǎn)發(fā),直接從計算節(jié)點的外部網(wǎng)絡(luò)出去。
參考:
1.深入理解 Neutron -- OpenStack 網(wǎng)絡(luò)實現(xiàn)
2.深入理解OpenStack Neutron