在RHEL 7上配置聚合网络链接:绑定和成组
在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