Teaming síťového rozhraní byl zaveden od CentOS/RHEL 7 jako rozšiřitelnější a škálovatelnější alternativa k propojení sítí. Tento příspěvek popisuje, jak nakonfigurovat síťový tým na CentOS/RHEL 7/8.
Uvedené příklady jsou založeny na systému Oracle Linux 8.2 (hostující virtuální stroj Oracle VirtualBox 6.1) se dvěma síťovými rozhraními využívajícími NetworkManager.
Konkrétně se rozhraní příkazového řádku Network Manager (nmcli) primárně používá s možnostmi uvedenými ve zkratce/zkráceně formulář.
1. Původní konfigurace před týmem
Následující označuje původní konfiguraci sítě před týmem:
# 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. Smazat stávající síťová připojení
Smažte stávající připojení enp0s3 a enp0s8 následovně. Tito jsou znovu vytvořeni jako týmoví otroci v následujících krocích.
# 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. Vytvořit připojení hlavního týmu
Vytvořte připojení hlavního týmu. Například:
# 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.
Nahoře je režim běhu týmu (runner) aktivní záloha a monitor/sledovač propojení týmu (link_watch) je ethtool. Mezi alternativní hodnoty runner a link_watch patří:
- běžec :loadbalance, roundrobin, lacp, broadcast, random.
- link_watch :arp_ping, nsna_ping
NetworkManager vytvoří následující konfigurační soubor rozhraní:
# 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. Volitelně přidělte týmu statickou IP adresu
Týmovému připojení můžete volitelně přiřadit statickou IP adresu, bránu, DNS atd. Například:
# 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 upravuje následující konfigurační soubor týmového rozhraní:
# 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]
Pokud není přiřazena žádná statická IP adresa, použije tým DHCP.
5. Nakonfigurujte a přidejte otroky do týmu
Nakonfigurujte a přidejte otroky do týmu. Například:
# 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 vytvoří následující konfigurační soubory týmového podřízeného rozhraní:
# 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
Když je do týmu přidán alespoň jeden otrok, vyvolá se rozhraní (tým0) a zpřístupní se.
# 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
Pamatujte, že všechna týmová/týmová rozhraní používají stejnou MAC adresu, tj. adresu prvního podřízeného člena týmu.
6. Restartujte tým
Restartujte tým, aby se statická IP adresa atd. projevila. Například:
# nmcli con down team0 && nmcli con up team0
7. Identifikujte aktuální aktivní/neaktivní slave rozhraní
Identifikujte aktuální aktivní a neaktivní slave rozhraní pomocí teamdctl(8). Například:
# 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. Povolit promiskuitní režim pro síťová rozhraní
Některé virtualizační technologie, jako je Oracle VM VirtualBox, vyžadují povolení promiskuitního režimu na síťových rozhraních přiřazených hostům i v rámci hostů, aby se slave failover/failback chovaly správně. Může být také vyžadováno povolení promiskuitního režimu na síťových rozhraních na fyzických systémech.
Pro Oracle VM VirtualBox lze promiskuitní režim povolit pro hostovaná rozhraní následovně:
– Oracle VM VirtualBox Manager> [HOST]> Nastavení> Síť> Adaptér 1|… ] Pokročilé ] Promiskuitní režim:Povolit vše
Promiskuitní režim lze aktivovat v systémech CentOS/RHEL 7 dynamicky a staticky pomocí vlastní služby následovně:
Dynamické, netrvalé:
# ip link set enp0s3 promisc on # ip link set enp0s8 promisc on
Statické, trvalé:
Vytvořte vlastní soubor systemd unit s následujícím obsahem, např.:
# 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
Informujte systemd o nové službě. Například:
# systemctl daemon-reload
Povolte a spusťte novou službu/jednotku, např.:
# 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.
Ověřte, zda je na všech podřízených rozhraních povolen promiskuitní režim. Například:
# 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. Testování odolnosti týmové síťové konektivity – slave failover/failback
A. Ze vzdáleného klienta spusťte nepřetržitý ping(8) serveru, pro který bylo nakonfigurováno sdružování v síti, např.:
[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. Odpojte aktuálně aktivního týmového otroka.
Dočasně odpojte fyzický síťový kabel připojený k slave rozhraní, např. enp0s3. Všimněte si, že zakázání rozhraní programově neemuluje skutečnou ztrátu fyzického připojení.
# 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
Po odpojení označuje teamdctl slave rozhraní enp0s3 jako down a bývalý záložní slave enp0s8 je nyní aktuální aktivní slave. Navzdory převzetí služeb při selhání slave pokračuje ping(8) ze vzdáleného klienta bez přerušení.
Spuštění příkazu ip(8) dále potvrzuje, že veškerý síťový provoz do týmu probíhá prostřednictvím nového aktivního slave enp0s8, tj.:
# 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. Odpojte nového aktuálního aktivního týmového otroka.
Dočasně odpojte fyzický síťový kabel připojený k nově propagovanému aktivnímu slave rozhraní, např. enp0s8. Po odpojení označuje teamdctl obě slave rozhraní enp0s3 a enp0s8 jako down, tj.:
# 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:
V tomto okamžiku, když jsou oba týmoví slave odpojeni, ping(8) ze vzdáleného klienta se zastaví, např.
... 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. Znovu připojte odpojený slave
Znovu připojte fyzický síťový kabel k jednomu z podřízených rozhraní, např. enp0s3. Po opětovném připojení označuje teamdctl podřízené rozhraní enp0s3 jako up, tj.:
# 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
V tomto okamžiku, s enp0s3 aktuálním aktivním slavem, se ping(8) ze vzdáleného klienta obnoví, např.
... 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. Znovu připojte zbývající odpojený slave.
Znovu připojte fyzický síťový kabel ke zbývajícímu slave rozhraní, např. enp0s8. Po opětovném připojení označuje teamdctl zbývající podřízené rozhraní enp0s8 jako up, tj.:
# 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