IPTables, les chaînes INPUT, OUTPUT et FORWARD

Dans le pare-feu Iptables le module (la  table) filter comprend 3 chaînes. Ces chaînes vont accueillir nos règles de filtrage. Comment déterminer quelle chaîne utiliser ? Aidons-nous des logs pour le découvrir. Nous utiliserons les machines pc-maison, srv-linux et pc-tiny de ce réseau Lab.

mon réseau lab

Notre pare-feu iptables est installé sur la machine srv-linux (sous debian 10). Nous allons configurer iptables pour qu’il produise des logs  à partir de requêtes icmp entre pc-maison et pc-tiny  et  entre srv-linux et pc-tiny. Mais notre box internet n’ayant aucune règle de routage concernant le LAN2 nous devons d’abord ajouter une route statique à pc-maison.

route ADD 192.168.56.0 MASK 255.255.255.0  172.16.0.253

Regardons sur  srv-linux l’état de la table filter d’iptables avec iptables -t filter -L. Filter étant la table par défaut on peut simplifier la commande à iptables -L.

root@srv-linux:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Les 3 chaînes sont vides (aucune règles).  Si dans une chaîne un paquet ne correspond à aucune règle alors ici iptables laissera passer le paquet (policy ACCEPT) .  Le champs target correspond à l’action que doit effectuer la règle. Les cibles les plus utilisée pour la table filter sont  ACCEPT, DROP et REJECT

Dans le terminal nous allons ajouter une règle pour chacune de ces chaînes (iptables -A nom_de_la_chaine).

iptables -A INPUT -p icmp --icmp-type any -j LOG --log-prefix "ping input :" 
iptables -A FORWARD  -p icmp --icmp-type any -j LOG --log-prefix "ping forward :"
iptables -A OUTPUT -p icmp --icmp-type any -j LOG --log-prefix "ping output :"

Pour toutes communications icmp (-p icmp –icmp-type any) nous déterminons une cible  (-J) ici  écrire dans un fichier de log (LOG). Par défaut la cible LOG sur debian 10 va écrire dans   /var/log/syslog ,  /var/log/kern.log et /var/log/messages !  L’écriture sera précédée d’un préfixe (–log_prefix) destiné à taguer les logs pour en simplifier la consultation . 

Consultons à nouveau l’état de la table filter :

root@srv-linux:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        icmp --  anywhere             anywhere             icmp any LOG level warning prefix "ping input :"

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LOG        icmp --  anywhere             anywhere             icmp any LOG level warning prefix "ping forward :"

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        icmp --  anywhere             anywhere             icmp any LOG level warning prefix "ping output :"

Nos règles sont enregistrées. Source ou de destination n’ont pas été renseignées dans nos règles d’où la valeur par défaut et anywhere. Ouvrons une nouvelle console sur srv-linux pour pouvoir consulter syslog en temps réel. 

tail -f /var/log/syslog | grep -i -n “ping “
root@srv-linux:~# tail -f /var/log/syslog | grep -i -n "ping "
11:May  1 17:05:39 srv-linux kernel: [ 8091.946210] ping input :IN=enp0s8 OUT= MAC=08:00:27:1d:0c:4f:08:00:27:be:e8:25:08:00 SRC=192.168.56.100 DST=172.16.0.253 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27197 DF PROTO=ICMP TYPE=8 CODE=0 ID=44550 SEQ=2
12:May  1 17:05:39 srv-linux kernel: [ 8091.946245] ping output :IN= OUT=enp0s8 SRC=172.16.0.253 DST=192.168.56.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=53146 PROTO=ICMP TYPE=0 CODE=0 ID=44550 SEQ=2

Ce sont les règles des chaînes  INPUT et OUTPUT qui ont traité les paquets. La chaîne INPUT est utilisée lorsqu’une requête est à destination du firewall (IN=enp0s8) . La chaîne OUTPUT lorsqu’une requête est générée par une des interfaces  du firewall (OUT=enp0s8 )

Depuis pc-tiny  je ping maintenant pc-maison  :

11:May  1 18:15:58 srv-linux kernel: [12310.781758] ping forward :IN=enp0s8 OUT=enp0s3 MAC=08:00:27:1d:0c:4f:08:00:27:be:e8:25:08:00 .168.56.100 DST=172.16.0.10 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54253 DF PROTO=ICMP TYPE=8 CODE=0 ID=16647 SEQ=0
12:May  1 18:15:58 srv-linux kernel: [12310.781967] ping forward :IN=enp0s3 OUT=enp0s8 MAC=08:00:27:e9:56:f7:00:8c:fa:8b:55:2b:08:00 .16.0.10 DST=192.168.56.100 LEN=84 TOS=0x00 PREC=0x00 TTL=127 ID=10672 PROTO=ICMP TYPE=0 CODE=0 ID=16647 SEQ=0

C’est la règle de la chaîne FORWARD qui a traité les paquets .  Cette chaîne est donc à utiliser lorsqu’on souhaite filtrer les paquets qui vont traverser le firewall. 

En conclusion ce sont la source et la destination du paquet qui vont déterminer la chaîne que nous devons  utiliser pour le filtrage. 

Pour terminer remettons la table  filter dans son état initial.  Il existe plusieurs solutions. Dans le terminal nous pouvons entrer à nouveau nos règles mais avec l’option -D (delete) au lieu de -A.  

 
iptables -D INPUT -p icmp --icmp-type any -j LOG --log-prefix "ping input :" 
iptables -D FORWARD  -p icmp --icmp-type any -j LOG --log-prefix "ping forward :"
iptables -D OUTPUT -p icmp --icmp-type any -j LOG --log-prefix "ping output :"

Si les chaînes ne contenaient initialement aucune règle  nous pouvons vider entièrement la chaîne avec    iptables -F NOM_DE_LA_CHAINE

On efface la route statique créé sur pc-maison : route delete 192.168.56.0

Pour aller plus loin

Disposer d’un fichier de log spécifique pour iptables en créant un fichier de configuration dans /etc/rsyslog.d/ :  

https://unix.stackexchange.com/questions/96484/how-can-i-configure-syslog-conf-file-to-log-iptables-messages-in-a-separate-fil

Organiser la rotation de ce fichier de  logs :

 https://www.svennd.be/rotate-rsyslog-logs-using-logrotate/

Tutoriel Iptables : https://www.nbs-system.com/blog/howto-iptables

Autre tutoriel : https://www.malekal.com/tutoriel-iptables

Consulter les règles en temps réels avec watch : watch -n 1 iptables -vnL

http://man7.org/linux/man-pages/man1/watch.1.html

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Résoudre : *
24 − 19 =