Cómo solucionar una interfaz de red que pierde su IP en CentOS 7 (NetworkManager)

Entorno

  • SO: CentOS 7
  • Versión de NetworkManager: 1.18.x

Síntoma

Una interfaz de red (ej. eth1) pierde repetidamente su dirección IP estática después de un reinicio o al reiniciar NetworkManager. La interfaz sube a nivel de capa 2 (link UP, carrier on) pero no tiene IP asignada. NetworkManager la muestra como disconnected sin perfil de conexión vinculado.

$ nmcli device status
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
eth1    ethernet  disconnected  --
$ ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    (no inet address)

Mientras tanto, otras interfaces (ej. eth0) funcionan correctamente cada vez.

Causa Raíz

Dos errores de configuración combinados impiden que la interfaz obtenga su IP:

1. Plugin ifcfg-rh deshabilitado en NetworkManager

En /etc/NetworkManager/NetworkManager.conf, la línea de plugins estaba comentada:

[main]
#plugins=ifcfg-rh,ibft

Con esta línea comentada, NetworkManager no lee los archivos /etc/sysconfig/network-scripts/ifcfg-*. Otras interfaces pueden seguir funcionando si tienen un perfil de conexión preexistente en la base de datos interna de NetworkManager. Sin embargo, cualquier interfaz que dependa únicamente de su archivo ifcfg-* no tendrá perfil cargado.

Sin un perfil válido, NetworkManager auto-genera un perfil temporal "Wired connection 1" con ipv4.method: auto (DHCP), que obtiene una dirección DHCP aleatoria o falla silenciosamente — nunca aplicando la IP estática deseada.

2. Valor inválido de BOOTPROTO en el archivo ifcfg

Incluso después de rehabilitar el plugin ifcfg-rh, NetworkManager puede rechazar cargar el archivo. El journal mostrará:

ifcfg-rh: loading "/etc/sysconfig/network-scripts/ifcfg-eth1" fails: Unknown BOOTPROTO 'no'

NetworkManager 1.18.x espera BOOTPROTO=none (no no) para configuración de IP estática. El valor no es aceptado por el servicio legacy network pero no por el plugin ifcfg-rh de NetworkManager.

Solución

Paso 1: Habilitar el plugin ifcfg-rh

Editar /etc/NetworkManager/NetworkManager.conf y asegurarse de que la línea de plugins no esté comentada:

[main]
plugins=ifcfg-rh,ibft

Paso 2: Corregir BOOTPROTO en el archivo ifcfg

Editar el archivo correspondiente en /etc/sysconfig/network-scripts/ y cambiar BOOTPROTO=no a BOOTPROTO=none.

Ejemplo de ifcfg-eth1 corregido:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.1.254
NETMASK=255.255.255.252

Paso 3: Eliminar perfil auto-generado y recargar

# Eliminar el perfil DHCP auto-generado si existe
nmcli connection delete 'Wired connection 1'

# Reiniciar NetworkManager
systemctl restart NetworkManager

Paso 4: Verificar

$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
eth1    ethernet  connected  eth1

$ ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    inet 192.168.1.254/30 brd 192.168.1.255 scope global noprefixroute eth1

Comandos de Diagnóstico

Comando Propósito
ip addr show eth1 Verificar si la interfaz tiene IP
nmcli device status Ver estado de NM por interfaz
nmcli connection show Listar perfiles cargados en NM
cat /etc/NetworkManager/NetworkManager.conf Verificar si el plugin ifcfg-rh está habilitado
cat /etc/sysconfig/network-scripts/ifcfg-* Inspeccionar archivos de configuración de interfaces
journalctl -u NetworkManager Leer logs de NM para errores de carga
nmcli connection load /etc/sysconfig/network-scripts/ifcfg-eth1 Intentar carga manual para provocar el error

Conclusión Clave

  1. Siempre verificar que el plugin ifcfg-rh esté habilitado — si está comentado, NM ignora silenciosamente todos los archivos ifcfg.
  2. Usar BOOTPROTO=none, no BOOTPROTO=no — el servicio legacy network acepta ambos, pero el plugin ifcfg-rh de NetworkManager solo acepta none.
  3. Revisar journalctl -u NetworkManager — NM registra la razón exacta por la que rechaza un archivo de configuración, lo cual es el camino más rápido al diagnóstico.