TP SECU FILTRAGE DYNAMIQUE 2010 2011 ( Correction ) Présentation du TP Nous utiliserons 3 machines le rôle du poste client externe sera joué par le serveur de la formation permanente ( srvlnx.formation.jussieu.fr ) une machine VMWARE sous DEVIL LINUX sera utilisée comme firewall le firewall a deux cartes réseaux eth0 ( interface externe ) et eth1 (interface interne) l'addresse IP du réseau interne pour le firewall sur le réseau 10.0.0.0/24 est 10.0.0.254 login root (azerty) une machine VMWARE sous Mandriva 2008 jouera le rôle de serveur interne le serveur virtuel à une seule interface réseau eth0 en 10.0.0.10 login vmuser(azerty) login root(azerty) Le serveur virtuel mandriva est vu depuis l'extérieur à travers une translation d'addresse quelques indications: iptables D «règle» iptables F iptables L : supprime une règle : supprime TOUTES LES REGLES : liste les règles en cours exemples : iptables t filter L nv ( n signifie numeric ( pas de résolution dns et v verbose )) I Préparation 1 Démarrer uniquement la machine virtuelle FIREWALL ( menu tp_secu_dyn entrée firewall ) vérifier que l'ip FORWARDING est actif cat /proc/sys/net/ipv4/ip_forward 1 noter l'adresse IP externe root@firewall> /sbin/ifconfig eth0 eth0 Link encap:ethernet HWaddr 00:21:70:CC:18:2A inet adr:192.168.216.115 Bcast:192.168.133.255 Masque:255.255.255.0 Dans le fichier /root/firewall.rules modifier la variable IP_SECONDARY_ADDRESS ( c'est l'addresse de eth0 + 100 ) IP_SECONDARY_ADDRESS=192.168.216.215 redémarrer le service ( /etc/init.d/firewall restart)
il est aussi important de vérifier qu'il n'y a pas de messages d'erreurs vérifier vos interfaces réseau ( ping pour tester ) 2 Démarrer la machine virtuelle serveur ( mandriva 2008) ( menu tp_secu_dyn entrée serveur ) mot de passe: azerty Le setup est déjà prédéfini comme dans le TP précédent sur NAT A partir de là il vous faudra trois terminaux : un sur la machine virtuelle serveur en root ( via ssh ) un sur la machine virtuelle firewall en root (via ssh un sur srvlnx.formation.jussieu.fr pour jouer le rôle de client externe via ssh ( utiliser votre login ) Les logs du firewall ( syslog ng ) ont été redirigé vers le serveur trouver les lignes faisant cela dans /etc/syslog ng/syslog ng.conf le fichier /etc/syslog-ng/syslog-ng.conf du firewall send all messages to the loghost destination loghost { udp("10.0.0.10" port(514)); }; log { source(src); destination(loghost); }; pour faire un petit test de log, sur les machines unix il existe une commande «logger» qui permet d'envoyer le message que l'on veut dans les log. Pour en savoir plus voir le man. exemple : root@firewall:~ logger essai sur le serveur je retrouve : root@serveur:~> /var/log> grep essai /var/log/messages Mar 17 11:16:47 10.0.0.254 src@firewall root: essai donc mes logs marchent bien en remote sur le serveur virtuel Mandriva pour accepter les logs venant d'une autre machine il faut modifier le fichier /etc/sysconfig/syslog pour accepter le remote ( options r ) cela a déjà été fait Options to syslogd m 0 disables 'MARK' messages. r enables logging from remote machines x disables DNS lookups on messages recieved with r See syslogd(8) for more details SYSLOGD_OPTIONS=" r x m 0 a /var/spool/postfix/dev/log" vous avez donc sur le serveur virtuel à la fois les logs du serveur et du firewall rappel ( tail f /var/log/messages ) II Filtrage sur le serveur virtuel mandriva 2008 Normalement si le setup est bon un ping depuis le client doit fonctionner vérifier par tcpdump sur le serveur virtuel tout paquet venant de la machine virtuelle sort avec comme adresse l'adresse secondaire du firewall 192.168.216.1XX (1XX étant l'adresse de votre poste + 100 ) tout paquet venant de l'extérieur à destination de l'adresse 192.168.216.1XX est redirigé sur la machine 10.0.0.10 sur la machine virtuelle serveur, vous avez un script appelé «/root/iptables dynamique.sh» c'est ici que vous devrez mettre vos règles en commençant par commenter les 2 lignes suivantes
iptables A INPUT i eth0 j LOG log prefix 'FIRST ACCEPT' iptables A INPUT i eth0 j ACCEPT lisez le pour le comprendre!/bin/sh set vx IPC=/sbin/iptables RESET de toutes les regles $IPC F $IPC X $IPC Z Politique par defaut $IPC P INPUT DROP $IPC P OUTPUT ACCEPT $IPC P FORWARD ACCEPT On autorise tout sur l'interface de loopbak $IPC A INPUT i lo j ACCEPT $IPC A INPUT m state state ESTABLISHED j LOG log prefix ' ESTABLISHED ACCEPT: ' $IPC A INPUT m state state RELATED j LOG log prefix ' RELATED ACCEPT: ' $IPC A INPUT m state state ESTABLISHED,RELATED j ACCEPT vous commenterez les 2 regles suivantes pour les remplacer par les votres iptables A INPUT i eth0 j LOG log prefix 'FIRST ACCEPT:' iptables A INPUT i eth0 j ACCEPT On rejette tout le reste avec des logs $IPC A INPUT j LOG log prefix 'LAST RULE REJECT :' $IPC A INPUT j REJECT pour redémarrer les règles la commandes est : /root/iptables dynamique.sh 1 expliquer la règle suivante se trouvant dans iptables dynamique.sh iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT j'accepte en entrée sur cette machine tous les paquets appartenant des sessions déjà établies ou bien relatives à une session déjà établie quelque soit l'interface vous noterez que pour les logs j'ai séparé le ESTABLISHED et le RELATED afin de bien comprendre quel paquet passe par quelle règle 2 autoriser SSH vers le serveur virtuel uniquement depuis 10.0.0.1 ( machine réelle ) et vérifier votre règles
en vous aidant des logs et de tcpdump Modifiez a partir d'ici iptables -A INPUT -i $INTERFACE -j LOG iptables -A INPUT -i $INTERFACE -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j LOG --logprefix 'NEW SSH: ' iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j ACCEPT iptables -A INPUT -i $INTERFACE -j LOG --log-prefix 'LAST RULES REJECT: ' iptables -A INPUT -i $INTERFACE -j REJECT désormais : user@client > ssh 192.168.216.215 ssh: connect to host 192.168.216.215 port 22: Connection refused et dans les logs sur le serveur : Mar 17 11:19:46 10.0.0.10 serveur kernel: LAST RULE REJECT: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=192.168.216.215 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=33998 DF PROTO=TCP SPT=1023 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 alors que depuis la machine réelle : root@ /var/log> ssh root@10.0.0.10 root@10.0.0.10's password: cela marche 3 autorisez ICMP vers le serveur virtuel mandriva 2008 de partout sauf du réseau 10.0.0.0/24 Modifiez a partir d'ici iptables -A INPUT -i eth0 -j LOG iptables -A INPUT -i eth0 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j LOG logprefix 'NEW SSH: ' iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j ACCEPT je commence par interdir icmp au réseau 10.0.0.0/24 puis je l'autorise pour tout le reste iptables -A INPUT -p icmp -s 10.0.0.0/24 -m state --state NEW -j DROP iptables -A INPUT -p icmp -m state --state NEW -j ACCEPT à la place des deux lignes précédente je préfère n'écrire qu'une règle iptables -A INPUT -p icmp! -s 10.0.0.0/24 -m state --state NEW -j ACCEPT iptables -A INPUT -i eth0 -j LOG --log-prefix 'LAST RULES REJECT: ' iptables -A INPUT -i eth0 -j REJECT root@firewall /var/log> ping 10.0.0.10 PING 10.0.0.10 (10.0.0.10) 56(84) bytes of data. 10.0.0.10 ping statistics 35 packets transmitted, 0 received, 100% packet loss, time 33993ms user@client > ping 192.168.216.215 64 bytes from 192.168.216.254: icmp_seq=1 ttl=63 time=0.704 ms 64 bytes from 192.168.216.254: icmp_seq=2 ttl=63 time=0.370 ms 4 autoriser le ftp avec suivi de connexions depuis partout Modifiez a partir d'ici iptables -A INPUT -i eth0 -j LOG iptables -A INPUT -i eth0 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j ACCEPT je commence par interdir icmp au réseau 10.0.0.0/24 puis je l'autorise pour tout le reste
iptables -A INPUT -p icmp! -s 10.0.0.0/24 -j ACCEPT FTP iptables -A INPUT -p tcp -m state --state NEW --dport 21 -j LOG log-prefix 'NEW FTP SESSION: ' iptables -A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT iptables -A INPUT -i eth0 -j LOG --log-prefix 'LAST RULES REJECT: ' iptables -A INPUT -i eth0 -j REJECT faites des essais depuis le firewall en mode actif et passif qu'en concluez vous root@firewall ~> ftp 10.0.0.10 Connected to 10.0.0.10. 220 Welcome to this FTP service. 530 Please login with USER and PASS. Name (10.0.0.10:weill): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> dir 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Mar 17 10:26 titi -rw-r--r-- 1 0 0 0 Mar 17 10:26 toto 226 Directory send OK. ftp> passive Passive mode on. ftp> dir 227 Entering Passive Mode (10,0,0,10,23,216) ftp: connect: Connection refused information : d'après cette ligne 227 Entering Passive Mode (10,0,0,10,23,216) on peut déduire que le port utilisé sera 23x256 + 216 = 6104 dans les logs on a : Mar 17 13:15:46 serveur kernel: NEW FTP SESSION: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=12367 DF PROTO=TCP SPT=43618 DPT=21 WINDOW=5840 RES=0x00 SYN URGP=0 Mar 17 13:15:46 serveur kernel: ESTABLISHED ACCEPT: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=12369 DF PROTO=TCP SPT=43618 DPT=21 WINDOW=1460 RES=0x00 ACK URGP=0 [...] Mar 17 13:15:47 serveur kernel: ESTABLISHED ACCEPT: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=58 TOS=0x10 PREC=0x00 TTL=64 ID=12397 DF PROTO=TCP SPT=43618 DPT=21 WINDOW=1460 RES=0x00 ACK PSH URGP=0 Mar 17 13:15:47 serveur kernel: ESTABLISHED ACCEPT: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=12399 DF PROTO=TCP SPT=43618 DPT=21 WINDOW=1460 RES=0x00 ACK URGP=0 Mar 17 13:15:47 serveur kernel: LAST RULE REJECT : IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=26371 DF PROTO=TCP SPT=38457 DPT=6104 WINDOW=5840 RES=0x00 SYN URGP=0 en regardant la dernière ligne de log on voit que la connexion sur le port 6104 est refusée donc la connexion passive est refusée charger le modules de suivi de connexion du protocol ftp
sur le serveur virtuel par la commande suivante : modprobe ip_conntrack_ftp et refaites les tests depuis le firewall ftp> dir 227 Entering Passive Mode (10,0,0,10,245,135) 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Mar 17 10:26 titi -rw-r--r-- 1 0 0 0 Mar 17 10:26 toto 226 Directory send OK. donc le port utilisé en passif est (256x245)+135 = 62855 extrait des logs : Mar 17 13:18:11 10 serveur kernel: NEW FTP SESSION: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=17237 DF PROTO=TCP SPT=53740 DPT=21 WINDOW=5840 RES=0x00 SYN URGP=0 [...] Mar 17 13:18:12 serveur kernel: ESTABLISHED ACCEPT: IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=17269 DF PROTO=TCP SPT=53740 DPT=21 WINDOW=1460 RES=0x00 ACK URGP=0 Mar 17 13:18:12 serveur kernel: RELATED ACCEPT : IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=23156 DF PROTO=TCP SPT=44144 DPT=62855 WINDOW=5840 RES=0x00 SYN URGP=0 Mar 17 13:18:13 serveur kernel: ESTABLISHED ACCEPT : IN=eth0 OUT= MAC=00:0c:29:06:c9:df:00:50:56:c0:00:01:08:00 SRC=10.0.0.254 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=23156 DF PROTO=TCP SPT=44144 DPT=62855 WINDOW=5840 RES=0x00 ACK URGP=0 En fait seul le premier paquet est RELATED ensuite c'est de l'established puisqu'ajouté à la table de connection Maintenant refaites le test depuis un client externe [root@cluster root] ftp 192.168.216.215 Connected to 192.168.216.215 220 Welcome to this FTP service. 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (192.168.216.200:weill): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> passive Passive mode on. ftp> dir 227 Entering Passive Mode (10,0,0,10,151,150) ftp: connect: Connection timed out en fait cela ne marche pas correctement car la partie translation d'adresse sur le firewall doit avoir un module pour pouvoir changer les adresses qui sont transmises dans les données du paquets sur le firewall il faut charger le modules ip_nat_ftp ( modprobe ip_nat_ftp )
IMPORTANT DESACTIVEZ TOUTES LES REGLES DE FILTRAGE SUR LE SERVEUR VIRTUEL /etc/init.d/iptables stop root@serveur:~ > iptables -L -nv Chain INPUT (policy ACCEPT 182 packets, 15892 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 111 packets, 12509 bytes) pkts bytes target prot opt in out source destination OK il n'y a plus de règles de filtrage sur le serveur III FILTRAGE sur le firewall executer la commande /root/activate lire le fichier /root/firewall.rules puis l'exécuter sous ROOT Partie A Vérifier que la machines virtuelle est bien filtrée dans les 2 sens (via ssh, nmap ou ping par exemple) tout en regardant les logs (rappel de la commande : tail f /var/log/messages grep 10.0.0.254 SUR LE SERVEUR ) Quelle règle a permis ce filtrage total? Voici le fichier de règle : Firewall rules ADDRESSE SECONDAIRE a CHANGER SECONDAIRE=PRIMAIRE + 100 IP_SECONDARY_ADDRESS=192.168.216.215 Ne rien modifier pour l'instant après cla LOOPBACK_INTERFACE=lo Path to IPTABLES executable IPTABLES=/usr/sbin/iptables MODPROBE=/sbin/modprobe activer ip forwarding echo 1 > /proc/sys/net/ipv4/ip_forward this module is required by "iptstate" in inittab: ${MODPROBE} ip_conntrack configuration interface eth0:0 /sbin/ifconfig eth0:0 $IP_SECONDARY_ADDRESS netmask 255.255.255.0 Clear de toutes les regles NAT, reset des compteurs iptables t nat F iptables t nat X iptables t nat Z
translation statique de tous les paquets a destination de SECONDARY $IPTABLES t nat A POSTROUTING o eth0 j SNAT to $IP_SECONDARY_ADDRESS $IPTABLES t nat A PREROUTING i eth0 d $IP_SECONDARY_ADDRESS j DNAT to 10.0.0.10 Clear de toutes les regles filter, reset des compteurs cette partie n'est que pour la partie filtrage sur firewall iptables F iptables X iptables Z Definition de la politique de base : tout interdit sauf iptables P INPUT ACCEPT iptables P FORWARD ACCEPT iptables P OUTPUT ACCEPT LOOPBACK : autoriser le traffic sur la boucle locale. iptables A INPUT i $LOOPBACK_INTERFACE j ACCEPT iptables A OUTPUT o $LOOPBACK_INTERFACE j ACCEPT chaine Log puis REJECT iptables N LOGnREJECT iptables A LOGnREJECT j LOG log prefix 'REJECT_LOG:' iptables A LOGnREJECT j REJECT INSERER VOS REGLES ICI FIN DE ZONE D'INSERTION Cette regle sera toujours la derniere iptables t filter A FORWARD j LOGnREJECT Le firewall devil étant utilisé en coupure, les paquet rentre par une interface et sorte par l'autre le fitrage s'effectue donc UNIQUEMENT SUR LA CHAINE FORWARD. La seule règle concernant la chaine FORWARD est : iptables t filter A FORWARD j LOGnREJECT ce qui signifie que tout paquet arrivant sur la chaine FORWARD est envoyé sur la chaine LOGnREJECT si l'on regarde ce que fait la chaine LOGnREJECT iptables A LOGnREJECT j LOG log prefix 'REJECT_LOG:' iptables A LOGnREJECT j REJECT tout paquet arrivant sur cette chaine est journalisé puis rejeté dans les log j'ai Feb 17 15:34:24 tsunami kernel: REJECT_LOG:IN=vmnet1 OUT=eth0 SRC=10.0.0.10 DST=192.168.216.147 LEN=66 TOS=0x00 PREC=0x00 TTL=63 ID=35322 DF PROTO=TCP SPT=21 DPT=43984 WINDOW=5792 RES=0x00 ACK PSH FIN URGP=0 Feb 17 15:35:44 tsunami kernel: REJECT_LOG:IN=eth0 OUT=vmnet1 SRC=192.168.216.200 DST=10.0.0.10 LEN=28 TOS=0x00 PREC=0x00 TTL=63 ID=6743 DF PROTO=ICMP TYPE=8 CODE=0 ID=8729 SEQ=0 Autoriser une connexion ssh sur la machine virtuelle 10.0.0.10 depuis l'extérieur (client externe) ainsi que sa règle de log associée (en lui donnant un nom clair pour l'identifier)
Aidez vous des logs et de tcpdump pour comprendre les problèmes Que concluez vous? Je dois donc ouvrir les connexions SSH depuis toute machine de la zone externe vers le serveur et les journaliser Mon fichier de règle devient : INSERER VOS REGLES ICI iptables A FORWARD p tcp dport 22 d 10.0.0.10 m state state NEW j LOG log prefix ' EXTSSH ACC:' iptables A FORWARD p tcp dport 22 d 10.0.0.10 m state state NEW j ACCEPT FIN DE ZONE D'INSERTION Cette regle sera toujours la derniere iptables t filter A FORWARD j LOGnREJECT je fais un test depuis mon client externe ( srvlnx). Cela ne marche pas dans les logs j'ai : user@client ~> ssh 192.168.216.215 ssh: connect to host 192.168.216.215 port 22: Connection refused Feb 17 16:46:42 tsunami kernel: EXTSSH ACC: IN=eth0 OUT=eth1 SRC=192.168.216.200 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=31777 DF PROTO=TCP SPT=57067 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 Feb 17 16:46:42 tsunami kernel: REJECT_LOG: IN=eth1 OUT=eth0 SRC=10.0.0.10 DST=192.168.216.200 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=22 DPT=57067 WINDOW=5792 RES=0x00 ACK SYN URGP=0 Le syn sur eth0 est bien accepté par contre on refuse les paquets qui rentre par l'interface eth1 et qui sortent par eth0( le retour ack syn ). Il nous faut donc une règle pour autoriser les paquets dans l'état ESTABLISHED. Si je rajoute une règle de ce type ( avec sa règle de journalisation associée ): iptables -A FORWARD -m state --state ESTABLISHED -j LOG --log-prefix 'ESTAB ACC: ' iptables -A FORWARD -m state --state ESTABLISHED -j effectivement cela marche et dans les logs on a : Feb 17 16:48:42 tsunami kernel: EXTSSH ACC: IN=eth0 OUT=eth1 SRC=192.168.216.200 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=31777 DF PROTO=TCP SPT=57067 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 Feb 17 16:48:42 tsunami kernel: ESTAB ACC: IN=eth1 OUT=eth0 SRC=10.0.0.10 DST=192.168.216.200 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=22 DPT=57067 WINDOW=5792 RES=0x00 ACK SYN URGP=0 Feb 17 16:48:42 tsunami kernel: ESTAB ACC: IN=eth0 OUT=eth1 SRC=192.168.216.200 DST=10.0.0.10 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=31777 DF PROTO=TCP SPT=57067 DPT=22 WINDOW=5840 RES=0x00 ACK URGP=0
Partie B 1) Création de zone de filtrage Pour faciliter le travail de filtrage, on va s'aider de la possibilité offerte par iptables de créer des chaînes utilisateurs (iptables N chaînes). Comme je vous l'ai expliqué en cours il faut faire le parallèle entre les chaînes défini par l'utilisateur et la programmation en C par exemple: Je commence par définir mes fonctions et je pourrais en suite les utiliser depuis d'autres fonctions ou bien mon programme principal ( main ). dans ce cas mon main est la chaîne FORWARD On commence par créer : une chaîne INTERNET vers le réseau privé (LAN) qui est nommée : I2L internet vers le réseau interne: cela signifie des paquets qui entre par eth0 et sorte par eth1 donc je vais écrire la règle suivante pour la chaîne FORWARD: je crée ma chaîne I2L : iptables -N I2L iptables -A FORWARD -i eth0 -o eth1 -j I2L une chaîne LAN vers l'extérieur (INTERNET) qui est nommée : L2I réseau interne vers l'extérieur: cela signifie des paquets qui entre par eth1 et sorte par eth0 donc je vais écrire la règle suivante pour la chaîne FORWARD: je crée ma chaîne L2I : iptables -N L2I iptables -A FORWARD -i eth1 -o eth0 -j L2I une chaîne de log pour les accès autorisés qui est nommée : LOGnACCEPT On commence par créer la chaîne puis on ajoute des règles dedans iptables -N LOGnACCEPT iptables -A LOGnACCEPT -j LOG --log-prefix 'ACCEPT_LOG: ' iptables -A LOGnACCEPT -j ACCEPT Tout paquet étant envoyé à cette chaîne est journalisé et accepté. une chaîne de log pour les accès refusés qui est nommée: LOGnDROP iptables -N LOGnDROP iptables -A LOGnDROP -j LOG --log-prefix 'DROP_LOG: ' iptables -A LOGnDROP -j DROP On continue par créer : les différentes règles de logs associées aux 2 chaînes de logs (LOGnACCEPT et LOGnDROP) précédemment créées (donner toujours un préfixe d'identification simple et clair). Créer les règles de forward associées aux chaînes L2I et I2L Désormais mon fichier de règle deviens : chaine Log puis REJECT iptables N LOGnREJECT iptables A LOGnREJECT j LOG log prefix 'REJECT_LOG:' iptables A LOGnREJECT j REJECT INSERER VOS REGLES ICI fonction log et accept iptables -N LOGnACCEPT iptables -A LOGnACCEPT -j LOG --log-prefix 'ACCEPT_LOG: ' iptables -A LOGnACCEPT -j ACCEPT fonction log et drop iptables -N LOGnDROP iptables -A LOGnDROP -j LOG --log-prefix 'DROP_LOG: ' iptables -A LOGnDROP -j DROP
fonction extérieur vers réseau interne I2L iptables -N I2L fonction réseau interne vers extérieur iptables -N L2I Programme principal (main) sur la chaîne FORWARD paquet état ESTABLISHED je les journalise et les accepte tout de suite: iptables A FORWARD m state state ESTABLISHED j LOGnACCEPT iptables -A FORWARD -i eth0 -o eth1 -j I2L iptables -A FORWARD -i eth1 -o eth0 -j L2I FIN DE ZONE D'INSERTION Cette regle sera toujours la derniere iptables t filter A FORWARD j LOGnREJECT A l'heure actuelle avec les règles juste au dessus qu'arrive t'il à un paquet qui est envoyé dans les chaînes I2L et L2I? Ces chaînes sont créés mais ne contiennent pas encore de règles ( iptables A ) on leur appliquera donc la politique par défaut ( iptables P) de la chaîne parente ( FORWARD) Avec ce que l'on à déjà écrit, répondre aux questions suivantes est très simple Je n'ai plus qu'a gérer l'état NEW dans les chaînes I2L ou bien L2I en fonction de ce que l'on me demande 2) Autoriser tout trafic (sans logs) du réseau privé vers l'extérieur. réseau interne vers extérieur c'est la chaine L2I, autoriser sans log = ACCEPT, tout trafic = pas de critère j'ajoute donc à la chaine L2I la règles suivante : iptables A L2I j ACCEPT 3) Autoriser ssh, puis ping (avec les logs) depuis l'extérieur vers la machine virtuelle 10.0.0.10. maintenant autoriser ssh depuis l'extérieur vers le serveur interne ( chaîne I2L ) avec log = LOGnACCEPT iptables A I2L p tcp dport 22 d 10.0.0.10 m state state NEW j LOGnACCEPT pour ping : iptables -A I2L -p icmp -m state --state NEW -d 10.0.0.10 --icmp-type echo-request -j LOGnACCEPT 4) Autoriser ftp (avec les logs) depuis l'extérieur vers la machine virtuelle 10.0.0.10. FTP = tcp port 21, autoriser avec les log =LOGnACCEPT,depuis l'extérieur = chaine I2L Donc : iptables -A I2L -p tcp --dport 21 -d 10.0.0.10 -m state state NEW -j LOGnACCEPT Je fais maintenant les tests depuis le serveur interne tout fonctionne vers l'extérieur cela fonctionne depuis l'extérieur vers le serveur interne ssh, ping et ftp standard fonctionne par contre le ftp passif ne fonctionne pas. C'est normal car pour l'instant nous ne gérons pas l'état RELATED
Donc mon script dans sa version définitive deviens : je vous demande de bien vouloir l'assimiler voir de le tester ;-) Clear de toutes les regles filter, reset des compteurs cette partie n'est que pour la partie filtrage sur firewall iptables -F iptables -X iptables -Z Definition de la politique de base : tout est accepté iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT LOOPBACK : autoriser le traffic sur la boucle locale. iptables -A INPUT -i $LOOPBACK_INTERFACE -j ACCEPT iptables -A OUTPUT -o $LOOPBACK_INTERFACE -j ACCEPT chaine Log puis REJECT iptables -N LOGnREJECT iptables -A LOGnREJECT -j LOG --log-prefix 'REJECT_LOG:' iptables -A LOGnREJECT -j REJECT INSERER VOS REGLES ICI fonction log et accept iptables -N LOGnACCEPT iptables -A LOGnACCEPT -j LOG --log-prefix 'ACCEPT_LOG: ' iptables -A LOGnACCEPT -j ACCEPT fonction log et drop iptables -N LOGnDROP iptables -A LOGnDROP -j LOG --log-prefix 'DROP_LOG: ' iptables -A LOGnDROP -j DROP fonction réseau interne vers extérieur iptables -N L2I iptables -A L2I -j ACCEPT je clos ma chaine par un refus avec log du reste ( c'est une bonne habitude) iptables -A L2I -j LOGnDROP fonction de l'extérieur vers le réseau interne iptables -N I2L iptables -A I2L iptables -A I2L -p tcp --dport 22 -d 10.0.0.10 -m state --state NEW -j LOGnACCEPT iptables -A I2L -p icmp -m state --state NEW -d 10.0.0.10 --icmp-type echo-request -j LOGnACCEPT iptables -A I2L -p tcp --dport 21 -d 10.0.0.10 -m state state NEW -j LOGnACCEPT je clos ma chaine par un refus avec log du reste ( c'est une bonne habitude) iptables -A I2L -j LOGnDROP Programme Principal paquet état ESTABLISHED je les journalise et les accepte tout de suite: j'en profite pour gérer aussi les paquet dans l'état RELATED pour ftp sans oublier de charger le module la machine fait du NAT aussi modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables A FORWARD m state state ESTABLISHED,RELATED j LOGnACCEPT iptables -A FORWARD -i eth0 -o eth1 -j I2L iptables -A FORWARD -i eth1 -o eth0 -j L2I
FIN DE ZONE D'INSERTION Cette regle sera toujours la derniere iptables -t filter -A FORWARD -j LOGnREJECT