Configurando bonding no Oracle Linux

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.

bonding

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.

bonding-test

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