Linux基礎:VLAN篇
1.1 vlan介紹
本小節重點:
-
vlan的含義
-
vlan的型別
-
交換機埠型別
-
vlan的不足
1.1.1 vlan的含義
區域網LAN的發展是VLAN產生的基礎,因而先介紹一下區域網LAN
由Hub、網橋或交換機等網路裝置連線同一網段內的所有節點形成區域網(LAN),通常是一個單獨的廣播域
處於同一個區域網LAN之內的網路節點之間可以直接通訊
處於不同區域網段的裝置之間的通訊則必須經過路由器才能通訊
上述傳統拓撲結構的關鍵在於用三層裝置,即路由器,來隔離不同共的LAN,在網路規模增大的情況下存在兩個缺陷:
1.路由器數量需要增多,網路時延隨之增加,進而導致網路資料傳輸速度的下降。這主要是因為資料在從一個區域網傳遞到另一個區域網時,必須經過路由器的路由操作:路由器根據資料包中的相應資訊確定資料包的目標地址,然後再選擇合適的路徑轉發出去。
2.使用者是按照它們的物理連線被自然地劃分到不同的使用者組(廣播域)中。這種分割方式並不是根據工作組中所有使用者的共同需要和頻寬的需求來進行的。因此,儘管不同的工作組或部門對頻寬的需求有很大的差異,但它們卻被機械地劃分到同一個廣播域中爭用相同的頻寬。
綜上兩點,必須選出一種隔離廣播域的方式,兼備下述兩點
1.可以不用通過路由器來隔離不同廣播域
2.可以突破地理位置的限制,再邏輯上劃分出不同的廣播域
這就是VLAN,IEEE 802.1Q 標準定義了VLAN Header 的格式。它再普通乙太網幀結構的SA(srcaddr)之後加入了4bytes的VLAN Tag/Header 資料,其中包括12-bits的VLAN ID。VLAN ID最大值為4096,但是有效值範圍是1-4094
帶VLAN的交換機分為兩類:
-
Access port:這些埠被打上了VLAN Tag。離開交換機的Access port進入計算機的以太幀中沒有VLAN Tag,這意味著連線到access port的機器不會察覺到VLAN的存在。離開計算機進入這些埠的資料幀都被打上了VLAN Tag。
-
Trunk port: 有多個交換機時,組A中的部分機器連線到 switch 1,另一部分機器連線到 switch 2。要使得這些機器能夠相互訪問,你需要連線兩臺交換機。 要避免使用一根電纜連線每個 VLAN 的兩個埠,我們可以在每個交換機上配置一個 VLAN trunk port。Trunk port 發出和收到的資料包都帶有 VLAN header,該 header 表明了該資料包屬於那個 VLAN。因此,只需要分別連線兩個交換機的一個 trunk port 就可以轉發所有的資料包了。通常來講,只使用 trunk port 連線兩個交換機,而不是用來連線機器和交換機,因為機器不想看到它們收到的資料包帶有 VLAN Header。
單臺交換機上劃分VLAN
多型交換機上劃分VLAN
1.1.2 vlan的型別
(1)基於埠的VLAN(untagged VLAN - 埠屬於一個VLAN,資料幀中中沒有VLAN tag)
這種模式下,在交換機上建立若干個VLAN,在將若干埠放在每個VLAN 中。每個埠在某一時刻只能屬於一個VLAN。一個 VLAN 可以包含所有埠,或者部分埠。每個埠有個PVID (port VLAN identifier)。這種模式下,一個埠上收到的 frame 是 untagged frame,因此它不包含任何有關 VLAN 的資訊。VLAN 的關係只能從埠的 PVID 上看出來。交換機在轉發 frame 時,只將它轉發到相同 PVID 的埠。
如上圖所示,連線兩個交換機的同一個 VLAN 中的兩個計算機需要通訊的話,需要在兩個交換機之間連兩根線:
-
一根從 Switch A 埠4 到 Switch B 埠 4 (VLAN 1)
-
一根從 Switch A 埠8 到 Switch B 埠 8 (VLAN 2)
(2)Tagged VLANs (資料幀中帶有 VLAN tag)
這種模式下,frame 的VLAN 關係是它自己攜帶的資訊中儲存的,這種資訊叫 a tag or tagged header。當交換機收到一個帶 VLAN tag 的幀,它只將它轉發給具有同樣 VID 的埠。一個能夠接收或者轉發 tagged frame 的埠被稱為 a tagged port。所有連線到這種埠的網路裝置必須是 802.1Q 協議相容的。這種裝置必須能處理 tagged frame,以及新增 tag 到其轉發的 frame。
1.1.3 vlan的不足
-
VLAN 使用 12-bit 的 VLAN ID,所以 VLAN 的第一個不足之處就是它最多隻支援 4096 個 VLAN 網路(當然這還要除去幾個預留的),對於大型資料中心的來說,這個數量是遠遠不夠的。
-
VLAN 是基於 L2 的,所以很難跨越 L2 的邊界,在很大程度上限制了網路的靈活性。
-
VLAN 操作需手工介入較多,這對於管理成千上萬臺機器的管理員來說是難以接受的。
1.2 二層交換的基礎知識
1.2.1 二層交換機最基本的功能
二層交換機最基本的功能包括:
-
mac地址學習:當交換機從它的某個埠收到資料幀時,它將埠的 ID 和幀的源 MAC 地址儲存到它的內部MAC表中。這樣,當將來它收到一個要轉發到該 MAC 地址的幀時,它就知道直接從該埠轉發出去了。
-
資料幀轉發:交換機在將從某個埠收到資料幀,再將其從某個埠轉發出去之前,它會做一些邏輯判斷:
-
如果幀的目的 MAC 地址是廣播或者多播地址的話,將其從交換機的所有埠(除了傳入埠)上轉發。
-
如果幀的目的MAC地址在它的內部MAC表中能找到對應的輸出埠的話(MAC 地址學習過程中儲存的),將其從該埠上轉發出去。
-
對其它情況,將其從交換機的所有埠(除了傳入埠)上轉發。
-
-
加VLAN標籤/去VALAN標籤:
-
-
幀接收:從 trunk port 上收到的資料幀必須是加了標籤的。從 access port 上收到的資料幀必須是沒有加標籤的,否則該幀將會被拋棄。
-
幀處理:根據上述轉發流程決定其發出的埠。
-
幀發出:從 trunk port 發出的幀是加了標籤的。從 access port 上發出的幀必須是沒加標籤的。
-
預設情況下,交換機的所有埠都處於VLAN 1 中,也就相當於沒有配置 VLAN。該機制說明如下:
-
PC A 發一個幀到交換機的 1 埠,其目的MAC地址為 PC B 的 MAC。
-
交換機比較其目的 MAC 地址和它的內部 MAC Table,發現它不存在(此時表為空)。在決定泛洪之前,它把埠 1 和 PC A 的 MAC 地址存進它的 MAC Table。
-
交換機將幀拷貝多份,分別從2和3埠發出。
-
PC B 收到該幀以後,發現其目的 MAC 地址和他自己的 MAC 地址相同。它發出一個回覆幀進入埠3。
-
交換機將 PC B 的 MAC地址和埠3 存在它的 MAC 表中。
-
因為該幀的目的地址為PC A 的 MAC 地址它已經在 MAC 表中,交換機直接將它轉發到埠1,達到PC A。
配置了 VLAN 的交換機的該機制類似,只不過:
(1)MAC 表格中每一行有不同的 VLAN ID。做比較的時候,拿傳入幀的目的 MAC 地址和 VLAN ID 和此表中的行資料相比較。如果都相同,則選擇其 Ports 作為轉發出口埠。
(2)如果沒有吻合的表項,則將此幀從所有有同樣 VLAN ID 的 Access ports 和 Trunk ports 轉發出去。
1.2.2 ARP協議
二層網路使用 MAC (media access control address)地址作為硬體的唯一標識。基於 TCP/IP 協議的軟體使用 ARP 來將 IP 地址轉化為 MAC 地址。
\1. 目的 IP 地址在同一網段的話
該示例中,Host A 和 B 在同一個網段中。A 的 IP 地址是 10.0.0.99,B 的 IP 地址是 10.0.0.100。當 A 要和 B 通訊時,A 需要知道 B 的 MAC 地址。該過程經過以下步驟:
(1)A 上的 IP 協議棧知道通過B 的 IP 地址可以直接到達 B。A 檢查它的本地 ARP 快取來看B 的 MAC 地址是否已經存在。
(2)如果A 沒有發現B 的 MAC 地址,它發出一個 ARP 廣播請求,來詢問“10.0.0.100 的 MAC 地址是什麼?”,該資料包:
SRC MAC: A 的 MAC
DST MAC:FF:FF:FF:FF:FF:FF
SRA IP: A 的 IP
DST IP: B 的 IP
(3)該網段中所有的電腦都將收到該包,並且會檢查 DST IP 和自己的IP 是否相同。如果不同,則丟棄該包。Host B 發現其IP 地址和 DST IP 相同,它將 A 的 IP/MAP 地址加入到自己的ARP 快取中。
(4)B 發出一個 ARP 回覆訊息
SRC MAC: B 的 MAC
DST MAC:A 的 MAC
SRA IP: B 的 IP
DST IP: A 的 IP
(5)交換機直接將該包交給 host A。A 收到後,將 B 的 MAC/IP 地址快取到 ARP 快取中。
(6)A 使用 B 的 MAC 作為目的 MAC 地址發出 IP 包。
\2. 目的IP 地址不在同一個網段的話
本例子中,A 的地址是 10.0.0.99, B 的地址是 192.168.0.99。Router 的 interface 1 和 A 在同一個網段,其IP 地址為10.0.0.1;interface 2 和 B 在同一個網段,其IP地址為 192.168.0.1。
A 使用下面的步驟來獲取 Router 的 interface 1 的 MAC 地址。
(1)根據其路由表,A 上的 IP 協議知道需要通過它上面配置的 gateway 10.0.0.1 才能到達到 B。經過上面例子中的步驟,A 會得到 10.0.0.1 的 MAC 地址。
(2)當 A 收到 Router interface 1 的 MAC 地址後,A 發出了給B 的資料包:
SRC MAC: A 的 MAC
DST MAC:Router 的 interface 1 的 MAC 地址
SRA IP: A 的 IP
DST IP: B 的 IP
(3)路由器的 interface1 收到該資料包後,根據其路由表,首先經過同樣的ARP 過程,路由器根據 B 的 IP 地址通過 ARP 獲得其 MAC 地址,然後將包發給它。
SRC MAC: Router interface 2 的 MAC
DST MAC:B 的 MAC
SRA IP: A 的 IP
DST IP: B 的 IP
二、使用OpenvSwitch(OVS)+VLAN組網
Neutron 基於 VLAN 模式的 tenant network 同 provider network 一樣,都必須使用物理的 VLAN 網路
2.1 物理VLAN網路配置
本例子中,交換機上劃分了三個 VLAN 區域:
-
管理網路,用於 OpenStack 節點之間的通訊,假設 VLAN ID 範圍為 50 - 99.
-
資料網路,用於虛擬機器之間的通訊。由於Vlan模式下,租戶建立的網路都具有獨立的 Vlan ID,故需要將連線虛機的伺服器的交換機埠設定為 Trunk 模式,並且設定所允許的 VLAN ID 範圍,比如 100~300。
-
外部網路,用於連線外部網路。加上 VLAN ID 範圍為 1000-1010。
關於網段之間的路由:
-
如果該物理交換機接到一個物理路由器並做相應的配置,則資料網路可以使用這個物理路由器,而不需要使用 Neutron 的虛擬路由器。
-
如果不使用物理的路由器,可以在網路節點上配置虛擬路由器。
2.2 Neutron配置
2.2.1 配置進行
控制節點上:
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan tenant_network_types = vlanmechanism_drivers = openvswitch
[ml2_type_flat]
flat_networks = external
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300
網路節點上:
#為連線物理交換機的網絡卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用於資料網路,eth3 用於外部網路
ovs-vsctl add-br br-eth2ovs-vsctl add-br br-ex
ovs-vsctl add-port br-eth2 eth2ovs-vsctl add-port br-ex eth3
# vim /etc/neutron/plugins/ml2/ml2_conf.ini [m12]
type_drivers = flat,vlantenant_network_types = vlanmechanism_drivers = openvswitch[ml2_type_flat]flat_networks = external
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300,external:1000:1010
[ovs]
bridge_mappings = physnet1:br-eth2,external:br-ex
計算節點上:
#為連線物理交換機的網絡卡 eth2 建立 OVS physical bridge
ovs-vsctl add-br br-eth2
ovs-vsctl add-port br-eth2 eth2
# vim /etc/neutron/plugins/ml2/ml2_conf.ini [m12]
type_drivers = vlantenant_network_types = vlanmechanism_drivers = openvswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300
[ovs]
bridge_mappings = physnet1:br-eth2
注意:
-
network_vlan_ranges 中的 VLAN ID 必須和物理交換機上的 VLAN ID 區間一致。
-
bridge_mappings 中所指定的 bridge 需要和在個節點上手工建立的 OVS bridge 一致。
然後重啟相應的 Neutron 服務。
2.2.2 配置生效過程
當 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在計算和網路節點上啟動時,它會根據各種配置在節點上建立各種 bridge。以 OVS Agent 為例,
(1)建立 intergration brige(預設是 br-int);如果 enable_tunneling = true 的話,建立 tunnel bridge (預設是 br-tun)。
(2)根據 bridge_mappings,配置每一個 VLAN 和 Flat 網路使用的 physical network interface 對應的預先建立的 OVS bridge。
(3)所有虛機的 VIF 都是連線到 integration bridge。同一個虛擬網路上的 VM VIF 共享一個本地 VLAN (local VLAN)。Local VLAN ID 被對映到虛擬網路對應的物理網路的 segmentation_id。
(4)對於 GRE 型別的虛擬網路,使用 LSI (Logical Switch identifier)來區分隧道(tunnel)內的租戶網路流量(tenant traffic)。這個隧道的兩端都是每個物理伺服器上的 tunneling bridge。使用 Patch port 來將 br-int 和 br-tun 連線起來。
(5)對於每一個 VLAN 或者 Flat 型別的網路,使用一個 veth 或者一個 patch port 對來連線 br-int 和物理網橋,以及增加 flow rules等。
(6)最後,Neutron L2 Agent 啟動後會執行一個RPC迴圈任務來處理 埠新增、刪除和修改。管理員可以通過配置項 polling_interval 指定該 RPC 迴圈任務的執行間隔,預設為2秒。
2.3 建立虛擬網路和子網
2.3.1 建立命令
s1@controller:~$ neutron net-create net1 (或者 Admin 使用者執行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
Created a new network:
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
| name | net1 |
| provider:network_type | vlan |
| provider:physical_network | physnet1 |
| provider:segmentation_id | 101 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 74c8ada23a3449f888d9e19b76d13aab |
+---------------------------+--------------------------------------+
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
2.3.2 Neutron程式碼實現
做完以上的步驟之後,使用者就可以在 subnet 上 boot 虛機了。
boot 虛機的過程中,Nova 依次會:
(1)呼叫 Neutron REST API 申請一個或者多個 port。Neutron 會根據資料庫中的配置來進行分配。
(2)在計算節點上,Nova 呼叫 ovs-vsctl 命令將虛機的 VIF 被 plug 到 br-int 上。
(3)啟動虛機。
Neutron L2 Agent 的迴圈任務每隔兩秒會依次:
(1)呼叫 ”ovs-vsctl list-ports“ 命令獲取到 br-int 上的 port,再根據上次儲存的歷史資料,生成所有變更埠的列表(包括新增的、更新的、刪除的埠)。比如:
{'current': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135']), 'removed': set([]), 'added': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135'])}
(2)為每一個待處理埠,根據其 ID 從 DB 中取得其詳細資訊。比如:
{u'profile': {}, u'admin_state_up': True, u'network_id': u'e2022937-ec2a-467a-8cf1-f642a3f777b6', u'segmentation_id': 4, u'device_owner': u'compute:nova', u'physical_network': phynet1, u'mac_address': u'fa:16:3e:fd:ed:22', u'device': u'592740b0-0768-4e57-870d-6495e6c22135', u'port_id': u'592740b0-0768-4e57-870d-6495e6c22135', u'fixed_ips': [{u'subnet_id': u'13888749-12b3-462e-9afe-c527bd0a297e', u'ip_address': u'91.1.180.4'}], u'network_type': u'vlan'}
(3)針對每一個增加或者變更的 port,設定 local VLAN Tag;呼叫 ”ovs-ofctl mod-flows “ 命令來設定 br-tun 或者 物理 bridge 的 flow rules;並設定 db 中其狀態為 up。
(4)針對每一個被刪除的 port,設定 db 中其狀態為 down。
2.4 Neutron虛擬網路
1)一個計算節點上的網路例項
它反映的網路配置如下:
-
Neutron 使用 Open vSiwtch。
-
一臺物理伺服器,網絡卡 eth1 接入物理交換機,預先配置了網橋 br-eth1。
-
建立了兩個 neutron VLAN network,分別使用 VLAN ID 101 和 102。
-
該伺服器上執行三個虛機,虛機1 和 2 分別有一個網絡卡接入 network 1;虛機2 和 3 分別有一個網絡卡接入 network 2.
Neutron在該計算節點上做的事情:
建立了OVS Integration bridge br-int。它的四個Access口中,兩個打上了內部vlan Tag1,連線接入network1的兩個網絡卡;另外兩個埠打上的是vlan tag 2
建立一對patch port連線br-int和br-eth1
設定br-int中的flow rules。對從access ports進入的資料幀,加上相應的vlan tag,轉發到patch port;從patch port進入的資料幀,將vlan id 101修改為1,102修改為2,再轉發到相應的access ports
設定br-eth1中的flow rules。從patch port進入的資料幀,將內部vlan id 1修改為101,內部vlan id 2修改為102,再從eth1埠發出。對從eht1進入的資料幀做相反的處理
(2)再加上另一個連線到同一個物理交換機的伺服器(加上 neutron 網路使用的 VLAN ID 為 100,物理 brige 為 br-eth0):
Neutron 實現了基於物理 VLAN 交換機的跨物理伺服器二層虛擬網路。
(3)連線到同一物理交換機的網路節點的情況
(4)網路流向
-
不同物理伺服器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那麼兩者的通訊直接經過 物理交換機 進行,不需要做到網路節點。如圖10 所示。
-
相同物理伺服器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那麼兩者的通訊直接經過 br-int 進行。
對其他虛機之間資料交換情形,都算作跨子網的資料流向,都需要經過網路節點中的 Router 進行 IP 包的路由。(也可以直接使用連線物理交換機的物理路由器)。