在RHEL 7上配置聚合网络链接:绑定和成组

时间:2020-03-21 11:42:54  来源:igfitidea点击:

在RHEL 7上配置网络绑定和分组。

聚合网络链接

有两种方法可以通过绑定或者分组在RHEL 7上配置聚合的网络链接。

网络绑定使两个或者多个网络接口可以充当一个接口,同时增加带宽并提供冗余。

网络分组旨在通过提供一个小的内核驱动程序来实现对数据包流的快速处理,并通过各种用户空间应用程序来执行用户空间中的所有其他操作,从而以不同的方式实现该概念。
现有的绑定驱动程序不受影响,可以使用网络分组作为替代方法,并且不能代替RHEL 7中的绑定。

准备工作

我们的实验室中有两个虚拟机,每个虚拟机都有两个网络接口。
将配置一台计算机进行网络绑定,而另一台进行网络分组。
将介绍用于网络分组的基本IPv6配置。

为避免出现问题,我们将从控制台而不是从Secure Shell(SSH)配置网络。
如果我们做错了,至少我们不会失去连接。

对VirtualBox的警告

对于那些使用VirtualBox配置绑定或者分组的用户,请确保将网络适配器的混杂模式设置为“允许所有”,然后在链接上启用混杂模式,例如:

# ip link set eth0 promisc on
# ip link set eth1 promisc on

上面的代码可以很好地进行测试,但是重启后不会继续存在。
添加到'/etc/rc.local',或者编写一个systemd服务来处理它。

配置网络绑定

确保已加载绑定模块:

# modprobe bonding

尽管不是必需的,但请随时检查nmcli示例,其中示例6是关于添加绑定主机和两个从属的。
我们可能会发现它们很有用。

# man 5 nmcli-examples

可以使用nmcli或者nmtui实用程序创建绑定接口。
我们使用nmcli是因为我们发现它使用起来更快,更容易。

我们将删除任何现有的网络配置,以免使自己有些头疼:

# nmcli c
NAME     UUID

TYPE

DEVICE
enp0s8   00cb8299-feb9-55b6-a378-3fdc720e0bc6  802-3-ethernet  enp0s8
enp0s17  8512e951-6012-c639-73b1-5b4d7b469f7f  802-3-ethernet  enp0s17

我们看到我们有两个配置了可预测网络接口名称的网卡。
删除现有配置:

# nmcli c del enp0s8 enp0s17

使用活动备份模式创建一个名为mybond0的绑定接口:

# nmcli c add type bond ifname mybond0 con-name mybond0 mode active-backup

将两个从站添加到mybond0接口:

# nmcli c add type bond-slave ifname enp0s17 con-name slave1 master mybond0
# nmcli c add type bond-slave ifname enp0s8 con-name slave2 master mybond0

现在,如果我们不指定任何IP配置,则服务器将默认通过DHCP获得其IP地址和网关。

在今天使用的实验中,我们的网关位于10.8.8.2上,而DNS(FreeIPA)服务器位于10.8.8.70上,因此我们想在配置中反映这些详细信息。

现在,如果在RHEL 7.0上,请执行以下操作:

# nmcli con mod mybond0 ipv4.addresses "10.8.8.71/24 10.8.8.2" \
 ipv4.method manual ipv4.dns 10.8.8.70 ipv4.dns-search rhce.local

如果在RHEL 7.1或者RHEL 7.2上,我们需要使用ipv4.gateway属性来定义网关:

# nmcli con mod mybond0 ipv4.addresses 10.8.8.71/24 \
 ipv4.gateway 10.8.8.2 ipv4.dns 10.8.8.70 ipv4.dns-search rhce.local \
 ipv4.method manual

为了建立联系,必须首先培养奴隶。
请注意,启动主接口不会自动启动从接口。
但是,启动从属接口总是会启动主接口,而停止主接口也会停止从属接口。

# nmcli c up slave1; nmcli c up slave2
# nmcli c up mybond0

检查连接:

# nmcli c
NAME     UUID

TYPE

DEVICE
slave2   fd9b7775-044a-47d2-8745-0a326ebc4df1  802-3-ethernet  enp0s17
slave1   12a7ee7f-070c-4366-b80a-a06b6fcbd8fc  802-3-ethernet  enp0s8
mybond0  fd19f953-1aaa-4f32-8246-58a2c0e60514  bond

mybond0

检查绑定状态:

# cat /proc/net/bonding/mybond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: enp0s17
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: enp0s17
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:ff:71:00
Slave queue ID: 0
Slave Interface: enp0s8
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:ff:81:00
Slave queue ID: 0

让我们看一下路由表:

# ip ro
default via 10.8.8.2 dev mybond0  proto static  metric 1024
10.8.8.0/24 dev mybond0  proto kernel  scope link  src 10.8.8.71

确保正确设置了DNS设置:

# cat /etc/resolv.conf
# Generated by NetworkManager
search rhce.local
nameserver 10.8.8.70

这纯粹是供参考:

# cat /etc/sysconfig/network-scripts/ifcfg-mybond0
DEVICE=mybond0
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=mybond0
UUID=12a7ee7f-070c-4366-b80a-a06b6fcbd8fc
ONBOOT=yes
IPADDR0=10.8.8.71
PREFIX0=24
GATEWAY0=10.8.8.2
DNS1=10.8.8.70
BONDING_OPTS=mode=active-backup
DOMAIN=rhce.local
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

我们可以通过禁用和启用从属接口来测试绑定,不应断开网络连接。

配置网络分组

我们需要成组的包装:

# yum install -y teamd

与绑定一样,虽然不是必需的,但我们可能需要检查nmcli示例,其中示例7是关于添加团队主服务器和两个从服务器的示例。

# man 5 nmcli-examples

现在,要创建团队主管,我们可以尝试记住一些JSON配置,或者我们可以使用RHEL 7服务器上可用的分组示例文件。

复制示例文件之一,打开进行编辑,并保留“运行器”部分,仅删除其他所有内容:

# cp /usr/share/doc/teamd-1.9/example_configs/loadbalance_1.conf /root/

我们使用负载平衡运行程序,但是,请随时选择活动备份或者任何其他备份。

在撰写本文时,可以使用以下运行步者。

  • 广播(数据通过所有端口传输),
  • 循环(数据依次在所有端口上传输),
  • 活动备份(使用一个端口或者链接,而将其他端口或者链接保留为备份),
  • 负载平衡(具有活动的Tx负载平衡和基于BPF的Tx端口选择器),
  • lacp(实现802.3ad链路聚合控制协议)。

确保流水线末尾没有逗号“,”,否则可能会导致连接激活失败。

# cat /root/loadbalance_1.conf
{

"runner":

{"name": "loadbalance"}
}

创建一个名为myteam0的负载平衡分组接口:

# nmcli c add type team con-name myteam0 ifname myteam0 config /root/loadbalance_1.conf

与绑定一样,我们的网关位于10.8.8.2上,而DNS(FreeIPA)服务器位于10.8.8.70上,因此我们希望将它们反映在配置中。

我们还想为组合接口分配一个唯一的本地IPv6 IP地址fc00 :: 10:8:8:72/7.
组合接口上的IPv6需要一些另外的内核配置来处理重复的地址检测,我们将在本文中进行介绍。

如果在RHEL 7.0上,请执行以下操作:

# nmcli c mod myteam0 ipv4.addresses "10.8.8.72/24 10.8.8.2" \
 ipv4.method manual ipv4.dns 10.8.8.70 ipv4.dns-search rhce.local \
 ipv6.addresses fc00::10:8:8:72/7 ipv6.method manual

如果在RHEL 7.2上,我们需要使用ipv4.gateway属性来定义网关:

# nmcli c mod myteam0 ipv4.addresses 10.8.8.72/24 \
 ipv4.gateway 10.8.8.2 ipv4.dns 10.8.8.70 ipv4.dns-search rhce.local \
 ipv4.method manual \
 ipv6.addresses fc00::10:8:8:72/7 ipv6.method manual

将两个网络设备添加到myteam0接口:

# nmcli c add type team-slave ifname enp0s8 con-name slave1 master myteam0
# nmcli c add type team-slave ifname enp0s17 con-name slave2 master myteam0

请注意,启动主接口不会自动启动端口接口。
但是,启动端口接口始终会启动主接口,而停止主接口也会停止端口接口。

# nmcli c up myteam0

检查连接:

# nmcli c
NAME     UUID

TYPE

DEVICE
slave1   c5551395-06d4-482b-9cb1-b73decf6f68c  802-3-ethernet  enp0s8
myteam0  05880fe0-38a8-43ca-83c0-e420e84dde9a  team

myteam0
slave2   a527b772-6cec-4c8a-bc7e-f104433c8eeb  802-3-ethernet  enp0s17
# teamdctl myteam0 state
setup:
  runner: loadbalance
ports:
  enp0s17

link watches:

link summary: up

instance[link_watch_0]:

name: ethtool

link: up
  enp0s8

link watches:

link summary: up

instance[link_watch_0]:

name: ethtool

link: up
# teamnl myteam0 ports
 3: enp0s17: up 1000Mbit FD
 2: enp0s8: up 1000Mbit FD

检查IPv4和IPv6的路由表:

# ip ro
default via 10.8.8.2 dev myteam0  proto static  metric 1024
10.8.8.0/24 dev myteam0  proto kernel  scope link  src 10.8.8.72
# ip -6 ro|grep -v error
fc00::/7 dev myteam0  proto kernel  metric 256
fe80::/64 dev myteam0  proto kernel  metric 25

确保正确设置了DNS设置:

# cat /etc/resolv.conf
# Generated by NetworkManager
search rhce.local
nameserver 10.8.8.70

ifcfg文件配置供参考:

# cat /etc/sysconfig/network-scripts/ifcfg-myteam0
DEVICE=myteam0
TEAM_CONFIG="{  \"runner\":

{\"name\": \"loadbalance\"} }"
DEVICETYPE=Team
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=myteam0
UUID=05880fe0-38a8-43ca-83c0-e420e84dde9a
ONBOOT=yes
IPADDR0=10.8.8.72
PREFIX0=24
GATEWAY0=10.8.8.2
DNS1=10.8.8.70
DOMAIN=rhce.local
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

与绑定一样,我们可以通过禁用和启用从属接口来测试分组,不应断开网络连接。

IPv6和重复地址检测(DAD)

我们可能会注意到,服务器重新启动后,IPv6接口进入dadfailed状态:

# ip ad show myteam0
8: myteam0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

link/ether 08:00:27:ff:82:00 brd ff:ff:ff:ff:ff:ff

inet 10.8.8.72/24 brd 10.8.8.255 scope global myteam0

valid_lft forever preferred_lft forever

inet6 fc00::10:8:8:72/7 scope global tentative dadfailed

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:feff:8200/64 scope link tentative dadfailed

valid_lft forever preferred_lft forever

我们可能无法ping6 IPv6地址。
要解决此问题,请检查内核配置:

# sysctl -a | grep accept_dad
net.ipv6.conf.all.accept_dad = 1
net.ipv6.conf.default.accept_dad = 1
net.ipv6.conf.enp0s17.accept_dad = 1
net.ipv6.conf.enp0s8.accept_dad = 1
net.ipv6.conf.lo.accept_dad = -1
net.ipv6.conf.myteam0.accept_dad = 1

在成组的界面上禁用DAD:

# sysctl -w net.ipv6.conf.myteam0.accept_dad=0

accept_dad的含义如下:

accept_dad - INTEGER

Whether to accept DAD (Duplicate Address Detection).

0: Disable DAD

1: Enable DAD (default)

2: Enable DAD, and disable IPv6 operation if MAC-based duplicate

link-local address has been found.

进行更改,将以下行添加到新文件'/etc/sysctl.d/accept_dad.conf'中:

net.ipv6.conf.myteam0.accept_dad=0

重新启动组合的inetrface:

# nmcli c down myteam0; nmcli c up slave1; nmcli c up slave2

检查IPv6状态:

# ip ad show myteam0
4: myteam0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

link/ether 08:00:27:ff:82:00 brd ff:ff:ff:ff:ff:ff

inet 10.8.8.72/24 brd 10.8.8.255 scope global myteam0

valid_lft forever preferred_lft forever

inet6 fc00::10:8:8:72/7 scope global

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:feff:8200/64 scope link

valid_lft forever preferred_lft forever