« LINUX:Firewall » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
(19 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
__FORCETOC__ | __FORCETOC__ | ||
---- | |||
''→ [[LINUX:Routeur-PPPOE|retour au Routeur-PPPOE]]'' | |||
---- | |||
=But= | =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. | 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. | ||
Ligne 10 : | Ligne 13 : | ||
dnf install iptables-services | dnf install iptables-services | ||
dnf install iptables-utils | dnf install iptables-utils | ||
dnf install iptables-legacy | |||
Il comporte deux volets: | Il comporte deux volets: | ||
Ligne 88 : | Ligne 92 : | ||
* -o ppp0: signifie quand on sort par l'interface "ppp0" | * -o ppp0: signifie quand on sort par l'interface "ppp0" | ||
* -j MASQUERADE: effectue l'opération de passe-passe d'adressage IP | * -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. | 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. | 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. | 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". | |||
Ligne 119 : | Ligne 135 : | ||
[[FILE:LINUX:Fw.input. | [[FILE:LINUX:Fw.input.pdf|300px]] | ||
[[FILE:LINUX:Fw.output. | [[FILE:LINUX:Fw.output.pdf|300px]] | ||
[[FILE:LINUX:Fw.forward. | [[FILE:LINUX:Fw.forward.pdf|300px]] | ||
Cette approche basique peut être affinées, par exemple, en faisant du LAN n°2 une DMZ: | 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 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 et les résolutions DNS (OUTPUT) Les flèches de gauche et de droite passent 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 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 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 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 et les résolutions DNS vers Internet (FORWARD) | * 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) | * le LAN n°1 peut aller sur Internet librement (FORWARD) | ||
[[FILE:LINUX:Fw2.input. | [[FILE:LINUX:Fw2.input.pdf|300px]] | ||
[[FILE:LINUX:Fw2.output. | [[FILE:LINUX:Fw2.output.pdf|300px]] | ||
[[FILE:LINUX:Fw2.forward. | [[FILE:LINUX:Fw2.forward.pdf|300px]] | ||
Ligne 143 : | Ligne 159 : | ||
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. | 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,...). | |||
Ligne 187 : | Ligne 205 : | ||
==Nouvelles connexions-statut NEW== | ==Nouvelles connexions-statut NEW== | ||
Passons ensuite aux nouvelles connexions. | 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. | 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''' | # '''INPUT''' | ||
Ligne 204 : | Ligne 222 : | ||
# '''FORWARD''' | # '''FORWARD''' | ||
# accès entre LANs privés | # accès entre LANs privés | ||
-A FORWARD -i enp4s0 -o enp4s2 -m conntrack --ctstate NEW -j ACCEPT | -A FORWARD -i enp4s0 -o enp4s2 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT | ||
-A FORWARD -i enp4s2 -o enp4s0 -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 | # accès des LANs privés vers Internet | ||
-A FORWARD -i enp4s0 -o enp0s25 -m conntrack --ctstate NEW -j ACCEPT | -A FORWARD -i enp4s0 -o enp0s25 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT | ||
-A FORWARD -i enp4s2 -o enp0s25 -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 -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 -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 | # refus d'accès d'Internet vers les LANs privés | ||
-A FORWARD -i enp0s25 -o enp4s0 -j DROP | -A FORWARD -i enp0s25 -o enp4s0 -j DROP | ||
Ligne 218 : | Ligne 236 : | ||
---- | ---- | ||
Les options suivantes signifient: | Les options suivantes signifient: | ||
* -s : désigne l'adresse IP ou la tranche d'adresses IP d'où vient le paquet ('''s'''ource) | * -s : désigne l'adresse IP ou la tranche d'adresses IP d'où vient le paquet ('''s'''ource) 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" | * ! : 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) | |||
Ligne 238 : | Ligne 309 : | ||
---- | ---- | ||
-A INPUT -j LOG --log-level debug --log-prefix "INPUT-REFUS" | -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-host-prohibited | ||
#-A INPUT -j REJECT --reject-with icmp-port-unreachable | |||
-A INPUT -j DROP | -A INPUT -j DROP | ||
-A OUTPUT -j LOG --log-level debug --log-prefix "OUTPUT-REFUS" | -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-host-prohibited | ||
#-A OUTPUT -j REJECT --reject-with icmp-port-unreachable | |||
-A OUTPUT -j DROP | -A OUTPUT -j DROP | ||
-A FORWARD -j LOG --log-level debug --log-prefix "FORWARD-REFUS" | -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-host-prohibited | ||
#-A FORWARD -j REJECT --reject-with icmp-port-unreachable | |||
-A FORWARD -j DROP | -A FORWARD -j DROP | ||
---- | ---- | ||
Ligne 259 : | Ligne 333 : | ||
=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 <nowiki>https://inetdoc.net/guides/iptables-tutorial/dnattarget.html</nowiki>. | |||
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 <nowiki>http://14.17-242-81.adsl-dyn.isp.belgacom.be</nowiki> | |||
qui donne si tout se déroule comme attendu: | |||
--2022-01-24 15:46:17-- <nowiki>http://14.17-242-81.adsl-dyn.isp.belgacom.be/</nowiki> | |||
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. | |||
---- | |||
''→ [[LINUX:Routeur-PPPOE|retour au Routeur-PPPOE]]'' | |||
---- | ---- | ||
__NOEDITSECTION__ | __NOEDITSECTION__ | ||
[[Category:LINUX]] | [[Category:LINUX]] |