Primeiro instale o pacote ifenslave e somente depois disso inicie a configuração das placas de rede que irão compor seu bond linux.

# apt-get install ifenslave

Desligar / desconfigurar interfaces existentes

# ifdown eth0 (repita para todas as interfaces incluídas no vínculo)
# /etc/init.d/networking stop
{Eu}

Às vezes, o ifdown não funciona, nesse caso, use ifconfig eth0 down .

Configuração – Exemplo 1

Modifique o arquivo / etc / network / interfaces :

auto bond0

iface bond0 inet estatic
    address 10.31.1.5
    netmask 255.255.255.0
    network 10.31.1.0
    gateway 10.31.1.254
    slaves eth0 eth1
    bond-mode active-backup
    bond-miimon 100
    bond-downdelay 200
    bond-updelay 200

Para obter mais detalhes, consulte /usr/share/doc/ifenslave/README.Debian e /usr/src/linux/Documentation/networking/bonding.txt .

Configuração – Exemplo 2 (“Modo Laptop”)

Ligue as interfaces de rede sem fio e cabo (RJ45 / WLAN) defina uma única interface de rede virtual (por exemplo, vinculação) (por exemplo, bond0).

Enquanto o cabo de rede estiver conectado, sua interface (por exemplo, eth0) é usado para o tráfego de rede. Se você puxar o plugue RJ45, ifenslave alterna para a interface sem fio (por exemplo, wlan0) de forma transparente, sem qualquer perda de pacotes de rede.

Após reconectar o cabo de rede, o ifenslave volta para eth0 (“modo de failover”).

Do ponto de vista externo (= rede), não importa qual interface esteja ativa. O dispositivo de ligação apresenta seu próprio endereço MAC definido por software (ou seja, virtual), diferente dos MACs definidos por hardware de eth0 ou wlan0.

O servidor dhcp usará esse MAC para atribuir um endereço IP ao dispositivo bond0. Portanto, o computador possui um endereço IP exclusivo sob o qual pode ser identificado. Sem ligação, cada interface teria seu próprio endereço IP.

Modifique o arquivo / etc / network / interfaces :

# Definir escravos   
auto eth0
manual iface eth0 inet
    bond-master bond0
    eth0 primário-bond
    backup ativo no modo bond
   
auto wlan0
manual de iface wlan0 inet
    wpa-conf /etc/network/wpa.conf
    bond-master bond0
    eth0 primário-bond
     bond-mode active-backup 

# Definir mestre
auto bond0
iface bond0 dhcp inet
    bond-slaves none
    eth0 primary-bond
    bond-mode active-backup 
    bond-miimon 100

Nota: A configuração acima foi encontrada trabalhando no Debian 6 e em versões posteriores. A última versão verificada é o Debian 9.8 (*). A configuração é um pouco contrária à documentação dos interfaces de , ifup e ifenslave e os exemplos em / usr / share / doc / ifenslave / examples /.

Teoricamente, apenas a interface bond0 deve ter o atributo auto . O ifup bond0 trará os escravos automaticamente (como a documentação diz). Isso é parcialmente verdadeiro, mas obviamente as opções de configuração dos escravos são ignoradas. Por exemplo, wlan0 é ativado sem iniciar o wpa_supplicant e a configuração de vínculo primário de eth0 é ignorada.(TODO: Isso é um bug no ifenslave ?)

Parece que os escravos devem ser criados antes do bond0 para incluir suas opções de configuração. Para fazer isso através do script /etc/init.d/networking , suas definições devem estar antes da definição bond0 e os atributos automáticos devem ser definidos.

Obviamente, eles não devem ser iniciados novamente quando o bond0 iniciar. A opção bond-slaves none desativa isso.

As opções bond-master , bond-primary e bond-mode devem ser repetidas consistentemente para cada escravo.

Haverá avisos “ifup: interface xyz já configurados”, mas pelo menos funciona.

(*) Nas versões mais recentes do Debian, os nomes dos dispositivos de rede (podem) mudaram, dependendo do caminho de atualização. As instalações do zero agora usam “nomes de interface de rede previsíveis” ( https://wiki.debian.org/NetworkConfiguration#Predictable_Network_Interface_Names ). Para encontrar os nomes de suas interfaces, você deve procurar aqui:$ ls / sys / classe / net / 

Este documento ainda usa os nomes tradicionais.

Configuração – Exemplo 3 (“Modo Laptop”, principalmente conforme documentação – Debian 9 “stretch”)

Essa é uma maneira de ativar o modo laptop com failover automático entre com fio e sem fio, com preferência com fio se ambos estiverem disponíveis, com base na documentação. No entanto, o exemplo de documentação não está completo e não está totalmente correto. Especificamente, as alterações no exemplo (usr / share / doc / ifenslave / examples / ethernet + wifi) são:

  • a estrofe eth0 é necessária; caso contrário, funcionará inicialmente, mas o bond0 removerá o eth0 para sempre se o link eth0 voltar a funcionar depois de voltar uma vez (como quando passa de sem fio para com fio e depois para sem fio), em vez de apenas desabilitá-lo até o link voltar.
  • “bond-give-a-chance 10” resultou na interface wlan0 tentando subir três vezes, com a terceira tentativa falhando e depois sendo inutilizável. Removê-lo completamente consertou isso. Em vez de excluí-lo, apenas comentei o FYI desde o YMMV.
  • a ordem de escravização parece importar: se “escravos de vínculo” for especificado da maneira esperada (eth0 wlan0), então wlan0 será inicialmente a interface principal, apenas para ser alterado para eth0 na diretiva “vínculo primário”.
  • “modo de ligação” foi alterado de “1” para “backup ativo” para ser pelo menos mais legível.
  • seria uma boa prática ter a configuração da wlan em um arquivo separado para que “interfaces” não exijam proteção especial, e isso também foi alterado. O conteúdo de “wpa_supplicant.conf” não é específico para ligação e apenas foi inserido normalmente.

Então, aqui está a maravilha do / etc / network / interfaces :

auto bond0
iface bond0 inet estático
    bond-slaves wlan0 eth0
    bond-mode active-backup 
    eth0 primary-bond
    bond-miimon 100
    address <ipv4address> / <maskbits>
    gateway <ipv4address>

allow-bond0 eth0
manual iface eth0 inet

allow-bond0 wlan0
manual de iface wlan0 inet
# bond-give-a-chance 10
    wpa-bridge bond0
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Se você usa DHCP ou algum outro serviço, precisa alterar a estrofe “bond0” de acordo, mas as outras interfaces devem permanecer “manuais”, pois não devem obter um endereço IP.

ponte do vínculo

Se você deseja usar o vínculo em uma ponte, basta adicionar as linhas da ponte normalmente ao seu arquivo / etc / network / interfaces. Altere a interface de vínculo para manual e use-a como interface de ponte. Aqui está um arquivo de amostra de interfaces de ligação em ponte:

# interface de rede integrada
auto enp4s0
Manual de iface enp4s0 inet
# PCIe nic
auto enp8s0
Manual de iface enp8s0 inet
# bond inteface
auto bond0
manual iface bond0 inet
        slaves enp4s0 enp8s0
        bond-mode 802.3ad
# interface Ponte
auto br0
iface br0 inet static
        address 192.168.1.17
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        bridge_ports bond0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Usando systemd-networkd

Este método não usa o pacote ifenslave mencionado acima. Se o seu computador estiver usando o systemd e as placas de rede estiverem funcionando no momento, você não precisará de mais nada.

Observe que, como é comum em sistemas operacionais do tipo unix, o caso é importante – “Bond” é diferente de “bond” e “Name” não é o mesmo que “name”.

Ativando systemd-networkd

Se você não estiver usando o systemd-networkd, precisará habilitá-lo.

systemctl enable systemd-networkd

Configurando o dispositivo bond

Crie um arquivo que termine em .netdev em / etc / systemd / network . Nomeie isso após o nome da interface vinculada que você deseja usar (por exemplo, bond1.netdev).

Este exemplo assume a ligação 802.3ad ou LACP. Para obter mais informações, consulte a página de manual systemd.netdev e / ou a documentação do kernel .

A maioria dos sistemas deve funcionar com o 802.3ad e esse provavelmente é o modo que você deseja, pois as duas placas de rede trabalham juntas para fornecer o dobro da taxa de transferência. No entanto, se não funcionar no seu caso, você pode tentar outro modo, como o backup ativo (usado no exemplo ifenslave acima).

Observe que o systemd está sempre criando uma interface bond0 padrão com o modo round round robin e o modo não pode ser alterado. Portanto, para usar qualquer outro modo, crie bond1 ou outro nome para a interface. A interface bond0 com o modo 802.3ad simplesmente não funciona.

[NetDev]
Nome = bond1
Descrição = LAG / Bond a um switch
Tipo = vínculo

[Vinculo]
Mode = 802.3ad

Adicionar interfaces ao vínculo / atraso

Há duas maneiras de você fazer isto. Uma é criar um arquivo .network para cada interface de rede mais um para a rede vinculada. O outro é descrever as interfaces de rede no arquivo da rede ligada. Aqui vamos usar o último método.

Crie um arquivo que termine em .network em / etc / systemd / network usando o mesmo nome que anteriormente (por exemplo, bond1.network).

O systemd-networkd usa um sistema correspondente para decidir qual interface usar. Você pode usar a correspondência baseada em nome aqui, se quiser, mas não use a correspondência baseada em mac, pois isso pode causar confusão com os endereços mac de alteração de vínculo.

Este exemplo usa correspondência baseada em pci-id. Para encontrar os endereços para suas placas de rede, use:

lspci -d | grep Ether

use essas informações para criar o arquivo .network.

[Combine]
Caminho = pci-0000: 00: 01.0
Caminho = pci-0000: 05: 10.0

[Rede]
Bond = bond1

Outra opção é simplesmente usar os nomes das interfaces de rede substituindo a linha Path = por Name = <nome da interface de rede>. Você também pode usar caracteres curinga e pode especificar ambos / todos os dispositivos em um único arquivo:

[Combine]
Nome = enp *

[Rede]
Bond = bond1

ou

[Combine]
Nome = enp0s01
Nome = enp5s10

[Rede]
Bond = bond1

Dando um IP ao vínculo

Crie um arquivo que termine em .network em / etc / systemd / network . O nome (obviamente) já não deve ser usado. Isso diz ao systemd como abrir a rede ligada. Para um endereço IP estático, você pode usar:

[Combine]
Nome = bond1

[Rede]
address = 10.31.1.5
Gateway = 10.31.1.1
DNS = 10.31.1.1

Para DHCP (por exemplo, para um laptop em que você poderia usar conexões sem fio e / ou com fio), tente:

[Combine]
Nome = bond1

[Rede]
DHCP = sim

Atualize as configurações

Se sua rede estava usando / etc / network / interfaces antes de configurar a ligação, renomeie o arquivo para impedir que seja usado:

mv / etc / network / interfaces /etc/network/interfaces.save

Neste ponto, recomendo reiniciar o sistema. Essa é a maneira mais fácil de limpar as configurações de rede anteriores e testar se o systemd-networkd inicia conforme o esperado. A rede deve apresentar a ligação ativa. Você pode verificar isso com:

ip link list

Você deve ver 4 dispositivos, eis suas duas interfaces físicas de rede (marcadas como “ESCRAVO”) e o dispositivo bond1. Somente o dispositivo bond1 deve ter um endereço IP. Também deve ser marcado como “MASTER”.

Se você precisar fazer mais alterações posteriormente ou corrigir problemas com sua configuração atual, a partir de agora, basta reiniciar o systemd-networkd após atualizar os arquivos / etc / systemd / network.

systemctl restart systemd-networkd

permitindo ponte para máquinas virtuais

Adicionei esta seção porque não é imediatamente óbvio que sua configuração de ponte de rede existente provavelmente não funcionará com o systemd-networkd. Antes de configurar meu vínculo de rede, eu estava usando os utilitários de ponte para criar um dispositivo br0 usando / etc / network / interfaces. Desde que removi esse arquivo, eu precisava de uma nova maneira de configurar a ponte.

Felizmente, systemd-networkd é multi-talentoso e bastante hábil em lidar com pontes de rede. Tudo o que você precisa fazer é definir a ponte e fornecer as características apropriadas.

Como o dispositivo bond0, você precisa criar um arquivo .netdev para definir o dispositivo. Criei o br0.netdev da seguinte maneira:

[NetDev]
Nome = br0
Tipo = ponte

Em seguida, vinculo-o ao vínculo de rede que defini anteriormente usando br0.network:

[Combine]
Nome = bond1

[Rede]
Bridge = br0

Por fim, altero o arquivo .network de gerenciamento para referir-se a br0 em vez de bond1. Como as definições anteriores tornaram bond1 um escravo de br0, isso resulta na ponte sendo criada corretamente.

problema de renomeação do udev

Você provavelmente verá apenas as regras UDEV para seus dispositivos de rede se tiver atualizado a partir das versões anteriores do Debian. Novas instalações nomeiam as placas de rede após seus endereços pci. As regras são usadas para preservar os nomes herdados dos dispositivos (por exemplo, eth0), caso estejam sendo usados ​​em outro lugar.

Se você estiver confiante de que você está não usando os nomes antigos, você pode simplesmente remover o arquivo descrito abaixo.

“udev” atribui nomes de adaptadores de rede conforme

/etc/udev/rules.d/70-persistent-net.rules

onde regra normalmente se parece com isso:

# Dispositivo PCI 0x10ec: 0x8168 (r8169)
SUBSISTEMA == "rede", AÇÃO == "adicionar", DRIVERS == "? *", ATTR {endereço} == "xx: xx: xx: xx: xx: xx", ATTR {dev_id} == "0x0 ", ATTR {type} ==" 1 ", KERNEL ==" eth * ", NAME =" eth0 "

O problema da ligação é que duas ou mais placas de rede podem ter o mesmo Endereço MAC que confunde o udev ao tentar (re) nomear adaptadores conforme seus MACs e falha porque já existe outra placa com esse MAC. Quando isso acontece, a NIC pode ser nomeada como “renomear2” em vez de “eth0” etc.

A solução possível é alterar a regra do udev para atribuir nomes de interface de rede de acordo com os IDs PCI das placas de rede em vez dos endereços MAC. Isso pode ser feito substituindo-o

ATTR {endereço} == "xx: xx: xx: xx: xx: xx"

com algo como

KERNELS == "0000: 04: 00.0"

no arquivo “70-persistent-net.rules”.

Os IDs PCI correspondentes podem ser encontrados em dmesg:

sudo dmesg | grep eth

Onde se pode procurar um fragmento de linha como este:

r8169 0000: 04: 00.0 eth0: RTL8168e / 8111e
# ^^^^^^^^^^^^

Mas isso não é recomendado, pois não encontrará, por exemplo, dispositivos sem fio ou dispositivos que não usem nomes legados.

A alternativa preferida é encontrar IDs PCI usando ” lspci -D | grep Ether “:

0000: 04: 00.0 Controlador Ethernet: Realtek Semiconductor Co., Ltd. Controlador PCI Express Gigabit RTL8111 / 8168/8411 (rev 06)

Observe que em sistemas modernos, você pode converter o endereço PCI no nome da rede usando os dois números do meio expressos na base10. No exemplo acima, o controlador 0000: 04: 00.0 seria enp4s00.

Teste / Depuração

Gorjeta

Para ter uma ideia do que está acontecendo nos bastidores, experimente um pequeno script para mostrar algumas informações sobre o dispositivo de ligação.

#! / bin / sh

echo "Slaves = $ (cat / sys / class / net / bond0 / bonding / slaves)"
echo "Primary = $ (cat / sys / classe / net / bond0 / bonding / primário)"
echo "Slave active = $ (cat / sys / class / net / bond0 / bonding / active_slave)"

r=$(pidof dhclient) 
test -n "$r" && ps $r 

r=$(pidof wpa_supplicant) 
teste -n "$ r" && ps $ r

Depurando ifenslave

O mecanismo de ligação é baseado em um módulo do kernel chamado ligação, que expõe sua interface através do sistema de arquivos virtual / sys (por exemplo, / sys / class / net / bond0 / *).

A instalação e a configuração são feitas na terra do usuário com scripts de shell:

  • /etc/network/if-post-down.d/ifenslave
  • /etc/network/if-up.d/ifenslave
  • /etc/network/if-pre-up.d/ifenslave

Esses scripts são chamados na inicialização e desligamento do sistema (na verdade, é o ifup que os chama). Sua intenção é alimentar o módulo do kernel com os parâmetros e configurações apropriados.

Se algo com a ligação falhar (e a dica acima não ajuda), você pode dar uma olhada no que os scripts fazem passo a passo.

Para ativar a saída detalhada, chame ifup -a -v diretamente (em vez de chamar /etc/init.d/networking ). A opção -v permite um log de todos os comandos que os scripts estão executando. Isso dá pelo menos um rastro do que está acontecendo quando.

Infelizmente, isso não mostra as reações do módulo do kernel (como possíveis mensagens de erro), porque as mensagens do kernel (módulo) são relatadas pelo utilitário syslog.

Para ter uma idéia real do que está acontecendo, você precisa fazer o que é chamado de depuração invasiva . Isso significa adicionar linhas aos scripts em pontos críticos para enviar uma mensagem ao syslog.

Exemplo:

Função sysfs_change_down no arquivo /etc/network/if-pre-up.d/ifenslave

   logger -t sysfs_change_down sysfs "$1" "$2" 
         sysfs "$1" "$2" 
   logger -t sysfs_change_down $(cat /sys/class/net/bond0/bonding/mode) 

Nota adicional para o Debian Lenny On Sparc

(pode ser aplicável a outras arquiteturas também)

# cd /etc/modprobe.d

# cat> aliases-bond.conf
alias bond0 bonding
  options bond-mode=1 arp_interval = 2000 arp_ip_target = 192.168.3.1
<CTRL-D>

Sem esse arquivo, você receberá um aviso ao iniciar a interface vinculada semelhante a esta:

ligação: Aviso: os parâmetros dos módulos miimon ou arp_interval e arp_ip_target devem ser especificados, caso contrário, a ligação não detectará falhas no link! consulte bonding.txt para obter detalhes.

Inicializar / configurar novas interfaces

# ifup bond0
# /etc/init.d/networking start

Além disso, se você usar um ambiente Lenny que foi atualizado a partir do Etch , é altamente recomendável verificar o resultado do comando a seguir para verificar o modo do dispositivo de ligação, porque os arquivos de configuração do Etch e versões anteriores não funcionam para o Lenny e versões posteriores lançamentos.

cat / sys / class / net / bond0 / bonding / mode

1. Faça ping para outro sistema em um terminal

# ping XXXX

2. Desconecte o cabo de rede ativo e observe o resultado do ping, a rede deve ser retomada em alguns segundos

3. Reconecte o cabo de rede desconectado, aguarde 30 segundos para permitir que a tabela ARP seja atualizada

4. Desconecte outro cabo de rede e observe o resultado do ping, a rede deve ser retomada em alguns segundos

Alterar escravo ativo

1. Use ifenslave para alterar o escravo ativo. O exemplo abaixo configurará eth0 como escravo ativo

# ifenslave -c bond0 eth0 eth1