Enviado por Edu4rdSHL el Sáb, 06/04/2019 - 22:16
Bonding

Buen día, hoy les comentaré sobre algo que muchas personas no conocen, otros no lo tienen claro, pero que al fin de cuentas es demasiado útil: la unión de interfaces de red o bonding.

· ¿Qué es?

De acuerdo a wikipedia:

En redes de computadoras, el término agregación de enlaces se aplica a varios métodos de combinación (agregación) de múltiples conexiones de red en paralelo para aumentar el rendimiento más allá de lo que podría sostener una sola conexión y proporcionar redundancia en caso de que uno de los enlaces falle. Un grupo de agregación de enlaces (LAG) combina una serie de puertos físicos para crear una única ruta de datos de gran ancho de banda, a fin de implementar la carga compartida de tráfico entre los puertos miembros del grupo y mejorar la confiabilidad de la conexión.

La definición es bastante clara, esta técnica proporciona conexiones de red paralelas para maximizar el rendimiento, o para permitir conexiones de red redundantes y maximizar la disponibilidad de la red. por ejemplo, para maximizar la disponibilidad permite que las conexiones de red "conmuten por error" entre un dispositivo de red primario y cualquier número de dispositivos secundarios, o alternativamente, seleccionando la conexión de mayor velocidad disponible. Este enfoque proporciona configuración automática de redes inalámbricas y por cable con soporte de dispositivos extraíbles. Lo anterior es realizado usando el modo active-backup (más adelante explicaré los modos disponibles).

· Funcionamiento y ventajas

Para explicar el funcionamiento, nos podemos basar en la definición y además aclararé unas cosas adicionales de cosas que permitirá y cosas que no, el uso de esta tecnología:

  • No va a duplicar tu velocidad de conexión.
  • Te permite entre otras cosas, tener en tu equipo la posibilidad de conectarse a dos redes diferentes mediante conexión cableada e inalámbrica, usar de manera primaria una de ellas y en caso de que esta falle, usar la red secundaria sin sufrir desconexiones, interrupción en las descargas, reconexiones en servicios que requieren una conexión ininterrumpida (IRC, XMPP, etc), interrupción de streaming, entre muchas cosas más usando el modo active-backup que es el que vamos a configurar en este artículo.

· Modos de bonding

Esta tecnología, tiene diversos modos de funcionamiento o bonding, cada uno de ellos realiza una cosa diferente y los explicaré a cotinuación:

0 (balance-rr) Round-robin policy: Transmite paquetes en orden secuencial desde el primer esclavo (slave) disponible hasta el último. Este modo proporciona equilibrio de carga y tolerancia a fallos.

1 (active-backup) Active-backup policy: solo un esclavo en el enlace está activo. Un esclavo diferente se activa si, y solo si, el esclavo activo falla. La dirección MAC del enlace es visible externamente en un solo puerto (adaptador de red) para evitar confundir el conmutador. Este modo proporciona tolerancia a fallos.

2 (balance-xor) XOR policy: Transmisión basada en [(dirección MAC de origen XOR con dirección MAC de destino) recuento de esclavos en módulo]. Esto selecciona el mismo esclavo para cada dirección MAC de destino. Este modo proporciona equilibrio de carga y tolerancia a fallos.

3 (broadcast) Broadcast policy: transmite todo en todas las interfaces de tipo esclavo. Este modo proporciona tolerancia a fallos.

4 (802.3ad) IEEE 802.3ad Dynamic link aggregation: Crea grupos de agregación que comparten la misma velocidad y configuraciones de dúplex. Utiliza todos los esclavos en el agregador activo de acuerdo con la especificación 802.3ad.
(Requisitos previos: compatibilidad con Ethtool en los controladores básicos para recuperar la velocidad y el dúplex de cada esclavo. Un conmutador que admite la agregación dinámica de enlaces IEEE 802.3ad. La mayoría de los conmutadores requerirán algún tipo de configuración para habilitar el modo 802.3ad).


5 (balance-tlb) Adaptive transmit load balancing: enlace de canales que no requiere ningún soporte de conmutador especial. El tráfico saliente se distribuye de acuerdo con la carga actual (calculada en relación con la velocidad) en cada esclavo. El tráfico entrante es recibido por el esclavo actual. Si el esclavo receptor falla, otro esclavo asume la dirección MAC del esclavo receptor fallido.
(Requisito previo: soporte de Ethtool en los controladores base para recuperar la velocidad de cada esclavo).


6 (balance-alb) Adaptive load balancing: incluye balance-tlb más balanceo de carga (rlb) para el tráfico IPV4, y no requiere ningún soporte de conmutador especial. El balanceo de carga recibido se logra mediante la negociación ARP. El controlador de enlace intercepta las Respuestas ARP enviadas por el sistema local al salir y sobrescribe la dirección de hardware de origen con la dirección de hardware única de uno de los esclavos en el enlace, de modo que diferentes pares utilizan diferentes direcciones de hardware para el servidor.

· Requisitos para bonding

Para este artículo usaremos systemd-networkd y dos tarjetas de red, si usted no está usando este administrador de redes, puede hacer la migración de una manera sencilla (en caso de que ya lo use, puede continuar a la sección "Configurando la unión de interfaces."). Para algo más detallado puede leer https://securityhacklabs.net/forum/distribuciones-gnulinux/archlinux/20…. Siga estos pasos:

  1. Deshabilite su gestor de red actual (NetworkManager, wicd, etc) haciendo uso del comando systemctl, para NetworkManager sería:
    $ sudo systemctl disable NetworkManager.service NetworkManager-wait-online.service # Para Network Manager
    
    $ sudo systemctl disable wicd.service # Para wicd
  2. El siguiente paso es configurar nuestras interfaces de red, para saber cuales son, ejecutaremos:
    $ ls /sys/class/net/
    enp2s0  lo  wlp3s0
  3. En este caso tenemos enp2s0 y wlp3s0 (la interfaz 'lo' queda excluída al ser el loopback). Ahora procedemos a configurarlas:

    Para la interfaz cableada: creamos el archivo '/etc/systemd/network/20-wired.network' para la conexión cableada con el siguiente contenido:
    [Match]
    Name=enp2s0
    
    [Network]
    DHCP=ipv4
    DNS=9.9.9.9 # Esta línea te permite usar los servidores DNS seguros y privados de https://www.quad9.net/, si no desea usarlos, elimine esta línea.

    Para la red inalámbrica: primero configuraremos wpa_supplicant para la autenticación wifi y luego crearemos el archivo .network.

    Configuración de wpa_supplicant:
    # Los siguientes comandos requieren privilegios root (no sudo).
    
    $ wpa_passphrase "Nombre de la red" 'Contraseña de la red' > /etc/wpa_supplicant/wpa_supplicant-wlp3s0.conf
    $ systemctl enable --now wpa_supplicant@wlp3s0

    Creamos un archivo llamado '/etc/systemd/network/25-wireless.network' con el siguiente contenido:
    [Match]
    Name=wlp3s0
    
    [Network]
    DHCP=ipv4
    DNS=9.9.9.9 # Esta línea te permite usar los servidores DNS seguros y privados de https://www.quad9.net/, si no desea usarlos, elimine esta línea.
  4. Detenemos nuestros servicios de red anteriores usando:
    $ sudo systemctl stop NetworkManager.service NetworkManager-wait-online.service # Para Network Manager
    
    $ sudo systemctl stop wicd.service # Para wicd
  5. Iniciamos systemd-network y lo habilitamos para que inicie de manera automática al iniciar el sistema:
    $ sudo systemctl enable --now systemd-networkd.service systemd-resolved.service systemd-networkd-wait-online

Con esto ya hemos terminado la migración al administrador de red de systemd, asegúrese de que tiene acceso a internet con las dos interfaces antes de continuar.

· Configurando la unión de interfaces.

Una vez tengamos systemd-networkd configurado y corriendo, vamos a configurar el bonding.

  1. Configurando el bonding: el primer paso es crear un dispositivo de red virtual para nuestra conexión bond.
    - Creamos un archivo llamado '/etc/systemd/network/10-bond1.netdev' con el siguiente contenido:
    [NetDev]
    Name=bond1
    Kind=bond
    
    [Bond]
    Mode=active-backup
    PrimaryReselectPolicy=always
    TransmitHashPolicy=layer3+4
    MIIMonitorSec=1s
    LACPTransmitRate=fast

    - Configuramos la interfaz bond creando un archivo llamado '/etc/systemd/network/10-bond1.network' con el siguiente contenido:

    [Match]
    Name=bond1
    
    [Network]
    DHCP=ipv4
    DNS=9.9.9.9 # Esta línea te permite usar los servidores DNS seguros y privados de https://www.quad9.net/, si no desea usarlos, elimine esta línea.

    Con esto finalizamos este paso.

  2. Lo siguiente, es regresar a los archivos '/etc/systemd/network/20-wired.network' y '/etc/systemd/network/25-wireless.network' y editarlos de esta manera para que apunten a nuestra interfaz bond:

    '/etc/systemd/network/20-wired.network'

    [Match]
    Name=enp2s0
    
    [Network]
    Bond=bond1
    LinkLocalAddressing=no
    PrimarySlave=true

    Nota: con la opción PrimarySlave=true, establecemos la prioridad de nuestra interfaz de red, esto significa que si esta se encuentran conectada, la interfaz en modo bonding usará esta como primaria y las secundarias solo se activarán en caso de que esta falle. También una vez esta vuelva a estar disponible, la interfaz bond hará el cambio automáticamente para usar la primaria nuevamente.

    '/etc/systemd/network/25-wireless.network'

    [Match]
    Name=wlp3s0
    
    [Network]
    LinkLocalAddressing=no
    Bond=bond1
  3. Ahora reniniciamos nuestros servicios de red con:

    $ sudo systemctl restart systemd-networkd.service systemd-resolved.service

Una vez hecho esto, ya habremos finalizado, para comprobarlo ejecutamos:

➤➤ $ networkctl 
IDX LINK             TYPE               OPERATIONAL SETUP     
  1 lo               loopback           carrier     unmanaged 
  2 enp2s0           ether              carrier     configured
  3 wlp3s0           wlan               carrier     configured
 66 bond1            bond               routable    configured

4 links listed.

Comprobamos el estado de nuestra interfaz bond con:

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

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: enp2s0 (primary_reselect always)
Currently Active Slave: enp2s0
MII Status: up
MII Polling Interval (ms): 1000
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: wlp3s0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

Slave Interface: enp2s0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 4
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

Podemos ver que el Bonding Mode es correcto de acuerdo a nuestras configuraciones (active-backup) y que nuetsra interfaz de red enp2s0 es la primaria.

Cualquier duda o inquietud dejarla en los comentarios. Registrate en el foro, síguenos en FacebookTwitterunete a nuestro chat en Discord y no olvides compartirnos en las redes sociales.

Acerca del autor

Especialista en Seguridad Informática bajo certificación OSCP, experto en técnicas de privacidad y seguridad en la red, analista de criptografía, Fundador de Security Hack Labs. Desarrollador de BlackArch Linux. Twitter: @edu4rdshl XMPP: edu4rdshl@conversations.im Threema ID: 736WU8VV

Comentarios