Olá pessoal, o intuito deste artigo é apresentar e documentar rapidamente o procedimento para configurar o bonding (redundância de placas de rede) no Linux.
Apesar do procedimento ser feito no Oracle Linux 6.6 ele é válido também para outras versões e distribuições, mas consulte a documentação antes de aplicar este procedimento para se certificar.
O bonding permite configurarmos duas placas de rede servindo como se fossem uma única. Desta maneira temos redundância nas placas de rede, ou seja, se uma das placas queimar ou tiver algum problema, todo o tráfego passará pela placa sobrevivente. Veja a ilustração abaixo.
Primeiramente tenha certeza que suas placas de rede estão configuradas com IP estático. Vamos verificar.
Listando as placas de rede é possível observar que ambas tem um endereço de IP atribuído.
[root@lore-srv ~]# ifconfig -a eth0 Link encap:Ethernet HWaddr 08:00:27:5B:A0:9B inet addr:192.168.15.13 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe5b:a09b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23659 errors:0 dropped:0 overruns:0 frame:0 TX packets:2023 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32192158 (30.7 MiB) TX bytes:159875 (156.1 KiB)</code> eth1 Link encap:Ethernet HWaddr 08:00:27:38:CE:7F inet addr:192.168.15.14 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe38:ce7f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23621 errors:0 dropped:0 overruns:0 frame:0 TX packets:316 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32184307 (30.6 MiB) TX bytes:35396 (34.5 KiB) eth2 Link encap:Ethernet HWaddr 08:00:27:C6:C4:8E inet addr:192.168.15.15 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fec6:c48e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23682 errors:0 dropped:0 overruns:0 frame:0 TX packets:312 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32192675 (30.7 MiB) TX bytes:34552 (33.7 KiB) eth3 Link encap:Ethernet HWaddr 08:00:27:C2:EC:BE inet addr:192.168.15.16 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fec2:ecbe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23784 errors:0 dropped:0 overruns:0 frame:0 TX packets:313 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32195783 (30.7 MiB) TX bytes:34622 (33.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:71 errors:0 dropped:0 overruns:0 frame:0 TX packets:71 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:6344 (6.1 KiB) TX bytes:6344 (6.1 KiB)
Nos arquivos /etc/sysconfig/network-scripts/ifcfg-eth0 e /etc/sysconfig/network-scripts/ifcfg-eth1 é possível observar que os endereços de IP atribuídos a ambas as placas de rede estão definidos de maneira estática. Observe o parâmetro BOOTPROTO nos arquivos.
[root@lore-srv ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet UUID=99b21e7f-160f-44a5-8240-3a7d0fb07568 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.15.13 NETMASK=255.255.255.0 HWADDR=08:00:27:5B:A0:9B DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0"
[root@lore-srv ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet UUID=1d6cc9e2-4643-4dab-9c6e-a195cc7d64bc ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.15.14 NETMASK=255.255.255.0 HWADDR=08:00:27:38:CE:7F DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth1"
Precisamos editar ou criar (caso ainda não exista) o arquivo /etc/modprobe.d/bonding.conf e incluir alguns parâmetros para o bonding correspondente.
[root@lore-srv ~]# vi /etc/modprobe.d/bonding.conf alias bond0 bonding options bond0 mode=active-backup miimon=100 downdelay=200 updelay=200 fail_over_mac=1
Os parâmetros que configuramos são os seguintes:
alias: nome da placa de rede virtual com função de bonding.
options: opções a serem definidas para o bonding bond0.
mode=1: configuração de modo backup ativo. Um dos slaves fica ativo para o bonding e caso esta placa de rede venha a falhar o outro slave assume a comunicação.
miimon=100: a cada quantos milissegundos o status das placas de rede que fazem parte do bonding serão verificadas pelo monitor de link.
downdelay=200: o tempo em milissegundos até que o slave seja desativado após uma falha no link ser detectada.
updelay=200: o tempo em milissegundos até que o slave seja ativado após a recuperação do link ser detectada. Este valor deve ser mútiplo do parâmetro miimon, senão ele será definido para o valor múltiplo mais próximo.
fail_over_mac=1: faz com que a interface do bonding use o MAC Address da placa remascente após um failover nas placas de rede físicas. (caso esteja usando uma máquina virtual este parâmetro deve ser configurado)
Para mais detalhes a respeito dos parâmetros consulte o arquivo /usr/share/doc/iputils-*/README.bonding
Para subir o bonding precisamos criar o arquivo /etc/sysconfig/network-scripts/bond0 que subirá a placa de rede virtual e que fará a redundância entre as duas placas de rede físicas que temos instaladas.
[root@lore-srv ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0 #alias bond bonding #options bond0 mode=1 miimon=100 downdelay=200 updelay=200 DEVICE=bond0 IPADDR=192.168.15.13 NETMASK=255.255.255.0 ONBOOT=yes BOOTPROTO=static USERCTL=no
Observe que o endereço de IP pode ser o mesmo utilizando em uma das placas de rede que servirão como slave. Neste cenário usei o IP da placa eth0.
Agora vamos configurar as placas de rede eth0 e eth1 para que sirvam como slaves do bond0.
[root@lore-srv ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet UUID=99b21e7f-160f-44a5-8240-3a7d0fb07568 ONBOOT=yes NM_CONTROLLED=yes HWADDR=08:00:27:5B:A0:9B NAME="System eth0" MASTER=bond0 SLAVE=yes
[root@lore-srv ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet UUID=1d6cc9e2-4643-4dab-9c6e-a195cc7d64bc ONBOOT=yes NM_CONTROLLED=yes HWADDR=08:00:27:38:CE:7F NAME="System eth1" MASTER=bond0 SLAVE=yes
É bom que você faça toda esta configuração a partir de uma conexão de uma terceira placa de rede ou diretamente no terminal do host, pois provavelmente você perderá a comunicação com o host quando fizer estas alterações.
Feito isso faça um reboot para verificar se tudo sobe corretamente. Se tiver algum problema pode deixar um comentário que eu tento ajudar.
Faça uma verificação para saber o bond0 subiu.
[root@lore-srv ~]# ifconfig bond0 Link encap:Ethernet HWaddr 08:00:27:5B:A0:9B inet addr:192.168.15.13 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe5b:a09b/64 Scope:Link UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:276 errors:0 dropped:60 overruns:0 frame:0 TX packets:152 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:34339 (33.5 KiB) TX bytes:21983 (21.4 KiB) eth0 Link encap:Ethernet HWaddr 08:00:27:5B:A0:9B inet addr:192.168.15.13 Bcast:192.168.15.255 Mask:255.255.255.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:213 errors:0 dropped:0 overruns:0 frame:0 TX packets:165 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:24359 (23.7 KiB) TX bytes:23965 (23.4 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:38:CE:7F inet addr:192.168.15.13 Bcast:192.168.15.255 Mask:255.255.255.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:70 errors:0 dropped:60 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:10400 (10.1 KiB) TX bytes:0 (0.0 b) eth2 Link encap:Ethernet HWaddr 08:00:27:C6:C4:8E inet addr:192.168.15.12 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fec6:c48e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:99 errors:0 dropped:0 overruns:0 frame:0 TX packets:45 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:12348 (12.0 KiB) TX bytes:4986 (4.8 KiB) eth3 Link encap:Ethernet HWaddr 08:00:27:C2:EC:BE inet addr:192.168.15.16 Bcast:192.168.15.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fec2:ecbe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:35 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5322 (5.1 KiB) TX bytes:2436 (2.3 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:44 errors:0 dropped:0 overruns:0 frame:0 TX packets:44 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4064 (3.9 KiB) TX bytes:4064 (3.9 KiB)
Como podemos ver nossa placa de rede bond0 está ativa e com o IP 192.168.15.13 e com o MAC Address da eth0.
Verifique o arquivo dinâmico /proc/net/boding/bond0, onde bond0 é o nome da placa virtual do bonding.
[root@lore-srv ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)</code> Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200 Slave Interface: eth0 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 1 Permanent HW addr: 08:00:27:5b:a0:9b Slave queue ID: 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 1 Permanent HW addr: 08:00:27:38:ce:7f Slave queue ID: 0
Vamos testar se o bonding está funcionando. Para isso vamos puxar o cabo de rede de uma das nossas placas de rede. Vou desconectar primeiro a eth0. Como estou usando o Virtual Box vou desconectar o cabo virtualmente.
Ao fazer isso veja novamente no arquivo dinâmico /proc/net/bonding/bond0 que a placa de rede eth0 está com o status down.
[root@lore-srv ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)</code> Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active) Primary Slave: None Currently Active Slave: eth1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200 Slave Interface: eth0 MII Status: down Speed: Unknown Duplex: Unknown Link Failure Count: 2 Permanent HW addr: 08:00:27:5b:a0:9b Slave queue ID: 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 1 Permanent HW addr: 08:00:27:38:ce:7f Slave queue ID: 0
Conecte novamente o cabo, verifique o status do bonding e faça o mesmo processo para a outra placa para ter certeza que está tudo funcionando como deveria.
Desta maneira garantimos a redundância nas nossas placas de rede. Espero que este artigo seja útil em algum momento.
Dúvidas ou problemas é só deixar nos comentários.
Abraços,
Franky