Redirection de port, également appelée mappage de ports, est une méthode permettant à des appareils distants de se connecter à un service spécifique au sein de votre réseau local privé (LAN). Comme son nom l'indique, le processus consiste à rediriger les requêtes d'un port spécifique vers un autre port ou réseau. Il modifie la destination du paquet en cours de route et est considéré comme un type d'opération de traduction d'adresse réseau (NAT) .
L'activation de la redirection de port permet aux appareils ou hôtes non connectés au réseau interne d'accéder les uns aux autres, ce qui est autrement restreint lorsqu'elle est désactivée. Vous pouvez tirer parti des avantages de la redirection de port pour bloquer des sites web cibles, améliorer la sécurité et contourner le pare-feu NAT à votre convenance.
Dans ce tutoriel, nous allons vous guider à travers les étapes de redirection de ports avec iptables sous Linux.
Prérequis
Pour suivre ce tutoriel, vous aurez besoin de :
- Ubuntu installé sur votre système.
- Deux hôtes Ubuntu 20.04 dans le même centre de données avec le réseau privé activé.
- Un compte utilisateur non-root configuré avec les privilèges sudo sur chaque machine.
Détails de l'hôte
Tout d'abord, nous devons connaître les détails des interfaces et des adresses des serveurs de travail. Vérifions les interfaces réseau de notre système :
|
1 |
ip -4 addr show scope global |
Vous verrez la sortie suivante :
|
1 2 3 4 5 6 7 8 9 |
Exemple de sortie 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
Ici, la sortie en surbrillance montre deux interfaces, la première eth0 attribuée à l'adresse 192.51.100.45, et la seconde eth1 attribuée à l'adresse 192.168.1.5. Parmi ces deux interfaces, l'une est publique et l'autre est privée. Nous allons exécuter une commande pour les distinguer et identifier l'interface publique, celle connectée à votre passerelle par défaut. Pour les distinguer, tapez :
|
1 |
ip route show | grep default= |
Vous verrez la sortie suivante :
|
1 2 3 |
Sortie: ip route show | grep default |
Données fictives pour le tutoriel
Nous utiliserons des adresses et des attributions d'interfaces fictives tout au long de ce tutoriel. Vous êtes libre d'utiliser ces données ou de les remplacer, à votre convenance.
Détails réseau du serveur web :
-
Adresse IP publique : 203.0.113.2
-
Adresse IP privée : 192.0.2.2
-
Interface publique : eth0
-
Interface privée : eth1
Détails réseau du pare-feu :
-
Adresse IP publique : 203.0.113.15
-
Adresse IP privée : 192.0.2.15
-
Interface publique : eth0
-
Interface privée : eth1
Configuration du serveur web
Commençons par notre hôte de serveur web. Tout d'abord, connectez-vous avec votre sudo utilisateur.
Installer Nginx
Tout d'abord, nous allons installer Nginx sur notre hôte de serveur web et le verrouiller afin qu'il n'écoute que son interface privée. Cela permettra à notre serveur web d'être disponible uniquement si nous avons configuré la redirection de port de manière correcte.
Ensuite, mettez à jour le cache des paquets locaux et utilisez apt pour télécharger et installer Nginx :
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Ajouter des restrictions
Une fois Nginx installé sur notre hôte de serveur web, nous allons le verrouiller pour nous assurer qu'il accepte les entrées provenant des interfaces privées et de nulle part ailleurs. De plus, cela garantira que nos serveurs web ne seront actifs que si la configuration de la redirection de port est correcte.
Pour ajouter des restrictions, ouvrez le fichier de configuration du bloc serveur par défaut /etc/nginx/sites-enabled/default sur n'importe quel éditeur de texte de votre choix (ici, nous utilisons l'éditeur de texte nano), et tapez :
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
Dans la sortie, vous verrez la directive listen apparaître deux fois :

Dans ce tutoriel, nous utilisons la première directive pour illustrer la redirection IPv4. La seconde, configurée pour IPv6, peut être supprimée. Ajoutez l'adresse IP privée de votre serveur web suivie de deux-points juste avant le 80 pour indiquer à Nginx de n'accepter que les entrées provenant de l'interface privée. Ensuite, modifiez la directive :

Une fois cela fait, enregistrez et fermez le fichier. Avant de continuer, assurez-vous qu'il n'y a pas d'erreurs de syntaxe. Testons le fichier :
|
1 |
sudo nginx -t |

Si aucune erreur ne s'affiche, vous pouvez redémarrer Nginx et activer la nouvelle configuration :
|
1 |
sudo service nginx restart |
Vérification de la restriction réseau
Vérifions le niveau d'accès que nous avons à notre serveur web. Essayez d'accéder au serveur web en utilisant l'interface privée à l'aide de la curl commande :
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Vous verrez la sortie suivante :

Si nous essayons d'utiliser l'interface publique, nous ne pourrons pas nous connecter :
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Échec de connexion à 203.0.113.2 port 80: Connexion refusée |
C'est exactement ce à quoi nous nous attendions.
Configurer le pare-feu pour rediriger le port 80
Continuons notre travail en implémentant la redirection de port sur notre machine pare-feu.
Activer la redirection dans le noyau
Par défaut, la plupart des systèmes ont la redirection de port désactivée (OFF). Nous allons apporter des modifications pour l'activer (ON) en effectuant quelques éditions. De plus, il est possible d'activer la redirection de port de manière permanente en utilisant les privilèges sudo comme indiqué dans les étapes suivantes.
Pour activer la redirection du trafic au niveau du noyau, tapez :
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Pour activer la redirection de port de manière permanente, modifiez le fichier /etc/sysctl.conf . Ouvrez le fichier avec les privilèges sudo et tapez :
|
1 |
sudo nano /etc/sysctl.conf |
À l'intérieur, trouvez et décommentez la ligne qui ressemble à ceci :
|
1 |
net.ipv4.ip_forward=1 |
Une fois cela fait, enregistrez et fermez le fichier. Ensuite, utilisez les commandes sysctl pour appliquer les modifications des paramètres afin de les rendre effectives :
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Configuration de base du pare-feu
Tout d'abord, consultez le guide sur comment configurer un pare-feu de base sur votre machine. Une fois terminé, vous aurez :
- Installé iptables-persistent
- Enregistré le jeu de règles par défaut dans /etc/iptables/rules.v4
- Une connaissance approfondie de l'ajout et de la modification de règles à l'aide de la iptables commande
Vous pouvez également consulter comment lister et supprimer les règles de pare-feu iptables.
Ajout des règles de redirection
Nous allons configurer notre pare-feu pour nous assurer que le trafic entrant sur notre interface publique ( eth0 ) sur le port 80 soit redirigé vers notre interface privée ( eth1). Par défaut, notre pare-feu de base a une chaîne FORWARD définie sur DROP le trafic. L'ajout de règles de pare-feu permettra de transférer les connexions vers notre serveur web. Pour plus de sécurité, nous allons verrouiller les règles du pare-feu pour n'autoriser que les requêtes de redirection.
Dans la chaîne FORWARD , nous accepterons les nouvelles connexions destinées au port 80 provenant de notre interface publique et se dirigeant vers notre interface privée. Nous identifierons les nouvelles connexions à l'aide de l'extension conntrack et les représenterons par un paquet TCP SYN :
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Vous devez autoriser tout trafic ultérieur dans les deux sens résultant de la connexion entrante. Tapez les commandes ci-dessous pour autoriser le trafic ESTABLISHED et RELATED entre nos interfaces publique et privée :
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Vérifions si notre politique sur la chaîne FORWARD est définie sur DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Jusqu'à présent, nous avons ajouté quelques règles qui permettent au trafic entre nos interfaces publique et privée de passer à travers notre pare-feu. Cependant, iptables n'est pas encore informé de diriger le trafic car la configuration des règles du pare-feu reste à faire. Dans les étapes suivantes, nous ajouterons les règles NAT et ajusterons le jeu de règles permanent pour diriger le trafic.
Ajout des règles NAT pour diriger les paquets
Nous allons effectuer deux opérations distinctes afin que iptables puisse modifier correctement les paquets et rationaliser la communication avec les clients et le serveur web.
DNAT est la première opération qui commence la chaîne PREROUTING de la table nat . L'opération modifie l'adresse de destination du paquet et lui permet d'être correctement acheminé lorsqu'il passe entre les réseaux. Cependant, les clients sur le réseau public se connecteront à notre serveur pare-feu et n'auront aucune information sur la topologie de notre réseau privé. Pour transmettre des informations avec le réseau privé, modifiez l'adresse de destination de chaque paquet pour lui permettre d'atteindre correctement notre serveur web de destination.
Il est crucial de noter que nous nous concentrons sur la configuration de la redirection de port. Effectuer du NAT sur chaque paquet arrivant sur le pare-feu ne fait pas partie de notre tutoriel. Nous ferons correspondre les paquets sur le port 80 à l'adresse IP privée de notre serveur web :
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Le paquet sera correctement acheminé vers notre serveur web contenant l'adresse d'origine du client comme adresse source. Malgré les tentatives du serveur pour envoyer la réponse directement à cette adresse, il sera impossible d'établir une connexion TCP légitime.
Pour configurer un routage correct, nous allons modifier l'adresse source du paquet. Modifions l'adresse source pour qu'elle corresponde à l'adresse IP privée de notre serveur pare-feu. Après modification, la réponse sera renvoyée au pare-feu, qui la transmettra en retour au client.
Pour activer cette fonctionnalité, ajoutez une règle à la chaîne POSTROUTING de la table nat évaluée juste avant que les paquets ne soient envoyés sur le réseau. Ensuite, faites correspondre les paquets destinés à notre serveur web par adresse IP et port :
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Une fois cette règle en place, notre serveur web devrait être accessible en pointant notre navigateur web vers l'adresse publique de notre machine pare-feu :
|
1 |
curl 203.0.113.15 |
Vous verrez la sortie suivante :

Notre configuration de redirection de port est terminée.
Ajuster le jeu de règles permanent
Après avoir terminé la configuration de la redirection de port, nous allons l'enregistrer dans notre jeu de règles permanent. Si vous souhaitez conserver les commentaires dans le jeu de règles actuel, utilisez le service iptables-persistent pour enregistrer vos règles :
|
1 |
sudo service iptables-persistent save |
Vous pouvez également l'ouvrir et le modifier manuellement pour conserver les commentaires dans votre fichier :
|
1 |
sudo nano /etc/iptables/rules.v4 |
Ensuite, configurez la table filter et la table nat pour ajouter respectivement les règles de la chaîne FORWARD et les règles de ROUTING respectivement. L'ajustement de la table nat nous permettra d'ajouter des règles PREROUTING et POSTROUTING comme le montre l'exemple ci-dessous :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Autoriser tout le trafic sortant, mais bloquer par défaut les paquets entrants et transférés :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Chaînes personnalisées par protocole :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Trafic UDP acceptable # Trafic TCP acceptable -A TCP -p tcp --dport 22 -j ACCEPT # Trafic ICMP acceptable # Politique d'acceptation standard -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Bloquer les paquets non valides -A INPUT -m conntrack --ctstate INVALID -j DROP # Transmettre le trafic aux chaînes spécifiques au protocole ## Autoriser uniquement les nouvelles connexions (les connexions établies et associées devraient déjà être gérées) ## Pour TCP, autoriser en plus uniquement les nouveaux paquets SYN car c'est la seule méthode valide ## pour établir une nouvelle connexion TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Rejeter tout ce qui est arrivé jusqu'ici ## Essayer d'être spécifique au protocole avec le message de rejet -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Règles pour rediriger le port 80 vers notre serveur web # Détails réseau du serveur web : # * Adresse IP publique : 203.0.113.2 # * Adresse IP privée : 192.0.2.2 # * Interface publique : eth0 # * Interface privée : eth1 # # Détails réseau du pare-feu : # # * Adresse IP publique : 203.0.113.15 # * Adresse IP privée : 192.0.2.15 # * Interface publique : eth0 # * Interface privée : eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Fin des règles de filtrage Forward # Valider les modifications COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Règles pour traduire les requêtes pour le port 80 de l'interface publique # afin que nous puissions rediriger correctement vers le serveur web en utilisant l' # interface privée. # Détails réseau du serveur web : # * Adresse IP publique : 203.0.113.2 # * Adresse IP privée : 192.0.2.2 # * Interface publique : eth0 # * Interface privée : eth1 # # Détails réseau du pare-feu : # # * Adresse IP publique : 203.0.113.15 # * Adresse IP privée : 192.0.2.15 # * Interface publique : eth0 # * Interface privée : eth1 # * Private Interface: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Fin des traductions NAT pour le trafic du serveur web COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Après avoir ajouté les valeurs ci-dessus, enregistrez et fermez le fichier. Ensuite, saisissez la commande ci-dessous pour tester la syntaxe de vos règles :
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Si vous ne voyez aucune erreur, chargez le jeu de règles :
|
1 |
sudo service iptables-persistent reload |
Vérifions que notre serveur web est toujours accessible via l'adresse IP publique de votre pare-feu :
|
1 |
curl 203.0.113.15 |
Conclusion
À la fin de ce tutoriel, vous devriez être à l'aise avec la redirection de ports sur un serveur Linux avec iptables. Vous pouvez exploiter les capacités de redirection de ports pour masquer la topologie de votre réseau privé tout en rationalisant le trafic de services pour qu'il circule librement à travers votre machine pare-feu passerelle.
Comme le processus repose explicitement sur la sécurité de votre réseau et les ports utilisés, il est sûr. Il peut y avoir un risque si vous n'avez pas de pare-feu de sécurité ou de sécurité VPN sur votre réseau. Par conséquent, il est conseillé de configurer le pare-feu comme décrit dans ce tutoriel. Nous espérons que ce guide vous aidera à rester en sécurité sur Internet lorsque vous utilisez votre réseau privé.
Pour explorer d'autres solutions de pare-feu que vous pouvez implémenter sur votre système, consultez ces ressources sur notre blog:
- Configuration d'un pare-feu avec UFW sur Ubuntu 18.04
- Configuration d'un pare-feu avec FirewallD sur CentOS 7
- Les bases de UFW : Apprendre les commandes essentielles du pare-feu
Bonne informatique !
Commentaires
Aucun commentaire pour l'instant. Soyez le premier.