一、Linux Bridge網(wǎng)橋管理
網(wǎng)絡(luò)虛擬化是虛擬化技術(shù)中最復(fù)雜的部分,也是非常重要的資源。
第一節(jié)中我們創(chuàng)建了一個(gè)名為br0的linux-bridge網(wǎng)橋,如果在此網(wǎng)橋上新建一臺vm,如下圖:

VM2 的虛擬網(wǎng)卡 vnet1 也連接到了 br0 上。 現(xiàn)在 VM1 和 VM2 之間可以通信,同時(shí) VM1 和 VM2 也都可以與外網(wǎng)通信。
查看網(wǎng)絡(luò)狀態(tài):

用brctl show 顯示當(dāng)前網(wǎng)橋連接狀態(tài):

brctl命令:

二、Vlan介紹
LAN 表示 Local Area Network,本地局域網(wǎng),通常使用 Hub 和 Switch 來連接 LAN 中的計(jì)算機(jī)。一般來說,兩臺計(jì)算機(jī)連入同一個(gè) Hub 或者 Switch 時(shí),它們就在同一個(gè) LAN 中。
一個(gè) LAN 表示一個(gè)廣播域。 其含義是:LAN 中的所有成員都會收到任意一個(gè)成員發(fā)出的廣播包。
VLAN 表示 Virtual LAN。一個(gè)帶有 VLAN 功能的switch 能夠?qū)⒆约旱亩丝趧澐殖龆鄠€(gè) LAN。計(jì)算機(jī)發(fā)出的廣播包可以被同一個(gè) LAN 中其他計(jì)算機(jī)收到,但位于其他 LAN 的計(jì)算機(jī)則無法收到。 簡單地說,VLAN 將一個(gè)交換機(jī)分成了多個(gè)交換機(jī),限制了廣播的范圍,在二層將計(jì)算機(jī)隔離到不同的 VLAN 中。
比方說,有兩組機(jī)器,Group A 和 B,我們想配置成 Group A 中的機(jī)器可以相互訪問,Group B 中的機(jī)器也可以相互訪問,但是 A 和 B 中的機(jī)器無法互相訪問。 一種方法是使用兩個(gè)交換機(jī),A 和 B 分別接到一個(gè)交換機(jī)。 另一種方法是使用一個(gè)帶 VLAN 功能的交換機(jī),將 A 和 B 的機(jī)器分別放到不同的 VLAN 中。
VLAN 的隔離是二層上的隔離,A 和 B 無法相互訪問指的是二層廣播包(比如 arp)無法跨越 VLAN 的邊界。但在三層上(比如IP)是可以通過路由器讓 A 和 B 互通的。
現(xiàn)在的交換機(jī)幾乎都是支持 VLAN 的。 通常交換機(jī)的端口有兩種配置模式: Access 和 Trunk。如下圖

Access 口
這些端口被打上了 VLAN 的標(biāo)簽,表明該端口屬于哪個(gè) VLAN。 不同 VLAN 用 VLAN ID 來區(qū)分,VLAN ID 的 范圍是 1-4096。 Access 口都是直接與計(jì)算機(jī)網(wǎng)卡相連的,這樣從該網(wǎng)卡出來的數(shù)據(jù)包流入 Access 口后就被打上了所在 VLAN 的標(biāo)簽。 Access 口只能屬于一個(gè) VLAN。
Trunk 口
假設(shè)有兩個(gè)交換機(jī) A 和 B。 A 上有 VLAN1(紅)、VLAN2(黃)、VLAN3(藍(lán));B 上也有 VLAN1、2、3,那如何讓 AB 上相同 VLAN 之間能夠通信呢?
辦法是將 A 和 B 連起來,而且連接 A 和 B 的端口要允許 VLAN1、2、3 三個(gè) VLAN 的數(shù)據(jù)都能夠通過。這樣的端口就是Trunk口了。 VLAN1, 2, 3 的數(shù)據(jù)包在通過 Trunk 口到達(dá)對方交換機(jī)的過程中始終帶著自己的 VLAN 標(biāo)簽。
三、Linux Bridge實(shí)現(xiàn)Vlan原理
KVM 虛擬化環(huán)境下實(shí)現(xiàn) VLAN 架構(gòu),如下圖

eth0 是宿主機(jī)上的物理網(wǎng)卡,有一個(gè)命名為 eth0.10 的子設(shè)備與之相連。 eth0.10 就是 VLAN 設(shè)備了,其 VLAN ID 就是 VLAN 10。 eth0.10 掛在命名為 brvlan10 的 Linux Bridge 上,虛機(jī) VM1 的虛擬網(wǎng)卡 vent0 也掛在 brvlan10 上。
這樣的配置其效果就是: 宿主機(jī)用軟件實(shí)現(xiàn)了一個(gè)交換機(jī)(當(dāng)然是虛擬的),上面定義了一個(gè) VLAN10。 eth0.10,brvlan10 和 vnet0 都分別接到 VLAN10 的 Access口上。而 eth0 就是一個(gè) Trunk 口。VM1 通過 vnet0 發(fā)出來的數(shù)據(jù)包會被打上 VLAN10 的標(biāo)簽。
eth0.10 的作用是:定義了 VLAN10
brvlan10 的作用是:Bridge 上的其他網(wǎng)絡(luò)設(shè)備自動加入到 VLAN10 中
增加一個(gè) VLAN20,如下圖

這樣虛擬交換機(jī)就有兩個(gè) VLAN 了,VM1 和 VM2 分別屬于 VLAN10 和 VLAN20。
對于新創(chuàng)建的虛機(jī),只需要將其虛擬網(wǎng)卡放入相應(yīng)的 Bridge,就能控制其所屬的 VLAN。
VLAN 設(shè)備總是以母子關(guān)系出現(xiàn),母子設(shè)備之間是一對多的關(guān)系。 一個(gè)母設(shè)備(eth0)可以有多個(gè)子設(shè)備(eth0.10,eth0.20 ……),而一個(gè)子設(shè)備只有一個(gè)母設(shè)備。
四、Linux Bridge實(shí)現(xiàn)Vlan
(1)查看核心是否提供VLAN 功能,執(zhí)行
dmesg | grep -i 802
或者檢查/proc/net/vlan目錄是否存在。
如果沒有提供VLAN 功能,/proc/net/vlan目錄是不存在的。

如果8021q模塊沒有載入系統(tǒng),則可以通過使用modprobe模組命令載入802.1q模組,並且利用lsmod命令確認(rèn)模組是否已經(jīng)載入到核心內(nèi)。
modprobe 8021q
lsmod | grep 8021q

設(shè)置開機(jī)載入8021q模塊(可選)
在/etc/sysconfig/modules下增加一個(gè)8021q.modules文件,文件內(nèi)容為modprobe 8021q
vi /etc/sysconfig/modules/8021q.modules
modprobe 8021q
(2)安裝查看用于查看Vlan配置的工具————vconfig
提前裝備好vconfig-1.9-16.el7.x86_64.rpm
rpm -ivh vconfig-1.9-16.el7.x86_64.rpm
rpm -qa vconfig

(3)創(chuàng)建vlan接口
創(chuàng)建vlan接口前,在設(shè)備上添加一塊網(wǎng)卡ens34,
網(wǎng)絡(luò)配置如右圖:

注意:
將BOOTPROTO=static
基于網(wǎng)卡ens34建立vlan10,vlan20接口:ens34.10,ens34.20:
vconfig add ens34 10
vconfig add ens34 20


cd /etc/sysconfig/network-scripts/
cp ifcfg-ens34 ifcfg-ens34.10 -- 創(chuàng)建ens33.10接口配置文件
編輯ifcfg-ens34.10文件,增加/修改下面內(nèi)容:
vim ifcfg-ens34.10
VLAN=yes
TYPE=vlan
PHYSDEV=ens34
VLAN_ID=10
NAME=ens34.10
ONBOOT=yes
ZONE=trusted
DEVICE=ens34.10
BRIDGE=brvlan-10
cp ifcfg-ens34.10 ifcfg-ens34.20
編輯ifcfg-ens34.20文件,增加/修改下面內(nèi)容:
vim ifcfg-ens34.20
VLAN=yes
TYPE=vlan
PHYSDEV=ens34
VLAN_ID=20
NAME=ens34.20
ONBOOT=yes
ZONE=trusted
DEVICE=ens34.20
BRIDGE=brvlan-20
(4)分別建立網(wǎng)橋brvlan-10,brvlan-20
brctl addbr brvlan-10
brctl addbr brvlan-20

(5)編輯網(wǎng)橋brvlan-10配置文件:
vim ifcfg-brvlan-10
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-10
DEVICE=brvlan-10
ONBOOT=yes
編輯網(wǎng)橋brvlan-20配置文件:
vim ifcfg-brvlan-20
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-20
DEVICE=brvlan-20
ONBOOT=yes
(6)將網(wǎng)橋brvlan-10接到網(wǎng)口ens34.10,brvlan-20接到網(wǎng)口ens34.20
brctl addif brvlan-10 ens34.10
brctl addif brvlan-20 ens34.20

(7)重新啟動網(wǎng)絡(luò)服務(wù)
systemctl restart network

五、Vlan模式測試虛機(jī)
先將NetworkManager服務(wù)關(guān)閉
(1)在宿主機(jī)中已經(jīng)提前創(chuàng)建好了虛機(jī) VM1
在 virt-manager 中將 VM1 的虛擬網(wǎng)卡掛到 brvlan-10 上

(2)從VM1克隆一臺虛機(jī)VM2
virst-clone -o vm1 -n vm2 -f /var/lib/libvirt/images/vm2.qcow2
(3)啟動VM1和VM2,并配置ip
(4)查看 Bridge,發(fā)現(xiàn) brvlan10 已經(jīng)連接了 vnet0 vnet1設(shè)備。

六、網(wǎng)卡配置bond(綁定)
(1)網(wǎng)卡bond(綁定),也稱作網(wǎng)卡捆綁。就是將兩個(gè)或者更多的物理網(wǎng)卡綁定成一個(gè)虛擬網(wǎng)卡。網(wǎng)卡是通過把多張網(wǎng)卡綁定為一個(gè)邏輯網(wǎng)卡,實(shí)現(xiàn)本地網(wǎng)卡的冗余,帶寬擴(kuò)容和負(fù)載均衡,在應(yīng)用部署中是一種常用的技術(shù)。
多網(wǎng)卡綁定實(shí)際上需要提供一個(gè)額外的軟件的bond驅(qū)動程序?qū)崿F(xiàn)。通過驅(qū)動程序可以將多塊網(wǎng)卡屏蔽。對TCP/IP協(xié)議層只存在一個(gè)Bond網(wǎng)卡,在Bond程序中實(shí)現(xiàn)網(wǎng)絡(luò)流量的負(fù)載均衡,即將一個(gè)網(wǎng)絡(luò)請求重定位到不同的網(wǎng)卡上,來提高總體網(wǎng)絡(luò)的可用性。
(2)網(wǎng)卡綁定的目的:
1.提高網(wǎng)卡的吞吐量。
2.增強(qiáng)網(wǎng)絡(luò)的高可用,同時(shí)也能實(shí)現(xiàn)負(fù)載均衡。
(3)網(wǎng)卡配置bond(綁定)bond模式:
1、Mode=0(balance-rr) 表示負(fù)載分擔(dān)round-robin,平衡輪詢策略,具有負(fù)載平衡和容錯功能
bond的網(wǎng)卡MAC為當(dāng)前活動的網(wǎng)卡的MAC地址,需要交換機(jī)設(shè)置聚合模式,將多個(gè)網(wǎng)卡綁定為一條鏈路。
2、Mode=1(active-backup) 表示主備模式,具有容錯功能,只有一塊網(wǎng)卡是active,另外一塊是備的standby,這時(shí)如果交換機(jī)配的是捆綁,將不能正常工作,因?yàn)榻粨Q機(jī)往兩塊網(wǎng)卡發(fā)包,有一半包是丟棄的。
3、Mode=2(balance-xor) 表示XOR Hash負(fù)載分擔(dān)(異或平衡策略),具有負(fù)載平衡和容錯功能
每個(gè)slave接口傳輸每個(gè)數(shù)據(jù)包和交換機(jī)的聚合強(qiáng)制不協(xié)商方式配合。(需要xmit_hash_policy)。
4、Mode=3(broadcast) 表示所有包從所有interface發(fā)出,廣播策略,具有容錯能力,這個(gè)不均衡,只有冗余機(jī)制...和交換機(jī)的聚合強(qiáng)制不協(xié)商方式配合。
5、Mode=4(802.3ad) 表示支持802.3ad協(xié)議(IEEE802.3ad 動態(tài)鏈接聚合) 和交換機(jī)的聚合LACP方式配合(需要xmit_hash_policy)。
6、Mode=5(balance-tlb) 適配器傳輸負(fù)載均衡,并行發(fā)送,無法并行接收,解決了數(shù)據(jù)發(fā)送的瓶頸。 是根據(jù)每個(gè)slave的負(fù)載情況選擇slave進(jìn)行發(fā)送,接收時(shí)使用當(dāng)前輪到的slave。
7、Mode=6(balance-alb) 在5的tlb基礎(chǔ)上增加了rlb。適配器負(fù)載均衡模式并行發(fā)送,并行接收數(shù)據(jù)包。
5和6不需要交換機(jī)端的設(shè)置,網(wǎng)卡能自動聚合。4需要支持802.3ad。0,2和3理論上需要靜態(tài)聚合方式,但實(shí)測中0可以通過mac地址欺騙的方式在交換機(jī)不設(shè)置的情況下不太均衡地進(jìn)行接收。
常用的有三種:
mode=0:平衡負(fù)載模式,有自動備援,但需要”Switch”支援及設(shè)定。
mode=1:自動備援模式,其中一條線若斷線,其他線路將會自動備援。
mode=6:平衡負(fù)載模式,有自動備援,不必”Switch”支援及設(shè)定。
(4)網(wǎng)卡配置bond(綁定)
1、eth1,eth2,eth3都配置綁定為bond0,例如:
cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
載入bond模塊:
modprobe bonding
2、查看bond0,并橋接到br1
cat ifcfg-bond0
DEVICE=bond0
TYPE=Bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
BONDING_OPTS="mode=6 miimon=100"
BRIDGE=br1
3、查看網(wǎng)橋br0
cat ifcfg-br1
TYPE=Bridge
DEVICE=br1
ONBOOT=yes
IPADDR=192.168.10.1
IPADDR1=192.168.20.1
IPADDR2=192.168.30.1
IPADDR3=192.168.40.1
IPADDR4=192.168.50.1
PREFIX3=24
PREFIX4=24
4、重啟系統(tǒng)
查看網(wǎng)卡信息:
ethtool bond0
七、網(wǎng)卡配置bond+vlan實(shí)踐
(1)創(chuàng)建bond0,并創(chuàng)建配置文件
(2)將bond0橋接到br1,并創(chuàng)建br1配置文件,重啟網(wǎng)絡(luò)服務(wù)
(3)在br1上,創(chuàng)建虛擬vlan網(wǎng)口:br1.10,br1.20,并創(chuàng)建配置文件
(4)創(chuàng)建brvlan-10,brvlan-10,并創(chuàng)建配置文件
(5)將網(wǎng)橋與虛擬vlan網(wǎng)口連接
brctl addif brvlan-10 br1.10
brctl addif brvlan-20 br1.20
(6)重啟網(wǎng)絡(luò)服務(wù)


課堂實(shí)驗(yàn)架構(gòu)圖:

實(shí)驗(yàn)步驟:
[root@yunwei2 network-scripts]# cat ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens37
ONBOOT=yes
MASTER=bond0
SLAVE=yes
[root@yunwei2 network-scripts]# modprobe bonding
[root@yunwei2 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
TYPE=Bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
BONDING_OPTS="mode=6 miimon=100"
BRIDGE=br1
[root@yunwei2 network-scripts]# brctl addbr br1
[root@yunwei2 network-scripts]# cat ifcfg-br1
TYPE=Bridge
NAME=br1
DEVICE=br1
ONBOOT=yes
BOOTPROTO=static
[root@yunwei2 network-scripts]# vconfig add br1 10
[root@yunwei2 network-scripts]# vconfig add br1 20
[root@yunwei2 network-scripts]# cat ifcfg-br1.10
VLAN=yes
TYPE=vlan
PHYSDEV=br1
VLAN_ID=10
NAME=br1.10
ONBOOT=yes
ZONE=trusted
DEVICE=br1.10
BRIDGE=brvlan-10
[root@yunwei2 network-scripts]# brctl addbr brvlan-10
[root@yunwei2 network-scripts]# brctl addbr brvlan-20
[root@yunwei2 network-scripts]# cat ifcfg-brvlan-10
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-10
DEVICE=brvlan-10
ONBOOT=yes
[root@yunwei2 network-scripts]# brctl addif brvlan-10 br1.10
[root@yunwei2 network-scripts]# brctl addif brvlan-20 br1.20
[root@yunwei2 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29a1940e no ens33
br1 8000.000c29a19418 no bond0
brvlan-10 8000.000c29a19418 no br1.10
brvlan-20 8000.000c29a19418 no br1.20
virbr0 8000.525400de6b4d yes virbr0-nic
[root@yunwei2 network-scripts]# systemctl restart network