手把手教你 Linux 是如何實現 VLAN 的

本文首發於我的公衆號 cloud_dev,專注於乾貨分享,號內有大量書籍和視頻資源,後臺回覆「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

01 準備環境

環境:ubuntu 16.04 環境(物理 or 虛擬)

確認 CPU 是否支持虛擬化:

# egrep -o '(vmx|svm)' /proc/cpuinfo
# vmx

如果不支持,開啓 KVM 嵌套虛擬化之後再重啓。

1.1 安裝 KVM 環境

sudo apt-get install -y qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan

1.2 安裝 Ubuntu 圖形化界面

sudo apt-get install -y xinit gdm kubuntu-desktop

02 創建 KVM 虛擬機

使用 virt-manager 創建 KVM 虛擬機,方法比較簡單,由於篇幅有限,大家可以查閱相關資料自行了解。

創建完之後用 virsh list --all 查看創建的 VM:

Id    Name                           State
----------------------------------------------------
 -     kvm1                           shut off
 -     kvm2                           shut off
 -     kvm3                           shut off

我們的實驗拓撲如下:

clipboard.png

圖中創建了 2 個 Linux Bridge:brvlan1 和 brvlan2,宿主機的物理網卡 eth0 抽象出兩個虛擬設備 eth0.1 和 eth0.2,也就是兩個 VLAN 設備,它們分別定義了兩個 VLAN:VLAN1 和 VLAN2。掛接到兩個 Bridge 上的網絡設備自動加入到相應的 VLAN 中。VLAN1 接兩個 VM,VLAN 接一個 VM。

實驗的目的是要驗證屬於同一個 VLAN1 中 VM1 和 VM2 能 ping 通,而屬於不同 VLAN 中的 VM ping 不通。

03 實驗開始

3.1 配置 VLAN

編輯 /etc/network/interfaces,加入兩個 Bridge 和兩個 VLAN 設備的配置,如下:

# The primary network interface
auto ens33
iface ens33 inet dhcp

auto ens33.1
iface ens33.1 inet manual
        vlan-raw-device ens33

auto brvlan1
iface brvlan1 inet manual
        bridge_stp off
        bridge_waitport 0
        bridge_fd 0
        bridge_ports ens33.1

auto ens33.2
iface ens33.2 inet manual
        vlan-raw-device ens33

auto brvlan2
iface brvlan2 inet manual
        bridge_stp off
        bridge_waitport 0
        bridge_fd 0
        bridge_ports ens33.2

注意,這裏務必和自己電腦的接口名稱統一,比如我這裏叫 ens33,就配 ens33.1 和 ens33.2 的 VLAN 設備,當然你也可以改成 eth0 的形式。

重啓宿主機,ifconfig 查看網絡接口:

clipboard.png

brctl show 查看當前 Linux Bridge 的配置,ens33.1 和 ens33.2 分別掛載 brvlan1 和 brvlan2 上了。

# brctl show
bridge name    bridge id        STP enabled    interfaces
brvlan1        8000.000c298c57e8    no        ens33.1
brvlan2        8000.000c298c57e8    no        ens33.2
virbr0        8000.000000000000    yes

3.2 配置 VM

我們先配置 VM1,啓動 virt-manager,在圖形界面中將 VM1 的虛擬網卡掛到 brvlan1 上:

clipboard.png

同樣的方式配置 VM2 和 VM3,VM2 也配到 brvlan1 上,VM3 配到 brvlan2 上。

3.3 查看 VM 配置

virsh start xxx 啓動 3 個 VM:

# virsh start kvm1
# virsh start kvm2
# virsh start kvm3

再通過 brctl show 查看 Bridge,這時發現 brvlan1 下接了 vnet0 和 vnet1,brvlan2 下接了 vnet2:

# brctl show
bridge name    bridge id        STP enabled    interfaces
brvlan1        8000.000c298c57e8    no        ens33.1
                            vnet0
                            vnet1
brvlan2        8000.000c298c57e8    no        ens33.2
                            vnet2
virbr0        8000.000000000000    yes

通過 virsh domiflist xxx 確認這就是 VM 的虛擬網卡:

# virsh domiflist kvm1
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     brvlan1    rtl8139     52:54:00:b3:dd:3a

# virsh domiflist kvm2
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet1      bridge     brvlan1    rtl8139     52:54:00:b7:4f:ef

# virsh domiflist kvm3
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet2      bridge     brvlan2    rtl8139     52:54:00:d8:b8:2a

04 驗證

爲了驗證相同 VLAN 之間的連通性和不同 VLAN 之間的隔離性,我們爲 3 個 VM 都配置同一網段的 IP。

使用 virt-manager 進入 VM console 控制面。

配置 VM1 的 IP:

ifconfig eth0 192.168.100.10 netmask 255.255.255.0

配置 VM2 的 IP:

ifconfig eth0 192.168.100.20 netmask 255.255.255.0

配置 VM3 的 IP:

ifconfig eth0 192.168.100.30 netmask 255.255.255.0

使用 VM1 ping VM2 能 ping 通,VM2 ping VM3 不能 ping 通。

clipboard.png

驗證完畢。

大家如果有興趣,可以抓個包看看,在發送 ping 包之前,需要知道對方的 MAC 地址,所以會先在網絡中廣播 ARP 包。ARP 是二層協議,VLAN 的作用就是隔離二層的廣播域,ARP 包自然就不能在不同 VLAN 中流通,所以在相同 VLAN 中,通信雙方能夠拿到對方的 MAC 地址,也就能 ping 通,不同 VLAN 反之。


我的公衆號 cloud_dev,號內有大量書籍和視頻資源,後臺回覆「1024」即可領取,分享的內容包括但不限於雲計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎大家關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章