Come associare i servizi a un IP su un server multi-IP
Livello: Intermedio
Tempo stimato: ~25 minuti
Obiettivo: Configurare SSH, Nginx, Apache e MySQL/MariaDB in modo che restino in ascolto solo su uno specifico indirizzo IP anziché su tutte le interfacce di un server con più IP.
Introduzione
Quando un server ha più indirizzi IP, per impostazione predefinita ogni servizio è in ascolto su tutti. Raramente è il comportamento desiderato: un database non dovrebbe essere raggiungibile da un IP pubblico e un server web di un cliente non dovrebbe rispondere sull'indirizzo di un altro cliente. Una corretta configurazione di un server con più IP garantisce che ogni interfaccia di rete gestisca il traffico appropriato. L'IP binding offre un controllo più preciso degli accessi, aiuta a gestire l'instradamento del traffico in ingresso e riduce la superficie di attacco. In questa guida spieghiamo come associare un servizio a un indirizzo IP (bind service to IP address) per diversi servizi comuni (SSH, Nginx, Apache, MySQL/MariaDB) e come ottimizzare la configurazione dell'indirizzo di ascolto in modo che venga utilizzato solo l'IP scelto.
Prerequisiti
Prima di iniziare, verificare che siano soddisfatte le seguenti condizioni:
- Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 o CentOS/RHEL 8/9 (se è necessario configurare il binding dei servizi su Ubuntu, i passaggi sono quasi identici in tutte le versioni)
- Accesso: accesso sudo o root al server
- Rete: almeno due indirizzi IP configurati sul server (verifica al passaggio 1)
- Conoscenze richieste: buona familiarità con la riga di comando di Linux e con la modifica di base dei file di testo
Passaggio 1: individuare gli indirizzi IP
Controllare quali indirizzi IP sono assegnati al server:
ip -4 addr show
Output previsto (esempio):
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
In questa guida useremo 203.0.113.10 come IP pubblico e 198.51.100.5 come IP secondario. Sostituirli con i propri indirizzi effettivi.
Se viene visualizzato un solo indirizzo, sul server non sono ancora configurati più IP. Contattare il provider o aggiungere manualmente un indirizzo prima di procedere.
Passaggio 2: associare SSH a uno specifico IP
Per impostazione predefinita, SSH è in ascolto su 0.0.0.0 (tutte le interfacce). Per limitarlo a un solo IP e ottenere il binding del servizio su Linux:
Eseguire il backup della configurazione:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
Aprire il file di configurazione di SSH:
sudo nano /etc/ssh/sshd_config
Individuare la direttiva ListenAddress e impostare l'indirizzo di ascolto per configurare l'indirizzo IP su cui restare in ascolto:
ListenAddress 203.0.113.10
Se ListenAddress è commentata o assente, aggiungere la riga in un punto qualsiasi del file.
Convalidare la configurazione:
sudo sshd -t
Se non viene restituito alcun output, la configurazione è valida.
Prima di riavviare SSH, assicurarsi che l'IP specificato sia corretto e raggiungibile. Se SSH viene associato a un IP errato, si perde l'accesso al server. Tenere aperta una seconda sessione SSH come rete di sicurezza oppure usare l'accesso console del provider.
Riavviare il servizio:
sudo systemctl restart sshd
Su alcuni sistemi il servizio può chiamarsi ssh invece di sshd.
Verificare che SSH sia ora in ascolto solo sull'IP specificato:
ss -tlnp | grep sshd
Output previsto:
LISTEN 0 128 203.0.113.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
Se compare 0.0.0.0:22, la modifica non è stata applicata. Controllare la configurazione per eventuali errori di battitura o righe ListenAddress in conflitto.
Passaggio 3: associare Nginx a uno specifico IP
La direttiva listen controlla quale IP e quale porta utilizza Nginx. Per associare l'applicazione a un IP, è necessario configurare la direttiva listen di NGINX.
Eseguire il backup della configurazione:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
Aprire la configurazione del sito:
sudo nano /etc/nginx/sites-available/default
Su CentOS/RHEL il percorso della configurazione predefinita è /etc/nginx/conf.d/default.conf. La sintassi è la stessa.
Modificare la direttiva di ascolto (listen) da:
listen 80; listen [::]:80;
a:
listen 203.0.113.10:80;
Se si utilizza anche HTTPS:
listen 203.0.113.10:443 ssl;
Testare la configurazione e ricaricarla:
sudo nginx -t sudo systemctl reload nginx
Verifica:
ss -tlnp | grep nginx
Output previsto:
LISTEN 0 511 203.0.113.10:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
Passaggio 4: associare Apache a uno specifico IP
Apache utilizza la direttiva Listen nella configurazione principale.
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
Modificare:
Listen 80
in:
Listen 203.0.113.10:80
Per HTTPS:
Listen 203.0.113.10:443
Aggiornare anche eventuali blocchi <VirtualHost *:80> in modo che usino l'IP:
<VirtualHost 203.0.113.10:80>
Testare e ricaricare:
Debian/Ubuntu:
sudo apachectl configtest sudo systemctl reload apache2
CentOS/RHEL:
sudo apachectl configtest sudo systemctl reload httpd
Verifica:
ss -tlnp | grep -E 'apache|httpd'
Passaggio 5: associare MySQL/MariaDB a uno specifico IP
Per impostazione predefinita, MySQL/MariaDB è in ascolto su 127.0.0.1 (solo localhost). Se è necessario renderlo raggiungibile su uno specifico IP interno, modificare bind-address per associare l'applicazione a un IP locale.
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
Il percorso esatto del file di configurazione varia. Se il file indicato sopra non esiste, cercare la sezione [mysqld] in /etc/my.cnf o /etc/mysql/my.cnf.
Individuare la riga bind-address e modificarla:
bind-address = 198.51.100.5
Riavviare il servizio:
sudo systemctl restart mysql # oppure mysqld / mariadb
Verifica:
ss -tlnp | grep 3306
Output previsto:
LISTEN 0 80 198.51.100.5:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))
Se si modifica bind-address da 127.0.0.1 a un IP instradabile, assicurarsi di avere una regola del firewall che consenta le connessioni solo da origini attendibili. Non esporre mai la porta di un database a Internet senza protezione.
Verifica
Dopo aver configurato tutti i servizi, eseguire un controllo riepilogativo:
ss -tlnp
Verificare che ogni servizio mostri l'IP previsto, non 0.0.0.0 o *.
ssh [email protected] # dovrebbe funzionare ssh [email protected] # dovrebbe essere rifiutata se SSH è associato all'altro IP
Ripristino
Per annullare una modifica, ripristinare la configurazione dal backup e riavviare il servizio.
Per SSH:
sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd
Per qualsiasi altro servizio, annullare la modifica di listen / bind-address nel rispettivo file di configurazione e riavviare. Il valore originale è quasi sempre 0.0.0.0, * o 127.0.0.1.
Conclusione
Ecco fatto. Ogni servizio può essere limitato modificando una sola direttiva, riavviando e verificando con ss -tlnp.
Versione del documento: 1.0
Ultimo aggiornamento: aprile 2026
Responsabile: Team di documentazione tecnica