Gostaria de configurar uma interface bond0 usando 2 dispositivos eth no CentOS 7 no VirtualBox?

1

Eu gostaria de configurar uma VM do CentOS 7.x dentro do VirtualBox para que eu possa experimentar interfaces de ligação. Como posso configurar essa VM para que ela tenha as seguintes interfaces:

  • eth1 (rede privada - 192.168.56.101)
  • eth2 (escravo para bond0)
  • eth3 (escravo para bond0)
  • bond0 (usando o LACP)

Usar o Vagrant para facilitar a configuração seria útil para facilitar a replicação.

OBSERVAÇÃO: Eu gostaria de fazer a configuração manualmente, então mostre um exemplo onde o NetworkManager está desabilitado.

    
por slm 12.10.2018 / 07:35

1 resposta

2

Configurando o Vagrant

Para começar, você pode usar o seguinte Vagrantfile para construir sua VM:

$ cat Vagrantfile
Vagrant.configure("2") do |config|

  config.vm.box = "centos/7"
  config.vm.hostname="box-101"
  config.ssh.forward_x11 = true

  config.vm.network "private_network", ip: "192.168.56.101"
  config.vm.network "public_network", bridge: "en0: Wi-Fi (Wireless)", auto_config: false
  config.vm.network "public_network", bridge: "en0: Wi-Fi (Wireless)", auto_config: false

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end

  config.vm.provision "shell", inline: <<-SHELL
    yum install -y git vim socat tcpdump wget sysstat
    yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  SHELL
end

OBSERVAÇÃO: A NIC que estou usando para meu public_network é o dispositivo bridge: "en0: Wi-Fi (Wireless)" do meu Macbook. Se você está fazendo isso em qualquer outra coisa, você precisará mudar isso para um NIC apropriado em seu sistema host onde o Vagrant / VirtualBox está rodando.

O arquivo acima contém 3 NICs que resultarão quando a VM for iniciada. Para iniciar a VM e o SSH:

$ vagrant up
$ vagrant ssh

Configuração de rede inicial

Se olharmos para a rede resultante, veremos o seguinte:

$ ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:c0:42:d5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 85127sec preferred_lft 85127sec
    inet6 fe80::5054:ff:fec0:42d5/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ce:88:39 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:8839/64 scope link
       valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d7:c2:ec brd ff:ff:ff:ff:ff:ff
    inet6 fe80::df68:9ee2:4b5:ad5f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:59:b0:69 brd ff:ff:ff:ff:ff:ff

E o roteamento correspondente:

$ ip r
default via 10.0.2.2 dev eth0 proto dhcp metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.101 metric 102

Desativar o NetworkManager

Para esta VM, desabilitaremos o NetworkManager, para que possamos configurar manualmente a interface de ligação + escravos.

$ for i in NetworkManager-dispatcher NetworkManager NetworkManager-wait-online; do
    systemctl disable $i && systemctl stop $i
  done

Confirmando que o NM está desativado:

$ systemctl list-unit-files |grep NetworkManager
NetworkManager-dispatcher.service             disabled
NetworkManager-wait-online.service            disabled
NetworkManager.service                        disabled

Configurando interface de ligação

Para começar, vamos construir 3 arquivos. 1 para a interface bond0 e 1 para cada uma das duas interfaces que vamos usar como escravos (eth2 & eth3).

ifcfg-bond0

$ cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
Type=Bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.232
PREFIX=24
GATEWAY=192.168.1.2
BONDING_OPTS="mode=4 miimon=100 lacp_rate=1"

NOTA: mode=4 é (802.3ad) aka. LACP. miimon=100 é o intervalo de verificação de 100 ms e lacp_rate=1 é rápido TX do parceiro. Você pode ver todos os parâmetros que o módulo de ligação aceita através deste comando modinfo bonding .

eth2

$ cat /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPV6INIT=no
MASTER=bond0
SLAVE=yes

eth3

$ cat /etc/sysconfig/network-scripts/ifcfg-eth3
DEVICE=eth3
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPV6INIT=no
MASTER=bond0
SLAVE=yes

OBSERVAÇÃO: No acima, estou atribuindo estaticamente à interface bond0 o endereço IP 192.168.1.232 & o gateway 192.168.1.2. Você vai querer mudar isso para algo apropriado para sua situação.

Iniciando a interface

De longe, a maneira mais fácil de iniciar a rede é reiniciar o serviço de rede:

$ systemctl restart network

Se dermos uma olhada nas interfaces e no roteamento:

$ ip a l
..
..
4: eth2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 08:00:27:d7:c2:ec brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 08:00:27:d7:c2:ec brd ff:ff:ff:ff:ff:ff
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:d7:c2:ec brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.232/24 brd 192.168.1.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fed7:c2ec/64 scope link
       valid_lft forever preferred_lft forever

$ ip r
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
169.254.0.0/16 dev bond0 scope link metric 1006
192.168.1.0/24 dev bond0 proto kernel scope link src 192.168.1.232
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.101

Detalhes da ligação

Também podemos dar uma olhada no dispositivo da interface de ligação para obter mais detalhes sobre o estado das interfaces:

$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: fast
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 08:00:27:d7:c2:ec
Active Aggregator Info:
    Aggregator ID: 1
    Number of ports: 1
    Actor Key: 9
    Partner Key: 1
    Partner Mac Address: 00:00:00:00:00:00

Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:d7:c2:ec
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: churned
Actor Churned Count: 0
Partner Churned Count: 1
details actor lacp pdu:
    system priority: 65535
    system mac address: 08:00:27:d7:c2:ec
    port key: 9
    port priority: 255
    port number: 1
    port state: 207
details partner lacp pdu:
    system priority: 65535
    system mac address: 00:00:00:00:00:00
    oper key: 1
    port priority: 255
    port number: 1
    port state: 3

Slave Interface: eth3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:59:b0:69
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: churned
Partner Churn State: churned
Actor Churned Count: 1
Partner Churned Count: 1
details actor lacp pdu:
    system priority: 65535
    system mac address: 08:00:27:d7:c2:ec
    port key: 9
    port priority: 255
    port number: 2
    port state: 199
details partner lacp pdu:
    system priority: 65535
    system mac address: 00:00:00:00:00:00
    oper key: 1
    port priority: 255
    port number: 1
    port state: 3

Verificando a conectividade externa

Abaixo, você pode ver a saída de um ping para o endereço IP do bond0 que eu estava executando em outra caixa na minha rede. Assim que reiniciámos o serviço network , podemos ver que ficou acessível:

$ ping 192.168.1.232
From 192.168.1.10 icmp_seq=7414 Destination Host Unreachable
From 192.168.1.10 icmp_seq=7415 Destination Host Unreachable
64 bytes from 192.168.1.232: icmp_seq=7416 ttl=64 time=886 ms
64 bytes from 192.168.1.232: icmp_seq=7417 ttl=64 time=3.58 ms
64 bytes from 192.168.1.232: icmp_seq=7418 ttl=64 time=3.52 ms
64 bytes from 192.168.1.232: icmp_seq=7419 ttl=64 time=3.46 ms
64 bytes from 192.168.1.232: icmp_seq=7420 ttl=64 time=3.15 ms
64 bytes from 192.168.1.232: icmp_seq=7421 ttl=64 time=3.50 ms

Dica de reinicialização

No CentOS 7.x, parece haver um bug / problema com as interfaces bond0 iniciando corretamente durante a inicialização. Uma solução alternativa para esse problema é adicionar o seguinte a:

 $ echo "ifup bond0" >> /etc/rc.d/rc.local
 $ chmod +x /etc/rc.d/rc.local

Isso garantirá que a interface bond0 seja adequadamente ativada durante as inicializações.

Referências

por 12.10.2018 / 07:35