Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| iptables [Le 13/08/2019, 19:39] – [Configuration du pare-feu] 90.96.107.116 | iptables [Le 02/01/2021, 11:05] (Version actuelle) – [Configuration du pare-feu] explication de la commande 92.141.190.18 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | {{tag> | ||
| + | {{ / | ||
| + | ---- | ||
| + | |||
| + | =====Iptables===== | ||
| + | |||
| + | |||
| + | Iptables est une interface en ligne de commande permettant de configurer Netfilter. En plus de Iptables, depuis la version 8.04, Ubuntu est installé avec la surcouche [[: | ||
| + | |||
| + | Cette documentation est une introduction à Iptables, elle est destinée à ceux qui souhaitent mettre en place un [[: | ||
| + | |||
| + | Les lecteurs désirant approfondir leur recherche et aborder l' | ||
| + | |||
| + | iptables existe aussi pour ipv6, pour cela il suffit d' | ||
| + | |||
| + | Pour une bonne compréhension d' | ||
| + | |||
| + | |||
| + | ===== Configuration du pare-feu ===== | ||
| + | |||
| + | Nous allons configurer notre [[: | ||
| + | * On bloque tout le trafic entrant par défaut. | ||
| + | * On autorise au cas par cas : le trafic appartenant ou lié à des connexions déjà établies et le trafic à destination des serveurs (web, ssh, etc.) que nous souhaitons mettre à disposition. | ||
| + | |||
| + | Afin de ne pas avoir de problème au moment où on crée ces règles, nous allons d' | ||
| + | |||
| + | En tapant « '' | ||
| + | < | ||
| + | Chain INPUT (policy ACCEPT) | ||
| + | target | ||
| + | |||
| + | Chain FORWARD (policy ACCEPT) | ||
| + | target | ||
| + | |||
| + | Chain OUTPUT (policy ACCEPT) | ||
| + | target | ||
| + | </ | ||
| + | |||
| + | Pour l' | ||
| + | Pour cette configuration basique, seul le trafic entrant (chaine //input//) nous intéresse. | ||
| + | |||
| + | Par défaut, « '' | ||
| + | |||
| + | <note warning> | ||
| + | |||
| + | Si vous avez déjà modifié la configuration et que vous voulez la réinitialiser, | ||
| + | < | ||
| + | sudo iptables -F | ||
| + | sudo iptables -X | ||
| + | </ | ||
| + | |||
| + | === Autoriser le trafic entrant d'une connexion déjà établie === | ||
| + | |||
| + | Pour permettre à une connexion déjà ouverte de recevoir du trafic : | ||
| + | < | ||
| + | # iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT | ||
| + | </ | ||
| + | Cette commande ajoute une règle ('' | ||
| + | |||
| + | <note warning> | ||
| + | Une ancienne configuration avec l' | ||
| + | https:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Permettre le trafic entrant sur un port spécifique === | ||
| + | |||
| + | Pour permettre le trafic entrant sur le port 22 (traditionnellement utilisé par SSH, vous devrez indiquer à iptables tout le trafic TCP sur le port 22 de votre adaptateur réseau. | ||
| + | < | ||
| + | # iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT | ||
| + | </ | ||
| + | Cette commande ajoute une règle ('' | ||
| + | |||
| + | Maintenant vous pouvez vérifier vos règles iptables : | ||
| + | < | ||
| + | # iptables -L | ||
| + | Chain INPUT (policy ACCEPT) | ||
| + | target | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | </ | ||
| + | |||
| + | Maintenant, acceptons tout le trafic web ('' | ||
| + | < | ||
| + | # iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT | ||
| + | </ | ||
| + | |||
| + | En regardant nos règles, nous avons : | ||
| + | < | ||
| + | # iptables -L | ||
| + | Chain INPUT (policy ACCEPT) | ||
| + | target | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | </ | ||
| + | |||
| + | Nous avons exceptionnellement autorisé le trafic tcp pour ssh et les ports web, mais comme nous n' | ||
| + | |||
| + | === Bloquer le trafic === | ||
| + | |||
| + | Maintenant que nous avons fini avec les autorisations, | ||
| + | Nous allons en fait modifier la « politique par défaut » (// | ||
| + | |||
| + | < | ||
| + | # iptables -P INPUT DROP #warning : a ne pas utiliser sur un serveur distant ! | ||
| + | # iptables -L | ||
| + | Chain INPUT (policy DROP) | ||
| + | target | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | </ | ||
| + | |||
| + | **Un autre moyen de procéder** est l' | ||
| + | |||
| + | === Autoriser le trafic local === | ||
| + | |||
| + | Un p'tit problème de notre configuration est que même l' | ||
| + | Nous pourrions avoir écrit les règles de rejet seulement pour //eth0// en spécifiant '' | ||
| + | |||
| + | < | ||
| + | # iptables -I INPUT 2 -i lo -j ACCEPT | ||
| + | </ | ||
| + | |||
| + | Pour lister les règles plus en détail. | ||
| + | < | ||
| + | # iptables -L -v -n | ||
| + | </ | ||
| + | |||
| + | === Autoriser les requêtes ICMP (ping) === | ||
| + | |||
| + | Il peut-être utile de valider les réponses aux requêtes " | ||
| + | < | ||
| + | # On autorise le PC a faire des pings sur des IP externes et à répondre aux requêtes " | ||
| + | iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW, | ||
| + | |||
| + | # Si vous utilisez une ancienne version de iptables la commande ci-dessus peut ne pas fonctionner, | ||
| + | iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW, | ||
| + | |||
| + | # On autorise les pings | ||
| + | iptables -A INPUT -p icmp -j ACCEPT | ||
| + | </ | ||
| + | |||
| + | === Supprimer une règle === | ||
| + | |||
| + | Si vous vous êtes trompé dans la création d'une règle et que cela vous bloque une connexion, vous pouvez supprimer une seule entrée plutôt que de tout réinitialiser. | ||
| + | |||
| + | Tout d' | ||
| + | < | ||
| + | iptables -L --line-numbers | ||
| + | </ | ||
| + | Ce qui personnellement me retourne : | ||
| + | < | ||
| + | Chain INPUT (policy DROP) | ||
| + | num target | ||
| + | 1 DROP icmp -- anywhere | ||
| + | 2 ACCEPT | ||
| + | 3 ACCEPT | ||
| + | 4 ACCEPT | ||
| + | |||
| + | Chain FORWARD (policy ACCEPT) | ||
| + | num target | ||
| + | |||
| + | Chain OUTPUT (policy ACCEPT) | ||
| + | num target | ||
| + | 1 ACCEPT | ||
| + | 2 ACCEPT | ||
| + | </ | ||
| + | |||
| + | Je souhaite supprimer la ligne 2 de la chaîne OUTPUT | ||
| + | |||
| + | Syntaxe : iptables -D chaîne numéro_de_ligne | ||
| + | |||
| + | < | ||
| + | iptables -D OUTPUT 2 | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Sauvegarder vos règles === | ||
| + | |||
| + | Passer en mode superutilisateur | ||
| + | |||
| + | < | ||
| + | sudo -s iptables-save -c | ||
| + | </ | ||
| + | |||
| + | ===== Appliquer les règles au démarrage ===== | ||
| + | |||
| + | ==== Via iptables-persistent ==== | ||
| + | |||
| + | Vous avez testé vos règles, ça marche au poil, alors il reste à les appliquer au démarrage. | ||
| + | |||
| + | iptables-persistent propose de sauvegarder les règles dans le dossier **/ | ||
| + | |||
| + | service iptables-persistent | ||
| + | |||
| + | Il prend les arguments : **save** pour sauvegarder les règles, **flush** pour vider toutes les règles et **reload** pour les recharger depuis les fichiers précités. | ||
| + | |||
| + | ==== Via un fichier ==== | ||
| + | |||
| + | <note important> | ||
| + | </ | ||
| + | |||
| + | Commencez par éditer un fichier en root, que vous enregistrerez sous **/ | ||
| + | |||
| + | La première ligne de ce fichier doit être : | ||
| + | |||
| + | #!/bin/bash | ||
| + | |||
| + | Cette ligne indique que le fichier doit être enregistré en tant que [[: | ||
| + | |||
| + | Ajoutez ensuite à votre script ceci : | ||
| + | |||
| + | iptables-restore < / | ||
| + | |||
| + | Le reste du fichier doit contenir les commandes // | ||
| + | |||
| + | Déplacez le script iptables dans / | ||
| + | |||
| + | sudo mv / | ||
| + | |||
| + | Rendez ce script exécutable : | ||
| + | |||
| + | sudo chmod +x / | ||
| + | |||
| + | Cela devrait être bon. Au prochain redémarrage, | ||
| + | |||
| + | sudo iptables -L | ||
| + | | ||
| + | === Lancer votre script iptables au démarrage via Systemd === | ||
| + | |||
| + | Pour lancer votre script iptables au démarrage de votre Ubuntu, merci d' | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | Veuillez éditer ensuite le fichier se trouvant dans **/ | ||
| + | |||
| + | <file bash> | ||
| + | [Unit] | ||
| + | Description=Firewall | ||
| + | Requires=network-online.target | ||
| + | After=network-online.target | ||
| + | |||
| + | [Service] | ||
| + | User=root | ||
| + | Type=oneshot | ||
| + | RemainAfterExit=yes | ||
| + | ExecStart=/ | ||
| + | ExecStop=/ | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | |||
| + | Il ne vous reste plus qu'à activer le service **firewall.service**, | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | Au prochain redémarrage de votre Ubuntu, votre service **firewall.service** chargera votre script iptables se trouvant dans **/ | ||
| + | |||
| + | Pour vérifier le statut de votre service **firewall.service**, | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | ===== Script iptables ===== | ||
| + | |||
| + | < | ||
| + | |||
| + | <code bash iptables> | ||
| + | |||
| + | #!/bin/bash | ||
| + | |||
| + | iptables-restore < / | ||
| + | |||
| + | ## Script iptables by BeAvEr. | ||
| + | |||
| + | ## Règles iptables. | ||
| + | |||
| + | ## On flush iptables. | ||
| + | |||
| + | iptables -F | ||
| + | iptables -X | ||
| + | iptables -t nat -F | ||
| + | iptables -t nat -X | ||
| + | iptables -t mangle -F | ||
| + | iptables -t mangle -X | ||
| + | |||
| + | ## On drop les requêtes ICMP (votre machine ne répondra plus aux requêtes ping sur votre réseau local). | ||
| + | |||
| + | iptables -A INPUT -p icmp --icmp-type echo-request -j DROP | ||
| + | iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP | ||
| + | |||
| + | ## On accepte le Multicast. | ||
| + | |||
| + | iptables -A INPUT -m pkttype --pkt-type multicast -j ACCEPT | ||
| + | |||
| + | ## On drop tout le trafic entrant. | ||
| + | |||
| + | iptables -P INPUT DROP | ||
| + | |||
| + | ## On drop tout le trafic sortant. | ||
| + | |||
| + | iptables -P OUTPUT DROP | ||
| + | |||
| + | ## On drop le forward. | ||
| + | |||
| + | iptables -P FORWARD DROP | ||
| + | |||
| + | ## On drop les scans XMAS et NULL. | ||
| + | |||
| + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP | ||
| + | |||
| + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags ALL ALL -j DROP | ||
| + | |||
| + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags ALL NONE -j DROP | ||
| + | |||
| + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags SYN,RST SYN,RST -j DROP | ||
| + | |||
| + | ## Dropper silencieusement tous les paquets broadcastés. | ||
| + | |||
| + | iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP | ||
| + | | ||
| + | ## Permettre à une connexion ouverte de recevoir du trafic en entrée. | ||
| + | |||
| + | iptables -A INPUT -m conntrack --ctstate ESTABLISHED, | ||
| + | |||
| + | ## Permettre à une connexion ouverte de recevoir du trafic en sortie. | ||
| + | |||
| + | iptables -A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT | ||
| + | |||
| + | ## On accepte la boucle locale en entrée. | ||
| + | |||
| + | iptables -I INPUT -i lo -j ACCEPT | ||
| + | |||
| + | ## On log les paquets en entrée. | ||
| + | |||
| + | iptables -A INPUT -j LOG | ||
| + | |||
| + | ## On log les paquets forward. | ||
| + | |||
| + | iptables -A FORWARD -j LOG | ||
| + | |||
| + | exit 0 | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Documentations supplémentaires ===== | ||
| + | |||
| + | En anglais : | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | En Français : | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | ===== Sources ===== | ||
| + | |||
| + | * Basé sur [[https:// | ||
| + | * Merci à Rusty Russell et son How-To, il est la base de cette page. | ||
| + | * Et merci surtout pour son travail au sein de l' | ||
| + | |||
| + | |||
| + | // | ||
