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.
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)
Sur la machine filtrant les paquets :
Très utile si la machine est hors-service.
Une fois de plus, utile pour les diagnostics.
Pour rendre ping et DNS plus utile.
À l'intérieur de la Zone Démilitarisée :
Serveur mail
Serveur de nom
Serveur web
En interne :
Ce sont des services standards à autoriser : on autorise parfois les machines internes à tout faire, mais ici nous serons plus restrictifs.
Bien entendu, nous voulons qu'il leur soit possible d'envoyer du courrier vers l'extérieur.
C'est ainsi qu'ils lisent leur courrier.
Ils doivent pouvoir rechercher des noms externes pour le web, le ftp, traceroute ou ssh.
C'est ainsi qu'ils synchronisent le serveur web externe avec l'interne.
Bien entendu, nous voulons qu'ils puissent se connecteur au serveur web externe.
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é).
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
#
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
#
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.
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
#
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
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
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
Restrictions internes :
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
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
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
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
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
ipchains -A mauvais-bon -j REJECT
ipchains -N mauvais-if
ipchains -N zdm-if
ipchains -N bon-if
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
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
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
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
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1