Instalando e Configurando Bonding no Debian Squeeze

Ethernet bonding, regulado pela norma IEEE 802.3ad com o título link aggregation é uma técnica em redes de computadores usada para o acoplamento de dois ou mais canais Ethernet em paralelo para produzir um único canal de maior velocidade e/ou aumentar a disponibilidade e redundância desse canal.

Aqui vamos configurar o bonding para mantermos a redundância de uma conexão de rede.

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Aqui vamos precisar de uma máquina com duas interfaces de rede no mínimo eu vou utilizar uma VM com 3 interfaces para demostrar a utilização.

Vamos instalar os pacotes necessários

aptitude update && aptitude install ifenslave ethtool -y

Agora vamos inserir o módulo do bonding para ser carregado com o sistema

echo "alias bond0 bonding" >> /etc/modprobe.d/bonding.conf
echo "options bonding mode=0 miimon=100" >> /etc/modprobe.d/bonding.conf

Vamos dar uma olhadas nas opções acima que vamos utilizar para o bond

Na primeira linha estamos carregando o modulo bonding e criando a interface virtual bond0. Na segunda linha informa que o módulo bonding deve operar em mode 0. Veja os diferentes tipos de configuração do módulo bonding:

  1. mode 0 - balance-rr - Balanceamento entre as interfaces usando o algoritmo Round-Robin. Transmite os pacotes em uma ordem seqüencial, da primeira a última placa de rede agregada ao bonding que estiver disponível. Este modo provê o balanceamento da carga e tolerância as falhas.
  2. mode 1 - active-backup - Apenas uma das interfaces agregadas ao bonding fica ativa. Outra interface se torna ativa se, e somente se, a interface atualmente ativa vier a falhar. O endereço MAC da interface bonding fica visível externamente em apenas uma placa de rede, para evitar confusão no switch. Este modo provê tolerancia à falhas.
  3. mode 2 - balance-xor - Balanceamento usando o algorítimo Xor, com o MAC da placa de rede de destino do pacote, para selecionar a interface de rede que será utilizada. O bonding ultilizará sempre a mesma placa de rede para cada endereço MAC de destino. Este modo provê o balanceamento da carga e tolerancia à falhas.
  4. mode 3 - broadcast - Transmissão dos pacotes utilizando o conceito de broadcast. Os pacotes são transmitidos em todas as interfaces agregadas ao bonding. Este modo provê tolerancia à falhas.
  5. mode 4 - 802.3ad - Agregação de links dinamicamente. Criação de grupos de agregações que possuem a mesma velocidade e definições de comunicação (duplex). Transmite e recebe dados em todas as interfaces do grupo. Prerequisitos: 1) Suporte ao Ethtool para obeter as informações de velocidade e definições de comunicação (duplex) de cada placa de rede. 2) Switch com suporte aos padrões IEEE 802.3ad e agregação dinâmica de links.
  6. mode 5 - balance-tlb - Balanceamento de carga de transmissão adaptativa. Não requer switch com características especificas. O tráfego de saída é distribuido de acordo com a capacidade e o uso atual de cada placa de rede agregada ao bonding. O tráfego de entrada é recebido pela placa de rede atualmente em uso. Se a placa de rede que está recebendo dados vier a falhar, outra placa de rede assume seu MAC, e passa a receber os dados em seu lugar. Prerequisitos: 1) Suporte ao Ethtool para obeter as informações de velocidade de cada placa de rede.
  7. mode 6 - balance-alb - Balanceamento de carga adaptativo para transmissão e recebimento de informações para o protocolo IPV4. Não requer switch com características especificas. O balanceamento da carga é feito utilizando negociações ARP interceptadas pelo driver bonding. Prerequisitos: 1) Suporte ao Ethtool para obeter as informações de velocidade de cada placa de rede. 2) Driver de rede com suporte à alteração do endereço MAC da placa com a mesma em uso.
  • miimon - Especifica a frequência de monitorização MII link em milissegundos. Isto determina quantas vezes o estado do link de cada slave é inspecionados para falhas de link. Um valor de zero desativa MII monitoramento de links. Um valor de 100 é um bom ponto de partida.

Vamos listar as interfaces de rede

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok

Agora vamos configurar o bonding, podemos deixar o arquivo como abaixo, não precisamos configurar a interface eth0 e eth1 somente a interface bond0 no meu caso ;)

vim /etc/network/interfaces
#Interface de Loopback
auto lo
iface lo inet loopback

#Interface Interna
auto eth0
iface eth0 inet static
        address 10.101.0.25
        netmask 255.255.255.0
        network 10.101.0.0
        broadcast 10.101.0.255

#Interface do bonding
auto bond0
        iface bond0 inet static
        address 10.101.0.23
        netmask 255.255.255.0
        network 10.101.0.0
        gateway 10.101.0.254
        bond-slaves eth1 eth2

Agora vamos reiniciar o servidor para testarmos, pois como vamos tirar a configuração de alguma outra interface e subir ela em conjunto o sistema se perde o mais fácil é reiniciar

reboot

Agora vamos visualizar as interfaces com o mii-tool

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok

Agora vamos visualizar o status das interfaces

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:3f:b0:b8 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 08:00:27:9d:8e:f7 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 08:00:27:ff:cd:7c brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 08:00:27:ff:cd:7c brd ff:ff:ff:ff:ff:ff

Vamos Conferir com o ifconfig

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          inet end.: 10.101.0.23  Bcast:10.101.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:feff:cd7c/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:2946 (2.8 KiB)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          inet end.: 10.101.0.25  Bcast:10.101.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe3f:b0b8/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:2825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:207738 (202.8 KiB)  TX bytes:12344 (12.0 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:2946 (2.8 KiB)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:46 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:4578 (4.4 KiB)  TX bytes:4578 (4.4 KiB)

Agora vamos fazer um teste simples de ping

ping -c 5 10.101.0.23
PING 10.101.0.23 (10.101.0.23) 56(84) bytes of data.
64 bytes from 10.101.0.23: icmp_req=1 ttl=64 time=0.383 ms
64 bytes from 10.101.0.23: icmp_req=2 ttl=64 time=0.383 ms
64 bytes from 10.101.0.23: icmp_req=3 ttl=64 time=0.361 ms
64 bytes from 10.101.0.23: icmp_req=4 ttl=64 time=0.354 ms
64 bytes from 10.101.0.23: icmp_req=5 ttl=64 time=0.353 ms

--- 10.101.0.23 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.353/0.366/0.383/0.027 ms

Agora vamos desativar uma interface, vou desativar a interface eth1 e vamos ver o status dela

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, no link
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok

Agora vamos efetuar o teste de ping novamente

ping -c 5 10.101.0.23
PING 10.101.0.23 (10.101.0.23) 56(84) bytes of data.
64 bytes from 10.101.0.23: icmp_req=1 ttl=64 time=0.383 ms
64 bytes from 10.101.0.23: icmp_req=2 ttl=64 time=0.352 ms
64 bytes from 10.101.0.23: icmp_req=3 ttl=64 time=0.350 ms
64 bytes from 10.101.0.23: icmp_req=4 ttl=64 time=0.291 ms
64 bytes from 10.101.0.23: icmp_req=5 ttl=64 time=0.239 ms

--- 10.101.0.23 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.239/0.323/0.383/0.051 ms

Funcionando Agora vamos habilitar a interface novamente, e vamos ver o seu status

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok

Vamos efetuar um teste com ping novamente

ping -c 5 10.101.0.23
PING 10.101.0.23 (10.101.0.23) 56(84) bytes of data.
64 bytes from 10.101.0.23: icmp_req=1 ttl=64 time=0.395 ms
64 bytes from 10.101.0.23: icmp_req=2 ttl=64 time=0.376 ms
64 bytes from 10.101.0.23: icmp_req=3 ttl=64 time=0.359 ms
64 bytes from 10.101.0.23: icmp_req=4 ttl=64 time=0.380 ms
64 bytes from 10.101.0.23: icmp_req=5 ttl=64 time=0.369 ms

--- 10.101.0.23 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.359/0.375/0.395/0.027 ms

Agora vamos desativar uma interface, vou desativar a interface eth2 e vamos ver o status dela

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, no link

Agora vamos efetuar mais um teste com o ping

ping -c 5 10.101.0.23
PING 10.101.0.23 (10.101.0.23) 56(84) bytes of data.
64 bytes from 10.101.0.23: icmp_req=1 ttl=64 time=0.416 ms
64 bytes from 10.101.0.23: icmp_req=2 ttl=64 time=0.342 ms
64 bytes from 10.101.0.23: icmp_req=3 ttl=64 time=0.354 ms
64 bytes from 10.101.0.23: icmp_req=4 ttl=64 time=0.350 ms
64 bytes from 10.101.0.23: icmp_req=5 ttl=64 time=0.377 ms

--- 10.101.0.23 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.342/0.367/0.416/0.036 ms

Como pode ser notado temos a nossa redundância com interfaces de Rede ;)

Referências