0%

Linux网卡绑定

Linux NIC Bonding 技术可以将多张物理网卡或者虚拟网卡绑定为一张虚拟的逻辑网卡,从而实现网卡的冗余、带宽的扩容以及负载均衡。

网卡绑定的作用

网卡绑定的作用主要有两个方面:

  • 提供冗余(负载均衡):网卡绑定最主要的作用,如下图,物理机的多张物理网卡可以上连多个交换机,将网卡绑定为一张虚拟网卡,使用该 bond 虚拟网卡,当其中一个交换机故障时,流量可以自动切换到另一个交换机与物理网卡,提供了网卡的容灾能力。
  • 提高吞吐量:由于是多张网卡进行负载均衡,bond 出来的网卡的吞吐量也得到了提升。

image-20250326005558522

网卡绑定模式

Mode 0 — balance-rr(轮询模式)

数据包依次顺序轮询每张网卡传输,即第1个包走 eth0,下一个包就走 eth1….一直轮询下去。

Mode 1 — active-backup(主备模式)

只有一张网卡作为主,承接流量,当主网卡宕机后,启用备网卡。

Mode 2 — balance-xor(异或模式)

基于源 MAC 和目的 MAC 的 Hash 选择网卡

Mode 3 — broadcast(广播模式)

所有数据包在所有网卡上传输。

Mode 5 — balance-tlb(传输负载均衡)

Mode 6 — balance-alb(适应性负载均衡)

使用 nmcli 绑定网卡

绑定网卡

  1. 创建绑定网卡

    1
    nmcli connection add type bond ifname <绑定网卡名> mode <模式>

    例如,创建一张名为 bond0 的主备模式绑定网卡

    1
    2
    root@ubuntu2404:/# nmcli connection add type bond ifname bond0 mode active-backup
    Connection 'bond-bond0' (fed29263-5656-449b-95c8-cf2e23432736) successfully added.

    查看网络设备,即可看到新建的 bond0 网卡

    1
    2
    3
    4
    5
    6
    7
    root@ubuntu2404:/# nmcli device status
    DEVICE TYPE STATE CONNECTION
    ens160 ethernet connected netplan-ens160
    ens256 ethernet connected Wired connection 1
    bond0 bond connecting (getting IP configuration) bond-bond0
    lo loopback connected (externally) lo
    docker0 bridge connected (externally) docker0
  2. 添加从属网卡

    1
    nmcli connection add type bond-slave ifname <从属网卡名> master <绑定网卡名>

    例如,将 ens160ens256 网卡绑定到 bond0 网卡上

    1
    2
    3
    4
    root@ubuntu2404:/# nmcli connection add type bond-slave ifname ens160 master bond0
    Connection 'bond-slave-ens160' (021cce67-1440-4d50-a8a9-5c7faf8a361b) successfully added.
    root@ubuntu2404:/# nmcli connection add type bond-slave ifname ens256 master bond0
    Connection 'bond-slave-ens256' (f17d7bf7-4313-4f90-8f9c-5c35c0ebe319) successfully added.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    root@ubuntu2404:/# nmcli connection show
    NAME UUID TYPE DEVICE
    netplan-ens160 febc54dc-e29c-3939-a911-8a11855bd1c8 ethernet ens160
    Wired connection 1 ec18620e-37bf-3343-acf5-b57b8928465d ethernet ens256
    bond-bond0 fed29263-5656-449b-95c8-cf2e23432736 bond bond0
    lo 73b7043c-59f1-42aa-a711-2eb721fc18b4 loopback lo
    docker0 5fb2c927-9b29-4d43-99ab-09af694a8927 bridge docker0
    bond-slave-ens160 021cce67-1440-4d50-a8a9-5c7faf8a361b ethernet --
    bond-slave-ens256 f17d7bf7-4313-4f90-8f9c-5c35c0ebe319 ethernet --
  3. 配置绑定网卡

    1
    nmcli connection modify bond-bond0 ipv4.addresses 172.16.19.200/24 ipv4.gateway 172.16.19.2 ipv4.method manual
  4. 激活绑定

    1
    nmcli connection up bond-bond0
  5. 激活从属网卡(可不激活,激活后会导致原本的网卡无法直接访问)

    1
    2
    nmcli connection up bond-slave-ens160
    nmcli connection up bond-slave-ens256

验证网卡冗余

按照上面步骤绑定完网卡后,可以看到多了一张网卡 bond0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ubuntu2404:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:ec:41:a3 brd ff:ff:ff:ff:ff:ff
altname enp2s0
3: ens256: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:ec:41:a3 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:ec:41:ad
altname enp26s0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:8b:f0:0f:5a brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
9: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:ec:41:a3 brd ff:ff:ff:ff:ff:ff
inet 172.16.19.200/24 brd 172.16.19.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
inet6 fe80::6d51:ebf5:7acc:83ff/64 scope link noprefixroute
valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
8
9
root@ubuntu2404:/# nmcli connection show
NAME UUID TYPE DEVICE
bond-bond0 1d93dc92-b5b8-4710-9f67-2424899947e3 bond bond0
bond-slave-ens160 f75880e7-977e-4537-84cd-a5bc802ad32c ethernet ens160
bond-slave-ens256 cf9838da-7c22-4066-ba2d-2b89d3e08f63 ethernet ens256
lo 73b7043c-59f1-42aa-a711-2eb721fc18b4 loopback lo
docker0 5fb2c927-9b29-4d43-99ab-09af694a8927 bridge docker0
netplan-ens160 febc54dc-e29c-3939-a911-8a11855bd1c8 ethernet --
Wired connection 1 ec18620e-37bf-3343-acf5-b57b8928465d ethernet --
1
2
3
4
5
6
7
root@ubuntu2404:/# nmcli device status
DEVICE TYPE STATE CONNECTION
bond0 bond connected bond-bond0
ens160 ethernet connected bond-slave-ens160
ens256 ethernet connected bond-slave-ens256
lo loopback connected (externally) lo
docker0 bridge connected (externally) docker0

通过 bond0 网卡 IP 连接,单独关掉 ens160 或者 ens256 网卡(ifconfig ens160 down),连接都不会收到影响。

  1. 恢复

    1
    2
    3
    4
    5
    6
    7
    nmcli connection down bond-bond0
    nmcli connection down bond-slave-ens160
    nmcli connection down bond-slave-ens256

    nmcli connection del bond-bond0
    nmcli connection del bond-slave-ens160
    nmcli connection del bond-slave-ens256