logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
doc:reseau:iptables-pare-feu-pour-un-client [08/10/2014 23:52]
Hypathie [Introduction]
doc:reseau:iptables-pare-feu-pour-un-client [11/11/2014 10:33]
Hypathie [Sauvegarder ses règles]
Ligne 6: Ligne 6:
   * Suivi : {{à-placer}}   * Suivi : {{à-placer}}
     * Création par [[user>​Hypathie]] 08/10/2014     * Création par [[user>​Hypathie]] 08/10/2014
-    * Testé par <...> le <​...> ​FIXME+    * Testé par <...> le <​...> ​
   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=99071#​p99071| Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))    * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=99071#​p99071| Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) 
  
-**Nota :**+
 ===== Introduction ===== ===== Introduction =====
 **Iptables** est un logiciel libre grâce auquel l’administrateur système peut configurer les chaînes et règles du pare-feu en espace noyau. **Iptables** est un logiciel libre grâce auquel l’administrateur système peut configurer les chaînes et règles du pare-feu en espace noyau.
  
-**Netfilter** est un framework implémentant le pare-feu au sein du noyau Linux.+**Netfilter** est un framework implémentant le pare-feu au sein du noyau Linux.\\  
 +Voir [[http://​www.netfilter.org/​|le site de netfilter]]
  
 Un pare-feu rejette les paquets du réseau selon des règles stockées dans la mémoire du PC.\\ Linux iptables travaille avec des «chaînes». Ces chaînes sont des regroupements de règles qui régissent le trafic réseau en fonction de trois axes : les paquets ; les protocoles ; les ports. Un pare-feu rejette les paquets du réseau selon des règles stockées dans la mémoire du PC.\\ Linux iptables travaille avec des «chaînes». Ces chaînes sont des regroupements de règles qui régissent le trafic réseau en fonction de trois axes : les paquets ; les protocoles ; les ports.
Ligne 39: Ligne 40:
  
 ===Ports TCP/UDP et Protocole couramment utilisés=== ===Ports TCP/UDP et Protocole couramment utilisés===
-Comme un pare-feu classique, iptables contrôle les ports sur une interface réseau par laquelle les paquets peuvent entrer, ​passer à travers pour y être modifiésou encore ​sortir.\\  ​+Comme un pare-feu classique, iptables contrôle les ports sur une interface réseau par laquelle les paquets peuvent entrer, ​transiter, sortir, être rejetés.\\  ​
  
-Ce reporter à la documentation interne (lien en vert) pour la mise en place de ces services ci-dessous.\\  +Ce reporter à la documentation interne (lien en vert) pour la mise en place des services ​listés ​ci-dessous.\\  
-Vous y trouverez : leur installation et leur configuration. Et à ce sujetcomment changer les ports par défaut ​associé à tel ou tel service+Vous y trouverez : leur installation et leur configuration, ​tel que la modification du port par défaut ​pour certains de ces protocoles.\\ 
  
-Dans la suite je considérerai qu'ils n'ont pas été modifiés.+Et à ce sujet, dans la suite de ce wiki, je considérerai qu'ils n'ont pas été modifiés.
  
 **[[doc:​reseau:​ftp|FTP]]** = TCP 21/​20\\ ​ **[[doc:​reseau:​ftp|FTP]]** = TCP 21/​20\\ ​
Ligne 65: Ligne 66:
 Un conseil ne pas mettre en place un pare-feu tout fait sans comprendre ce qu'on fait.\\ ​ Un conseil ne pas mettre en place un pare-feu tout fait sans comprendre ce qu'on fait.\\ ​
 L'​idéal est d'​avoir quelques bases sur les réseaux.\\ ​ L'​idéal est d'​avoir quelques bases sur les réseaux.\\ ​
-Voici quelques liens indispensables pour aborder ces bases :\\ +Voici quelques liens indispensables pour acquérir quelques connaissances fondamentales ​:\\ 
  
   * [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​tcpiprepetition.html|TCP/​IP]]   * [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​tcpiprepetition.html|TCP/​IP]]
Ligne 74: Ligne 75:
     * sur SCTP : les [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​sctpcharacteristics.html|Caractéristiques SCTP]] et les [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​sctpheaders.html|En-têtes SCTP]]     * sur SCTP : les [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​sctpcharacteristics.html|Caractéristiques SCTP]] et les [[http://​www.inetdoc.net/​guides/​iptables-tutorial/​sctpheaders.html|En-têtes SCTP]]
  
-Pour ce qui concerne le routage (table NAT), nous l'​aborderons lors de la mise en place d'un pare-feu pour une machine faisant office de routeur, dans un autre wiki.+Au sujet de la configuration réseau, commandes, fichiers de configuration pour GNU/​linux:​\\ [[http://​www.linux-france.org/​prj/​edu/​archinet/​systeme/​ch03.html]] 
 + 
 +Enfin pour lister les protocoles connus du système : 
 +<code user> cat /​etc/​protocols</​code>​ 
 + 
 +Pour ce qui concerne le routage (table NAT), nous l'​aborderons lors de la mise en place d'un pare-feu pour une machine faisant office de routeur, dans le wiki suivant.
 =====Fonctionnement d'​iptables===== =====Fonctionnement d'​iptables=====
 Pour apprendre à utiliser iptables et acquérir les différentes notions mises en œuvre lors de son utilisation,​ nous allons partir de l'​exemple.\\ ​ Pour apprendre à utiliser iptables et acquérir les différentes notions mises en œuvre lors de son utilisation,​ nous allons partir de l'​exemple.\\ ​
Ligne 82: Ligne 88:
 Une **table** permet de définir le plan de "​travail"​. En effet, iptables ne sert pas uniquement à bloquer certains paquets et n'est pas uniquement utiliser pour dresser un pare-feu. On peut par exemple s'en servir modifier un paquet (table MANGLE), ou pour faire de la redirection de paquet (table NAT). Une **table** permet de définir le plan de "​travail"​. En effet, iptables ne sert pas uniquement à bloquer certains paquets et n'est pas uniquement utiliser pour dresser un pare-feu. On peut par exemple s'en servir modifier un paquet (table MANGLE), ou pour faire de la redirection de paquet (table NAT).
  
-Mais c'est la table filter permet d'​utiliser iptables en tant que pare-feu. Avec cette table, on va indiquer à iptables un ensemble de règles dans un ordre précis afin qu'il sache s'il doit interdire ou autoriser le passage des paquets. \\ +Mais c'est la table filter ​qui permet d'​utiliser iptables en tant que pare-feu ​et qui nous intéresse ici.\\ Avec cette table, on va indiquer à iptables un ensemble de règles dans un ordre précis afin qu'il sache s'il doit interdire ou autoriser le passage des paquets. \\ 
  
 Dresser la table filter consistera à indiquer précisément à iptables pour quels paquets, pour quels ports ou protocoles, pour quelle direction... il y a autorisation ou interdiction de passage. Dresser la table filter consistera à indiquer précisément à iptables pour quels paquets, pour quels ports ou protocoles, pour quelle direction... il y a autorisation ou interdiction de passage.
Ligne 104: Ligne 110:
 > **La première ligne ''​Chain INPUT (policy ACCEPT)''​** concerne les paquets entrants **''​INPUT''​**.\\ On voit que tout passe dans toutes les directions **''​policy ACCEPT''​**. > **La première ligne ''​Chain INPUT (policy ACCEPT)''​** concerne les paquets entrants **''​INPUT''​**.\\ On voit que tout passe dans toutes les directions **''​policy ACCEPT''​**.
  
-> **En dessous ''​target ​  prot opt source ​ destination''​** ce sont les titres qui permettent de ranger dans un tableau bien lisible ce qui est mis en place :+> **En dessous ''​target ​  prot opt source ​ destination''​** ce sont les titres qui permettent de ranger ​le retour de la commande de listage ​dans un tableau bien lisible. Pratique pour lire plus facilement ​ce qui est mis en place :
 >> >>
 >> **''​target''​** : c'est l'​action à prendre, quand des règles seront mises en place, on trouvera dans cette colonne plusieurs lignes dont chacune aura l'une de ces valeurs :\\  **''​ACCEPT''​** (autoriser) ou **''​DROP''​** (interdire) ou **''​REJECT''​** (interdire en envoyant un signal d'​interdiction). >> **''​target''​** : c'est l'​action à prendre, quand des règles seront mises en place, on trouvera dans cette colonne plusieurs lignes dont chacune aura l'une de ces valeurs :\\  **''​ACCEPT''​** (autoriser) ou **''​DROP''​** (interdire) ou **''​REJECT''​** (interdire en envoyant un signal d'​interdiction).
Ligne 175: Ligne 181:
  
 <​note>​ <​note>​
--F : (flush) : vider toutes les tables ​existantes\\  +-F : (flush) : vider toutes les chaînes ​existantes\\  
--X : supprimer les règles ​personnelles ​+-X : supprimer les chaînes ​personnelles ​
 </​note>​ </​note>​
  
Ligne 190: Ligne 196:
   * Suivons le principe énoncé plus haut : on commence par tout interdire.   * Suivons le principe énoncé plus haut : on commence par tout interdire.
  
-Pour les entrées ; ce qui passe ; ce qui sort : 
 <code root> <code root>
 iptables -P INPUT DROP iptables -P INPUT DROP
Ligne 214: Ligne 219:
 <code root> <code root>
 iptables -t filter -A OUTPUT -p udp -m udp\ iptables -t filter -A OUTPUT -p udp -m udp\
- ​--dport 53 -m conntrack --ctstate RELATED,​ESTABLISHED -j ACCEPT+ ​--dport 53 -m conntrack --ctstate ​NEW,RELATED,​ESTABLISHED -j ACCEPT
  
 iptables -t filter -A INPUT -p udp -m udp\ iptables -t filter -A INPUT -p udp -m udp\
Ligne 276: Ligne 281:
  
 <​note>​ <​note>​
-Commande précédente, ou on peut aussi faire :+Commandes précédentes, ou celles-ci plus précises que l'on préférera ​:
 <code root> <code root>
-iptables -A OUTPUT -p icmp -m conntrack\+iptables -A OUTPUT ​-o eth0 -p icmp -m conntrack\
  ​--ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT  ​--ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT
  
-iptables -A INPUT -p icmp -m conntrack\+iptables -A INPUT -i eth0 -p icmp -m conntrack\
  ​--ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT  ​--ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT
 </​code>​ </​code>​
Ligne 296: Ligne 301:
  ​RELATED,​ESTABLISHED -j ACCEPT  ​RELATED,​ESTABLISHED -j ACCEPT
 </​code>​ </​code>​
 +
 +===Pour IMAP et SMTP (utilisation de messagerie icedove) ===
 +<code root>​iptables -A INPUT -m multiport -p tcp --sport 25,​2525,​587,​465,​143,​993,​995 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +
 +iptables -A OUTPUT -m multiport -p tcp --dport 25,​2525,​143,​465,​587,​993,​995 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT </​code>​
 +
 +Pour la liste des ports selon les serveurs de messagerie utilisés voir : [[https://​www.arclab.com/​en/​amlc/​list-of-smtp-and-imap-servers-mailserver-list.html|list of smtp and imap servers mailserver]]
 +
 +===Pour installer une imprimante partagée ===
 +  * Si l'on veut brancher son imprimante sur la machine d'IP 192.168.0.22 faisant alors office de serveur d'​impression pour le réseau local 192.168.0.0/​24 :
 +
 +<code root>​iptables -A INPUT -i eth0 -s 192.168.0.0/​24 -d 192.168.0.22 -p tcp\
 + ​--dport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +
 +iptables -A OUTPUT -o eth0 -s 192.168.0.22 -d 192.168.0.0/​24 -p tcp\
 + ​--sport 631 -m state ! --state INVALID -j ACCEPT</​code>​
 +
 +<​note>​Remarque sur la place du point d'​exclamation,​ qui ne se place pas devant ''​INVALID''​ comme on le voit souvent !</​note>​
 +
 +<note tip>**Si l'on veut que cette imprimante soit partagée aussi par un autre réseau, par exemple 192.168.1.0/​24 on ajoutera ceci au pare-feu du client :**
 +
 +<code root>​iptables -A INPUT -i eth0 -s 192.168.1.0/​24 -d 192.168.0.22 -p tcp\
 + ​--dport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +
 +iptables -A OUTPUT -o eth0 -s 192.168.0.22 -d 192.168.1.0/​24 -p tcp\
 + ​--sport 631 -m state ! --state INVALID -j ACCEPT</​code>​
 +
 +**Dans ce cas au niveau de la passerelle** :
 +Si elle dotée d'un pare-feu, il faudra que **son** pare-feu permette le trafic pour le port 631, c'​est-à-dire accepter sur eth0 (réseau 192.168.0.0/​24) les entrées et les sorties tcp sur le port 631.\\ ​
 +
 +Par exemple :
 +
 +  iptables -A INPUT -i eth0 -s 192.168.0.22 -d 192.168.0.1 -p tcp --sport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +  iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.22 -p tcp --dport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +
 +
 +Voir : [[atelier:​chantier:​iptables-un-pare-feu-pour-une-passerelle?&#​le-script-de-la-passerelle|Script d'une passerelle]]
 +</​note> ​
  
 ====Vérifier et faire des tests==== ====Vérifier et faire des tests====
Ligne 463: Ligne 506:
  
   * Pour vérifier ses logs :   * Pour vérifier ses logs :
-On se connecte en ssh du client sur lequel on a installé le pare-feu vers un client de notre réseau; puis dans l'​autre sens d'un client du réseau vers le client "​pare-feuté"​ qui est aussi server ​ssh.+On se connecte en ssh du client sur lequel on a installé le pare-feu vers un client de notre réseau; puis dans l'​autre sens d'un client du réseau vers le client "​pare-feuté"​ qui est aussi serveur ​ssh.
  
 <code user>​less /​var/​log/​messages | grep OUTGOING_SSH</​code>​ <code user>​less /​var/​log/​messages | grep OUTGOING_SSH</​code>​
Ligne 484: Ligne 527:
  
  
-====Sauvegarder ses règles ====+=====Sauvegarder ses règles ​=====
 En l'​état actuel, si on éteint le système au redémarrage nos règles et tables utilisateur auront disparu.\\ ​ En l'​état actuel, si on éteint le système au redémarrage nos règles et tables utilisateur auront disparu.\\ ​
 Pour les sauvegarder,​ il y a plusieurs méthodes. On peut créer un script de démarrage, ou se servir de les commandes iptables-save et iptables-restore.\\ ​ Pour les sauvegarder,​ il y a plusieurs méthodes. On peut créer un script de démarrage, ou se servir de les commandes iptables-save et iptables-restore.\\ ​
 On choisira d'​abord la seconde méthode car c'est la plus simple !  On choisira d'​abord la seconde méthode car c'est la plus simple ! 
  
-===Avec les commandes iptables-save et iptables-restore===+====Avec les commandes iptables-save et iptables-restore====
 La commande iptables-save crée un fichier et la commande iptables-restore charge la dernière sauvegarde à partir du fichier crée par iptables-save. La commande iptables-save crée un fichier et la commande iptables-restore charge la dernière sauvegarde à partir du fichier crée par iptables-save.
  
-  * Pour sauvegarder toutes les règles ​: +===Pour sauvegarder toutes les règles=== 
-<code root>​iptables-save > /etc/iptables</​code>​+<code root>​iptables-save > /etc/firewall-client</​code>​
  
-  * Pour les charger après le redémarrage ​: +===Pour les charger après le redémarrage=== 
-<code root>​iptables-restore < /etc/iptables</​code>​+<code root>​iptables-restore < /etc/firewall-client</​code>​
  
-Bon il ne faut pas oublier de mettre ​son pare-feu à chaque redémarrage !\\ +Bon il ne faut pas oublier de charger ​son pare-feu à chaque redémarrage !\\ 
  
 Évitons ce risque et surtout de nous fatiguer...\\ ​ Évitons ce risque et surtout de nous fatiguer...\\ ​
  
-  * Pour restaurer automatiquement les règles au démarrage+===Pour restaurer automatiquement les règles au démarrage===
  
-On va installer la commande iptables-restore avant que les interfaces ne soient chargés via le fichier /​etc/​network/​interfaces.\\ ​ +On va installer la commande iptables-restore avant que les interfaces ​ethernet ​ne soient chargés via le fichier /​etc/​network/​interfaces.\\ ​
- +
-L'​avantage de cette méthode est la possibilité de créer des règles personnalisées pour chaque interface. Si les règles sont indépendantes des interfaces, on place la commande ​ iptables-restore en pre-up de la boucle locale.+
  
 <code root>vim /​etc/​network/​interfaces</​code>​ <code root>vim /​etc/​network/​interfaces</​code>​
 <​code>​ <​code>​
 # The loopback network interface # The loopback network interface
-pre-up iptables-restore < /​etc/​iptables 
 auto lo auto lo
 iface lo inet loopback iface lo inet loopback
 +post-up iptables-restore < /​etc/​firewall-client
 </​code>​ </​code>​
  
-Donc le jour où on installera une carte wifi sur son vieil ordi fixe, on se teste d'​abord quelques nouvelles règles iptables, puis quand elles sont tip-top, on les sauvegarde ​ en crant un ''​iptables-save > /​etc/​iptables-wifi''​.\\ ​+===Avantages de cette méthode===
  
-On ne restera plus qu'à ajouter ''​pre-up ​iptables-restore ​< /​etc/​iptables-wifi''​ avant la configuration de l'​interface wlan dans /​etc/​network/​interfaces sans avoir toucher ce qui fonctionnait déjà...+  * La possibilité de créer des règles personnalisées pour chaque interface.  
 +Si les règles sont indépendantes des interfaces, on place la commande  ​iptables-restore ​en pre-up de la boucle locale.
  
-===Pour les fadas du "​scripting"​ shell===+On peut créer plusieurs fichiers à restaurer, un pour chaque interface par exemple, ou un fichier particulier pour un service particulier (un pour masquerade et squid, un autre pour un pare-feu)...
  
-**C'​est soit la méthode précédentesoit celle-ci !**\\  +Ainsi par exemple le jour où on ajoutera une carte wifi sur son vieil ordi fixe, on se teste quelques nouvelles règles iptablespuis quand elles sont tip-topon les sauvegarde ​ en créant ​un ''​iptables-save > /​etc/​iptables-wifi''​.\\ 
-(Pour tester n'​oubliez pas de commentermettre ​un ''​#''​ devant la ligne\\ ''​pre-up ​iptables-restore < /​etc/​iptables'' ​du fichier /​etc/​network/​interfaces ajoutée lors de la méthode précédente.)+
  
-<​code ​text firewall-client.sh>​+On ne restera plus qu'à ajouter ''​pre-up iptables-restore < /​etc/​iptables-wifi''​ avant la configuration de l'​interface wlan dans /​etc/​network/​interfaces sans avoir à modifier ce qui fonctionnait déjà... 
 + 
 +  * Une grande facilité de modification des règles du pare-feu : 
 +Si pour une raison ou une autre il est nécessaire d'​ajouter une règle au pare-feu, ou d'en supprimer une pour la modifier, on peut utiliser la commande iptables de suppression : 
 + 
 +Par exemple :\\  
 +Lister les règles avec un numéro de ligne : 
 + 
 +  iptables -L INPUT -n --line-numbers 
 + 
 +Supprimer une ligne particulière (avec le numéro de la colonne de gauche) : 
 + 
 +  iptables -D INPUT numeroDeLaLigneASupprimer 
 + 
 +Dans ce cas pour sauvegarder les nouvelles règles il n'y a qu'à relancer : 
 + 
 +  iptables-save > /​etc/​même_nom_de_fichier_que_celui_modifier 
 + 
 +Ainsi cela évite de modifier un quelconque fichier, et l'on peut se servir de toutes les commandes fournies par sa distribution. 
 + 
 +====Pour les fadas du "​scripting"​ shell==== 
 +Le script suivant permettra de mettre en place le pare-feu à chaque démarrage du système.\\  
 +Donc c'est soit la méthode de sauvegarde des règles iptables précédente,​ soit celle-ci.\\  
 +Si vous avez testé la première méthode, ne pas oublier de supprimer ou de commenté la ligne **''#​post-up iptables-restore < /​etc/​firewall-client''​** du fichier /​etc/​network/​interfaces. 
 + 
 +  * Ce script permettra un rappel des possibilités : 
 +<code root>/​etc/​init.d/​firewall-client.sh</​code>​ 
 + 
 +  Usage: /​etc/​init.d/​firewall-client.sh { start | stop | restart | status } 
 + 
 +  * Par exemple pour supprimer toutes les règles de toutes les tables : 
 +<code root>/​etc/​init.d/​firewall-client.sh stop</​code>​ 
 + 
 +  * Avec "​restart"​ pour permettre de remettre en place toutes les règles (via le fichier de sauvegarde d'​iptables-restore) 
 +  * Avec "​start" ​ pour relancer toutes les règles avec le script lui-même et les re-sauvegarder 
 +  * Avec "​status"​ pour l'​affichage des règles FILTER et NAT) 
 + 
 +<note tip> 
 +Il faut prendre conscience que si l'on souhaite modifier les règles du pare-feu, il est nécessaire après avoir effectué ses tests d'​aller éditer le fichier /​etc/​init.d/​firewall-client pour y apporter les modifications souhaitées aux commandes iptables su script.\\  
 +La commande iptables-save lancée après suppression,​ ajout, etc de nouvelles règles iptables seront écrasées au prochain redemarrage du système qui installera les règles du script /​etc/​init.d/​firewall-client qui auraient été laissées en l'​état. 
 +</​note>​ 
 + 
 +<​code ​bash firewall-client.sh>​
 #!/bin/sh #!/bin/sh
 ### BEGIN INIT INFO ### BEGIN INIT INFO
Ligne 542: Ligne 625:
 # Author: hypathie <​hypathie@debian-facile>​ # Author: hypathie <​hypathie@debian-facile>​
 # #
-##Set up init.d ​script+##Set up /etc/init.d/​firewall-client
 case "​$1"​ in case "​$1"​ in
 '​start'​) '​start'​)
-/​sbin/​iptables-restore < /​etc/​config_parefeu 
-RETVAL=$? 
-;; 
-'​stop'​) 
-/​sbin/​iptables-save > /​etc/​config_parefeu 
-RETVAL=$? 
-;; 
-'​clean'​) 
 ##Set up firewall-client ##Set up firewall-client
-# Clear any existing rules+# Clear any FILTER ​existing rules
 /​sbin/​iptables -F /​sbin/​iptables -F
 # Delete all User-specified chains # Delete all User-specified chains
Ligne 565: Ligne 640:
 /​sbin/​iptables -t filter -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW,​RELATED,​ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW,​RELATED,​ESTABLISHED -j ACCEPT
 /​sbin/​iptables -t filter -A INPUT -p udp -m udp --sport 53 -m conntrack --ctstate RELATED,​ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A INPUT -p udp -m udp --sport 53 -m conntrack --ctstate RELATED,​ESTABLISHED -j ACCEPT
-#Allow trafic on internal network ​ +#Allow trafic on internal network
-/​sbin/​iptables -t filter -A OUTPUT -o lo -j ACCEPT+
 /​sbin/​iptables -t filter -A INPUT -i lo -j ACCEPT /​sbin/​iptables -t filter -A INPUT -i lo -j ACCEPT
 +/​sbin/​iptables -t filter -A OUTPUT -o lo -j ACCEPT
 #Allow ping to internal network #Allow ping to internal network
-/​sbin/​iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT +/​sbin/​iptables -A OUTPUT ​-o eth0 -p icmp -m conntrack --ctstate NEW,​ESTABLISHED,​RELATED -j ACCEPT 
-/​sbin/​iptables -A INPUT -p icmp -m conntrack --ctstate ESTABLISHED,​RELATED -j ACCEPT+/​sbin/​iptables -A INPUT -i eth0 -p icmp -m conntrack --ctstate ​NEW,ESTABLISHED,​RELATED -j ACCEPT
 #Get web #Get web
 /​sbin/​iptables -t filter -A OUTPUT -p tcp -m multiport --dports 80,443,8000 -m conntrack --ctstate NEW,​RELATED,​ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A OUTPUT -p tcp -m multiport --dports 80,443,8000 -m conntrack --ctstate NEW,​RELATED,​ESTABLISHED -j ACCEPT
 /​sbin/​iptables -t filter -A INPUT -p tcp -m multiport --sports 80,443,8000 -m conntrack --ctstate RELATED,​ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A INPUT -p tcp -m multiport --sports 80,443,8000 -m conntrack --ctstate RELATED,​ESTABLISHED -j ACCEPT
 +#Allow mailing protocols (IMAP and SMTP)
 +/​sbin/​iptables -A INPUT -m multiport -p tcp --sport 25,​2525,​587,​465,​143,​993,​995 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +/​sbin/​iptables -A OUTPUT -m multiport -p tcp --dport 25,​2525,​143,​465,​587,​993,​995 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +#Allow cups
 +iptables -A INPUT -i eth0 -s 192.168.0.0/​24 -d 192.168.0.22 -p tcp --dport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 + 
 +iptables -A OUTPUT -o eth0 -s 192.168.0.22 -d 192.168.0.0/​24 -p tcp --sport 631 -m state ! --state INVALID -j ACCEPT
 +#Allow cups from sub-net
 +/​sbin/​iptables -A INPUT -i eth0 -s 192.168.1.0/​24 -d 192.168.0.22 -p tcp --dport 631 -m state --state NEW,​RELATED,​ESTABLISHED -j ACCEPT
 +/​sbin/​iptables -A OUTPUT -o eth0 -s 192.168.0.22 -d 192.168.1.0/​24 -p tcp --sport 631 -m state ! --state INVALID -j ACCEPT
 #Set up a user chain for ssh outgoing ​ #Set up a user chain for ssh outgoing ​
 /​sbin/​iptables -t filter -N OutGoingSSH /​sbin/​iptables -t filter -N OutGoingSSH
 /​sbin/​iptables -I INPUT -p tcp --dport 22 -j OutGoingSSH /​sbin/​iptables -I INPUT -p tcp --dport 22 -j OutGoingSSH
 /​sbin/​iptables -A OutGoingSSH -j LOG --log-prefix '​[OUTGOING_SSH] : ' /​sbin/​iptables -A OutGoingSSH -j LOG --log-prefix '​[OUTGOING_SSH] : '
-#Set up a user chain forr ssh incoming ​+#Set up a user chain for ssh incoming ​
 /​sbin/​iptables -t filter -N InComingSSH /​sbin/​iptables -t filter -N InComingSSH
 /​sbin/​iptables -I OUTPUT -p tcp --sport 22 -j InComingSSH /​sbin/​iptables -I OUTPUT -p tcp --sport 22 -j InComingSSH
Ligne 590: Ligne 675:
 /​sbin/​iptables -t filter -A OUTPUT -o eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,​ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A OUTPUT -o eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,​ESTABLISHED -j ACCEPT
 /​sbin/​iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/​24 -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT /​sbin/​iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/​24 -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
 +echo "set up firewall-client .........>​ [OK]"
 +/​sbin/​iptables-save > /​etc/​firewall-client
 +echo "​iptables-save > /​etc/​firewall-client .........>​ [OK]"
 +RETVAL=$?
 +;;
 +'​stop'​)
 +# delete any existing rules
 +/​sbin/​iptables -t filter -F
 +/​sbin/​iptables -t nat -F
 +/​sbin/​iptables -t mangle -F
 +/​sbin/​iptables -t raw -F
 +/​sbin/​iptables -t filter -P INPUT ACCEPT
 +/​sbin/​iptables -t filter -P OUTPUT ACCEPT
 +/​sbin/​iptables -t filter -P FORWARD ACCEPT
 +echo "​FILTER [ALL RULES .... [FLUSH] ..... POLICY ......> [ACCEPT]"​
 +/​sbin/​iptables -t nat -P PREROUTING ACCEPT
 +/​sbin/​iptables -t nat -P POSTROUTING ACCEPT
 +/​sbin/​iptables -t nat -P OUTPUT ACCEPT
 +/​sbin/​iptables -t mangle -P PREROUTING ACCEPT
 +/​sbin/​iptables -t mangle -P OUTPUT ACCEPT
 +/​sbin/​iptables -t mangle -P POSTROUTING ACCEPT
 +/​sbin/​iptables -t mangle -P FORWARD ACCEPT
 +/​sbin/​iptables -t mangle -P INPUT ACCEPT
 +/​sbin/​iptables -t raw -P OUTPUT ACCEPT
 +/​sbin/​iptables -t raw -P PREROUTING ACCEPT
 +echo "ALL TABLES ....[FLUSH] ..... ALL POLICY .......> [ACCEPT]"​
 RETVAL=$? RETVAL=$?
 ;; ;;
 '​restart'​) '​restart'​)
-$0 stop && $0 start+/​sbin/​iptables-restore < /​etc/​firewall-client 
 +echo "/​etc/​firewall-client ........[OK]"​ 
 +RETVAL=$
 +;; 
 +'​status'​) 
 +/​sbin/​iptables -L -n --line-numbers 
 +/​sbin/​iptables -t nat -L -n --line-numbers
 RETVAL=$? RETVAL=$?
 ;; ;;
 *) *)
-echo "​Usage:​ $0 { start | stop | restart | clean}"+echo "​Usage:​ $0 { start | stop | restart | status ​}"
 RETVAL=1 RETVAL=1
 ;; ;;
Ligne 604: Ligne 721:
 </​code>​ </​code>​
  
-===firewall-client.sh comme script init===+===Instalation de firewall-client.sh comme script init===
  
-Après avoir téléchargé ​firewall-client.sh.+  * Téléchargé ​firewall-client.sh. 
 + 
 +  * Déplacer le fichier firewall-client.sh dans le répertoire d'init :
 <note important>​ <note important>​
 Attention de bien changer $USER par votre nom d'​utilisateur !\\  Attention de bien changer $USER par votre nom d'​utilisateur !\\ 
 Pour pouvoir écrire (i.e. créer un fichier dans un dossier root, il faut lancer la commande en tant que root. Et donc $USER serait l'​utilisateur root qui n'a pas de fichier "​Téléchargements"​. Pour pouvoir écrire (i.e. créer un fichier dans un dossier root, il faut lancer la commande en tant que root. Et donc $USER serait l'​utilisateur root qui n'a pas de fichier "​Téléchargements"​.
 </​note>​ </​note>​
-  * Déplacer dans le répertoire d'init : 
  
 <code root>mv /​home/​$USER/​Téléchargements/​firewall-client.sh /​etc/​init.d/</​code>​ <code root>mv /​home/​$USER/​Téléchargements/​firewall-client.sh /​etc/​init.d/</​code>​
  
-  * Ajouter ​les droits d'​exécution ​au fichier ​pour en faire un exécutable ​:+  * Définir ​les droits d'​exécution ​et l'​appartenance du fichier ​/​etc/​init.d/​firewall-client.sh 
 + 
 +Ils doivent être :
  
 <code root> <code root>
-chmod +x /​etc/​init.d/​firewall-client.sh +chmod 0755 /​etc/​init.d/​firewall-client.sh 
-chmod 755 /​etc/​init.d/​firewall-client.sh+chown root:​root ​/​etc/​init.d/​firewall-client.sh
 </​code>​ </​code>​
  
Ligne 626: Ligne 746:
 <code root>​update-rc.d firewall-client.sh defaults</​code>​ <code root>​update-rc.d firewall-client.sh defaults</​code>​
  
-Et si tout c'est bien passé, au prochain redémarrage :+===Et si tout c'est bien passé=== 
 +Au prochain redémarrage ​
 +  * Le pare-feu se met en place pendant le démarrage du système  
 +<​code>​set up firewall-client .........>​ [OK] 
 +iptables-save > /​etc/​firewall-client .........>​ [OK]</​code>​ 
 + 
 +  * On peut le vérifier ​:
  
 <code root>​iptables -L -n --line-numbers</​code>​ <code root>​iptables -L -n --line-numbers</​code>​
  
-tout est là ! 8-)+Ou (plus complet) : 
 + 
 +<code root>/​etc/​init.d/​firewall-client.sh status</​code>​ 
 + 
 +Tout est là ! 8-)
  
 <note tip> <note tip>
Ligne 646: Ligne 776:
 Et voilà c'est déjà fini ;-) Et voilà c'est déjà fini ;-)
  
-**Prochain n° sur iptables : "un pare-feu pour une passerelle-routeur ​Debian"​.**+**Prochain n° sur iptables : "[[atelier:​chantier:​iptables-un-pare-feu-pour-une-passerelle?&|un pare-feu pour une passerelle ​Debian]]".**
  
-=====Récapitulatif ​des commandes ​et options =====+=====Récapitulatifcommandesoptions, syntaxe ​===== 
 +====Les commandes====
  
 ^ commandes ^ descriptions ^ ^ commandes ^ descriptions ^
Ligne 658: Ligne 789:
 | -L -t typetable | lister les règles d'un type de table où typetable est\\ soit ''​FILTER''​\\ soit ''​NAT''​\\ soit ''​MANGLE''​ ... | | -L -t typetable | lister les règles d'un type de table où typetable est\\ soit ''​FILTER''​\\ soit ''​NAT''​\\ soit ''​MANGLE''​ ... |
 |-E <​nowiki>​[chain]</​nowiki>​ | renommer la chaîne chain | |-E <​nowiki>​[chain]</​nowiki>​ | renommer la chaîne chain |
-| -F <​nowiki>​[chain]</​nowiki>​ | effacer (flush) les règles de la chaîne chain\\ ATTENTION\\ si on ne précise pas de chaîne, tout est effacé ! |+| -F <​nowiki>​[chain]</​nowiki>​ | effacer (flush) les règles de la chaîne chain |
 | -N chain | créer une nouvelle chaîne chain par l'​usager | | -N chain | créer une nouvelle chaîne chain par l'​usager |
 | -X chain | effacer la chaîne chain de l'​usager | | -X chain | effacer la chaîne chain de l'​usager |
-| -P chain target | définir la politique par défaut de la chaîne chain\\ où **target** est\\ soit ''​ACCEPT''​\\ soit ''​DROP''​\\ soit ''​REJETC''​ |+| -P chain target | définir la politique par défaut de la chaîne chain\\ où **target** est\\ soit ''​ACCEPT''​\\ soit ''​DROP''​\\ soit ''​REJECT''​ |
 | -Z <​nowiki>​[chain]</​nowiki>​ | remise à zéro des compteurs dans la chaîne chain si elle est indiquée | | -Z <​nowiki>​[chain]</​nowiki>​ | remise à zéro des compteurs dans la chaîne chain si elle est indiquée |
  
 +====Les options====
 ^options^descriptions^ ^options^descriptions^
 |-p [!] protocle|où protocole est : TCP, UDP, ICMP, ALL| |-p [!] protocle|où protocole est : TCP, UDP, ICMP, ALL|
Ligne 681: Ligne 812:
 [[http://​olivieraj.free.fr/​fr/​linux/​information/​firewall/​fw-03-05.html]] [[http://​olivieraj.free.fr/​fr/​linux/​information/​firewall/​fw-03-05.html]]
  
 +====La syntaxe générale ====
 +===Commande iptables basique===
 +  * Ouvrir une connexion vers sa machine ​
 +
 +  iptables -A INPUT -i <​interface_d'​entrée>​ -p <​nom_du_protocole>​ --dport <​nom_du_port_de_destination>​ -j ACCEPT
 +
 +> Où <​nom_du_protocole>​ est à remplacer par TCP, UDP, all ;
 +> une règle pour chaque protocole
 +> et <​nom_du_port>​ est le **nom du service**, tels FTP, DNS ... **ou le numéro** qui leur correspond tels 21, 53...
 +
 +===Règles plus précise ===
 +
 +  * Sur l'​entrée :
 +
 +  iptables -A INPUT -i <​interface_d'​entrée>​ -s <​reseau_local/​masque_de_reseau>​ -d <​ip_locale>​ -p <​nom_du_protocole>​ --dport <​nom_du_port>​ -m state --state NEW -j ACCEPT
 +
 +
 +> Ce qui rentre sur sa carte ethernet, dont la source est seulement <​reseau_local/​masque_de_reseau>​ et seulement à destination de <​ip_locale>,​ dont l'​état est une nouvelle connexion par tel protocole et sur tel port, sera accepté.
 + 
 +  * Sur la sortie :
 +
 +  iptables -A OUTPUT -o eth0 -s <​ip_locale>​ -d <​reseau_local/​masque_de_reseau>​ -p <​nom_du_protocole>​ --sport <​nom_du_port>​ -m state --state NEW -j ACCEPT
 +
 +> Ce qui sort de sa carte ethernet, dont la source est seulement <​reseau_local/​masque_de_reseau>​ et seulement à destination de <​ip_locale>,​ dont l'​état est une nouvelle connexion par tel protocole et sur tel port, sera accepté.
 +
 +
 +===Filtre encore plus restrictif===
 +
 +  * En entrée :
 +
 +  iptables -A INPUT -i eth0 -s <​reseau_local/​masque_de_reseau>​ -d <​ip_locale>​ -p <​nom_du_protocole>​ --dport <​nom_du_port>​ -m state --state ! INVALID -j ACCEPT
 +
 +> On précise que l'on accepte, en entrée sur l'​interface réseau, tout ce qui vient de notre réseau local à destination de l'​adresse ip, correspondant à notre interface réseau utilisant tel protocole, vers tel numéro de port (ou service) dont l'​état du paquet n'est pas invalide, c'​est-à-dire un paquet ayant l'​état '​nouveau',​ '​établi',​ '​relatif'​ ou 'non traqué'​.
 +
 +  * En sortie :
 +
 +  iptables -A OUTPUT -o eth0 -s <​ip_locale>​ -d <​reseau_local/​masque_de_reseau>​ -p <​nom_du_protocole>​ --sport <​nom_du_port>​ -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +
 +> On précise que l'on accepte de laisser sortir de l'​interface réseau, tout paquet dont la source est l'​adresse ip correspondant à notre interface réseau, à destination de notre réseau local utilisant tel protocole, vers tel numero de port (ou service) dont l'​état est '​relatif'​ ou '​établi'​ - en rapport avec la règle d'​entrée.
 +
 +**-> Tous les paquets qui ne correspondent pas à ces critères d'​entrée ou sortie n'​entrent pas ou ne sortent pas !**
  
  
 +Pour dresser des définitions avec des arguments plus précis car tenant compte des particularités de chacun des protocoles, voir la documentation **[[http://​www.netfilter.org/​documentation/​|netfilter:​Documentation]]**.
doc/reseau/iptables-pare-feu-pour-un-client.txt · Dernière modification: 31/05/2023 20:57 par lagrenouille

Pied de page des forums

Propulsé par FluxBB