Comment lier des services à une IP sur un serveur multi-IP
Niveau : Intermédiaire
Durée estimée : ~25 minutes
Objectif : Configurer SSH, Nginx, Apache et MySQL/MariaDB pour qu'ils écoutent uniquement sur une adresse IP précise au lieu de toutes les interfaces d'un serveur disposant de plusieurs adresses IP.
Introduction
Lorsqu'un serveur possède plusieurs adresses IP, chaque service écoute par défaut sur toutes. C'est rarement souhaitable : une base de données ne doit pas être accessible sur une adresse IP publique, et le serveur web d'un client ne doit pas répondre sur l'adresse d'un autre client. Une configuration correcte d'un serveur multi-IP garantit que chaque interface réseau traite le bon trafic. La liaison à une adresse IP (IP binding) offre un contrôle d'accès plus strict, aide à gérer l'acheminement du trafic entrant et réduit la surface d'attaque. Dans ce tutoriel, nous expliquons comment lier un service à une adresse IP (bind service to IP address) pour plusieurs services courants — SSH, Nginx, Apache, MySQL/MariaDB — et comment optimiser la configuration de l'adresse d'écoute afin que le service n'écoute que sur l'adresse IP choisie.
Prérequis
Avant de commencer, assurez-vous que les conditions suivantes sont remplies :
- Système d'exploitation : Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 ou CentOS/RHEL 8/9 (si vous devez configurer la liaison de services sous Ubuntu, les étapes sont presque identiques d'une version à l'autre)
- Accès : accès sudo ou root au serveur
- Réseau : au moins deux adresses IP configurées sur le serveur (à vérifier à l'étape 1)
- Connaissances requises : maîtrise de la ligne de commande Linux et de l'édition de texte de base
Étape 1 : Identifier vos adresses IP
Vérifiez quelles adresses IP sont attribuées au serveur :
ip -4 addr show
Sortie attendue (exemple) :
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
Dans ce tutoriel, nous utilisons 203.0.113.10 comme adresse IP publique et 198.51.100.5 comme adresse IP secondaire. Remplacez-les par vos adresses réelles.
Si vous ne voyez qu'une seule adresse, votre serveur n'a pas encore plusieurs adresses IP configurées. Contactez votre fournisseur ou ajoutez une adresse manuellement avant de continuer.
Étape 2 : Lier SSH à une adresse IP précise
Par défaut, SSH écoute sur 0.0.0.0 (toutes les interfaces). Pour le limiter à une seule adresse IP et réaliser la liaison du service sous Linux :
Sauvegardez la configuration :
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
Ouvrez le fichier de configuration SSH :
sudo nano /etc/ssh/sshd_config
Repérez la directive ListenAddress et définissez l'adresse d'écoute afin de configurer l'adresse IP sur laquelle le service écoute :
ListenAddress 203.0.113.10
Si ListenAddress est commentée ou absente, ajoutez la ligne à n'importe quel endroit du fichier.
Validez la configuration :
sudo sshd -t
Si aucune sortie n'est renvoyée, la configuration est valide.
Avant de redémarrer SSH, assurez-vous que l'adresse IP indiquée est correcte et joignable. Si vous liez SSH à une mauvaise adresse IP, vous perdrez l'accès au serveur. Gardez une seconde session SSH ouverte par précaution, ou utilisez l'accès console de votre fournisseur.
Redémarrez le service :
sudo systemctl restart sshd
Sur certains systèmes, le service peut s'appeler ssh au lieu de sshd.
Vérifiez que SSH n'écoute désormais que sur l'adresse IP indiquée :
ss -tlnp | grep sshd
Sortie attendue :
LISTEN 0 128 203.0.113.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
Si vous voyez 0.0.0.0:22, la modification n'a pas pris effet. Recherchez dans la configuration d'éventuelles fautes de frappe ou des lignes ListenAddress contradictoires.
Étape 3 : Lier Nginx à une adresse IP précise
La directive listen détermine l'adresse IP et le port utilisés par Nginx. Pour lier l'application à une adresse IP, vous devez configurer la directive listen de NGINX.
Sauvegardez la configuration :
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
Ouvrez la configuration de votre site :
sudo nano /etc/nginx/sites-available/default
Sous CentOS/RHEL, le chemin de la configuration par défaut est /etc/nginx/conf.d/default.conf. La syntaxe est la même.
Remplacez la directive d'écoute (listen) :
listen 80; listen [::]:80;
par :
listen 203.0.113.10:80;
Si vous utilisez également HTTPS :
listen 203.0.113.10:443 ssl;
Testez la configuration et rechargez-la :
sudo nginx -t sudo systemctl reload nginx
Vérification :
ss -tlnp | grep nginx
Sortie attendue :
LISTEN 0 511 203.0.113.10:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
Étape 4 : Lier Apache à une adresse IP précise
Apache utilise la directive Listen dans sa configuration 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
Remplacez :
Listen 80
par :
Listen 203.0.113.10:80
Pour HTTPS :
Listen 203.0.113.10:443
Mettez également à jour tous les blocs <VirtualHost *:80> pour qu'ils utilisent l'adresse IP :
<VirtualHost 203.0.113.10:80>
Testez et rechargez :
Debian/Ubuntu :
sudo apachectl configtest sudo systemctl reload apache2
CentOS/RHEL :
sudo apachectl configtest sudo systemctl reload httpd
Vérification :
ss -tlnp | grep -E 'apache|httpd'
Étape 5 : Lier MySQL/MariaDB à une adresse IP précise
Par défaut, MySQL/MariaDB écoute sur 127.0.0.1 (localhost uniquement). Si vous devez le rendre accessible sur une adresse IP interne précise, modifiez bind-address afin de lier l'application à une adresse 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
Le chemin exact du fichier de configuration varie. Si le fichier ci-dessus n'existe pas, recherchez la section [mysqld] dans /etc/my.cnf ou /etc/mysql/my.cnf.
Repérez la ligne bind-address et modifiez-la :
bind-address = 198.51.100.5
Redémarrez le service :
sudo systemctl restart mysql # ou mysqld / mariadb
Vérification :
ss -tlnp | grep 3306
Sortie attendue :
LISTEN 0 80 198.51.100.5:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))
Si vous faites passer bind-address de 127.0.0.1 à une adresse IP routable, assurez-vous de disposer d'une règle de pare-feu n'autorisant les connexions que depuis des sources de confiance. N'exposez jamais le port d'une base de données à l'Internet public sans protection.
Vérification
Après avoir configuré tous les services, effectuez un contrôle récapitulatif :
ss -tlnp
Vérifiez que chaque service affiche l'adresse IP prévue, et non 0.0.0.0 ou *.
ssh [email protected] # doit fonctionner ssh [email protected] # doit être refusée si SSH est lié à l'autre adresse IP
Retour arrière
Pour annuler une modification, restaurez la configuration sauvegardée et redémarrez le service.
Pour SSH :
sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd
Pour tout autre service, annulez la modification de listen / bind-address dans le fichier de configuration correspondant et redémarrez. La valeur d'origine est presque toujours 0.0.0.0, * ou 127.0.0.1.
Conclusion
C'est tout. Chaque service peut être restreint en modifiant une seule directive, en redémarrant puis en vérifiant avec ss -tlnp.
Version du document : 1.0
Dernière mise à jour : avril 2026
Responsable : Équipe de documentation technique