VLAN模式

一 二層基礎知識

1.1 vlan介紹

本小節重點:數據庫

  • vlan的含義
  • vlan的類型
  • 交換機端口類型
  • vlan的不足

1.1.1:vlan的含義

  局域網LAN的發展是VLAN產生的基礎,於是先介紹一下局域網LANvim

  由Hub、網橋或交換機等網絡設備鏈接同一網段內的全部節點造成局域網(LAN),一般是一個單獨的廣播域。緩存

  處於同一個局域網LAN以內的網絡節點之間能夠直接通訊服務器

  處於不一樣局域網段的設備之間的通訊則必須通過路由器才能通訊。網絡


  上述傳統拓撲結構的關鍵在於用三層設備,即路由器,來隔離不一樣的LAN,在網絡規模增大的狀況下存在兩個缺陷: 
  1. 路由器數量須要增多,網絡時延隨之加長,進而致使網絡數據傳輸速度的降低。這主要是由於數據在從一個局域網傳遞到另外一個局域網時,必須通過路由器的路由操做: 路由器根據數據包中的相應信息肯定數據包的目標地址,而後再選擇合適的路徑轉發出去。 
  
  2. 用戶是按照它們的物理鏈接被天然地劃分到不一樣的用戶組(廣播域)中。這種分割方式並非根據工做組中全部用戶的共同須要和帶寬的需求來進行的。所以,儘管不一樣的工做組或部門對帶寬的需求有很大的差別,但它們卻被機械地劃分到同一個廣播域中爭用相同的帶寬。 
  app

  綜上兩點,必須選出一種隔離廣播域的方式,兼備下述兩點ide

  1.能夠不用經過路由器來隔離不一樣廣播域  學習

  2.能夠突破地理位置的限制,在邏輯上劃分出不一樣的廣播域spa

  這就是VLAN,IEEE 802.1Q 標準定義了 VLAN Header 的格式。它在普通以太網幀結構的 SA (src addr)以後加入了 4bytes 的 VLAN Tag/Header 數據,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值爲4096,可是有效值範圍是 1 - 4094。3d

帶 VLAN 的交換機的端口分爲兩類:

  • Access port:這些端口被打上了 VLAN Tag。離開交換機的 Access port 進入計算機的以太幀中沒有 VLAN Tag,這意味着鏈接到 access ports 的機器不會覺察到 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。

上圖中,兩個交換機上的端口8 支持 VLAN 1 和 2, 所以一根線就能夠了實現跨交換機的同VLAN 內的計算機互相通訊了。 

1.1.3:vlan的不足

  1. VLAN 使用 12-bit 的 VLAN ID,因此 VLAN 的第一個不足之處就是它最多隻支持 4096 個 VLAN 網絡(固然這還要除去幾個預留的),對於大型數據中心的來講,這個數量是遠遠不夠的。
  2. VLAN 是基於 L2 的,因此很難跨越 L2 的邊界,在很大程度上限制了網絡的靈活性。
  3. VLAN 操做需手工介入較多,這對於管理成千上萬臺機器的管理員來講是難以接受的。

1.2 : 二層交換的基礎知識

1.2.1:二層交換機最基本的功能

二層交換機最基本的功能包括:

  • MAC 地址學習:當交換機從它的某個端口收到數據幀時,它將端口的 ID 和幀的源 MAC 地址保存到它的內部MAC表中。這樣,當未來它收到一個要轉發到該 MAC 地址的幀時,它就知道直接從該端口轉發出去了。
  • 數據幀轉發:交換機在將從某個端口收到數據幀,再將其從某個端口轉發出去以前,它會作一些邏輯判斷:
    • 若是幀的目的 MAC 地址是廣播或者多播地址的話,將其從交換機的全部端口(除了傳入端口)上轉發。
    • 若是幀的目的MAC地址在它的內部MAC表中能找到對應的輸出端口的話(MAC 地址學習過程當中保存的),將其從該端口上轉發出去。
    • 對其它狀況,將其從交換機的全部端口(除了傳入端口)上轉發。
  • 加 VLAN 標籤/去 VLAN 標籤:
    • 幀接收:從 trunk port 上收到的數據幀必須是加了標籤的。從 access port 上收到的數據幀必須是沒有加標籤的,不然該幀將會被拋棄。
    • 幀處理:根據上述轉發流程決定其發出的端口。
    • 幀發出:從 trunk port 發出的幀是加了標籤的。從 access port 上發出的幀必須是沒加標籤的。

 默認狀況下,交換機的全部端口都處於VLAN 1 中,也就至關於沒有配置 VLAN。該機制說明以下:

  1. PC A 發一個幀到交換機的 1 端口,其目的MAC地址爲 PC B 的 MAC。
  2. 交換機比較其目的 MAC 地址和它的內部 MAC Table,發現它不存在(此時表爲空)。在決定泛洪以前,它把端口 1 和 PC A 的 MAC 地址存進它的 MAC Table。
  3. 交換機將幀拷貝多份,分別從2和3端口發出。
  4. PC B 收到該幀之後,發現其目的 MAC 地址和他本身的 MAC 地址相同。它發出一個回覆幀進入端口3。
  5. 交換機將 PC B 的 MAC地址和端口3 存在它的 MAC 表中。
  6. 由於該幀的目的地址爲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 區域:

  1. 管理網絡,用於 OpenStack 節點之間的通訊,假設 VLAN ID 範圍爲 50 - 99.
  2. 數據網絡,用於虛擬機之間的通信。因爲Vlan模式下,租戶創建的網絡都具備獨立的 Vlan ID,故須要將鏈接虛機的服務器的交換機端口設置爲 Trunk 模式,而且設置所容許的 VLAN ID 範圍,好比 100~300。
  3. 外部網絡,用於鏈接外部網絡。加上 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 = vlan
mechanism_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-eth2
ovs-vsctl add-br br-ex ovs-vsctl add-port br-eth2 eth2
ovs-vsctl add-port br-ex eth3 # vim /etc/neutron/plugins/ml2/ml2_conf.ini
[m12] type_drivers = flat,vlan
tenant_network_types = vlan
mechanism_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 = vlan
tenant_network_types = vlan
mechanism_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:Neturon虛擬網絡

(1)一個計算節點上的網絡實例

它反映的網絡配置以下:

  1. Neutron 使用 Open vSiwtch。
  2. 一臺物理服務器,網卡 eth1 接入物理交換機,預先配置了網橋 br-eth1。
  3. 建立了兩個 neutron VLAN network,分別使用 VLAN ID 101 和 102。
  4. 該服務器上運行三個虛機,虛機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 包的路由。(也能夠直接使用鏈接物理交換機的物理路由器)。

相關文章
相關標籤/搜索