Page suivante - Page précédente - Table des matières

7. Un exemple sérieux

Cet exemple est extrait du tutorial donné par Michael Neuling et moi-même en mars 1999 lors du LinuxWorld ; ce n'est pas le seul moyen de régler le problème donné, mais c'est probablement le plus simple. J'espère que vous le jugerez informatif.

7.1 L'arrangement

  • Un réseau interne camouflé (sous divers systèmes d'exploitation), que nous appellerons "BON" ;
  • des serveurs exposés dans un réseau séparé (nommé "ZDM" pour Zone Démilitarisée) ;
  • une connexion PPP à l'Internet (nommé "MAUVAIS").

 Réseau externe (MAUVAIS)
 |
 |
 ppp0|
 ---------------
 | 192.84.219.1|             Réseau des serveurs (ZDM)
 |             |eth0
 |             |----------------------------------------------
 |             |192.84.219.250 |             |              |
 |             |               |             |              |
 |192.168.1.250|               |             |              |
 ---------------          --------       -------        -------
 | eth1            | SMTP |       | DNS |        | WWW |
 |                 --------       -------        -------
 |              192.84.219.128  192.84.219.129  192.84.218.130
 |
 Réseau Interne (BON)

7.2 Buts

Sur la machine filtrant les paquets :

PING tout réseau

Très utile si la machine est hors-service.

TRACEROUTE tout réseau

Une fois de plus, utile pour les diagnostics.

Accès au DNS

Pour rendre ping et DNS plus utile.

À l'intérieur de la Zone Démilitarisée :

Serveur mail

  • SMTP vers l'extérieur
  • Accepte le SMTP de l'intérieur et de l'extérieur
  • Accepte le POP3 de l'intérieur

Serveur de nom

  • Envoi de requêtes DNS vers l'extérieur
  • Accepte les requêtes DNS de l'intérieur, l'extérieur, et du filtre de paquets

Serveur web

  • Accepte les requêtes HTTP de l'intérieur et de l'extérieur
  • Accès rsync de l'intérieur

En interne :

Autorise WWW, ftp, traceroute et ssh vers l'extérieur

Ce sont des services standards à autoriser : on autorise parfois les machines internes à tout faire, mais ici nous serons plus restrictifs.

Autorise le SMTP vers le serveur mail

Bien entendu, nous voulons qu'il leur soit possible d'envoyer du courrier vers l'extérieur.

Autorise le POP3 vers le serveur mail

C'est ainsi qu'ils lisent leur courrier.

Autorise les requêtes DNS vers le serveur de nom

Ils doivent pouvoir rechercher des noms externes pour le web, le ftp, traceroute ou ssh.

Autorise rsync vers le serveur web

C'est ainsi qu'ils synchronisent le serveur web externe avec l'interne.

Autorise les requêtes WWW vers le serveur web

Bien entendu, nous voulons qu'ils puissent se connecteur au serveur web externe.

Autorise le ping vers le filtre de paquets

Il est courtois de l'autoriser ; ils peuvent ainsi tester si le pare-feu est coupé (ainsi nous ne serons pas tenus responsables si un site extérieur est coupé).

7.3 Avant le filtrage des paquets

  • Protection anti-spoofing

    Puisque nous n'avons pas de routage asymétrique, nous pouvons simplement mettre en marche l'anti-spoofing pour toutes les interfaces.

    # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1> $f; done
    #
    

  • Mettre en place des règles de filtrage en interdiction (DENY) totale :

    Nous autorisons tout de même le traffic local, mais nous interdisons tout le reste.

    # ipchains -A input -i ! lo -j DENY
    # ipchains -A output -i ! lo -j DENY
    # ipchains -A forward -j DENY
    #
    

  • Configurer les interfaces

    Ceci est généralement réalisé par les scripts de lancement. Faîtes bien attention à ce que les règles ci-dessus soient insérées avant que les interfaces ne soient configurées, afin de prévenir le passage de paquets avant l'insertion des règles.

  • Insertion des modules de camouflage par protocole

    Nous devons insérer le module de camouflage du FTP, ainsi le ftp passif et actif fonctionnera `uniquement' du réseau interne.

    # insmod ip_masq_ftp
    #
    

7.4 Filtrage de paquets pour les paquets traversants

Avec le camouflage, il vaut mieux filtrer la chaîne de retransmission.

Cassez la chaîne de retransmission en plusieurs chaînes utilisateurs dépendant des interfaces sources/destination ; ceci ramène le problème à des problèmes plus gérables.

ipchains -N bon-zdm
ipchains -N mauvais-zdm
ipchains -N bon-mauvais
ipchains -N zdm-bon
ipchains -N zdm-mauvais
ipchains -N mauvais-bon

ACCEPTer les codes standards d'erreur ICMP est un fait classique, nous lui créons donc une chaîne.

ipchains -N icmp-acc

Configurer les sauts de la chaîne de transmission

Malheureusement, nous connaissons seulement (dans la chaîne de transmission) quelle est l'interface externe. Ainsi, pour se représenter de quelle interface vient le paquet, nous utilisons l'adresse source (l'anti-spoofing évite les problèmes liés aux adresses).

Notez que nous enregistrons tout ce qui ne vérifie aucune de ces règles (cependant, ceci ne devrait jamais arriver).

ipchains -A forward -s 192.168.1.0/24 -i eth0 -j bon-zdm
ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j bon-mauvais
ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j zdm-mauvais
ipchains -A forward -s 192.84.219.0/24 -i eth1 -j zdm-bon
ipchains -A forward -i eth0 -j mauvais-zdm
ipchains -A forward -i eth1 -j mauvais-bon
ipchains -A forward -j DENY -l

Définir la chaîne icmp-acc

Les paquets correspondant à l'une des erreurs ICMP sont acceptés, sinon le contrôle les rendra à la chaîne appellante.

ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT

Bon (interne) vers ZDM (serveurs)

Restrictions internes :

  • Autorise WWW, ftp, traceroute, ssh vers l'extérieur
  • Autorise le SMTP vers le serveur mail
  • Autorise le POP3 vers le serveur mail
  • Autorise les requêtes DNS vers le serveur de nom
  • Autorise le rsync vers le serveur web
  • Autorise le WWW vers le serveur web
  • Autorise le ping vers le filtre de paquets

On pourrait utiliser le camouflage du réseau interne vers la ZDM, mais ici nous ne le ferons pas. Puisque personne du réseau interne ne devrait tenter de choses démoniaques, nous enregistrons les paquets qui sont interdits.

ipchains -A bon-zdm -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A bon-zdm -p tcp -d 192.84.219.128 pop-3 -j ACCEPT
ipchains -A bon-zdm -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bon-zdm -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bon-zdm -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A bon-zdm -p tcp -d 192.84.218.130 rsync -j ACCEPT
ipchains -A bon-zdm -p icmp -j icmp-acc
ipchains -A bon-zdm -j DENY -l

Mauvais (extérieur) vers ZDM (serveurs)

  • Restrictions de la ZDM :
    • Serveur mail :
      • SMTP vers l'extérieur
      • Accepte le SMTP venant de l'intérieur et extérieur
      • Accepte le POP3 de l'intérieur
    • Serveur de noms :
      • Envoi de requêtes DNS vers l'extérieur
      • Accepte le DNS venant de l'intérieur, extérieur et du filtre de paquets
    • Serveur web :
      • Accepte les requêtes HTTP venant de l'intérieur et de l'extérieur
      • Accès rsync de l'intérieur
  • Les trucs à autoriser du réseau extérieur vers la ZDM
    • N'enregistre pas les violations, elles peuvent arriver.
    ipchains -A mauvais-zdm -p tcp -d 192.84.219.128 smtp -j ACCEPT
    ipchains -A mauvais-zdm -p udp -d 192.84.219.129 domain -j ACCEPT
    ipchains -A mauvais-zdm -p tcp -d 192.84.219.129 domain -j ACCEPT
    ipchains -A mauvais-zdm -p tcp -d 192.84.218.130 www -j ACCEPT
    ipchains -A mauvais-zdm -p icmp -j icmp-acc
    ipchains -A mauvais-zdm -j DENY
    

Bon (intérieur) vers Mauvais (extérieur).

  • Restrictions internes :
    • Autorise le WWW, ftp, traceroute, ssh vers l'extérieur
    • Autorise SMTP vers le serveur mail
    • Autorise POP-3 vers le serveur mail
    • Autorise DNS vers le serveur de nom
    • Autorise rsync vers le serveur web
    • Autorise WWW vers le serveur web
    • Autorise ping vers le filtre de paquets
  • Un grand nombre de gens autorisent tout venant de l'intérieur vers les réseaux extérieurs, puis ajoutent des restrictions. Nous sommes fascistes.
    • Enregistre les violations.
    • Le ftp passif est géré par le module de camouflage.
    ipchains -A bon-mauvais -p tcp --dport www -j MASQ
    ipchains -A bon-mauvais -p tcp --dport ssh -j MASQ
    ipchains -A bon-mauvais -p udp --dport 33434:33500 -j MASQ
    ipchains -A bon-mauvais -p tcp --dport ftp --j MASQ
    ipchains -A bon-mauvais -p icmp --icmp-type ping -j MASQ
    ipchains -A bon-mauvais -j REJECT -l
    

ZDM vers Bon (intérieur)

  • Restrictions internes :
    • Autorise WWW, ftp, traceroute, ssh vers l'extérieur
    • Autorise SMTP vers le serveur mail
    • Autorise POP3 vers le serveur mail
    • Autorise DNS vers le serveur de noms
    • Autorise rsync vers le serveur web
    • Autorise WWW vers le serveur web
    • Autorise ping vers le filtre de paquets
  • Si nous camouflions le réseau intérieur de la ZDM, nous refuserions simplement les paquets venant d'un autre moyen. Tel quel, il autorise uniquement les paquets qui peuvent provenir d'une connexion pré-établie.
    ipchains -A zdm-bon -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
    ipchains -A zdm-bon -p udp -s 192.84.219.129 domain -j ACCEPT
    ipchains -A zdm-bon -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
    ipchains -A zdm-bon -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
    ipchains -A zdm-bon -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
    ipchains -A zdm-bon -p icmp -j icmp-acc
    ipchains -A zdm-mauvais -j DENY -l
    

ZDM vers Mauvais (extérieur)

  • Restrictions de la ZDM :
    • Serveur mail
      • SMTP vers l'extérieur
      • Accepte SMTP venant de l'intérieur et de l'extérieur
      • Accepte POP3 venant de l'intérieur
    • Serveur de noms
      • Envoi de requêtes DNS vers l'extérieur
      • Accepte le DNS de l'intérieur, l'extérieur et du filtre de paquets
    • Serveur web
      • Accepte HTTP venant de l'intérieur et de l'extérieur
      • Accès rsync de l'intérieur
  • ipchains -A zdm-mauvais -p tcp -s 192.84.219.128 smtp -j ACCEPT
    ipchains -A zdm-mauvais -p udp -s 192.84.219.129 domain -j ACCEPT
    ipchains -A zdm-mauvais -p tcp -s 192.84.219.129 domain -j ACCEPT
    ipchains -A zdm-mauvais -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
    ipchains -A zdm-mauvais -p icmp -j icmp-acc
    ipchains -A zdm-mauvais -j DENY -l
    

Mauvais (extérieur) vers Bon (intérieur)

  • Nous n'autorisons rien (de non camouflé) à passer du réseau extérieur vers le réseau intérieur.
    ipchains -A mauvais-bon -j REJECT
    

Filtrage de paquets pour la machine Linux elle-même

  • Si nous désirons utiliser le filtrage de paquets sur les paquets arrivant sur la machine elle-même, nous devons filtrer la chaîne d'entrée. Nous créons une chaîne pour chaque interface de destination :
    ipchains -N mauvais-if
    ipchains -N zdm-if
    ipchains -N bon-if
    
  • Créons les sauts vers elles :
    ipchains -A input -d 192.84.219.1 -j mauvais-if
    ipchains -A input -d 192.84.219.250 -j zdm-if
    ipchains -A input -d 192.168.1.250 -j bon-if
    

Interface Mauvais (extérieur)

  • Machine de filtrage des paquets :
    • PING tous les réseaux
    • TRACEROUTE tous les réseaux
    • Accès DNS
  • L'interface extérieure reçoit aussi des réponses aux paquets camouflés, les erreurs ICMP leur correspondant et les réponses PING.
    ipchains -A mauvais-if -i ! ppp0 -j DENY -l
    ipchains -A mauvais-if -p TCP --dport 61000:65096 -j ACCEPT
    ipchains -A mauvais-if -p UDP --dport 61000:65096 -j ACCEPT
    ipchains -A mauvais-if -p ICMP --icmp-type pong -j ACCEPT
    ipchains -A mauvais-if -j icmp-acc
    ipchains -A mauvais-if -j DENY
    

Interface ZDM

  • Restrictions du filtre de paquets :
    • PING tous les réseaux
    • TRACEROUTE tous les réseaux
    • Accès DNS
  • L'interface ZDM reçoit les réponses DNS, ping et les erreurs ICMP
    ipchains -A zdm-if -i ! eth0 -j DENY
    ipchains -A zdm-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
    ipchains -A zdm-if -p UDP -s 192.84.219.129 53 -j ACCEPT
    ipchains -A zdm-if -p ICMP --icmp-type pong -j ACCEPT
    ipchains -A zdm-if -j icmp-acc
    ipchains -A zdm-if -j DENY -l
    

Interface Bon (intérieur)

  • Restrictions du filtre de paquets
    • PING tous les réseaux
    • TRACEROUTE tous les réseaux
    • Accès DNS
  • Restrictions intérieures :
    • Autorise WWW, ftp, traceroute, ssh vers l'extérieur
    • Autorise SMTP vers le serveur mail
    • Autorise POP3 vers le serveur mail
    • Autorise DNS vers le serveur de noms
    • Autorise rsync vers le serveur web
    • Autorise WWW vers le serveur web
    • Autorise ping vers le filtre de paquets
  • L'interface intérieure reçoit les pings, les réponses ping et les erreurs ICMP.
    ipchains -A bon-if -i ! eth1 -j DENY
    ipchains -A bon-if -p ICMP --icmp-type ping -j ACCEPT
    ipchains -A bon-if -p ICMP --icmp-type pong -j ACCEPT
    ipchains -A bon-if -j icmp-acc
    ipchains -A bon-if -j DENY -l
    

7.5 Finalement

  • Supprime les règles de bloquage :
    ipchains -D input 1
    ipchains -D forward 1
    ipchains -D output 1
    


Page suivante - Page précédente - Table des matières