tp secu filtrage dynamique 20102011 ( correction )...tp secu filtrage dynamique 20102011 (...

13
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 » : supprime une règle iptables -F : supprime TOUTES LES REGLES iptables -L : 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)

Upload: others

Post on 21-Mar-2020

27 views

Category:

Documents


0 download

TRANSCRIPT

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 firewallle 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.254login root (azerty)

­ une machine VMWARE sous  Mandriva 2008 jouera le rôle de serveur internele 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 » : supprime une règleiptables ­F : supprime TOUTES LES REGLESiptables ­L : 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_forward1noter 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.215redé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 NATA 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 detailsSYSLOGD_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 firewallrappel ( 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/shset ­vxIPC=/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 ACCEPTiptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j LOG --log-prefix '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 refusedet 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 [email protected]@10.0.0.10's password: cela marche3 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 ACCEPTiptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.1 --dport 22 -j LOG –log-prefix '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.10PING 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.21564 bytes from 192.168.216.254: icmp_seq=1 ttl=63 time=0.704 ms64 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 ACCEPTiptables -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 ACCEPTiptables -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.10Connected to 10.0.0.10.220 Welcome to this FTP service.530 Please login with USER and PASS.Name (10.0.0.10:weill): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> dir200 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 toto226 Directory send OK.ftp> passivePassive mode on.ftp> dir227 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=0Mar 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=0Mar 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=0Mar 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_ftpet refaites les tests  depuis le firewall

ftp> dir227 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 toto226 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.215Connected to 192.168.216.215220 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 typeName (192.168.216.200:weill): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> passivePassive mode on.ftp> dir227 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 -nvChain 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.rulespuis l'exécuter sous ROOT 

Partie AVé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èmesQue concluez­vous ?

Je dois donc ouvrir les connexions SSH depuis toute machine de la zone externe vers le serveur et les journaliserMon 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.215ssh: 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 B1) Création de zone de filtragePour 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 : I2Linternet vers le réseau interne: cela signifie des paquets qui entre par eth0et 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 I2Liptables -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 eth1et 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 L2Iiptables -A FORWARD -i eth1 -o eth0 -j L2I

– une chaîne de log pour les accès autorisés qui est nommée : LOGnACCEPTOn commence par créer la chaîne puis on ajoute des règles dedans iptables -N LOGnACCEPTiptables -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: LOGnDROPiptables -N LOGnDROPiptables -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 LOGnACCEPTiptables -A LOGnACCEPT -j LOG --log-prefix 'ACCEPT_LOG: 'iptables -A LOGnACCEPT -j ACCEPT # fonction log et dropiptables -N LOGnDROPiptables -A LOGnDROP -j LOG --log-prefix 'DROP_LOG: 'iptables -A LOGnDROP -j DROP

# fonction extérieur vers réseau interne I2Liptables -N I2L# fonction réseau interne vers extérieuriptables -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 I2Liptables -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 I2LDonc :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 ACCEPTiptables -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 LOGnACCEPTiptables -A LOGnACCEPT -j LOG --log-prefix 'ACCEPT_LOG: 'iptables -A LOGnACCEPT -j ACCEPT # fonction log et dropiptables -N LOGnDROPiptables -A LOGnDROP -j LOG --log-prefix 'DROP_LOG: 'iptables -A LOGnDROP -j DROP## fonction réseau interne vers extérieur# iptables -N L2Iiptables -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 I2Liptables -A I2L iptables -A I2L -p tcp --dport 22 -d 10.0.0.10 -m state --state NEW -j LOGnACCEPTiptables -A I2L -p icmp -m state --state NEW -d 10.0.0.10 --icmp-type echo-request -j LOGnACCEPTiptables -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 aussimodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables ­A FORWARD ­m state –state ESTABLISHED,RELATED ­j LOGnACCEPT# iptables -A FORWARD -i eth0 -o eth1 -j I2Liptables -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