En los entornos de producción es habitual encontrarse los caminos de red redundados, es decir 2 o más tarjetas de red trabajando juntas.
La idea es que cada tarjeta de red va conectada un switch diferente, de esta forma tenemos tolerancia a fallos de las tarjetas de red y la electrónica de red que hay detrás, generalmente un switch.
Vamos a ver como configurar un interfaz de tipo bond en Red Hat/CentOS. Para documentar el procedimiento he utilizado concretamente CentOS 6.4.
La situación inicial en cuanto a configuración de red es:
[root@oradb ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:25:4C:B6
inet addr:192.168.174.100 Bcast:192.168.174.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:217 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22757 (22.2 KiB) TX bytes:2555 (2.4 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:F8:6B:64
inet addr:192.168.174.134 Bcast:192.168.174.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef8:6b64/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:196 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12570 (12.2 KiB) TX bytes:1298 (1.2 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:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 b) TX bytes:720 (720.0 b)
Lo primero que debemos hace es desactivar «NetworkManager» y trabajar directamente con el servicio «network». Primero verificamos la situación actual:
[root@oradb ~]# chkconfig --list NetworkManager
NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@oradb ~]# chkconfig --list network
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
En este caso debemos modificar el arranque automático de los servicios, parar «NetworkManager» y arrancar «network»:
[root@oradb ~]# chkconfig NetworkManager off
[root@oradb ~]# chkconfig network on
[root@oradb ~]# chkconfig --list NetworkManager
NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@oradb ~]# chkconfig --list network
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@oradb ~]# /etc/init.d/NetworkManager stop
Stopping NetworkManager daemon: [ OK ]
[root@oradb ~]# /etc/init.d/network start
Bringing up loopback interface: [ OK ]
Bringing up interface Auto_eth0: [ OK ]
Podemos reiniciar la máquina si queremos y verificar que arrancan los servicios deseados (no debería existir problema). Una vez reiniciada la situación es:
[root@oradb ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:25:4C:B6
inet addr:192.168.174.100 Bcast:192.168.174.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:130 errors:0 dropped:0 overruns:0 frame:0
TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:51318 (50.1 KiB) TX bytes:2514 (2.4 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:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 b) TX bytes:720 (720.0 b)
Solo vemos una tarjeta de red porque no trabajamos con «network» y no existe configuración por defecto para eth1. Para configurar el bonding necesitamos conocer las MACs de las tarjetas podemos verlas con:
[root@oradb ~]# ip addr 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
inet 127.0.0.1/8 scope host lo
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 qlen 1000
link/ether 00:50:56:25:4c:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.100/24 brd 192.168.174.255 scope global eth0
inet6 fe80::250:56ff:fe25:4cb6/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <broadcast,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:f8:6b:64 brd ff:ff:ff:ff:ff:ff
Bueno ya tenemos todo lo necesario, ahora simplemente movemos la configuración existente a otro lugar (como copia de seguridad) y creamos la configuración del bond (ficheros ifcfg-bond0, ifcfg-eth0 y ifcfg-eth1):
[root@oradb network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@oradb network-scripts]# ls
ifcfg-Auto_eth0 ifdown-post ifup-eth ifup-routes
ifcfg-lo ifdown-ppp ifup-ippp ifup-sit
ifdown ifdown-routes ifup-ipv6 ifup-tunnel
ifdown-bnep ifdown-sit ifup-isdn ifup-wireless
ifdown-eth ifdown-tunnel ifup-plip init.ipv6-global
ifdown-ippp ifup ifup-plusb net.hotplug
ifdown-ipv6 ifup-aliases ifup-post network-functions
ifdown-isdn ifup-bnep ifup-ppp network-functions-ipv6
[root@oradb network-scripts]# mv ifcfg-Auto_eth0 ~
[root@oradb network-scripts]# cat ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.174.100
NETMASK=255.255.255.0
GATEWAY=192.168.174.2
DNS1=8.8.8.8
DEFROUTE=yes
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="miimon=100 mode=1 primary=eth0 updelay=50000"
[root@oradb network-scripts]# cat ifcfg-eth0
DEVICE=eth0
HWADDR=00:50:56:25:4C:B6
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
[root@oradb network-scripts]# cat ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:F8:6B:64
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
Detalles a tener en cuenta en estos ficheros:
- ifcfg-bond0, aquí se definen las configuraciones de red tradicionales, es decir IP, máscara, gateway, etc… Para hemos respetado la configuración de red que existía antes de configurar el bond. Además de algunos parámetros específicos dentro de BONDING_OPTS, los comentamos luego.
- ifcfg-eth0 y ifcfg-eth1, debemos asegurarnos que los parámetros DEVICE (nombre del dispositivo), HWADDR (la MAC), SLAVE (indica que es una tarjeta esclava) y MASTER (esta es la asocición de la tarjeta con el interfaz bond, que es el master)
Reiniciamos el servicio y verificamos el estado:
[root@oradb network-scripts]# /etc/init.d/network reload
Shutting down interface eth0: /etc/sysconfig/network-scripts/ifdown-eth: line 116: /sys/class/net/bond0/bonding/slaves: No such file or directory
[ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface bond0: [ OK ]
[root@oradb network-scripts]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:50:56:25:4C:B6
inet addr:192.168.174.100 Bcast:192.168.174.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:939 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:101073 (98.7 KiB) TX bytes:4340 (4.2 KiB)
eth0 Link encap:Ethernet HWaddr 00:50:56:25:4C:B6
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:929 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:100473 (98.1 KiB) TX bytes:4340 (4.2 KiB)
eth1 Link encap:Ethernet HWaddr 00:50:56:25:4C:B6
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:600 (600.0 b) TX bytes:0 (0.0 b)
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:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 b) TX bytes:720 (720.0 b)
El bond ya está arrancado y las tarjetas eth0 y eth1 son esclavas de bond0-
Vamos ver un poco los parámetros utilizados en BONDING_OPTS de la configuración del fichero ifcfg-bond0:
- miimon=100, frecuencia en milisegundos en la que se monitoriza el estado de la tarjeta.
- mode=1, establece el modo de trabajo a activo-pasivo.
- primary=eth0, indica cual es el interfaz primario. Este será el activo por defecto.
- updelay=50000, (por defecto es 0) especifica los milisegundos en los que una interfaz se considera activa después de obtener link de nuevo. Este parámetro es muy importante porque el que una tarjeta tenga link no significa que esté lista para trabajar, debemos tener en cuenta que la electrónica de red necesita sus tiempos, que pueden ser 30 segundos antes de enrutar cualquier petición de tráfico. Si por ejemplo el interfaz eth0 cae y pasa a ser activo eth1, más tarde se soluciona el problema y eth0 vuelve a conectarse casi seguro que perdemos conectividad debido a updalay por defecto es 0, esta situación dependiendo del software de alta disponibilidad (por ejemplo Red Hat Cluster Linux) con el que estemos trabajando puede ocasionar incluso un reinicio de la máquina.
Os dejo un link con la documentación de estas opciones:
https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s3-modules-bonding-directives.html
Los mensajes de estado del bond los podemos ver en:
/var/log/messages
Podemos desconectar la tarjeta primaria (eth0) y ver los mensajes indicando el cambio de tarjeta activa (eth1):
[root@oradb network-scripts]# tail -f /var/log/messages
Nov 29 11:35:07 oradb kernel: bonding: bond0: making interface eth0 the new active one.
Nov 29 11:35:07 oradb kernel: bonding: bond0: first active interface up!
Nov 29 11:35:07 oradb kernel: bonding: bond0: Setting eth0 as primary slave.
Nov 29 11:35:07 oradb kernel: ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
Nov 29 11:35:08 oradb ntpd[2232]: Deleting interface #3 eth0, fe80::250:56ff:fe25:4cb6#123, interface stats: received=0, sent=0, dropped=0, active_time=796 secs
Nov 29 11:35:08 oradb ntpd[2232]: Deleting interface #5 eth0, 192.168.174.100#123, interface stats: received=13, sent=13, dropped=0, active_time=796 secs
Nov 29 11:35:10 oradb ntpd[2232]: Listening on interface #6 bond0, fe80::250:56ff:fe25:4cb6#123 Enabled
Nov 29 11:35:10 oradb ntpd[2232]: Listening on interface #7 bond0, 192.168.174.100#123 Enabled
Nov 29 11:36:00 oradb kernel: bond0: link status definitely up for interface eth1, 1000 Mbps full duplex.
Nov 29 11:45:33 oradb kernel: packagekitd[3674]: segfault at 29 ip 00000030c8e57dd3 sp 00007fff8527d1e0 error 4 in libglib-2.0.so.0.2200.5[30c8e00000+e4000]
Nov 29 11:56:03 oradb kernel: e1000: eth0 NIC Link is Down
Nov 29 11:56:03 oradb kernel: bonding: bond0: link status definitely down for interface eth0, disabling it
Nov 29 11:56:03 oradb kernel: bonding: bond0: making interface eth1 the new active one.
Si volvemos a conectar eth0:
[root@oradb network-scripts]# tail -f /var/log/messages
Nov 29 11:58:29 oradb kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Nov 29 11:58:29 oradb kernel: bonding: bond0: link status up for interface eth0, enabling it in 50000 ms.
Nov 29 11:59:23 oradb kernel: bond0: link status definitely up for interface eth0, 1000 Mbps full duplex.
Nov 29 11:59:23 oradb kernel: bonding: bond0: making interface eth0 the new active one.
Vemos que después de conectar la tarjeta eth0, espera el sistema 50000 ms y luego la convierte en primaria.
Podemos conocer el estado del bond en todo momento simplemente con:
[root@oradb network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 50000
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:50:56:25:4c:b6
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f8:6b:64
Slave queue ID: 0
Espero que os sirva de ayuda esta entrada…