45. Application sur le routage et le filtrage de paquets IP

45.1. Introduction

L'objectif esr de configurer une machine sous Linux, munie de trois cartes réseau 10/100 Base T, pour en faire un firewall. Pour visualiser les trames qui sont échangées sur le réseau, vous utiliserez un outil d'analyse de trames comme tcpdump, ethereal ou autre. Enfin pour filtrer le trafic et faire de la translation de port (PAT) la fonctionnalité iptables du noyau Linux sera utilisée. Un outil comme iptraf est intéressant pour visualiser la translation de port sur le routeur.

Le rôle d'un routeur (ou passerelle/gateway en terminologie IP) est de "router" les paquets entrants par une interface, vers une de ses interfaces de sortie, en fonction de l'adresse IP du destinataire (en fait du réseau auquel il appartient).

Le routeur dispose d'une table de routage interne, visible avec la commande route.

Exemple de table de routage :


adminbdd opt # route
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.5.0     *               255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
default         hp5406-05.lild0 0.0.0.0         UG    0      0        0 eth0

Le noyau Linux sait router les paquets entre différentes interfaces et vers des réseaux. Il faut que la fonction "ip forwarding" soit activée. Cela est réalisable dynamiquement :


adminbdd opt # echo 0/1 > /proc/sys/net/ipv4/ip_forward

0 pour désactiver (la valeur par défaut), 1 pour activer.

On peut également modifier directement le fichier de configuration en ajoutant la directive FORWARD_IPV4=yes dans /etc/sysconfig/network pour les Red hat-like et IP_FORWARD=yes dans /etc/network/option pour les Debian-like.

45.2. Fonctions et filtrage

Le filtrage des paquets au niveau IP, transport ou adresse est utilisé pour des raisons de sécurité. Par exemple autoriser ou interdire l'accès à un service, à un réseau ou à une machine (voir fiche de cours).

Les règles de filtrage sont analysées de manière séquentielle, dès qu'une règle correspond au paquet analysé, elle est appliquée.

Chaque paquet est analysé au travers des chaînes. Si un filtre correspond, la règle associée est appliquée au paquet (ACCEPT, DROP, MASQ ...). Sinon le filtre suivant est testé. À la fin de chaque chaîne un traitement "par défaut" est appliqué en dernier ressort (ACCEPT/DROP).

45.3. Exercice applicatif - partie théorique

Le but de cet exercice est d'écrire les règles de filtrage pour le réseau présenté ci-dessous. Pour cela, nous allons utiliser mon outil favori Netkit mais dans la deuxième partie principalement. Ici, il ne s'agit que de la partie théorique.

Figure 22. Le réseau d'étude

Petit rappel de la notation utilisée pour les question avant de commencer. De plus, il est bon avant de commencer de réinitialiser les règles d'iptables avec un les options -F et -X.


Notation :
A = 195.0.0, B = 172.16,
A.0 = toutes les machines du réseau 1, B.0 = toutes les machines du
réseau B
A.1, B.1, indiquent respectivement 195.0.0.1 et 172.16.0.1

Écrire les règles de filtrage iptables qui répondent aux différents problèmes :

  1. Interdire tous les paquets de A.0 vers B.0

    
vanvincq@CP2L ~ $ iptables -A FORWARD -s 195.0.0.0/24 -d 172.16.0.0/24 -j DROP
    
  2. Interdire tous les paquets de A.0 vers B.1

    
vanvincq@CP2L ~ $ iptables -A FORWARD -s 195.0.0.0/24 -d 172.16.0.1 -j DROP
    
  3. Interdire tous les paquets NetBIOS À destination de A.254

  4. Masquer toutes les adresses de A.0 pour tous les protocoles

  5. Masquer toutes les adresses de A.0 pour tous les protocoles uniquement pour les services SMTP et POP3

  6. N’autoriser que les paquets de A.1 vers B.1, interdire tout le reste

  7. Interdire les paquets de A.1 vers B.1, autoriser tout le reste

  8. N’autoriser que les paquets telnet de A.1 vers B.1, interdire tout le reste

  9. N’autoriser que les paquets TCP de A.0 vers B.0, interdire tout le reste.

45.4. Exercice applicatif - partie pratique

Schéma d’un réseau simple. Le routeur a trois interfaces réseau. Les segments de classe A et le segment de classe B peuvent être réalisés à l’aide de simple machines et de câbles croisés.

Figure 23. Schématisation d'un réseau simple

Pour ce Tp, nous allons réutiliser le schéma de l'exercice précédent. On utilisera pour cela trois machines C, R et S. R fait référence au routeur, C fait référence au client installé sur le réseau de classe B et S fait référence au serveur installé sur le réseau de classe A.

Figure 24. Réseau utilisé pour l'exercice

45.4.1. Première partie : installation et configuration du routage

Voici l'organisation de mon laboratoire Netkit pour la mise en oeuvre de l'exercice :


adminbdd lab_iptables # cat lab.conf 
LAB_DESCRIPTION="Exercice applicatif iptables"
LAB_VERSION=1.0
LAB_AUTHOR="Vanvincq Clément"
LAB_EMAIL=vanvincq.clement@gmail.com
LAB_WEB=http://www.eof.eu.org/

serveur[0]="classeA"
client[0]="classeB"

routeur[0]="classeB"
routeur[1]="classeA"
routeur[2]="classeC"

adminbdd lab_iptables # cat client.startup 
ifconfig eth0 132.10.0.10 netmask 255.255.255.0 broadcast 132.10.0.255 up
route add default gw 132.10.0.1

adminbdd lab_iptables # cat serveur.startup 
ifconfig eth0 32.5.5.10 netmask 255.255.255.0 broadcast 32.5.5.255 up
route add default gw 32.5.5.1

adminbdd lab_iptables # cat routeur.startup 
ifconfig eth0 132.10.0.1 netmask 255.255.255.0 broadcast 132.10.0.255 up
ifconfig eth1 32.5.5.1 netmask 255.255.255.0 broadcast 32.5.5.255 up
ifconfig eth2 200.10.0.1 netmask 255.255.255.0 broadcast 200.10.0.255 up

Tout est fin prêt, il ne reste plus qu'à démarrer avec la commande lstart.

Maintenant, nous allons vérifer que les configurations des différentes interfaces soient correctes.


routeur:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 56:c8:11:04:db:65  
          inet addr:132.10.0.1  Bcast:132.10.0.255  Mask:255.255.255.0
          inet6 addr: fe80::54c8:11ff:fe04:db65/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:244 (244.0 B)  TX bytes:468 (468.0 B)
          Interrupt:5 

eth1      Link encap:Ethernet  HWaddr 0a:b3:df:6d:ee:4a  
          inet addr:32.5.5.1  Bcast:32.5.5.255  Mask:255.255.255.0
          inet6 addr: fe80::8b3:dfff:fe6d:ee4a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:384 (384.0 B)  TX bytes:468 (468.0 B)
          Interrupt:5 

eth2      Link encap:Ethernet  HWaddr 2e:31:6b:dd:4a:5b  
          inet addr:200.10.0.1  Bcast:200.10.0.255  Mask:255.255.255.0
          inet6 addr: fe80::2c31:6bff:fedd:4a5b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)
          Interrupt:5 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:100 (100.0 B)  TX bytes:100 (100.0 B)
		  
routeur:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
132.10.0.0      *               255.255.255.0   U     0      0        0 eth0
200.10.0.0      *               255.255.255.0   U     0      0        0 eth2
32.5.5.0        *               255.255.255.0   U     0      0        0 eth1

client:~# ifconfig
eth0      Link encap:Ethernet  HWaddr ee:ba:7b:99:bc:a5  
          inet addr:132.10.0.10  Bcast:132.10.0.255  Mask:255.255.255.0
          inet6 addr: fe80::ecba:7bff:fe99:bca5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:384 (384.0 B)  TX bytes:468 (468.0 B)
          Interrupt:5 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:100 (100.0 B)  TX bytes:100 (100.0 B)

serveur:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 0a:a7:1c:26:58:fa  
          inet addr:32.5.5.10  Bcast:32.5.5.255  Mask:255.255.255.0
          inet6 addr: fe80::8a7:1cff:fe26:58fa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:168 (168.0 B)  TX bytes:468 (468.0 B)
          Interrupt:5 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:100 (100.0 B)  TX bytes:100 (100.0 B)

Rien d'anormal, tout est bien à sa place. Maintenant, envoyons quelques requêtes ICMP pour tester la connexion avec les interfaces du routeur.


client:~# ping -c 3 132.10.0.1; ping -c 3 32.5.5.1; ping -c 3 200.10.0.1
PING 132.10.0.1 (132.10.0.1) 56(84) bytes of data.
64 bytes from 132.10.0.1: icmp_seq=1 ttl=64 time=0.208 ms
64 bytes from 132.10.0.1: icmp_seq=2 ttl=64 time=0.183 ms
64 bytes from 132.10.0.1: icmp_seq=3 ttl=64 time=0.181 ms
--- 132.10.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.181/0.190/0.208/0.020 ms

PING 32.5.5.1 (32.5.5.1) 56(84) bytes of data.
64 bytes from 32.5.5.1: icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from 32.5.5.1: icmp_seq=2 ttl=64 time=0.227 ms
64 bytes from 32.5.5.1: icmp_seq=3 ttl=64 time=0.226 ms
--- 32.5.5.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.136/0.196/0.227/0.044 ms

PING 200.10.0.1 (200.10.0.1) 56(84) bytes of data.
64 bytes from 200.10.0.1: icmp_seq=1 ttl=64 time=0.138 ms
64 bytes from 200.10.0.1: icmp_seq=2 ttl=64 time=0.189 ms
64 bytes from 200.10.0.1: icmp_seq=3 ttl=64 time=0.225 ms
--- 200.10.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2008ms
rtt min/avg/max/mdev = 0.138/0.184/0.225/0.035 ms

serveur:~# ping -c 3 32.5.5.1; ping -c 3 132.10.0.1; ping -c 3 200.10.0.1
PING 32.5.5.1 (32.5.5.1) 56(84) bytes of data.
64 bytes from 32.5.5.1: icmp_seq=1 ttl=64 time=9.96 ms
64 bytes from 32.5.5.1: icmp_seq=2 ttl=64 time=0.184 ms
64 bytes from 32.5.5.1: icmp_seq=3 ttl=64 time=0.206 ms
--- 32.5.5.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 0.184/3.450/9.960/4.603 ms

PING 132.10.0.1 (132.10.0.1) 56(84) bytes of data.
64 bytes from 132.10.0.1: icmp_seq=1 ttl=64 time=0.249 ms
64 bytes from 132.10.0.1: icmp_seq=2 ttl=64 time=0.222 ms
64 bytes from 132.10.0.1: icmp_seq=3 ttl=64 time=0.241 ms
--- 132.10.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.222/0.237/0.249/0.016 ms

PING 200.10.0.1 (200.10.0.1) 56(84) bytes of data.
64 bytes from 200.10.0.1: icmp_seq=1 ttl=64 time=0.133 ms
64 bytes from 200.10.0.1: icmp_seq=2 ttl=64 time=0.187 ms
64 bytes from 200.10.0.1: icmp_seq=3 ttl=64 time=0.229 ms
--- 200.10.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2024ms
rtt min/avg/max/mdev = 0.133/0.183/0.229/0.039 ms

On peut constater que toutes les interfaces sont bien accessibles, que ce soit à partir du client ou du serveur. Peut-être vous demandez-vous pourquoi l'interface eth2 est accessible ? La raison est simple. Dans Netkit, les hôtes ont dans leurs configurations de base un ip forwarding opérationnel. Ce qui est bien dans notre cas, surtout pour l'hôte jouant le rôle de routeur. Bien entendu, rien ne nous empêche de le désactiver a posteriori.

Vérification du fichier /proc/sys/net/ipv4/ip_forward :


routeur:~# cat /proc/sys/net/ipv4/ip_forward 
1
serveur:~# cat /proc/sys/net/ipv4/ip_forward 
1
client:~# cat /proc/sys/net/ipv4/ip_forward 
1

Il ne nous reste plus, dans cette première partie, qu'à installer le programme iptraf sur le routeur à partir de cette archive pré-compilée.


routeur:/hosthome# dpkg -i iptraf_3.0.0-8_i386.deb 
Selecting previously deselected package iptraf.
(Reading database ... 31970 files and directories currently installed.)
Unpacking iptraf (from iptraf_3.0.0-8_i386.deb) ...
Setting up iptraf (3.0.0-8) ...
Processing triggers for man-db ...
routeur:/hosthome# iptraf -h

Syntax:
    iptraf [ -f ] [ -u ] [ { -i iface | -g | -d iface | -s iface | -z iface |
           -l iface } [ -t timeout ] [ -B ] [ -L logfile ] [-I interval] ] 

Issue the iptraf command with no parameters for menu-driven operation.
These options can also be supplied to the command:

-i iface    - start the IP traffic monitor (use "-i all" for all interfaces)
-g          - start the general interface statistics
-d iface    - start the detailed statistics facility on an interface
-s iface    - start the TCP and UDP monitor on an interface
-z iface    - shows the packet size counts on an interface
-l iface    - start the LAN station monitor ("-l all" for all LAN interfaces)
-B          - run in background (use only with one of the above parameters)
-t timeout  - when used with one of the above parameters, tells
              the facility to run only for the specified number of
              minutes (timeout)
-L logfile  - specifies an alternate log file for any direct invocation
              of a facility from the command line.  The log is placed in
              /var/log/iptraf if path is not specified.
-I interval - specifies the log interval for all facilities except the IP
              traffic monitor.  Value is in minutes.
-f          - clear all locks and counters.  Use with great caution.
              Normally used to recover from an abnormal termination.

-u          - allow use of unsupported interfaces as ethernet devices.
IPTraf 3.0.0 Copyright (c) Gerard Paul Java 1997-2004

45.4.2. Deuxième partie : règles de filtrage simples

À partir de notre réseau, nous allons ajouter quelques nouvelles règles :

  1. Interdir toutes les requêtes du Client vers le Serveur (extérieur).

    Comme on se place au niveau d'un routeur, on utilise la directive FORWARD de la table FILTER; le but étant de contrôler les trames passant d'une interface à l'autre.

    
routeur:~# iptables -A FORWARD -s 132.10.0.10 -d 32.5.5.10 -j DROP
    routeur:~# iptables -L --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination         
    1    DROP       all  --  132.10.0.10          32.5.5.10           
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    

    Envoi d'une requête ICMP en provenance du Client vers le Serveur.

    
client:~# ping -c 5 32.5.5.10
    PING 32.5.5.10 (32.5.5.10) 56(84) bytes of data.
    
    --- 32.5.5.10 ping statistics ---
    5 packets transmitted, 0 received, 100% packet loss, time 4034ms
    

    n.b : Si l'on essaye de joindre le Client avec un ping à partir du Serveur, on remarquera que la requête échoue. Cela est simplement dû au fait que les paquets traversent bien le routeur mais sont bloqués lors du retour.

  2. Autoriser toutes les requêtes du Client vers le Serveur.

    On va supprimer l'ancienne règle afin de repartir du bon pied.

    
routeur:~# iptables -F
    routeur:~# iptables -A FORWARD -s 132.10.0.10 -d 32.5.5.10 -j ACCEPT
    routeur:~# iptables -L --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all  --  132.10.0.10          32.5.5.10           
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    
    
client:~# ping -c 5 32.5.5.10
    PING 32.5.5.10 (32.5.5.10) 56(84) bytes of data.
    64 bytes from 32.5.5.10: icmp_seq=1 ttl=63 time=19.5 ms
    64 bytes from 32.5.5.10: icmp_seq=2 ttl=63 time=0.355 ms
    64 bytes from 32.5.5.10: icmp_seq=3 ttl=63 time=0.280 ms
    64 bytes from 32.5.5.10: icmp_seq=4 ttl=63 time=0.361 ms
    64 bytes from 32.5.5.10: icmp_seq=5 ttl=63 time=0.330 ms
    
    --- 32.5.5.10 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4019ms
    rtt min/avg/max/mdev = 0.280/4.182/19.585/7.701 ms
    
  3. Interdir tout passage sur la chaîne FORWARD en laissant l’option ACCEPT sur les chaînes INPUT et OUTPUT.

    
routeur:~# iptables -F
    routeur:~# iptables -A FORWARD -j DROP
    routeur:~# iptables -A INPUT -j ACCEPT
    routeur:~# iptables -A OUTPUT -j ACCEPT
    routeur:~# iptables -L --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all  --  anywhere             anywhere            
    
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination         
    1    DROP       all  --  anywhere             anywhere            
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all  --  anywhere             anywhere            
    

    Dans ce cas, il est impossible au Client de communiquer en dehors de son réseau (car le forwarding est complétement désactivé donc Client se retrouve isolé). Mais étant donné que le INPOUT et OUPOUT sont acceptés, Client peut très bien envoyer une requête HTTP au routeur par le port 80 (je sais que c'est bizarre comme situation mais c'est pour l'exemple xD).

    
client:~# ping -c 3 32.5.5.10
    PING 32.5.5.10 (32.5.5.10) 56(84) bytes of data.
    
    --- 32.5.5.10 ping statistics ---
    3 packets transmitted, 0 received, 100% packet loss, time 2016ms
    routeur:~# /etc/init.d/apache2 start
    Starting web server: apache2.
    client:~# telnet 132.10.0.1 80
    Trying 132.10.0.1...
    Connected to 132.10.0.1.
    Escape character is '^]'.
    GET
    <html><body><h1>It works!</h1></body></html>
    Connection closed by foreign host.
    
  4. Activer le masquage d’adresse pour toutes les machines du réseau auquel appartient le Client (132.0.0.0/24) vers tous les autres réseaux.

    Encore une fois, on supprime les anciennes règles avant de commencer. À noter que sans préciser de table, c'est la table FILTER qui est prise par défaut. On aura dans notre cas besoin de la table NAT.

    
routeur:~# iptables -F
    routeur:~# iptables -t nat -A POSTROUTING -s 132.10.0.0/24 -j MASQUERADE
    routeur:~# iptables -t nat -L --line-numbers
    Chain PREROUTING (policy ACCEPT)
    num  target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    num  target     prot opt source               destination         
    1    MASQUERADE  all  --  132.10.0.0/24        anywhere            
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    

    Ok, testons le masquage d'adresse. Pour cela, Client envoit un ping à Serveur :

    
client:~# ping -c 2 32.5.5.10
    PING 32.5.5.10 (32.5.5.10) 56(84) bytes of data.
    64 bytes from 32.5.5.10: icmp_seq=1 ttl=63 time=0.501 ms
    64 bytes from 32.5.5.10: icmp_seq=2 ttl=63 time=0.380 ms
    
    --- 32.5.5.10 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1015ms
    rtt min/avg/max/mdev = 0.380/0.440/0.501/0.064 ms
    serveur:~# tcpdump 
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    14:31:32.061877 IP 32.5.5.1 > 32.5.5.10: ICMP echo request, id 27138, seq 1, length 64
    14:31:32.064673 arp who-has 32.5.5.1 tell 32.5.5.10
    14:31:32.064789 arp reply 32.5.5.1 is-at 0a:b3:df:6d:ee:4a (oui Unknown)
    14:31:32.064796 IP 32.5.5.10 > 32.5.5.1: ICMP echo reply, id 27138, seq 1, length 64
    14:31:33.065232 IP 32.5.5.1 > 32.5.5.10: ICMP echo request, id 27138, seq 2, length 64
    14:31:33.065266 IP 32.5.5.10 > 32.5.5.1: ICMP echo reply, id 27138, seq 2, length 64
    14:31:38.064212 arp who-has 32.5.5.10 tell 32.5.5.1
    14:31:38.064230 arp reply 32.5.5.10 is-at 0a:a7:1c:26:58:fa (oui Unknown)
    

    Et pour comparer, réessayons dans l'autre sens :

    
serveur:~# ping -c 1 132.10.0.10
    PING 132.10.0.10 (132.10.0.10) 56(84) bytes of data.
    64 bytes from 132.10.0.10: icmp_seq=1 ttl=63 time=0.380 ms
    
    --- 132.10.0.10 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.380/0.380/0.380/0.000 ms
    client:~# tcpdump
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    14:32:31.518900 IP 32.5.5.10 > 132.10.0.10: ICMP echo request, id 3330, seq 1, length 64
    14:32:31.522337 IP 132.10.0.10 > 32.5.5.10: ICMP echo reply, id 3330, seq 1, length 64
    14:32:36.515788 arp who-has 132.10.0.1 tell 132.10.0.10
    14:32:36.515950 arp reply 132.10.0.1 is-at 56:c8:11:04:db:65 (oui Unknown)
    

    Bien, tout fonctionne parfaitement.

  5. Activer le masquage d’adresse pour toutes les machines du réseau auquel appartient le Client vers un seul des autres réseaux. Par exemple si l'on est sur le domaine vert.org, activer le masquage vers bleu.org. Les paquets ne devront pas passer vers noir.org ou rouge.org.

    
routeur:~# iptables -t nat -F
    routeur:~# iptables -t nat -A POSTROUTING -s 132.10.0.0/24 -d 32.5.5.0/24 -j MASQUERADE
    routeur:~# iptables -t nat -L --line-numbers
    Chain PREROUTING (policy ACCEPT)
    num  target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    num  target     prot opt source               destination         
    1    MASQUERADE  all  --  132.10.0.0/24        32.5.5.0/24         
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    
  6. Restaurer l’état réalisé au point 4 (après masquage). Activez iptraf sur l’interface publique. Vérifier que seule, l’adresse ip de l’interface du réseau privé apparaît et que toutes les autres sont "masquées". Noter la traduction de port et identifiez les sessions.

    Restauration de l'était du point 4 :

    
routeur:~# iptables -t nat -F
    routeur:~# iptables -t nat -A POSTROUTING -s 132.10.0.0/24 -j MASQUERADE
    

    Comme pour la question 4, on peut constater le masquage d'IP.

    Figure 25. iptraf au niveau du routeur du routeur

45.4.3. Troisième partie : règles de filtrage par adresse, port et protocoles

  1. Relevez dans les fichiers /etc/protocol et /etc/services les ports et noms des protocoles utilisés par les services ftp et http. Refuser tout trafic du Client vers l’extérieur à destination de ces ports. Vérifier que telnet est accepté.

  2. N’autoriser au Client l’accès qu’à une seule machine (par exemple le client de rouge.org si vous êtes sur vert.org), refuser tout le reste.

  3. Refuser tout accès à la machine (192.168.x.1) de votre réseau (192.168.x.0) vers le réseau (192.168.y.0).

  4. Relever les ports et protocoles utilisés par les services de résolution de noms. Construiser les règles afin qu’elles répondent au problème suivant. On désire que : toutes les machines du réseau privé puissent avoir accès à tous les autres services de n’importe quel réseau, la machine C de votre réseau privé ne peut pas envoyer de requête UDP/DOMAIN vers la machine Serveur.

  5. Pour les deux traitements qui suivent, utiliserer deux écritures, dont l’opérateur "!" (not) qui permet d’obtenir des compléments. Autoriser toutes les requêtes qui sortent vers l’extérieur, sauf celles qui vont sur un port ftp. N’autoriser aucune requête hormis celles qui sont à destination du port 80.