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 27/04/2020, 10:37] – [Via un fichier] beaver 116.202.112.170 | iptables [Le 20/07/2026, 10:45] (Version actuelle) – niveau titre (h1) | pas de maj à iptables | liens wpfr | icône | mise en forme krodelabestiole | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | {{ / | ||
| - | ---- | ||
| - | =====Iptables===== | + | {{ : |
| + | ====== iptables ====== | ||
| + | FIXME: Depuis une Ubuntu 23.10, le package [[apt> | ||
| - | 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 | + | **[[wpfr> |
| - | Les lecteurs désirant approfondir leur recherche et aborder l' | + | Cette documentation est une introduction à **iptables**, elle est destinée à ceux qui souhaitent mettre en place un [[: |
| - | iptables existe aussi pour ipv6, pour cela il suffit | + | Les lecteurs désirant approfondir leur recherche et aborder l' |
| - | Pour une bonne compréhension d'Iptables (et des pare-feux en général) | + | **iptables** existe aussi pour l'IPv6, pour cela il suffit |
| + | Pour une bonne compréhension d' | ||
| ===== Configuration du pare-feu ===== | ===== Configuration du pare-feu ===== | ||
| Ligne 25: | Ligne 26: | ||
| Afin de ne pas avoir de problème au moment où on crée ces règles, nous allons d' | Afin de ne pas avoir de problème au moment où on crée ces règles, nous allons d' | ||
| - | En tapant « '' | + | En tapant « '' |
| < | < | ||
| Chain INPUT (policy ACCEPT) | Chain INPUT (policy ACCEPT) | ||
| Ligne 42: | Ligne 43: | ||
| Par défaut, « '' | Par défaut, « '' | ||
| - | <note warning> | + | <note warning> |
| Si vous avez déjà modifié la configuration et que vous voulez la réinitialiser, | Si vous avez déjà modifié la configuration et que vous voulez la réinitialiser, | ||
| Ligne 54: | Ligne 55: | ||
| Pour permettre à une connexion déjà ouverte de recevoir du trafic : | Pour permettre à une connexion déjà ouverte de recevoir du trafic : | ||
| < | < | ||
| - | # iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT | + | sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT |
| </ | </ | ||
| + | Cette commande ajoute une règle ('' | ||
| <note warning> | <note warning> | ||
| Ligne 65: | Ligne 67: | ||
| === Permettre le trafic entrant sur un port spécifique === | === 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. | + | 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 | + | sudo iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT |
| </ | </ | ||
| Cette commande ajoute une règle ('' | Cette commande ajoute une règle ('' | ||
| Ligne 73: | Ligne 75: | ||
| Maintenant vous pouvez vérifier vos règles iptables : | Maintenant vous pouvez vérifier vos règles iptables : | ||
| < | < | ||
| - | # iptables -L | + | sudo iptables -L |
| Chain INPUT (policy ACCEPT) | Chain INPUT (policy ACCEPT) | ||
| target | target | ||
| Ligne 82: | Ligne 84: | ||
| Maintenant, acceptons tout le trafic web ('' | Maintenant, acceptons tout le trafic web ('' | ||
| < | < | ||
| - | # iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT | + | sudo iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT |
| </ | </ | ||
| En regardant nos règles, nous avons : | En regardant nos règles, nous avons : | ||
| < | < | ||
| - | # iptables -L | + | sudo iptables -L |
| Chain INPUT (policy ACCEPT) | Chain INPUT (policy ACCEPT) | ||
| target | target | ||
| Ligne 101: | Ligne 103: | ||
| Maintenant que nous avons fini avec les autorisations, | Maintenant que nous avons fini avec les autorisations, | ||
| Nous allons en fait modifier la « politique par défaut » (// | Nous allons en fait modifier la « politique par défaut » (// | ||
| + | <note important> | ||
| < | < | ||
| - | # iptables -P INPUT DROP #warning : a ne pas utiliser sur un serveur distant ! | + | sudo iptables -P INPUT DROP #warning : a ne pas utiliser sur un serveur distant ! |
| - | # iptables -L | + | sudo iptables -L |
| Chain INPUT (policy DROP) | Chain INPUT (policy DROP) | ||
| target | target | ||
| Ligne 111: | Ligne 113: | ||
| ACCEPT | ACCEPT | ||
| </ | </ | ||
| + | |||
| + | == Autre méthode, par exemple pour les server == | ||
| **Un autre moyen de procéder** est l' | **Un autre moyen de procéder** est l' | ||
| Ligne 116: | Ligne 120: | ||
| === Autoriser le trafic local === | === Autoriser le trafic local === | ||
| - | Un p' | + | Un petit 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 '' | Nous pourrions avoir écrit les règles de rejet seulement pour //eth0// en spécifiant '' | ||
| < | < | ||
| - | # iptables -I INPUT 2 -i lo -j ACCEPT | + | sudo iptables -I INPUT 2 -i lo -j ACCEPT |
| </ | </ | ||
| Pour lister les règles plus en détail. | Pour lister les règles plus en détail. | ||
| < | < | ||
| - | # iptables -L -v -n | + | sudo iptables -L -v -n |
| </ | </ | ||
| Ligne 133: | Ligne 137: | ||
| < | < | ||
| # On autorise le PC a faire des pings sur des IP externes et à répondre 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, | + | sudo 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, | # 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, | + | sudo iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW, |
| # On autorise les pings | # On autorise les pings | ||
| - | iptables -A INPUT -p icmp -j ACCEPT | + | sudo iptables -A INPUT -p icmp -j ACCEPT |
| </ | </ | ||
| Ligne 148: | Ligne 152: | ||
| Tout d' | Tout d' | ||
| < | < | ||
| - | iptables -L --line-numbers | + | sudo iptables -L --line-numbers |
| </ | </ | ||
| Ce qui personnellement me retourne : | Ce qui personnellement me retourne : | ||
| Ligne 173: | Ligne 177: | ||
| < | < | ||
| - | iptables -D OUTPUT 2 | + | sudo iptables -D OUTPUT 2 |
| </ | </ | ||
| Ligne 191: | Ligne 195: | ||
| Vous avez testé vos règles, ça marche au poil, alors il reste à les appliquer au démarrage. | 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 **/ | + | iptables-persistent propose de sauvegarder les règles dans le répertoire '' |
| - | | + | |
| - | Il prend les arguments : **save** pour sauvegarder les règles, | + | Il prend les arguments : '' |
| ==== Via un fichier ==== | ==== Via un fichier ==== | ||
| - | <note important> | + | <note important> |
| </ | </ | ||
| - | Commencez par éditer un fichier en root, que vous enregistrerez sous **/ | + | Commencez par éditer un fichier en root, que vous enregistrerez sous '' |
| La première ligne de ce fichier doit être : | La première ligne de ce fichier doit être : | ||
| Ligne 208: | Ligne 212: | ||
| #!/bin/bash | #!/bin/bash | ||
| - | Cette ligne indique que le fichier doit être enregistré en tant que [[: | + | Cette ligne indique que le fichier doit être interprété par l' |
| Ajoutez ensuite à votre script ceci : | Ajoutez ensuite à votre script ceci : | ||
| Ligne 214: | Ligne 218: | ||
| iptables-restore < / | iptables-restore < / | ||
| - | Le reste du fichier doit contenir les commandes | + | Le reste du fichier doit contenir les commandes |
| Déplacez le script iptables dans / | Déplacez le script iptables dans / | ||
| Ligne 229: | Ligne 233: | ||
| | | ||
| === Lancer votre script iptables au démarrage via Systemd === | === Lancer votre script iptables au démarrage via Systemd === | ||
| - | |||
| - | <note important> | ||
| Pour lancer votre script iptables au démarrage de votre Ubuntu, merci d' | Pour lancer votre script iptables au démarrage de votre Ubuntu, merci d' | ||
| Ligne 236: | Ligne 238: | ||
| <code bash> | <code bash> | ||
| - | Et y mettre | + | Veuillez éditer ensuite le fichier se trouvant dans **/ |
| - | <file bash / | + | <file bash> |
| [Unit] | [Unit] | ||
| Description=Firewall | Description=Firewall | ||
| Ligne 248: | Ligne 250: | ||
| Type=oneshot | Type=oneshot | ||
| RemainAfterExit=yes | RemainAfterExit=yes | ||
| - | ExecStart=/etc/init.d/nom_de_votre_script_iptables | + | ExecStart=/usr/local/sbin/ |
| - | ExecStop=/etc/init.d/nom_de_votre_script_iptables | + | ExecStop=/usr/local/sbin/ |
| [Install] | [Install] | ||
| Ligne 259: | Ligne 261: | ||
| <code bash> | <code bash> | ||
| - | Au prochain redémarrage de votre Ubuntu, votre service **firewall.service** chargera votre script se trouvant dans **/ | + | Au prochain redémarrage de votre Ubuntu, votre service **firewall.service** chargera votre script |
| - | Pour vérifier le statut de votre service **firewall.service** | + | Pour vérifier le statut de votre service **firewall.service**, veuillez saisir dans un [[: |
| - | <code bash>sudo systemctl status firewall</ | + | <code bash> |
| ===== Script iptables ===== | ===== Script iptables ===== | ||
| Ligne 269: | Ligne 271: | ||
| < | < | ||
| - | <file bash iptables> | + | <code bash iptables> |
| #!/bin/bash | #!/bin/bash | ||
| - | iptables-restore < / | ||
| - | |||
| ## Script iptables by BeAvEr. | ## Script iptables by BeAvEr. | ||
| Ligne 280: | Ligne 280: | ||
| ## On flush iptables. | ## On flush iptables. | ||
| - | |||
| iptables -F | iptables -F | ||
| iptables -X | iptables -X | ||
| Ligne 287: | Ligne 286: | ||
| iptables -t mangle -F | iptables -t mangle -F | ||
| iptables -t mangle -X | 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 récupère notre adresse internet. À utiliser seulement si vous êtes derrière un réseau local. | ||
| - | |||
| - | export ip=$(/ | ||
| - | |||
| - | ## Allow Samba. | ||
| - | |||
| - | iptables -t raw -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns | ||
| - | |||
| - | ## Allow Avahi-daemon (seulement notre LAN. Si vous n'avez pas de LAN, supprimer la partie --source $ip/24). | ||
| - | |||
| - | iptables -A INPUT -p udp -m udp --source $ip/ | ||
| - | |||
| - | iptables -A INPUT -p udp -m udp --source $ip/ | ||
| - | |||
| - | ## On accepte le Multicast. | ||
| - | |||
| - | iptables -A INPUT -m pkttype --pkt-type multicast -j ACCEPT | ||
| ## On drop tout le trafic entrant. | ## On drop tout le trafic entrant. | ||
| - | |||
| iptables -P INPUT DROP | iptables -P INPUT DROP | ||
| ## On drop tout le trafic sortant. | ## On drop tout le trafic sortant. | ||
| - | |||
| iptables -P OUTPUT DROP | iptables -P OUTPUT DROP | ||
| ## On drop le forward. | ## On drop le forward. | ||
| - | |||
| iptables -P FORWARD DROP | iptables -P FORWARD DROP | ||
| + | |||
| + | ## 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 | ||
| + | |||
| + | # Autorise les messages ICMP " | ||
| + | # Nécessaire pour recevoir les erreurs liées à nos propres connexions | ||
| + | # sortantes (ex: PMTUD - découverte du MTU du chemin), sans quoi les | ||
| + | # connexions TCP/UDP peuvent se bloquer silencieusement (ex: HTTPS/ | ||
| + | iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT | ||
| - | ## On drop les scans XMAS et NULL. | + | # Autorise |
| - | + | # Utilisé notamment par traceroute | |
| - | iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN, | + | # en transit (TTL=0) ; utile pour le diagnostic réseau et pour éviter |
| + | # que des erreurs de routage légitimes soient bloquées. | ||
| + | iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT | ||
| + | |||
| + | ## On accepte le Multicast (mDNS/ | ||
| + | iptables -A INPUT -m pkttype --pkt-type multicast | ||
| - | iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP | + | ## DHCP client : indispensable pour obtenir/ |
| + | ## sudo ss -tulnpa |grep :68 | ||
| + | ## -> udp | ||
| + | ## -> 192.168.1.254: | ||
| + | iptables -A INPUT -p udp --sport 67 --dport 68 -j ACCEPT | ||
| - | iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP | + | ## Rejette les paquets dans un état de connexion invalide (INVALID). |
| - | + | # Il s'agit généralement de paquets malformés, incohérents, | |
| - | iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN, | + | # ou ne correspondant à aucune connexion suivie par conntrack. Cette règle |
| + | # permet d' | ||
| + | iptables -A INPUT -m conntrack | ||
| ## Dropper silencieusement tous les paquets broadcastés. | ## Dropper silencieusement tous les paquets broadcastés. | ||
| - | |||
| iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP | iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP | ||
| | | ||
| ## Permettre à une connexion ouverte de recevoir du trafic en entrée. | ## Permettre à une connexion ouverte de recevoir du trafic en entrée. | ||
| - | + | iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT | |
| - | iptables -A INPUT -m conntrack --ctstate ESTABLISHED, | + | |
| ## Permettre à une connexion ouverte de recevoir du trafic en sortie. | ## Permettre à une connexion ouverte de recevoir du trafic en sortie. | ||
| - | |||
| iptables -A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT | iptables -A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT | ||
| ## On accepte la boucle locale en entrée. | ## On accepte la boucle locale en entrée. | ||
| - | |||
| iptables -I INPUT -i lo -j ACCEPT | iptables -I INPUT -i lo -j ACCEPT | ||
| ## On log les paquets en entrée. | ## On log les paquets en entrée. | ||
| - | |||
| iptables -A INPUT -j LOG | iptables -A INPUT -j LOG | ||
| ## On log les paquets forward. | ## On log les paquets forward. | ||
| - | |||
| iptables -A FORWARD -j LOG | iptables -A FORWARD -j LOG | ||
| exit 0 | exit 0 | ||
| - | </file> | + | </code> |
| - | ===== Documentations supplémentaires | + | ===== Voir aussi ===== |
| + | |||
| + | ==== Documentations supplémentaires ==== | ||
| En anglais : | En anglais : | ||
| - | * [[http:// | + | * [[https:// |
| - | * [[http:// | + | * [[https:// |
| - | * [[http:// | + | * [[https:// |
| En Français : | En Français : | ||
| Ligne 373: | Ligne 363: | ||
| * [[https:// | * [[https:// | ||
| * [[http:// | * [[http:// | ||
| - | * [[http:// | + | * [[https:// |
| * [[https:// | * [[https:// | ||
| - | ===== Sources | + | |
| + | ==== Sources ==== | ||
| * Basé sur [[https:// | * Basé sur [[https:// | ||
| - | * Merci à Rusty Russell et son How-To, il est la base de cette page. | + | * Merci à Rusty Russell et son //How-To//, il est la base de cette page. |
| * Et merci surtout pour son travail au sein de l' | * Et merci surtout pour son travail au sein de l' | ||
| - | + | ---- | |
| - | // | + | //[[:Contributeurs]] : [[:utilisateurs: |
