Cómo enlazar servicios a una IP en un servidor multi-IP
Nivel: Intermedio
Tiempo estimado: ~25 minutos
Objetivo: Configurar SSH, Nginx, Apache y MySQL/MariaDB para que escuchen únicamente en una dirección IP concreta en lugar de en todas las interfaces de un servidor con varias IP.
Introducción
Cuando un servidor tiene varias direcciones IP, cada servicio escucha en todas ellas de forma predeterminada. Rara vez es lo que se desea: una base de datos no debería ser accesible desde una IP pública, y un servidor web de un cliente no debería responder en la dirección de otro cliente. Una configuración correcta de un servidor con varias IP garantiza que cada interfaz de red gestione el tráfico adecuado. El enlace a IP (IP binding) ofrece un control de acceso más preciso, ayuda a gestionar el enrutamiento del tráfico entrante y reduce la superficie de ataque. En este tutorial explicaremos cómo enlazar un servicio a una dirección IP (bind service to IP address) para varios servicios habituales (SSH, Nginx, Apache y MySQL/MariaDB) y cómo optimizar la configuración de la dirección de escucha para que solo se utilice la IP elegida.
Requisitos previos
Antes de empezar, asegúrese de que se cumplen las siguientes condiciones:
- Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 o CentOS/RHEL 8/9 (si necesita configurar el enlace de servicios en Ubuntu, los pasos son prácticamente idénticos en todas las versiones)
- Acceso: acceso sudo o root al servidor
- Red: al menos dos direcciones IP configuradas en el servidor (compruébelo en el paso 1)
- Conocimientos necesarios: manejo seguro de la línea de comandos de Linux y edición básica de texto
Paso 1: Identifique sus direcciones IP
Compruebe qué direcciones IP están asignadas al servidor:
ip -4 addr show
Salida esperada (ejemplo):
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... inet 203.0.113.10/24 brd 203.0.113.255 scope global eth0 inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0:1
En este tutorial usaremos 203.0.113.10 como IP pública y 198.51.100.5 como IP secundaria. Sustitúyalas por sus direcciones reales.
Si solo ve una dirección, su servidor aún no tiene varias IP configuradas. Póngase en contacto con su proveedor o añada una dirección manualmente antes de continuar.
Paso 2: Enlace SSH a una IP concreta
De forma predeterminada, SSH escucha en 0.0.0.0 (todas las interfaces). Para restringirlo a una sola IP y lograr el enlace de servicios en Linux:
Haga una copia de seguridad de la configuración:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
Abra el archivo de configuración de SSH:
sudo nano /etc/ssh/sshd_config
Busque la directiva ListenAddress y establezca la dirección de escucha para configurar la dirección IP en la que se escucha:
ListenAddress 203.0.113.10
Si ListenAddress está comentada o no existe, añada la línea en cualquier parte del archivo.
Valide la configuración:
sudo sshd -t
Si no se muestra ninguna salida, la configuración es válida.
Antes de reiniciar SSH, asegúrese de que la IP que ha especificado es correcta y accesible. Si enlaza SSH a una IP incorrecta, se quedará sin acceso al servidor. Mantenga abierta una segunda sesión SSH como red de seguridad o utilice el acceso por consola de su proveedor.
Reinicie el servicio:
sudo systemctl restart sshd
En algunos sistemas, el servicio puede llamarse ssh en lugar de sshd.
Compruebe que SSH escucha ahora solo en la IP especificada:
ss -tlnp | grep sshd
Salida esperada:
LISTEN 0 128 203.0.113.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
Si ve 0.0.0.0:22, el cambio no ha surtido efecto. Compruebe si la configuración tiene errores tipográficos o líneas ListenAddress en conflicto.
Paso 3: Enlace Nginx a una IP concreta
La directiva listen controla qué IP y qué puerto utiliza Nginx. Para enlazar la aplicación a una IP, debe configurar la directiva listen de NGINX.
Haga una copia de seguridad de la configuración:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
Abra la configuración de su sitio:
sudo nano /etc/nginx/sites-available/default
En CentOS/RHEL, la ruta de la configuración predeterminada es /etc/nginx/conf.d/default.conf. La sintaxis es la misma.
Cambie la directiva de escucha (listen) de:
listen 80; listen [::]:80;
a:
listen 203.0.113.10:80;
Si también utiliza HTTPS:
listen 203.0.113.10:443 ssl;
Pruebe la configuración y recárguela:
sudo nginx -t sudo systemctl reload nginx
Verifique:
ss -tlnp | grep nginx
Salida esperada:
LISTEN 0 511 203.0.113.10:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
Paso 4: Enlace Apache a una IP concreta
Apache utiliza la directiva Listen en su configuración principal.
Debian/Ubuntu:
sudo cp /etc/apache2/ports.conf /etc/apache2/ports.conf.backup sudo nano /etc/apache2/ports.conf
CentOS/RHEL:
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup sudo nano /etc/httpd/conf/httpd.conf
Cambie:
Listen 80
por:
Listen 203.0.113.10:80
Para HTTPS:
Listen 203.0.113.10:443
Actualice también los bloques <VirtualHost *:80> para que usen la IP:
<VirtualHost 203.0.113.10:80>
Pruebe y recargue:
Debian/Ubuntu:
sudo apachectl configtest sudo systemctl reload apache2
CentOS/RHEL:
sudo apachectl configtest sudo systemctl reload httpd
Verifique:
ss -tlnp | grep -E 'apache|httpd'
Paso 5: Enlace MySQL/MariaDB a una IP concreta
De forma predeterminada, MySQL/MariaDB escucha en 127.0.0.1 (solo localhost). Si necesita que sea accesible en una IP interna concreta, cambie bind-address para enlazar la aplicación a una IP local.
Debian/Ubuntu (MySQL 8.x / MariaDB 10.x):
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
CentOS/RHEL (MariaDB):
sudo cp /etc/my.cnf.d/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf.backup sudo nano /etc/my.cnf.d/mariadb-server.cnf
La ruta exacta del archivo de configuración varía. Si el archivo anterior no existe, busque la sección [mysqld] en /etc/my.cnf o /etc/mysql/my.cnf.
Busque la línea bind-address y cámbiela:
bind-address = 198.51.100.5
Reinicie el servicio:
sudo systemctl restart mysql # o mysqld / mariadb
Verifique:
ss -tlnp | grep 3306
Salida esperada:
LISTEN 0 80 198.51.100.5:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))
Si cambia bind-address de 127.0.0.1 a una IP enrutable, asegúrese de tener una regla de firewall que permita conexiones solo desde orígenes de confianza. Nunca exponga el puerto de una base de datos a Internet sin protección.
Verificación
Después de configurar todos los servicios, realice una comprobación general:
ss -tlnp
Confirme que cada servicio muestra la IP prevista, y no 0.0.0.0 ni *.
ssh [email protected] # debería funcionar ssh [email protected] # debería ser rechazada si SSH está enlazado a la otra IP
Reversión
Para revertir cualquier cambio, restaure la configuración de la copia de seguridad y reinicie el servicio.
Para SSH:
sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd
Para cualquier otro servicio, deshaga el cambio de listen / bind-address en el archivo de configuración correspondiente y reinicie. El valor original es casi siempre 0.0.0.0, * o 127.0.0.1.
Conclusión
Eso es todo. Cada servicio se puede restringir cambiando una sola directiva, reiniciando y verificando con ss -tlnp.
Versión del documento: 1.0
Última actualización: abril de 2026
Responsable: Equipo de documentación técnica