L'association d'interfaces réseau a été introduite à partir de CentOS/RHEL 7 en tant qu'alternative plus extensible et évolutive à la liaison réseau. Cet article décrit comment configurer l'association réseau sur CentOS/RHEL 7/8.
Les exemples fournis sont basés sur le système Oracle Linux 8.2 (machine virtuelle invitée Oracle VirtualBox 6.1) avec deux interfaces réseau utilisant NetworkManager.
Plus précisément, l'interface de ligne de commande Network Manager (nmcli) est principalement utilisée avec les options spécifiées en abrégé/raccourci formulaire.
1. Configuration d'origine de la pré-équipe
Ce qui suit indique la configuration réseau d'origine de la pré-équipe :
# dnf list | grep team | grep anaconda NetworkManager-team.x86_64 1:1.22.8-4.el8 @anaconda libteam.x86_64 1.29-1.el8 @anaconda teamd.x86_64 1.29-1.el8 @anaconda
# lspci | grep -i eth 00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
# nmcli dev DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected enp0s3 enp0s8 ethernet connected enp0s8 lo loopback unmanaged --
# nmcli con NAME UUID TYPE DEVICE enp0s3 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 enp0s8 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# ls -l /etc/sysconfig/network-scripts/* -rw-r--r-- 1 root root 334 Aug 21 13:29 /etc/sysconfig/network-scripts/ifcfg-enp0s3 -rw-r--r-- 1 root root 334 Aug 21 13:30 /etc/sysconfig/network-scripts/ifcfg-enp0s8
# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 1 MACADDR=[MAC_ADDR1] 2 MTU=1500 3 TYPE=Ethernet 4 PROXY_METHOD=none 5 BROWSER_ONLY=no 6 BOOTPROTO=dhcp 7 DEFROUTE=yes 8 IPV4_FAILURE_FATAL=no 9 IPV6INIT=yes 10 IPV6_AUTOCONF=yes 11 IPV6_DEFROUTE=yes 12 IPV6_FAILURE_FATAL=no 13 IPV6_ADDR_GEN_MODE=stable-privacy 14 NAME="enp0s3" 15 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 16 DEVICE=enp0s3 17 ONBOOT=yes
# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8 1 MACADDR=[MAC_ADDR2] 2 MTU=1500 3 TYPE=Ethernet 4 PROXY_METHOD=none 5 BROWSER_ONLY=no 6 BOOTPROTO=dhcp 7 DEFROUTE=yes 8 IPV4_FAILURE_FATAL=no 9 IPV6INIT=yes 10 IPV6_AUTOCONF=yes 11 IPV6_DEFROUTE=yes 12 IPV6_FAILURE_FATAL=no 13 IPV6_ADDR_GEN_MODE=stable-privacy 14 NAME="enp0s8" 15 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 16 DEVICE=enp0s8 17 ONBOOT=yes
# ip addr ... 2: enp0s3:mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether brd ff:ff:ff:ff:ff:ff inet /24 brd scope global dynamic noprefixroute enp0s3 valid_lft 86059sec preferred_lft 86059sec inet6 fe80::ca99:46d3:1765:f02b/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether brd ff:ff:ff:ff:ff:ff inet /24 brd scope global dynamic noprefixroute enp0s8 valid_lft 86121sec preferred_lft 86121sec inet6 fe80::36d0:6bd3:5152:83dc/64 scope link noprefixroute valid_lft forever preferred_lft forever
2. Supprimer les connexions réseau existantes
Supprimez les connexions enp0s3 et enp0s8 existantes comme suit. Ceux-ci sont recréés en tant qu'esclaves d'équipe dans les étapes suivantes.
# nmcli con show NAME UUID TYPE DEVICE enp0s3 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 enp0s8 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# nmcli con del XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Connection 'enp0s3' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully deleted. # nmcli con del XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Connection 'enp0s8' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully deleted.
# nmcli dev DEVICE TYPE STATE CONNECTION enp0s3 ethernet disconnected -- enp0s8 ethernet disconnected -- lo loopback unmanaged --
# ls -l /etc/sysconfig/network-scripts/ total 0 #
3. Créer une connexion d'équipe principale
Créez la connexion de l'équipe principale. Par exemple :
# nmcli con add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}, "link_watch": {"name": "ethtool"}}' Connection 'team0' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added.
Ci-dessus, le mode de fonctionnement de l'équipe (runner) est activebackup et le moniteur/observateur de lien d'équipe (link_watch) est ethtool. Les autres valeurs runner et link_watch incluent :
- coureur :loadbalance, roundrobin, lacp, diffusion, aléatoire.
- link_watch :arp_ping, nsna_ping
NetworkManager crée le fichier de configuration d'interface suivant :
# cat /etc/sysconfig/network-scripts/ifcfg-team0 1 TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}" 2 PROXY_METHOD=none 3 BROWSER_ONLY=no 4 BOOTPROTO=dhcp 5 DEFROUTE=yes 6 IPV4_FAILURE_FATAL=no 7 IPV6INIT=yes 8 IPV6_AUTOCONF=yes 9 IPV6_DEFROUTE=yes 10 IPV6_FAILURE_FATAL=no 11 IPV6_ADDR_GEN_MODE=stable-privacy 12 NAME=team0 13 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 14 DEVICE=team0 15 ONBOOT=yes 16 DEVICETYPE=Team
# nmcli con NAME UUID TYPE DEVICE team0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX team team0
# nmcli dev DEVICE TYPE STATE CONNECTION team0 team connecting (getting IP configuration) team0 enp0s3 ethernet disconnected -- enp0s8 ethernet disconnected -- lo loopback unmanaged
4. Attribuez éventuellement une adresse IP statique à l'équipe
Attribuez éventuellement une adresse IP statique, une passerelle, un DNS, etc. à la connexion d'équipe. Par exemple :
# nmcli con mod team0 ipv4.addresses [IP3]/24 # nmcli con mod team0 ipv4.gateway [IP4] # nmcli con mod team0 ipv4.dns [IP5] # nmcli con mod team0 ipv4.method manual # nmcli con mod team0 connection.autoconnect yes
NetworkManager modifie le fichier de configuration d'interface d'équipe suivant :
# cat /etc/sysconfig/network-scripts/ifcfg-team0 1 TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}" 2 PROXY_METHOD=none 3 BROWSER_ONLY=no 4 BOOTPROTO=none 5 DEFROUTE=yes 6 IPV4_FAILURE_FATAL=no 7 IPV6INIT=yes 8 IPV6_AUTOCONF=yes 9 IPV6_DEFROUTE=yes 10 IPV6_FAILURE_FATAL=no 11 IPV6_ADDR_GEN_MODE=stable-privacy 12 NAME=team0 13 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 14 DEVICE=team0 15 ONBOOT=yes 16 DEVICETYPE=Team 17 IPADDR=[IP3] 18 PREFIX=24 19 GATEWAY=[IP4] 20 DNS1=[IP5]
L'équipe utilisera DHCP si aucune adresse IP statique n'est attribuée.
5. Configurer et ajouter des esclaves à l'équipe
Configurez et ajoutez des esclaves à l'équipe. Par exemple :
# nmcli con add type team-slave con-name team0-slave0 ifname enp0s3 master team0 Connection 'team0-slave0' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added. # nmcli con add type team-slave con-name team0-slave1 ifname enp0s8 master team0 Connection 'team0-slave1' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added.
# nmcli conn NAME UUID TYPE DEVICE team0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX team team0 team0-slave0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 team0-slave1 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# nmcli dev DEVICE TYPE STATE CONNECTION team0 team connected team0 enp0s3 ethernet connected team0-slave0 enp0s8 ethernet connected team0-slave1 lo loopback unmanaged --
NetworkManager crée les fichiers de configuration d'interface esclave d'équipe suivants :
# cat /etc/sysconfig/network-scripts/ifcfg-team0-slave0 1 NAME=team0-slave0 2 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 3 DEVICE=enp0s3 4 ONBOOT=yes 5 TEAM_MASTER=team0 6 DEVICETYPE=TeamPort
# cat /etc/sysconfig/network-scripts/ifcfg-team0-slave1 1 NAME=team0-slave1 2 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 3 DEVICE=enp0s8 4 ONBOOT=yes 5 TEAM_MASTER=team0 6 DEVICETYPE=TeamPort
Lorsqu'au moins un esclave est ajouté à l'équipe, l'interface (team0) est appelée et devient accessible.
# ip addr ... 2: enp0s3: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff 3: enp0s8: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff 6: team0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff inet [IP3]/24 brd [IP6] scope global dynamic noprefixroute team0 valid_lft 86045sec preferred_lft 86045sec inet6 fe80::5b1f:554a:1928:8575/64 scope link noprefixroute valid_lft forever preferred_lft forever
Notez que toutes les interfaces d'équipe/associées utilisent la même adresse MAC, c'est-à-dire celle du premier membre esclave de l'équipe.
6. Redémarrez l'équipe
Redémarrez l'équipe pour que l'adresse IP statique, etc. prenne effet. Par exemple :
# nmcli con down team0 && nmcli con up team0
7. Identifier les interfaces esclaves actives/inactives actuelles
Identifiez les interfaces esclaves actives et inactives actuelles à l'aide de teamdctl(8). Par exemple :
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp0s3
8. Activer le mode promiscuité pour les interfaces réseau
Certaines technologies de virtualisation, telles qu'Oracle VM VirtualBox, nécessitent que le mode promiscuité soit activé sur les interfaces réseau attribuées aux invités, ainsi qu'au sein des invités, afin que le basculement/restauration esclave se comporte correctement. L'activation du mode promiscuité sur les interfaces réseau des systèmes physiques peut également être nécessaire.
Pour Oracle VM VirtualBox, le mode promiscuité peut être activé pour les interfaces invité comme suit :
– Oracle VM VirtualBox Manager> [GUEST]> Paramètres> Réseau> Adaptateur 1|… ] Avancé ] Mode promiscuité :Tout autoriser
Le mode Promiscuous peut être activé dans les systèmes CentOS/RHEL 7 de manière dynamique et statique à l'aide d'un service personnalisé comme suit :
Dynamique, non persistant :
# ip link set enp0s3 promisc on # ip link set enp0s8 promisc on
Statique, persistant :
Créez un fichier d'unité systemd personnalisé avec le contenu suivant, par exemple :
# cat /usr/lib/systemd/system/promiscuous.service 1 [Unit] 2 Description=Bring up network interfaces in promiscuous mode upon boot 3 After=network.target 4 5 [Service] 6 Type=oneshot 7 ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on 8 ExecStart=/usr/sbin/ip link set dev enp0s8 promisc on 9 ExecStop=/usr/sbin/ip link set dev enp0s3 promisc off 10 ExecStop=/usr/sbin/ip link set dev enp0s8 promisc off 11 TimeoutStartSec=0 12 RemainAfterExit=yes 13 14 [Install] 15 WantedBy=default.target
Informez systemd du nouveau service. Par exemple :
# systemctl daemon-reload
Activer et démarrer le nouveau service/unité, par exemple :
# systemctl enable promiscuous Created symlink /etc/systemd/system/default.target.wants/promiscuous.service → /usr/lib/systemd/system/promiscuous.service.
# systemctl start promiscuous
# systemctl status promiscuous ● promiscuous.service - Bring up network interfaces in promiscuous mode upon boot Loaded: loaded (/usr/lib/systemd/system/promiscuous.service; enabled; vendor preset: disabled) Active: active (exited) since Fri 2020-08-21 16:14:53 AEST; 17s ago Process: 8088 ExecStart=/usr/sbin/ip link set dev enp0s8 promisc on (code=exited, status=0/SUCCESS) Process: 8086 ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on (code=exited, status=0/SUCCESS) Main PID: 8088 (code=exited, status=0/SUCCESS) Aug 21 16:14:53 [HOST] systemd[1]: Starting Bring up network interfaces in promiscuous mode upon boot... Aug 21 16:14:53 [HOST] systemd[1]: Started Bring up network interfaces in promiscuous mode upon boot.
Vérifiez que le mode de promiscuité est activé sur toutes les interfaces esclaves. Par exemple :
# ip addr | grep enp 2: enp0s3: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 3: enp0s8: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000
9. Résilience de la connectivité réseau de l'équipe de test - basculement/retour arrière esclave
A. À partir d'un client distant, lancez un ping continu (8) du serveur pour lequel l'association réseau a été configurée, par exemple :
[CLIENT]$ ping [SERVER] PING [IP3] ([IP3]) 56(84) bytes of data. 64 bytes from [IP3]: icmp_seq=1 ttl=64 time=0.025 ms 64 bytes from [IP3]: icmp_seq=2 ttl=64 time=0.034 ms 64 bytes from [IP3]: icmp_seq=3 ttl=64 time=0.039 ms ...
B. Déconnectez l'équipe esclave actuellement active.
Débranchez temporairement le câble réseau physique connecté à l'interface esclave, par ex. enp0s3. Notez que la désactivation d'une interface par programme n'émule pas la perte réelle de connectivité de lien physique.
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp0s8
Une fois déconnecté, teamdctl désigne l'interface esclave enp0s3 comme étant en panne et l'ancien esclave de sauvegarde enp0s8 est maintenant l'esclave actif actuel. Malgré le basculement de l'esclave, le ping(8) du client distant continue sans interruption.
L'exécution de la commande ip(8) confirme en outre que tout le trafic réseau vers l'équipe se produit via le nouvel esclave actif enp0s8, c'est-à-dire :
# ip -s link ... 2: enp0s3: [BROADCAST,MULTICAST,PROMISC] mtu 1500 qdisc fq_codel master team0 state DOWN mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 3007606561 5014092 0 27008 0 91263 TX: bytes packets errors dropped carrier collsns 787749 7568 0 0 0 0 3: enp0s8: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 3829373093 6116137 0 26680 0 111948 TX: bytes packets errors dropped carrier collsns 179163 1337 0 0 0 0 7: team0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 2106463511 1969187 0 49615 0 60559 TX: bytes packets errors dropped carrier collsns 176341 1378 0 0 0 0
C. Déconnectez le nouvel esclave de l'équipe active actuelle.
Déconnectez temporairement le câble réseau physique connecté à l'interface esclave active nouvellement promue, par ex. enp0s8. Une fois déconnecté, teamdctl désigne les deux interfaces esclaves enp0s3 et enp0s8 comme down, c'est-à-dire :
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 enp0s8 link watches: link summary: down instance[link_watch_0]: name: ethtool link: up down count: 1 runner: active port:
À ce stade, avec les deux esclaves de l'équipe déconnectés, le ping (8) du client distant cesse, par exemple
... 64 bytes from [IP3]: icmp_seq=1253 ttl=64 time=0.207 ms 64 bytes from [IP3]: icmp_seq=1254 ttl=64 time=0.131 ms 64 bytes from [IP3]: icmp_seq=1255 ttl=64 time=0.227 ms 64 bytes from [IP3]: icmp_seq=1256 ttl=64 time=0.218 ms 64 bytes from [IP3]: icmp_seq=1257 ttl=64 time=0.198 ms From [IP3] icmp_seq=1258 Destination Host Unreachable From [IP3] icmp_seq=1259 Destination Host Unreachable ...
D. Reconnecter l'esclave déconnecté
Reconnectez le câble réseau physique à l'une des interfaces esclaves, par ex. enp0s3. Une fois reconnecté, teamdctl désigne l'interface esclave enp0s3 comme up, c'est-à-dire :
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 enp0s8 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 runner: active port: enp0s3
À ce stade, avec enp0s3 l'esclave actif actuel, ping(8) du client distant reprend, par exemple
... From [IP3] icmp_seq=1392 Destination Host Unreachable From [IP3] icmp_seq=1393 Destination Host Unreachable From [IP3] icmp_seq=1394 Destination Host Unreachable From [IP3] icmp_seq=1395 Destination Host Unreachable 64 bytes from [IP3]: icmp_seq=1396 ttl=64 time=1258180 ms 64 bytes from [IP3]: icmp_seq=1397 ttl=64 time=1257180 ms 64 bytes from [IP3]: icmp_seq=1398 ttl=64 time=1256181 ms 64 bytes from [IP3]: icmp_seq=1399 ttl=64 time=1255181 ms ...
E. Reconnectez l'esclave restant déconnecté.
Reconnectez le câble réseau physique à l'interface esclave restante, par ex. enp0s8. Une fois reconnecté, teamdctl indique que l'interface esclave restante enp0s8 est active, c'est-à-dire :
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 runner: active port: enp0s3