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 14/05/2019, 19:57] – [Script iptables] beaver 87.120.36.157 | 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' | ||
+ | |||
+ | |||
+ | // | ||