Vincular servicios a una IP en un servidor Linux multi-IP | INTROSERV
EUR
european

EUR

usa

USD

Spanish Es
Ex. VAT Ex. VAT 0%

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.

Info

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.

Warning

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

Info

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

Info

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

Info

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))

Warning

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 *.

También puede probar desde otra máquina:

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA