計算機網絡VLAN模式

一 二層基礎知識
1.1 vlan介紹
1.1.1:vlan的含義
1.1.2:vlan的類型
1.1.3:vlan的不足
1.2 : 二層交換的基礎知識
1.2.1:二層交換機最基本的功能
1.2.2:ARP協(xié)議
二 使用OpenvSwitch(OVS)+VLAN組網
2.1 物理VLAN網絡配置
2.2 Neutron配置
2.2.1 配置進行
2.2.2 配置生效過程
2.3:創(chuàng)建虛擬網絡和子網
2.3.1 創(chuàng)建命令
2.3.2 Neutron代碼實現(xiàn)
2.4:Neturon虛擬網絡
一 二層基礎知識
1.1 vlan介紹
本小節(jié)重點:

vlan的含義
vlan的類型
交換機端口類型
vlan的不足
1.1.1:vlan的含義
  局域網LAN的發(fā)展是VLAN產生的基礎,因而先介紹一下局域網LAN

由Hub、網橋或交換機等網絡設備連接同一網段內的所有節(jié)點形成局域網(LAN),通常是一個單獨的廣播域。

處于同一個局域網LAN之內的網絡節(jié)點之間可以直接通信

處于不同局域網段的設備之間的通信則必須經過路由器才能通信。

上述傳統(tǒng)拓撲結構的關鍵在于用三層設備,即路由器,來隔離不同的LAN,在網絡規(guī)模增大的情況下存在兩個缺陷:
  1. 路由器數量需要增多,網絡時延隨之加長,進而導致網絡數據傳輸速度的下降。這主要是因為數據在從一個局域網傳遞到另一個局域網時,必須經過路由器的路由操作: 路由器根據數據包中的相應信息確定數據包的目標地址,然后再選擇合適的路徑轉發(fā)出去。
  
  2. 用戶是按照它們的物理連接被自然地劃分到不同的用戶組(廣播域)中。這種分割方式并不是根據工作組中所有用戶的共同需要和帶寬的需求來進行的。因此,盡管不同的工作組或部門對帶寬的需求有很大的差異,但它們卻被機械地劃分到同一個廣播域中爭用相同的帶寬。

綜上兩點,必須選出一種隔離廣播域的方式,兼?zhèn)湎率鰞牲c

1.可以不用通過路由器來隔離不同廣播域

2.可以突破地理位置的限制,在邏輯上劃分出不同的廣播域

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



帶 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 發(fā)出和收到的數據包都帶有 VLAN header,該 header 表明了該數據包屬于那個 VLAN。因此,只需要分別連接兩個交換機的一個 trunk port 就可以轉發(fā)所有的數據包了。通常來講,只使用 trunk port 連接兩個交換機,而不是用來連接機器和交換機,因為機器不想看到它們收到的數據包帶有 VLAN Header。

單臺交換機上劃分VLAN




多臺交換機上劃分VLAN



1.1.2:vlan的類型

(1)基于端口的 VLAN (untagged VLAN - 端口屬于一個VLAN,數據幀中沒有VLAN tag)

這種模式中,在交換機上創(chuàng)建若干個VLAN,在將若干端口放在每個VLAN 中。每個端口在某一時刻只能屬于一個VLAN。一個 VLAN 可以包含所有端口,或者部分端口。每個端口有個PVID (port VLAN identifier)。這種模式下,一個端口上收到的 frame 是 untagged frame,因此它不包含任何有關 VLAN 的信息。VLAN 的關系只能從端口的 PVID 上看出來。交換機在轉發(fā) frame 時,只將它轉發(fā)到相同 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 的幀,它只將它轉發(fā)給具有同樣 VID 的端口。一個能夠接收或者轉發(fā) tagged frame 的端口被稱為 a tagged port。所有連接到這種端口的網絡設備必須是 802.1Q 協(xié)議兼容的。這種設備必須能處理 tagged frame,以及添加 tag 到其轉發(fā)的 frame。


上圖中,兩個交換機上的端口8 支持 VLAN 1 和 2, 因此一根線就可以了實現(xiàn)跨交換機的同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表中。這樣,當將來它收到一個要轉發(fā)到該 MAC 地址的幀時,它就知道直接從該端口轉發(fā)出去了。
  • 數據幀轉發(fā):交換機在將從某個端口收到數據幀,再將其從某個端口轉發(fā)出去之前,它會做一些邏輯判斷:
    如果幀的目的 MAC 地址是廣播或者多播地址的話,將其從交換機的所有端口(除了傳入端口)上轉發(fā)。
    如果幀的目的MAC地址在它的內部MAC表中能找到對應的輸出端口的話(MAC 地址學習過程中保存的),將其從該端口上轉發(fā)出去。
    對其它情況,將其從交換機的所有端口(除了傳入端口)上轉發(fā)。
  • 加 VLAN 標簽/去 VLAN 標簽:
    幀接收:從 trunk port 上收到的數據幀必須是加了標簽的。從 access port 上收到的數據幀必須是沒有加標簽的,否則該幀將會被拋棄。
    幀處理:根據上述轉發(fā)流程決定其發(fā)出的端口。
    幀發(fā)出:從 trunk port 發(fā)出的幀是加了標簽的。從 access port 上發(fā)出的幀必須是沒加標簽的。
    默認情況下,交換機的所有端口都處于VLAN 1 中,也就相當于沒有配置 VLAN。該機制說明如下:


1.PC A 發(fā)一個幀到交換機的 1 端口,其目的MAC地址為 PC B 的 MAC。
2.交換機比較其目的 MAC 地址和它的內部 MAC Table,發(fā)現(xiàn)它不存在(此時表為空)。在決定泛洪之前,它把端口 1 和 PC A 的 MAC 地址存進它的 MAC Table。
3.交換機將幀拷貝多份,分別從2和3端口發(fā)出。
4.PC B 收到該幀以后,發(fā)現(xiàn)其目的 MAC 地址和他自己的 MAC 地址相同。它發(fā)出一個回復幀進入端口3。
5.交換機將 PC B 的 MAC地址和端口3 存在它的 MAC 表中。
6.因為該幀的目的地址為PC A 的 MAC 地址它已經在 MAC 表中,交換機直接將它轉發(fā)到端口1,達到PC A。
配置了 VLAN 的交換機的該機制類似,只不過:

(1)MAC 表格中每一行有不同的 VLAN ID。做比較的時候,拿傳入幀的目的 MAC 地址和 VLAN ID 和此表中的行數據相比較。如果都相同,則選擇其 Ports 作為轉發(fā)出口端口。


(2)如果沒有吻合的表項,則將此幀從所有有同樣 VLAN ID 的 Access ports 和 Trunk ports 轉發(fā)出去。

1.2.2:ARP協(xié)議
二層網絡使用 MAC (media access control address)地址作為硬件的唯一標識?;?TCP/IP 協(xié)議的軟件使用 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 協(xié)議棧知道通過B 的 IP 地址可以直接到達 B。A 檢查它的本地 ARP 緩存來看B 的 MAC 地址是否已經存在。
(2)如果A 沒有發(fā)現(xiàn)B 的 MAC 地址,它發(fā)出一個 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 發(fā)現(xiàn)其IP 地址和 DST IP 相同,它將 A 的 IP/MAP 地址加入到自己的ARP 緩存中。
(4)B 發(fā)出一個 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 地址發(fā)出 IP 包。

  1. 目的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 協(xié)議知道需要通過它上面配置的 gateway 10.0.0.1 才能到達到 B。經過上面例子中的步驟,A 會得到 10.0.0.1 的 MAC 地址。
(2)當 A 收到 Router interface 1 的 MAC 地址后,A 發(fā)出了給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 地址,然后將包發(fā)給它。
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 區(qū)域:

  1. 管理網絡,用于 OpenStack 節(jié)點之間的通信,假設 VLAN ID 范圍為 50 - 99.
  2. 數據網絡,用于虛擬機之間的通訊。由于Vlan模式下,租戶建立的網絡都具有獨立的 Vlan ID,故需要將連接虛機的服務器的交換機端口設置為 Trunk 模式,并且設置所允許的 VLAN ID 范圍,比如 100~300。
  3. 外部網絡,用于連接外部網絡。加上 VLAN ID 范圍為 1000-1010。


關于網段之間的路由:

  • 如果該物理交換機接到一個物理路由器并做相應的配置,則數據網絡可以使用這個物理路由器,而不需要使用 Neutron 的虛擬路由器。
  • 如果不使用物理的路由器,可以在網絡節(jié)點上配置虛擬路由器。

2.2 Neutron配置
2.2.1 配置進行
控制節(jié)點上:

# 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

網絡節(jié)點上:

#為連接物理交換機的網卡 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

計算節(jié)點上:

#為連接物理交換機的網卡 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 區(qū)間一致。
  • bridge_mappings 中所指定的 bridge 需要和在個節(jié)點上手工創(chuàng)建的 OVS bridge 一致。
    然后重啟相應的 Neutron 服務。

2.2.2 配置生效過程
當 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在計算和網絡節(jié)點上啟動時,它會根據各種配置在節(jié)點上創(chuàng)建各種 bridge。以 OVS Agent 為例,

(1)創(chuàng)建 intergration brige(默認是 br-int);如果 enable_tunneling = true 的話,創(chuàng)建 tunnel bridge (默認是 br-tun)。

(2)根據 bridge_mappings,配置每一個 VLAN 和 Flat 網絡使用的 physical network interface 對應的預先創(chuàng)建的 OVS bridge。

(3)所有虛機的 VIF 都是連接到 integration bridge。同一個虛擬網絡上的 VM VIF 共享一個本地 VLAN (local VLAN)。Local VLAN ID 被映射到虛擬網絡對應的物理網絡的 segmentation_id。

(4)對于 GRE 類型的虛擬網絡,使用 LSI (Logical Switch identifier)來區(qū)分隧道(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循環(huán)任務來處理 端口添加、刪除和修改。管理員可以通過配置項 polling_interval 指定該 RPC 循環(huán)任務的執(zhí)行間隔,默認為2秒。

2.3:創(chuàng)建虛擬網絡和子網
2.3.1 創(chuàng)建命令

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代碼實現(xiàn)
做完以上的步驟之后,用戶就可以在 subnet 上 boot 虛機了。

boot 虛機的過程中,Nova 依次會:

(1)調用 Neutron REST API 申請一個或者多個 port。Neutron 會根據數據庫中的配置來進行分配。

(2)在計算節(jié)點上,Nova 調用 ovs-vsctl 命令將虛機的 VIF 被 plug 到 br-int 上。

(3)啟動虛機。

Neutron L2 Agent 的循環(huán)任務每隔兩秒會依次:

(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 中其狀態(tài)為 up。

(4)針對每一個被刪除的 port,設置 db 中其狀態(tài)為 down。



2.4:Neturon虛擬網絡
(1)一個計算節(jié)點上的網絡實例

它反映的網絡配置如下:

Neutron 使用 Open vSiwtch。
一臺物理服務器,網卡 eth1 接入物理交換機,預先配置了網橋 br-eth1。
創(chuàng)建了兩個 neutron VLAN network,分別使用 VLAN ID 101 和 102。
該服務器上運行三個虛機,虛機1 和 2 分別有一個網卡接入 network 1;虛機2 和 3 分別有一個網卡接入 network 2.

Neutron在該計算節(jié)點上做的事情:

創(chuàng)建了OVS Integration bridge br-int。它的四個Access口中,兩個打上了內部vlan Tag1,連接接入network1的兩個網卡;另外兩個端口打上的是vlan tag 2

創(chuàng)建一對patch port連接br-int和br-eth1

設置br-int中的flow rules。對從access ports進入的數據幀,加上相應的vlan tag,轉發(fā)到patch port;從patch port進入的數據幀,將vlan id 101修改為1,102修改為2,再轉發(fā)到相應的access ports

設置br-eth1中的flow rules。從patch port進入的數據幀,將內部vlan id 1修改為101,內部vlan id 2修改為102,再從eth1端口發(fā)出。對從eht1進入的數據幀做相反的處理

(2)再加上另一個連接到同一個物理交換機的服務器(加上 neutron 網絡使用的 VLAN ID 為 100,物理 brige 為 br-eth0):

Neutron 實現(xiàn)了基于物理 VLAN 交換機的跨物理服務器二層虛擬網絡。

(3)連接到同一物理交換機的網絡節(jié)點的情況


(4)網絡流向

  • 不同物理服務器上的虛機,如果 VM1 和 VM2 屬于同一個 tenant network 的同一個subnet,那么兩者的通信直接經過 物理交換機 進行,不需要做到網絡節(jié)點。如圖10 所示。
  • 相同物理服務器上的虛機,如果 VM1 和 VM2 屬于同一個 tenant network 的同一個subnet,那么兩者的通信直接經過 br-int 進行。


對其他虛機之間數據交換情形,都算作跨子網的數據流向,都需要經過網絡節(jié)點中的 Router 進行 IP 包的路由。(也可以直接使用連接物理交換機的物理路由器)。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容