Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
iptables [Le 27/04/2020, 10:38] 116.202.112.170 [Via un fichier] beaver |
iptables [Le 16/02/2025, 06:46] (Version actuelle) 78.121.49.7 [Configuration du pare-feu] |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
=====Iptables===== | =====Iptables===== | ||
+ | FIXME: Depuis une Ubuntu 23.10, le package [[apt>iptables]] semble être maintenu, voir : https://changelogs.ubuntu.com/changelogs/pool/main/i/iptables/iptables_1.8.9-2ubuntu2/changelog -- [[utilisateurs:BeAvEr]], en date du : ✨✨ **////__(14/09/2023)__** ✨✨ | ||
+ | |||
+ | ---- | ||
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 [[:ufw|UFW]] qui permet de contrôler simplement Netfilter, [[:ufw|UFW]] est toutefois moins complet que 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 [[:ufw|UFW]] qui permet de contrôler simplement Netfilter, [[:ufw|UFW]] est toutefois moins complet que iptables. | ||
Ligne 10: | Ligne 13: | ||
Cette documentation est une introduction à Iptables, elle est destinée à ceux qui souhaitent mettre en place un [[:pare-feu]] et/ou un partage de connexion, sur une machine Linux, sans passer par une interface graphique. Seule la table par défaut (Filter) d'Iptables est présentée ici et seules les chaînes utilisées par Filter (Input, Forward et Output) y sont exposées. | Cette documentation est une introduction à Iptables, elle est destinée à ceux qui souhaitent mettre en place un [[:pare-feu]] et/ou un partage de connexion, sur une machine Linux, sans passer par une interface graphique. Seule la table par défaut (Filter) d'Iptables est présentée ici et seules les chaînes utilisées par Filter (Input, Forward et Output) y sont exposées. | ||
- | Les lecteurs désirant approfondir leur recherche et aborder l'utilisation des autres tables (Nat, Mangle, Row et Security) ainsi que des chaînes non utilisables par Filter (Prerouting et Postrouting) se tourneront vers les nombreuses documentations disponibles sur l'Internet (voir notamment ici). Ceux désirant configurer un [[:pare-feu]] par l'intermédiaire d'une interface graphique se tourneront vers Gufw ou encore vers Shorewall pour une utilisation sur serveur. | + | Les lecteurs désirant approfondir leur recherche et aborder l'utilisation des autres tables (Nat, Mangle, Row et Security) ainsi que des chaînes non utilisables par Filter (Prerouting et Postrouting) se tourneront vers les nombreuses documentations disponibles sur l'Internet. Ceux désirant configurer un [[:pare-feu]] par l'intermédiaire d'une interface graphique se tourneront vers Gufw ou encore vers Shorewall pour une utilisation sur serveur. |
iptables existe aussi pour ipv6, pour cela il suffit d'utiliser la commande ip6tables au lieu de iptables. | iptables existe aussi pour ipv6, pour cela il suffit d'utiliser la commande ip6tables au lieu de iptables. | ||
Ligne 54: | Ligne 57: | ||
Pour permettre à une connexion déjà ouverte de recevoir du trafic : | Pour permettre à une connexion déjà ouverte de recevoir du trafic : | ||
<code> | <code> | ||
- | # iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT | + | sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT |
</code> | </code> | ||
+ | Cette commande ajoute une règle (''-A'') à la chaîne contrôlant le trafic entrant //INPUT//, pour autoriser le trafic (''-j ACCEPT''), aprés vérification que l'état de la connexion est établie (''-m conntrack --ctstate ESTABLISHED''). | ||
<note warning> | <note warning> | ||
Ligne 67: | Ligne 71: | ||
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. | ||
<code> | <code> | ||
- | # iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT | + | sudo iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT |
</code> | </code> | ||
Cette commande ajoute une règle (''-A'') à la chaîne contrôlant le trafic entrant //INPUT//, pour autoriser le trafic (''-j ACCEPT''), vers l'interface (''-i'') //eth0// et à destination du port (''<nowiki>--dport</nowiki>'') //SSH// (on aurait pu mettre 22). | Cette commande ajoute une règle (''-A'') à la chaîne contrôlant le trafic entrant //INPUT//, pour autoriser le trafic (''-j ACCEPT''), vers l'interface (''-i'') //eth0// et à destination du port (''<nowiki>--dport</nowiki>'') //SSH// (on aurait pu mettre 22). | ||
Ligne 73: | Ligne 77: | ||
Maintenant vous pouvez vérifier vos règles iptables : | Maintenant vous pouvez vérifier vos règles iptables : | ||
<code> | <code> | ||
- | # iptables -L | + | sudo iptables -L |
Chain INPUT (policy ACCEPT) | Chain INPUT (policy ACCEPT) | ||
target prot opt source destination | target prot opt source destination | ||
Ligne 82: | Ligne 86: | ||
Maintenant, acceptons tout le trafic web (''www'') entrant : | Maintenant, acceptons tout le trafic web (''www'') entrant : | ||
<code> | <code> | ||
- | # iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT | + | sudo iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT |
</code> | </code> | ||
En regardant nos règles, nous avons : | En regardant nos règles, nous avons : | ||
<code> | <code> | ||
- | # iptables -L | + | sudo iptables -L |
Chain INPUT (policy ACCEPT) | Chain INPUT (policy ACCEPT) | ||
target prot opt source destination | target prot opt source destination | ||
Ligne 101: | Ligne 105: | ||
Maintenant que nous avons fini avec les autorisations, il faut maintenant bloquer le reste. | Maintenant que nous avons fini avec les autorisations, il faut maintenant bloquer le reste. | ||
Nous allons en fait modifier la « politique par défaut » (//policy//) de la chaîne //INPUT// : cette décision (//DROP//) s'applique lorsque aucune règle n'a été appliquée à un paquet. Donc, si la tentative de connexion n'est permise par aucune des règles précédentes, elle sera rejetée. | Nous allons en fait modifier la « politique par défaut » (//policy//) de la chaîne //INPUT// : cette décision (//DROP//) s'applique lorsque aucune règle n'a été appliquée à un paquet. Donc, si la tentative de connexion n'est permise par aucune des règles précédentes, elle sera rejetée. | ||
+ | <note important>warning : a ne pas utiliser sur un serveur distant !</note> | ||
<code> | <code> | ||
- | # 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 prot opt source destination | target prot opt source destination | ||
Ligne 111: | Ligne 115: | ||
ACCEPT tcp -- anywhere anywhere tcp dpt:www | ACCEPT tcp -- anywhere anywhere tcp dpt:www | ||
</code> | </code> | ||
+ | |||
+ | == Autre méthode, par exemple pour les server == | ||
**Un autre moyen de procéder** est l'ajout en fin de chaîne d'une règle supprimant les paquets (les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci), //via// ''iptables -A INPUT -j DROP'', mais il faudrait alors faire attention à la position des futures règles. | **Un autre moyen de procéder** est l'ajout en fin de chaîne d'une règle supprimant les paquets (les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci), //via// ''iptables -A INPUT -j DROP'', mais il faudrait alors faire attention à la position des futures règles. | ||
Ligne 116: | Ligne 122: | ||
=== Autoriser le trafic local === | === Autoriser le trafic local === | ||
- | Un p'tit problème de notre configuration est que même l'interface locale //(loopback)// est bloquée. | + | Un petit problème de notre configuration est que même l'interface locale //(loopback)// est bloquée. |
Nous pourrions avoir écrit les règles de rejet seulement pour //eth0// en spécifiant ''-i eth0'', mais nous pouvons aussi ajouter une règle pour //loopback//. Par exemple, nous pourrions l'insérer en 2e position : | Nous pourrions avoir écrit les règles de rejet seulement pour //eth0// en spécifiant ''-i eth0'', mais nous pouvons aussi ajouter une règle pour //loopback//. Par exemple, nous pourrions l'insérer en 2e position : | ||
<code> | <code> | ||
- | # iptables -I INPUT 2 -i lo -j ACCEPT | + | sudo iptables -I INPUT 2 -i lo -j ACCEPT |
</code> | </code> | ||
Pour lister les règles plus en détail. | Pour lister les règles plus en détail. | ||
<code> | <code> | ||
- | # iptables -L -v -n | + | sudo iptables -L -v -n |
</code> | </code> | ||
Ligne 133: | Ligne 139: | ||
<code> | <code> | ||
# On autorise le PC a faire des pings sur des IP externes et à répondre aux requêtes "ping" | # On autorise le PC a faire des pings sur des IP externes et à répondre aux requêtes "ping" | ||
- | iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT | + | sudo iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT |
# Si vous utilisez une ancienne version de iptables la commande ci-dessus peut ne pas fonctionner, dans ce cas entrez la commande suivante : | # Si vous utilisez une ancienne version de iptables la commande ci-dessus peut ne pas fonctionner, dans ce cas entrez la commande suivante : | ||
- | iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT | + | sudo iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT |
# On autorise les pings | # On autorise les pings | ||
- | iptables -A INPUT -p icmp -j ACCEPT | + | sudo iptables -A INPUT -p icmp -j ACCEPT |
</code> | </code> | ||
Ligne 148: | Ligne 154: | ||
Tout d'abord vous listez l'ensemble de vos règles avec l'affichage des lignes : | Tout d'abord vous listez l'ensemble de vos règles avec l'affichage des lignes : | ||
<code> | <code> | ||
- | iptables -L --line-numbers | + | sudo iptables -L --line-numbers |
</code> | </code> | ||
Ce qui personnellement me retourne : | Ce qui personnellement me retourne : | ||
Ligne 173: | Ligne 179: | ||
<code> | <code> | ||
- | iptables -D OUTPUT 2 | + | sudo iptables -D OUTPUT 2 |
</code> | </code> | ||
Ligne 193: | Ligne 199: | ||
iptables-persistent propose de sauvegarder les règles dans le dossier **/etc/iptables**, fichier **rules.v4** pour les règles IPv4 et **rules.v6** pour les règles IPv6. Le script peut s’appeler via : | iptables-persistent propose de sauvegarder les règles dans le dossier **/etc/iptables**, fichier **rules.v4** pour les règles IPv4 et **rules.v6** pour les règles IPv6. Le script peut s’appeler via : | ||
- | service iptables-persistent | + | sudo iptables-save |
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. | 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. | ||
Ligne 199: | Ligne 205: | ||
==== Via un fichier ==== | ==== Via un fichier ==== | ||
- | <note important>Depuis l'utilisation du daemon **systemd-resolved**, il n'est plus possible de lancer votre script iptables via l'emplacement **/etc/network/if-pre-up.d/** de votre Ubuntu. Pour vérifier si vous êtes concerné par cette note, veuillez ouvrir un [[:terminal]], avec pour contenu **pidof systemd-resolved**, si vous avez un retour, merci de vous référer au chapitre **3.2.1**. | + | <note important>Depuis l'utilisation du daemon **systemd-networkd**, il n'est plus possible de lancer votre script iptables via l'emplacement **/etc/network/if-pre-up.d/** de votre Ubuntu. Pour vérifier si vous êtes concerné par cette note, veuillez ouvrir un [[:terminal]], avec pour contenu **pidof systemd-networkd**, si vous avez un retour, merci de vous référer au chapitre **3.2.1**. |
</note> | </note> | ||
Ligne 208: | Ligne 214: | ||
#!/bin/bash | #!/bin/bash | ||
- | Cette ligne indique que le fichier doit être enregistré en tant que [[:tutoriel:script_shell|script bash]]. | + | Cette ligne indique que le fichier doit être interprété par l'exécutable /bin/bash (c'est donc un [[:tutoriel:script_shell|script bash]]). |
Ajoutez ensuite à votre script ceci : | Ajoutez ensuite à votre script ceci : | ||
Ligne 229: | Ligne 235: | ||
| | ||
=== Lancer votre script iptables au démarrage via Systemd === | === Lancer votre script iptables au démarrage via Systemd === | ||
- | |||
- | <note important>En cours de rédaction --- [[:utilisateurs:BeAvEr|BeAvEr]].</note> | ||
Pour lancer votre script iptables au démarrage de votre Ubuntu, merci d'ouvrir un [[:terminal]], avec pour contenu : | Pour lancer votre script iptables au démarrage de votre Ubuntu, merci d'ouvrir un [[:terminal]], avec pour contenu : | ||
Ligne 236: | Ligne 240: | ||
<code bash>sudo touch /lib/systemd/system/firewall.service</code> | <code bash>sudo touch /lib/systemd/system/firewall.service</code> | ||
- | Et y mettre : | + | Veuillez éditer ensuite le fichier se trouvant dans **/lib/systemd/system/firewall.service**, avec votre [[:éditeur de texte]] favoris, et y coller : |
- | <file bash /lib/systemd/system/firewall.service> | + | <file bash> |
[Unit] | [Unit] | ||
Description=Firewall | Description=Firewall | ||
Ligne 248: | Ligne 252: | ||
Type=oneshot | Type=oneshot | ||
RemainAfterExit=yes | RemainAfterExit=yes | ||
- | ExecStart=/etc/init.d/nom_de_votre_script_iptables start | + | ExecStart=/etc/init.d/nom_de_votre_script_iptables(modifier_le_nom!) start |
- | ExecStop=/etc/init.d/nom_de_votre_script_iptables stop | + | ExecStop=/etc/init.d/nom_de_votre_script_iptables(modifier_le_nom!) stop |
[Install] | [Install] | ||
Ligne 259: | Ligne 263: | ||
<code bash>sudo systemctl enable firewall.service</code> | <code bash>sudo systemctl enable firewall.service</code> | ||
- | Au prochain redémarrage de votre Ubuntu, votre service **firewall.service** chargera votre script se trouvant dans **/etc/init.d/**. | + | Au prochain redémarrage de votre Ubuntu, votre service **firewall.service** chargera votre script iptables se trouvant dans **/etc/init.d/**. |
Pour vérifier le statut de votre service **firewall.service**, veuillez saisir dans un [[:terminal]] : | Pour vérifier le statut de votre service **firewall.service**, veuillez saisir dans un [[:terminal]] : | ||
- | <code bash>sudo systemctl status firewall</code> | + | <code bash>systemctl status firewall</code> |
===== Script iptables ===== | ===== Script iptables ===== | ||
Ligne 269: | Ligne 273: | ||
<note>Ce script est un exemple, il est à adapter à vos besoins. Il peut toutefois être utilisé pour une utilisation courante, il offre une plutôt bonne "protection" pour un usage desktop.</note> | <note>Ce script est un exemple, il est à adapter à vos besoins. Il peut toutefois être utilisé pour une utilisation courante, il offre une plutôt bonne "protection" pour un usage desktop.</note> | ||
- | <file bash iptables> | + | <code bash iptables> |
#!/bin/bash | #!/bin/bash | ||
Ligne 291: | Ligne 295: | ||
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP | 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=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') | ||
- | |||
- | ## 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/24 --dport 5353 -j ACCEPT | ||
- | |||
- | iptables -A INPUT -p udp -m udp --source $ip/24 --dport 427 -j ACCEPT | ||
## On accepte le Multicast. | ## On accepte le Multicast. | ||
Ligne 325: | Ligne 314: | ||
## On drop les scans XMAS et NULL. | ## On drop les scans XMAS et NULL. | ||
- | iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP | + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP |
- | iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP | + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags ALL ALL -j DROP |
- | iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP | + | iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags ALL NONE -j DROP |
- | iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -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. | ## Dropper silencieusement tous les paquets broadcastés. | ||
Ligne 339: | Ligne 328: | ||
## 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,RELATED -j ACCEPT | + | iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT |
## Permettre à une connexion ouverte de recevoir du trafic en sortie. | ## Permettre à une connexion ouverte de recevoir du trafic en sortie. | ||
Ligne 359: | Ligne 348: | ||
exit 0 | exit 0 | ||
- | </file> | + | </code> |
===== Documentations supplémentaires ===== | ===== Documentations supplémentaires ===== | ||
En anglais : | En anglais : | ||
- | * [[http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html| How To Iptables]] | + | * [[https://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html| How To Iptables]] |
- | * [[http://www.netfilter.org/documentation/|Documentation Multilingue de Netfilter et Iptables]] | + | * [[https://www.netfilter.org/documentation/|Documentation Multilingue de Netfilter et Iptables]] |
- | * [[http://people.netfilter.org/rusty/unreliable-guides/| Rusty's Remarkably Unreliable Guides]] | + | * [[https://people.netfilter.org/rusty/unreliable-guides/| Rusty's Remarkably Unreliable Guides]] |
En Français : | En Français : | ||
Ligne 373: | Ligne 362: | ||
* [[https://memoire-grise-liberee.fr.eu.org|"Mémoire Grise Libérée" : IpTables HowTo]] | * [[https://memoire-grise-liberee.fr.eu.org|"Mémoire Grise Libérée" : IpTables HowTo]] | ||
* [[http://www.inetdoc.net/guides/iptables-tutorial/|iptables-tutorial de Oskar Andreasson traducteur Marc Blanc et publié par Philippe Latu]] | * [[http://www.inetdoc.net/guides/iptables-tutorial/|iptables-tutorial de Oskar Andreasson traducteur Marc Blanc et publié par Philippe Latu]] | ||
- | * [[http://www.it-connect.fr/supprimer-une-regle-precise-dans-iptables/|Supprimer une règle précise sous Iptables]] sur IT-Connect.fr | + | * [[https://www.it-connect.fr/supprimer-une-regle-precise-dans-iptables/|Supprimer une règle précise sous Iptables]] sur IT-Connect.fr |
* [[https://wiki.visionduweb.fr/index.php?title=Configurer_le_pare-feu_Iptables|Quelques notes avec des exemples ainsi que des liens valides vers des tutoriels pour utiliser Iptables]] depuis le wiki de Visionduweb. | * [[https://wiki.visionduweb.fr/index.php?title=Configurer_le_pare-feu_Iptables|Quelques notes avec des exemples ainsi que des liens valides vers des tutoriels pour utiliser Iptables]] depuis le wiki de Visionduweb. | ||
===== Sources ===== | ===== Sources ===== | ||
Ligne 383: | Ligne 372: | ||
//Contributeurs : [[utilisateurs:Kmeleon]], [[utilisateurs:eks]], [[utilisateurs:BeAvEr]] (Création du script iptables et modification majeure de la documentation), [[utilisateurs:maverick62]], [[utilisateurs:mydjey]] (mise à jour et refonte).// | //Contributeurs : [[utilisateurs:Kmeleon]], [[utilisateurs:eks]], [[utilisateurs:BeAvEr]] (Création du script iptables et modification majeure de la documentation), [[utilisateurs:maverick62]], [[utilisateurs:mydjey]] (mise à jour et refonte).// | ||
- |