LINUX:Firewall
But
Etape très importante, il faut sécuriser et filtrer les connexions d'autant plus qu'on est directement connecté à internet. Vient s'ajouter le problème, propre à IPV4 de l'interfaçage entre le réseau public et le réseau privé. En outre une particularité de la connexion PPP doit être appliquée.
IPTABLES
Sous Linux, il existe plusieurs Firewall. Nous utilisons "iptables". L'autre, "nftables", commence à prendre plus d'importance.
Nous installons les modules suivants:
dnf install iptables-services dnf install iptables-utils
Il comporte deux volets:
- iptables orienté IPV4
- ip6tables orienté IPV6
Les fichiers de configurations se trouvent dans le répertoire "/etc/sysconfig".
- iptables-config et ip6tables-config regroupent les options de lancement du service respectivement pour IPV4 et IPV6
- iptables et ip6tables regroupent les règles à appliquer respectivement pour IPV4 et IPV6
Pour activer ces services respectivement pour IPV4 et IPV6, nous utilisons les commandes:
systemctl enable iptables.service systemctl enable ip6tables.service
Pour les lancer respectivement pour IPV4 et IPV6, nous utilisons les commandes:
systemctl start iptables.service systemctl start ip6tables.service
A noter qu'il existe le service "firewalld.service" installé et activé à l'installation. Il peut être configuré pour utiliser soit iptables soit nftables. Il nous semble trop élémentaire; nous préférons concevoir nos propres séquences de règles. Pour cette raison, nous forçons son arrêt et son non lancement d'office avec les commandes suivantes.
systemctl disable firewalld.service systemctl stop firewalld.service systemctl mask firewalld.service
Comme nous avons désactivé IPV6, nous n'allons pas l'investiguer. Par sécurité, on garde une configuration qui bloque tout trafic et on lance le service concerné. Nous nous focaliserons sur celui concernant IPV4.
Le protocole FTP, couramment utilisé sur Internet, est un peu spécial car il utilise en même temps deux ports, usuellement les 21 et 20. Il pose aussi un gros problème pour le NAT. Cette spécifié nécessite de charger en mémoire des modules spéciaux qu'il faut spécifier. Ceci se fait dans le fichier de configuration "/etc/sysconfig/iptables-config". On y modifie la ligne suivante sans paramètres à l'origine en ajoutant les modules concernant FTP:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp nf_conntrack_ftp"
Il est également judicieux dans le cadre d'FTP (et de quelques autres protocoles), de changer un paramètre système. Nous avions créé le fichier "/etc/sysctl.d/router.conf". Nous allons ajouter la ligne suivante:
net.netfilter.nf_conntrack_helper = 1
Le nom du fichier n'a pas d'importance, l'extension si. Il faut recharger ce paramètre système avec la commande:
sysctl -p /etc/sysctl.d/router.conf
ou redémarrer la machine pour qu'il soit effectif.
IPTABLES comprend plusieurs tables.
Nous n'aborderons que les tables NAT et FILTER.
NAT
Sous IPV4, il existe deux grandes catégories d'adressage de machines. On laisse de côté le broadcast, l'unicast et le multicast ainsi que les adresses réservées. Nous avons les adresses utilisées sur Internet et celles utilisées dans les réseaux privés. Les deux son totalement disjointes et ne sont pas routables entre elles deux. Il faut donc une astuce pour, par exemple, une machine privée puisse interroger un serveur Web public tel Google.
Cette astuce se nomme NAT (Network address translation). Cette couche sert à faire paraître le trafic réseau comme appartenant à la bonne catégorie en fonction qu'il passe d'un côté ou de l'autre catégorie d'adressage. C'est là qu'intervient le NAT. De façon simpliste, quand un paquet du LAN privé veut passer vers Internet, ce processus substitue l'adresse IP privée en l'adresse publique. Quand la réponse revient d'Internet, il effectue l'opération inverse. Ce principe est d'application aussi dans l'autre sens mais avec des règles différentes non abordées dans ce paragraphe.
Dans le fichier "/etc/sysconfig/iptables", la section concernant la table NAT est signalée par la ligne:
*nat
et se clôture par la ligne:
COMMIT
Chaque table accepte un certain nombre de chaînes ayant chacune leur fonction propre dans le firewall. Il est possible de créer ses propres sous-chaînes comme des fonctions en programmation. En début on les déclare avec une politique donnée au démarrage. Ainsi pour la table NAT nous avons:
*nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :INPUT ACCEPT [0:0] # Commentaires # # Bloc des règles personnelles # COMMIT
Dans notre cas, la fonction NAT doit intervenir quand un paquet veut sortir de nos LANs privés vers Internet par l'interface "ppp0". Nous allons ajouter la règle personnelle suivante:
-A POSTROUTING -o ppp0 -j MASQUERADE
Explications:
- -A: ajout de la rêgle
- POSTROUTING: cette chaîne intervient en fin de processus après l'opération de filtrage faite au niveau de la table FILTER.
- -o ppp0: signifie quand on sort par l'interface "ppp0"
- -j MASQUERADE: effectue l'opération de passe-passe d'adressage IP
Le traitement à l'intérieur de chaque table/chaîne se fait de façon séquentielle en fonction de l'ordre d'ajout.
Une opération appelée derrière "-j" peut conduire à une sortie de traitement comme "MASQUERADE". D'autres comme "LOG" qui sert à imprimer un message dans le journal du système, laisse le traitement se poursuivre à la règle suivante.
On conçoit aisément que l'ordre des règles a un grande importance.
Maintenant supposons que la machine ayant l'adresse IP 192.168.2.2 du LAN n°2 soit un serveur WEB (protocole HTTP, port 80). Ce service doit être accessible depuis Internet. Il faut ajouter la ligne suivante dans le table NAT:
-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80
Explications:
- PREROUTING: l'adressage compatible avec Internet est adapté avant de rentrer dans le réseau privé
- -i ppp0: il concerne le trafic entrant par l'interface "^ppp0"
- -p tcp --dport 80: la requête arrivant est de type TCP et concerne le protocole HTTP de destination (port 80)
- -j DNAT: type d'action qui adapte l'adressage et le port de la destination
- --to-destination 192.168.2.2:80: à l'arrivée, l'adresse IP de destination est celle de l'interface "ppp0"; elle est transformée en l'adresse IP du serveur WEB du LAN n°2; l'ajout du port 80 est facultatif mais si le port du service WEB de la machine 192.168.2.2 était 8080, on aurait ":8080" à la place de ":80".
FILTER
La seconde table importante est "FILTER". C'est à ce niveau qu'on effectue le filtrage des paquets. Il existe trois chaînes:
- INPUT: pour traiter tout le trafic entrant dans la machine
- OUTPUT: pour traiter tout le trafic sortant hors de la machine
- FORWARD: pour traiter tout le trafic transitant au travers de la machine, ce qui est le rôle principal d'un routeur
La table FILTER a la même structure que la table NAT à part qu'elle ne dispose que des chaînes INPUT, OUTPUT et FORWARD. En début du fichier de commandes "/etc/sysconfig/iptables", on déclare ces chaînes de cette table avec une politique donnée au démarrage.
*filter :OUTPUT ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] # Commentaires # # Bloc des règles personnelles # COMMIT
Principe
Les trois schémas ci-dessous résument ce trafic. Le triangle représente le routeur, chaque coin une interface identifiée par son nom. Les flèches représentent le sens du trafic. La couleur verte symbolise l’autorisation et le rouge, le refus. La couleur se positionne dans le sens d'une requête. C'est la requête qui est filtrée mais il ne faut pas oublier qu'à une requête correspond normalement une réponse qui vient dans l'autre sens. Il est très important d'analyser le trafic de chaque flèche et d'effectuer le filtrage en conséquence. Nous avons pris le cas simple où tout trafic venant d'Internet est refusé et où on fait confiance à nos réseaux privés.
Cette approche basique peut être affinées, par exemple, en faisant du LAN n°2 une DMZ:
- le routeur n'a qu'un service SSH accessible que par notre LAN n°1 (INPUT) La flèche de droite passe au rouge.
- le routeur ne peut faire des requêtes que vers Interne pour ses mises à jour des logiciels et de l'heure et les résolutions DNS (OUTPUT) Les flèches de gauche et de droite passent au rouge
- le LAN n°2 héberge un serveur WEB accessible à partir d'Internet et du LAN n°1 (FORWARD) La flèche rouge de droite passe au vert.
- le LAN n°2 héberge un serveur SSH accessible à partir du LAN n°1 (FORWARD)
- le LAN n°2 ne peut accéder au LAN n°1 (FORWARD) La première flèche du bas allant vers la gauche passe au rouge.
- le LAN n°2 peut faire ses mises à jour des logficiels et de l'heure, et les résolutions DNS vers Internet (FORWARD)
- le LAN n°1 peut aller sur Internet librement (FORWARD)
Notions de flux
Remarquons que ce qui suit est présenté de façon très simple pour pouvoir comprendre la suite.
Quand une machine (client) émet une requête vers une autre machine (serveur), le statut de ce paquet est "NEW". Le serveur la refuse ou l'accepte. S'il y a acceptation, la suite du flux aura le statut "ESTABLISHED" car une connexion a été établie et il n'y a pas lieu d'en établir une seconde. Il y a quelques cas particuliers comme le protocole FTP qui utilise deux ports (21 et 20); dans ce cas un statut "RELATED" est également utilisé pour ouvrir le second port nécessaire. Le protocole ICMP en a également besoin.
Remarque: Cette approche présentée globalement doit être analysée pour chaque type de trafic (interface, protocole, machines source et cible, ports cible et source,...).
Préfiltrage et connexions déjà établies-statut ESTABLISHED
En début de chaîne, il faut toujours traiter les réponses données aux requêtes par analyse du statut. Ensuite viennent le traitement de filtrage proprement dit des nouvelles requêtes.
Nous avons respectivement pour les trois chaînes les lignes suivantes que pour une question de lisibilité, on peut placer en tête de chaque groupe de chaîne.
-A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT -A OUTPUT -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT -A FORWARD -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT -A INPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT -A OUTPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT -A FORWARD -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT
On peut compléter cette première étape par un refus de ce qui n'a pas été établi par le passé:
-A INPUT -m conntrack --ctstate INVALID -j REJECT -A OUTPUT -m conntrack --ctstate INVALID -j REJECT -A FORWARD -m conntrack --ctstate INVALID -j REJECT
On accepte également au préalable tout trafic venant d'un interface sur lui-même; c'est spécialement le cas de l'interface "lo".
-A INPUT -p ALL -i lo -j ACCEPT -A OUTPUT -p ALL -o lo -j ACCEPT -A FORWARD -p ALL -i lo -o lo -j ACCEPT
Notons que cette étape d'acceptation doit être absolument affinée car les statuts sont multiples, spécialement au niveau du protocole "ICMP" qui sert de messager; les cas de figures à refuser sont nombreux. Il ne faut pas oublier que plus tôt le cas est traité moins de ressources sont consommées. Internet regorge de conseils de filtrages additionnels dont certains se placent plus tôt dans la suite des traitements notamment dans la table MANGLE dont je n'ai pas parlé. Un autre auteur parlait du "bordel d'Internet" à filtrer; les pirates de tout poil sont légions et leurs idées nombreuses. Ici la création de ses propres chaînes est d'un grand secours pour alléger le code et le rendre plus lisible.
Dans les commandes ci-dessus, les options suivantes signifient:
- -i : le trafic entrant par l'interface nommé
- -o : le trafic sortant par l'interface nommé
- -p : le protocole (icmp, udp, tcp) (ALL pour tous)
- -m : le module à utiliser
Remarque: Vous rencontrerez parfois la notation ancienne mais équivalente "-m state --state" au lieu de "-m conntrack --ctstate".
Nouvelles connexions-statut NEW
Passons ensuite aux nouvelles connexions. Voici la partie du script qui vient en dessous dans le cas des schémas les plus simples présentés en premier lieu au chapitre "Principe". Par sécurité les deux interfaces "enp0s25" et "ppp0" sont reprises ensemble. Ce script ne demande pas d'explications. Nous avons tenu compte du double câblage vers la BBOX 3.
# INPUT # refus d'accès d'Internet -A INPUT -i enp0s25 -j DROP -A INPUT -i ppp0 -j DROP # accès venant du LAN correspondant à l'interface -A INPUT -i enp4s0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i enp4s2 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT # refus d'accès au LAN dont ce n'est pas l'interface -A INPUT -i enp4s0 ! -s 192.168.1.0/24 -j DROP -A INPUT -i enp4s2 ! -s 192.168.2.0/24 -j DROP # OUTPUT # accès total -A OUTPUT -j ACCEPT # FORWARD # accès entre LANs privés -A FORWARD -i enp4s0 -o enp4s2 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o enp4s0 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT # accès des LANs privés vers Internet -A FORWARD -i enp4s0 -o enp0s25 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o enp0s25 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s0 -o ppp0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT # refus d'accès d'Internet vers les LANs privés -A FORWARD -i enp0s25 -o enp4s0 -j DROP -A FORWARD -i enp0s25 -o enp4s2 -j DROP -A FORWARD -i ppp0 -o enp4s0 -j DROP -A FORWARD -i ppp0 -o enp4s2 -j DROP
Les options suivantes signifient:
- -s : désigne l'adresse IP ou la tranche d'adresses IP d'où vient le paquet (source) 192.168.1.0/24 concerne le réseau 192.168.1.0 ayant le netmask 255.255.255.0 (ou 24 bits).
- ! : signifie la négation donc " ! -s " signifie "ne venant pas de ces adresses IP"
Maintenant passons au second schéma. Le bloc ci-dessus est à remplacer par celui-ci. Ne pas oublier d'ajouter la seconde ligne (DNAT) ajoutée dans la table NAT. (voir au chapitre précédent)
# INPUT # refus d'accès d'Internet -A INPUT -i enp0s25 -j DROP -A INPUT -i ppp0 -j DROP # accès venant du LAN correspondant à l'interface # SSH : seule une machine du LAN n°1 peut accéder au routeur via SSH -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -s 192.168.1.2 -j ACCEPT # le reste du trafic interne est bloqué -A INPUT -i enp4s0 -j DROP -A INPUT -i enp4s2 -j DROP # OUTPUT # Accès vers Internet # DNS: résolution de noms de machines -A OUTPUT -o ppp0 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -o ppp0 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT # NTP: mise à l'heure -A OUTPUT -o ppp0 -p tcp -m tcp --dport 123 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -o ppp0 -p udp -m udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT # DNF: mises à jour des logiciels -A OUTPUT -o ppp0 -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -o ppp0 -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -o ppp0 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT # le reste du trafic est bloqué -A OUTPUT -j DROP # FORWARD # HTTP (serveur WEB) -A FORWARD -d 192.168.2.2 -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT # refus d'accès d'Internet vers les LANs privés -A FORWARD -i enp0s25 -o enp4s0 -j DROP -A FORWARD -i enp0s25 -o enp4s2 -j DROP -A FORWARD -i ppp0 -o enp4s0 -j DROP -A FORWARD -i ppp0 -o enp4s2 -j DROP # accès du LAN n°1 # SSH du LAN 1 vers LAN 2 -A FORWARD -i enp4s0 -o enp4s2 -s 192.168.1.2 -d 192.168.2.0/24 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT # le LAN 1 a un accès total à Internet -A FORWARD -i enp4s0 -o enp0s25 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s0 -o ppp0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT # le reste du trafic est bloqué vers le LAN n°2 -A FORWARD -i enp4s0 -o enp4s2 -j DROP # le LAN 2 a accès # DNS: résolution de noms de machines -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT # NTP: mise à l'heure -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p tcp -m tcp --dport 123 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p udp -m udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT # DNF: mises à jour des logiciels -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i enp4s2 -o ppp0 -s 192.168.2.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT # le reste du trafic du LAN n°2 vers Internet est bloqué -A FORWARD -i enp4s2 -o enp0s25 -j DROP -A FORWARD -i enp4s2 -o ppp0 -j DROP # le reste du trafic est bloqué vers le LAN n°1 -A FORWARD -i enp4s2 -o enp4s0 -j DROP
L'option suivante signifie:
- --dport: port de destination sur le serveur
Remarquons que pour une question de lisibilité, de nombreuses lignes à l'action "DROP" sont ajoutées. Elles sont facultative car une action "DROP" est ajoutée d'office en fin de traitement mais avec une écriture dans le journal. (voir point suivant)
Refus final
En fin de filtrage, il ne faut pas oublier de refuser globalement tout ce qui n'a pas été accepté; n'oublions pas que la politique par défaut est "ACCEPT". On peut en profiter pour lister dans les messages du système ces cas qui nous ont échappé. Cette étape est à faire pour les trois chaînes.
-A INPUT -j LOG --log-level debug --log-prefix "INPUT-REFUS" #-A INPUT -j REJECT --reject-with icmp-host-prohibited #-A INPUT -j REJECT --reject-with icmp-port-unreachable -A INPUT -j DROP -A OUTPUT -j LOG --log-level debug --log-prefix "OUTPUT-REFUS" #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited #-A OUTPUT -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -j DROP -A FORWARD -j LOG --log-level debug --log-prefix "FORWARD-REFUS" #-A FORWARD -j REJECT --reject-with icmp-host-prohibited #-A FORWARD -j REJECT --reject-with icmp-port-unreachable -A FORWARD -j DROP
Le type de traitement "-j LOG" permet d'écrire dans le journal du système un message; on a attribué à ce message le niveau "debug" et ce message sera précédé du texte qui suit. Ce texte sera complété par toute une série d'informations propre au paquet: interface, adresses IP, MAC adresse, ports, protocole, statut,... Ce type d'action est utile au moment de la conception pour savoir quels sont les paquets qui passent à une étape donnée du traitement. Ce traitement peur être filtré en plus pour un protocole, un port, une machine,... Par exemple, vous avez démarré un nouveau service et rien ne va ou vous ne savez pas quel est le port utilisé. Dans ce cas, vous ajoutez une entrée en début où vous filtrez sur l'adresse IP de votre machine.
Pour ma part, ces messages système sont orientés vers un fichier particulier "/var/log/iptables". Ces messages sont gérés par le service "rsyslog.service". Son fichier de configuration se nomme "/etc/rsyslog.conf". On ajoute la ligne suivante:
kern.=debug /var/log/iptables
Le mot clé "debug" est lié au niveau défini dans l'action "LOG" d'iptables ("--log-level debug"). On a en quelque sorte un tri des messages venant d'iptables sinon tout irait dans le fichier "/var/log/messages".
Évidemment, il faut redémarrer le service "rsyslog.service" ou la machine pour que cette modification entre en action.
Accès à notre serveur WEB à partir de notre réseau privé
Un autre problème courant consiste à accéder à notre serveur WEB à partir de notre réseau avec son nom de machine public connu des serveurs DNS mondiaux (exemple: www.adbweb.gslb.be).
Une solution consiste à avoir son propre serveur DNS interne et d'y ajouter son nom DNS public pointant vers l'adresse IP privée du serveur WEB, ici 192.168.2.2. La seconde solution est d'agir directement dans le firewall du routeur. Une explication complète peut se trouver à l'URL https://inetdoc.net/guides/iptables-tutorial/dnattarget.html.
Divers cas sont à considérer:
- à partir du routeur
- à partir d'une machine du réseau
Nous nous basons sur le second schéma et donc sur les règles introduites dans le firewall.
A partir du routeur
En premier lieu, il faut ouvrir notre routeur au port HTTP vers notre serveur WEB, ce qui n'est pas encore permis. Ceci se passe dans la table FILTER sous la chaîne "OUTPUT", avant l'action DROP finale.
# WEB interne -A OUTPUT -o enp4s2 -p tcp -m tcp -d 192.168.2.2 --dport 80 -m conntrack --ctstate NEW -j ACCEPT
En second lieu, il faut introduire dans la table NAT, une action DNAT proche de celle déjà introduite mais non sur la chaîne PREROUTING mais la chaîne OUTPUT comme il se doit.
-A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80
A partir d'une machine de notre réseau
Ici on agit au niveau de la table NAT.
En premier lieu, on ouvre l'action DNAT (NAT Destination) pour la chaîne PREROUTING aux autres interfaces ou au moins à l'interface désiré. Si on supprime l'option "-i", on l'ouvre à tous les interfaces réseaux.
-A PREROUTING -i enp4s2 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80 -A PREROUTING -i enp4s0 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80
Ensuite on effectue dans la table NAT sous la chaîne POSTROUTING (et non PREROUTING), une action SNAT (NAT Source) ayant l'option "--to-source" vers une des adresses IP privées du routeur. Notre routeur a deux interfaces réseaux ayant une adresse IP privées: 192.168.1.33 pour "enp4s0" et 192.168.2.1 pour "enp4s2". Nous avons le choix entre:
-A POSTROUTING -p tcp --dst 192.168.2.2 --dport 80 -j SNAT --to-source 192.168.2.1
et
-A POSTROUTING -p tcp --dst 192.168.2.2 --dport 80 -j SNAT --to-source 192.168.1.33
Test
Pour tester en ligne de commande sous Linux, on peut utiliser la commande "wget". Pour notre test, nous supposons que nous n'avons pas de nom public pour notre serveur WEB. Nous allons rechercher son nom attribué d'office par notre IPS via son adresse IP.
La commande "ifconfig" sur le routeur nous donne l'adresse IP publique de notre routeur: "81.242.17.14".
On recherche ensuite le nom de la machine sur base de cette adresse IP via le DNS avec la commande:
nslookup 81.242.17.14
qui donne:
14.17.242.81.in-addr.arpa name = 14.17-242-81.adsl-dyn.isp.belgacom.be.
On utilise la commande "wget" pour charger la page racine de notre site ou toute autre page:
wget http://14.17-242-81.adsl-dyn.isp.belgacom.be
qui donne si tout se déroule comme attendu:
--2022-01-24 15:46:17-- http://14.17-242-81.adsl-dyn.isp.belgacom.be/ Résolution de 14.17-242-81.adsl-dyn.isp.belgacom.be (14.17-242-81.adsl-dyn.isp.belgacom.be)… 81.242.17.14 Connexion à 14.17-242-81.adsl-dyn.isp.belgacom.be (14.17-242-81.adsl-dyn.isp.belgacom.be)|81.242.17.14|:80… connecté. requête HTTP transmise, en attente de la réponse… 200 OK Taille : 9 [text/html] Sauvegarde en : « index.html » index.html 100%[============================================================>] 9 --.-KB/s ds 0s 2022-01-24 15:46:17 (845 KB/s) — « index.html » sauvegardé [9/9]
Un fichier "index.html" est créé dont nous pouvons consulter le contenu.