本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「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
我們的實驗拓撲如下:
圖中創建了 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
查看網絡接口:
用 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 上:
同樣的方式配置 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 通。
驗證完畢。
大家如果有興趣,可以抓個包看看,在發送 ping 包之前,需要知道對方的 MAC 地址,所以會先在網絡中廣播 ARP 包。ARP 是二層協議,VLAN 的作用就是隔離二層的廣播域,ARP 包自然就不能在不同 VLAN 中流通,所以在相同 VLAN 中,通信雙方能夠拿到對方的 MAC 地址,也就能 ping 通,不同 VLAN 反之。
我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。