Cómo registrar un gran número de direcciones IP con Debian/Ubuntu
Un solo servidor a menudo necesita más de una dirección IP. Esta guía explica dos formas de asignar varias direcciones IPv4 a una sola interfaz de red en Debian y Ubuntu:
- automáticamente, con un script de shell y un servicio systemd, recomendado para rangos grandes;
- directamente en netplan, recomendado cuando las direcciones deben sobrevivir a una reconfiguración de red además de a un reinicio.
Ambos métodos hacen que la configuración persista tras los reinicios. Lea la nota al final de cada método para elegir el que se ajuste a su caso.
Cuándo necesita varias direcciones IP
Varias cargas de trabajo habituales en un solo servidor requieren más de una dirección pública:
- Servidores de correo que usan direcciones separadas y registros PTR para aislar la reputación de envío de distintos dominios.
- Servidores web que requieren direcciones dedicadas para aplicaciones heredadas, aislamiento de clientes o políticas de firewall específicas.
- Infraestructura de proxy y VPN, donde cada instancia de proxy o cada extremo VPN está vinculado a su propia dirección pública.
- Contenedores o máquinas virtuales que usan direcciones IP enrutadas.
Los planes VPS de INTROSERV incluyen dos direcciones IPv4 y una subred IPv6 /112 de forma predeterminada. Hay direcciones IPv4 adicionales disponibles en muchas ubicaciones. Consulte la disponibilidad para su región en el configurador de pedidos.
Antes de empezar
Necesita acceso de root y el nombre de la interfaz que llevará las direcciones adicionales. Las versiones modernas de Debian y Ubuntu ya no usan el antiguo nombre eth0, así que no lo dé por hecho. Liste las interfaces junto con sus direcciones actuales e identifique la que ya tiene su dirección principal:
ip -br addr show
La salida muestra entradas como ens3, enp1s0 o eth0 junto a las direcciones ya configuradas en ellas. La interfaz que ya lleva su IP principal es la que debe usar en los pasos siguientes. Los ejemplos aquí usan ens3.
Advertencia: Estos pasos modifican la configuración de red en un servidor al que probablemente accede por SSH. Un error puede cortar su propio acceso. Mantenga una segunda vía de entrada si dispone de ella, como la consola del proveedor o IP-KVM, y prefiera las opciones de aplicación segura que se muestran a continuación.
Crear el script de direcciones
Un script corto añade un rango de direcciones de una sola vez. Créelo en /usr/local/sbin:
nano /usr/local/sbin/extra-ips.sh
Pegue el siguiente script. Sustituya el nombre de la interfaz, el prefijo y el rango por el bloque que se le ha asignado. Las direcciones de abajo usan el rango de documentación de RFC 5737 y son marcadores de posición:
#!/bin/bash set -euo pipefail # Interfaz que llevará las direcciones adicionales. IFACE="ens3" # Prefijo común y el primer y el último valor del octeto de host. # Sustitúyalos por el bloque que se le ha asignado. PREFIX="203.0.113" FIRST=10 LAST=60 # Detenerse pronto con un mensaje claro si el nombre de la interfaz es incorrecto. if ! ip link show "$IFACE" >/dev/null 2>&1; then echo "Interfaz $IFACE no encontrada. Compruebe el nombre con: ip -br addr show" >&2 exit 1 fi for HOST in $(seq "$FIRST" "$LAST"); do ip addr replace "${PREFIX}.${HOST}/32" dev "$IFACE" done
Info: Las direcciones usan un prefijo /32 a propósito. La interfaz principal ya posee la ruta de su subred, por lo que cada dirección secundaria solo necesita una ruta de host local. Un prefijo /32 evita que el kernel añada una ruta de subred duplicada y mantiene limpia la tabla de enrutamiento. El script usaip addr replaceen lugar deip addr addpara que pueda volver a ejecutarse con seguridad sin generar un error con las direcciones que ya existen.
Haga el script ejecutable. Tenga en cuenta la ruta completa, que era la parte que faltaba en la versión anterior de esta guía:
chmod +x /usr/local/sbin/extra-ips.sh
Hacer que las direcciones persistan con un servicio systemd
Ejecutar el script a mano añade las direcciones solo hasta el siguiente reinicio. Para aplicarlas automáticamente al arrancar, cree un servicio systemd que ejecute el script durante el arranque. Este método funciona igual tanto si el sistema usa netplan, systemd-networkd o el antiguo stack ifupdown.
Cree el archivo de unidad:
nano /etc/systemd/system/extra-ips.service
Añada lo siguiente:
[Unit] Description=Assign additional IP addresses After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/extra-ips.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
Recargue systemd y active el servicio para que se ejecute ahora y en cada arranque:
systemctl daemon-reload systemctl enable --now extra-ips.service
Confirme que el servicio se ha iniciado correctamente:
systemctl status --no-pager extra-ips.service
Advertencia: Las direcciones añadidas por este script no forman parte de la configuración de netplan ni de systemd-networkd. Unnetplan applyposterior, unnetworkctl reconfigureo cualquier reinicio de red puede eliminarlas. Vuelven en el siguiente reinicio, o de inmediato si ejecutasystemctl restart extra-ips.service. Si las direcciones también deben mantenerse a través de una reconfiguración de red, use en su lugar el método de netplan que se describe a continuación.
Alternativa: definir las direcciones en netplan
En Ubuntu, donde netplan es la opción predeterminada, las direcciones pueden declararse en el propio netplan. El stack de red las trata entonces como direcciones gestionadas, de modo que sobreviven a una reconfiguración. Esto es adecuado para una lista pequeña y fija. Para un rango grande, el servicio systemd de arriba escala mejor, ya que netplan necesita una línea por dirección.
Cuando varios archivos de netplan definen la misma interfaz, sus ajustes pueden sobrescribirse o combinarse de formas inesperadas, lo que puede descartar su dirección principal y cortar el acceso. Editar el archivo de configuración existente suele ser más seguro que crear otro archivo para la misma interfaz. Abra el archivo que ya configura su interfaz, normalmente /etc/netplan/50-cloud-init.yaml o /etc/netplan/00-installer-config.yaml:
ls /etc/netplan/ nano /etc/netplan/50-cloud-init.yaml
Conserve todos los ajustes existentes de la interfaz, como dhcp4, la dirección principal, la puerta de enlace y los servidores de nombres. Añada las direcciones adicionales bajo una lista addresses en la misma interfaz. El ejemplo de abajo mantiene DHCP para la dirección principal y añade tres direcciones secundarias:
network: version: 2 ethernets: ens3: dhcp4: true addresses: - 203.0.113.10/32 - 203.0.113.11/32 - 203.0.113.12/32
Las versiones recientes de netplan advierten si el archivo es legible por otros usuarios. Restrinja los permisos para eliminar esa advertencia:
chmod 600 /etc/netplan/50-cloud-init.yaml
Pruebe el cambio con netplan try. Aplica la configuración y la revierte automáticamente al cabo de 120 segundos a menos que la confirme, lo que le protege de perder el acceso remoto:
netplan try
Si la conexión se mantiene y todo se ve correcto, confirme cuando se le pida y luego aplique la configuración de forma permanente:
netplan apply
Verificar el resultado
Liste las direcciones actualmente vinculadas a la interfaz y confirme que las nuevas están presentes:
ip -br addr show ens3
Las direcciones adicionales deberían aparecer ahora en la salida y se restaurarán automáticamente tras cada reinicio.
Eliminar las direcciones
Para eliminar una sola dirección, bórrela de la interfaz:
ip addr del 203.0.113.10/32 dev ens3
Si usó el script y el servicio, detenga la asignación de todo el rango en el arranque desactivando y eliminando el servicio:
systemctl disable --now extra-ips.service rm /etc/systemd/system/extra-ips.service systemctl daemon-reload
Si usó netplan, elimine las líneas adicionales de la lista addresses en el archivo de netplan y luego ejecute netplan apply.
Solución de problemas
Si el servicio no arranca, compruebe su estado y los registros:
systemctl status --no-pager extra-ips.service journalctl -u extra-ips.service
Confirme lo siguiente:
- el nombre de la interfaz en el script coincide con el nombre real de
ip -br addr show; - las direcciones pertenecen al bloque que se le ha asignado;
- el script es ejecutable.
Si usó por error un prefijo /24 en lugar de /32, la tabla de enrutamiento muestra el síntoma como varias rutas de subred duplicadas. Compruébelo con:
ip route
Esta guía se centra en IPv4. Al igual que con IPv4, las direcciones IPv6 secundarias se añaden normalmente como direcciones de host con un prefijo /128, usando el mismo comando ip addr replace, por ejemplo ip addr replace 2001:db8::10/128 dev ens3.