1. 程式人生 > >Linux下實現多網卡綁定

Linux下實現多網卡綁定

bond team nmctl

使用bind綁定多個網卡

由於服務器上對於可用性的要求都比較高,對於各項功能都會有有冗余設計,比如,磁盤、電源、網卡、甚至服務器本身等等,今天嘗試做一下網卡綁定實現網卡的冗余。
網卡綁定的實現表面上看起來有些像是硬盤實現邏輯卷,都是通過創建一個邏輯設備來實現的。實現網卡的綁定其實還挺簡單的,相比邏輯卷更容易理解。
首先,我們在/etc/sysconfig/network-scripts/目錄下創建一個文件,文件名通常會叫ifcfg-bondxx,除了ifcfg-後面的內容其實都是可以自己定義的,但通常都會寫成bind之類的,文件的內容其實和普通網卡配置文件的內容是一樣的,就像這樣

DEVICE=bond1
BOOTPROTO=static
IPADDR=172.20.16.121
GATEWAY=172.20.0.1
PREFIX=16
BONDING_OPTS="miimon=100 mode=1"

第一行的DEVICE是你給這個邏輯設備指定的名字,這個名字得和文件名的後半部分一樣。
第二行是指定IP的獲取方式,你也可以寫dhcp讓他自動獲取,如果是自動獲取,那麽IPADDR、GATEWAY和PREFIX都不需要再填
最後一行是比較重要的,必須得填,這個是綁定網卡的選項,mode代表綁定網卡的工作模式,miimon是一個時間間隔,代表備份網卡每隔多久查詢一次工作網卡的工作情況。單位是ms
以上只是第一步,邏輯網卡已經創建好了,下面就要指定那些網卡屬於這個邏輯網卡了。也很簡單,只要把你想加入這個邏輯網卡的物理網卡的配置文件稍微修改一下就可以了。就像這樣

TYPE="Ethernet"
BOOTPROTO=static
NAME=eth1
MASTER=bond1
SLAVE=yes
USERCTL=no
DEVICE=eth1
ONBOOT=yes

IPADDR=192.168.20.110
GATEWAY=192.168.0.1
PREFIX=16

其實後面的三行是無效的,不過我懶得刪掉了,比較重要的是MASTER=bond1,SLAVE=yes,這兩行指定了該網卡是屬於邏輯網卡bond1的從屬設備,DEVICE也是必須的,它指明了這個配置文件是給哪個網卡用的,其他的沒有也可以,不過建議寫上ONBOOT=yes
現在我們添加了第一個網卡到邏輯網卡,添加第二塊的方法和第一個是一樣的。換個文件而已。不在說。
然後我們就可以重啟我們的網絡服務了,在centos7中是用systemctl restart network之後就可以看看成果了。如果沒有問題的話在執行ifconfig之後會看到下面的內容:

[root@cent7 network-scripts]# ifconfig
bond1: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        inet 172.20.16.121  netmask 255.255.0.0  broadcast 172.20.255.255
        inet6 fe80::250:56ff:fe3b:6a38  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3b:6a:38  txqueuelen 1000  (Ethernet)
        RX packets 212  bytes 21252 (20.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1000 (1000.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

……

eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:50:56:3b:6a:38  txqueuelen 1000  (Ethernet)
        RX packets 1224  bytes 176616 (172.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 265  bytes 73426 (71.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth2: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:50:56:3b:6a:38  txqueuelen 1000  (Ethernet)
        RX packets 286  bytes 35478 (34.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 62  bytes 5878 (5.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

最明顯的就是多了一個叫bond1的網卡,而且是有IP的,eth1和2有同樣的mac地址,並且都沒有IP,我們可以通過查看 /proc/net/bonding/bond1 這個文件中的內容來看bond1的工作情況,如果你樂意還可以手工下線一個網卡看看這個綁定的設備的工作情況。
還記得bond1配置文件中的BONDING_OPTS="miimon=100 mode=1"這一行嗎 ,其實這個mode是有好幾種的,不過我們常用的並不多,比如mode0是輪巡代表數據包會從頭到尾經過每一個網卡,這種模式提供了負載均衡的能力和一定的容錯性,還有mode3,這種模式數據包會獨立通過每一個網卡,每個網卡也會給一個響應,具體體現就是數據的每一個請求都會得到多個回應。如果你想知道更多,下面有一個官方的文檔。
https://www.kernel.org/doc/Documentation/networking/bonding.txt

使用team綁定多個網卡

在centos7中也可以使用bond進行多網卡綁定,不過centos7中有更好的實現方法,建議在centos7中使用。首先還是修改配置文件的方法進行綁定。其格式和步驟和bond並沒有什麽區別。看一下文件格式。
首先是team0也就是那個邏輯網卡配置文件的格式

DEVICE=team0
DEVICETYPE=Team
TEAM_CONFIG="{\"runner\":{\"name\":\"activebackup\"}}"
BOOTPROTO=none
IPADDR=172.20.16.121
PREFIX=16
NAME=team0
ONBOOT=yes

大部分內容都是一樣的,只有第三行的TEAM_CONFIG有些差別,不過第三行除了activebackup這個單詞,其他部分是不需要變動的,這個單詞對應的就是mode部分,比如activebackup對應mode1,其他還有比如:broadcast roundrobin activebackup loadbalance
然後就是從網卡的配置,也是差不多的

DEVICE=eth1
DEVICETYPE=TeamPort
TEAM_MASTER=team0
NAME=eth1
ONBOOT=yes

配置文件修改之後就可以重啟網絡服務生效了。完成之後的ifconfig和之前的並無太大差別:

[root@cent7 network-scripts]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether be:27:a5:16:09:f8  txqueuelen 1000  (Ethernet)
        RX packets 1280  bytes 182697 (178.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 299  bytes 75980 (74.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether be:27:a5:16:09:f8  txqueuelen 1000  (Ethernet)
        RX packets 359  bytes 42823 (41.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 6582 (6.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

        …

team0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.16.121  netmask 255.255.0.0  broadcast 172.20.255.255
        inet6 fe80::bc27:a5ff:fe16:9f8  prefixlen 64  scopeid 0x20<link>
        ether be:27:a5:16:09:f8  txqueuelen 1000  (Ethernet)
        RX packets 36  bytes 3261 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19  bytes 1326 (1.2 KiB)
        TX errors 0  dropped 2 overruns 0  carrier 0  collisions 0

或者也可以使用nmcli命令直接生成對應的配置文件

nmcli con add type team con-name team0 ifname team0 config ‘{"runner": {"name": "loadbalance"}}‘
nmcli con mod team0 ipv4.addresses 192.168.1.100/24
nmcli con mod team0 ipv4.method manual
nmcli con add con-name eth1 type team-slave ifname eth1 master team0
nmcli con add con-name eth2 type team-slave ifname eth2 master team0
nmcli con up team0
nmcli con up eth1
nmcli con up eth2

上面的前三行是可以合成一行的,只是太長了,
add是增加
type team 表示增加的是一個team類型的
con-name team0 指定連接名稱
ifname team0 表示指定接口,
config 這部分是配置信息,和之前手寫配置文件內容格式相同
mod是修改指定連接
ipv4.addresses 指定ip地址
ipv4.method manual 表示手動指定ip,如果為空則自動選擇(如果使用手動ip,此選項必須添加)
之後的兩行
type team-slave 表示該設備是從屬設備
master team0 指定設備連接屬於誰
最後三行啟用相關設備。
使用teamdctl team0 stat 可以查看team連接的詳細信息

Linux下實現多網卡綁定