Linux 如何實現 VLAN
LAN 表示 Local Area Network,本地局域網,通常使用 Hub 和 Switch 來連接 LAN 中的計算機。
一般來說,兩臺計算機連入同一個 Hub 或者 Switch 時,它們就在同一個 LAN 中。
一個 LAN 表示一個廣播域。 其含義是:LAN 中的所有成員都會收到任意一個成員發出的廣播包。
VLAN 表示 Virtual LAN。一個帶有 VLAN 功能的switch 能夠將自己的端口劃分出多個 LAN。
計算機發出的廣播包可以被同一個 LAN 中其他計算機收到,但位於其他 LAN 的計算機則無法收到。
簡單地說,VLAN 將一個交換機分成了多個交換機,限制了廣播的範圍,在二層將計算機隔離到不同的 VLAN 中。
比方說,有兩組機器,Group A 和 B。
我們想配置成 Group A 中的機器可以相互訪問,Group B 中的機器也可以相互訪問,但是 A 和 B 中的機器無法互相訪問。
一種方法是使用兩個交換機,A 和 B 分別接到一個交換機。
另一種方法是使用一個帶 VLAN 功能的交換機,將 A 和 B 的機器分別放到不同的 VLAN 中。
請註意,VLAN 的隔離是二層上的隔離,A 和 B 無法相互訪問指的是二層廣播包(比如 arp)無法跨越 VLAN 的邊界。
但在三層上(比如IP)是可以通過路由器讓 A 和 B 互通的。概念上一定要分清。
現在的交換機幾乎都是支持 VLAN 的。 通常交換機的端口有兩種配置模式: Access 和 Trunk。看下圖
Access 口
這些端口被打上了 VLAN 的標簽,表明該端口屬於哪個 VLAN。
不同 VLAN 用 VLAN ID 來區分,VLAN ID 的 範圍是 1-4096。
Access 口都是直接與計算機網卡相連的,這樣從該網卡出來的數據包流入 Access 口後就被打上了所在 VLAN 的標簽。
Access 口只能屬於一個 VLAN。
Trunk 口
假設有兩個交換機 A 和 B。
A 上有 VLAN1(紅)、VLAN2(黃)、VLAN3(藍);B 上也有 VLAN1、2、3
那如何讓 AB 上相同 VLAN 之間能夠通信呢?
辦法是將 A 和 B 連起來,而且連接 A 和 B 的端口要允許 VLAN1、2、3 三個 VLAN 的數據都能夠通過。
這樣的端口就是Trunk口了。
VLAN1、2、3 的數據包在通過 Trunk 口到達對方交換機的過程中始終帶著自己的 VLAN 標簽。
了解了 VLAN 的概念之後,我們來看 KVM 虛擬化環境下是如何實現 VLAN 的。還是先看圖,
eth0 是宿主機上的物理網卡,有一個命名為 eth0.10 的子設備與之相連。 eth0.10 就是 VLAN 設備了,其 VLAN ID 就是 VLAN 10。 eth0.10 掛在命名為 brvlan10 的 Linux Bridge 上,虛機 VM1 的虛擬網卡 vent0 也掛在 brvlan10 上。
這樣的配置其效果就是:
宿主機用軟件實現了一個交換機(當然是虛擬的),上面定義了一個 VLAN10。
eth0.10,brvlan10 和 vnet0 都分別接到 VLAN10 的 Access口上。而 eth0 就是一個 Trunk 口。
VM1 通過 vnet0 發出來的數據包會被打上 VLAN10 的標簽。
eth0.10 的作用是:定義了 VLAN10 brvlan10 的作用是:Bridge 上的其他網絡設備自動加入到 VLAN10 中
我們再增加一個 VLAN20,見下圖
這樣虛擬交換機就有兩個 VLAN 了,VM1 和 VM2 分別屬於 VLAN10 和 VLAN20。 對於新創建的虛機,只需要將其虛擬網卡放入相應的 Bridge,就能控制其所屬的 VLAN。
VLAN 設備總是以母子關系出現,母子設備之間是一對多的關系。
一個母設備(eth0)可以有多個子設備(eth0.10,eth0.20 ……),而一個子設備只有一個母設備。
下一節我們通過實驗來實踐 VLAN。
Linux 如何實現 VLAN