Linux IPCHAINS-HOWTO
Paul Russell,
[email protected]
Version fran�aise par Arnaud Launay,
[email protected]
v1.0.7, 12 mars 1999
Ce document d�crit l'obtention, l'installation et la configuration du
logiciel am�lior� de cha�nes pare-feu IP pour Linux, et donne quelques
id�es sur l'utilisation que vous pouvez en faire.
______________________________________________________________________
Table des mati�res
1. Introduction
1.1 Qu'est ce que c'est ?
1.2 Pourquoi ?
1.3 Comment ?
1.4 O� ?
2. Bases du filtrage de paquets
2.1 Qu'est ce que c'est ?
2.2 Pourquoi ?
2.3 Comment ?
2.3.1 Un noyau avec le filtrage de paquets
2.3.2 ipchains
2.3.3 Rendre les r�gles permanentes
3. Je suis troubl� ! Routage, camouflage, redirection de ports, ipautofw...
3.1 Le guide du camouflage en 3 lignes par Rusty
3.2 Publicit� gratuite : le z�le de WatchGuard
3.3 Configurations classiques de type pare-feu
3.3.1 R�seaux priv�s : caches traditionnels
3.3.2 R�seaux priv�s : caches transparents
3.3.3 R�seaux priv�s : camouflage
3.3.4 R�seaux publics
3.3.5 Services internes limit�s
3.4 Pour plus d'informations sur le camouflage
4. Cha�nes de protection IP
4.1 Comment les paquets traversent les filtres
4.1.1 Utiliser ipchains
4.1.2 Op�rations sur une r�gle simple
4.1.3 Sp�cifications du filtrage
4.1.3.1 Sp�cifier les adresses IP source et destination
4.1.3.2 Sp�cifier l'inversion
4.1.3.3 Sp�cifier le protocole
4.1.3.3.1 Sp�cifier les ports UDP et TCP
4.1.3.3.2 Sp�cifier les types et codes ICMP
4.1.3.4 Sp�cifier une interface
4.1.3.5 Sp�cifier uniquement des paquets TCP SYN
4.1.3.6 Utiliser les fragments
4.1.4 Effets de bord du filtrage
4.1.4.1 Sp�cifier une destination
4.1.4.2 Enregistrement des paquets
4.1.4.3 Manipuler le type de service
4.1.4.4 Marquage d'un paquet
4.1.4.5 Op�rations sur une cha�ne enti�re
4.1.4.6 Cr�er une nouvelle cha�ne
4.1.4.7 Supprimer une cha�ne
4.1.4.8 Vider une cha�ne
4.1.4.9 Afficher une cha�ne
4.1.4.10 Remise � z�ro des compteurs
4.1.4.11 Choisir une police
4.1.5 Op�rations sur le camouflage
4.1.6 V�rifier un paquet
4.1.7 Voir ce qui arrive avec des r�gles multiples pr�cis�es en une seule fois
4.2 Exemples utiles
4.2.1 Utiliser ipchains-save
4.2.2 Utiliser ipchains-restore
5. Divers
5.1 Comment organiser vos r�gles pare-feu
5.2 Ce qu'il ne faut pas filtrer
5.2.1 Les paquets ICMP
5.2.2 Connexions TCP au DNS (serveur de nom)
5.2.3 Cauchemars du FTP
5.3 Filtrer le ping de la mort (Ping of Death)
5.4 Filtrer teardrop et bonk
5.5 Filtrer les bombes � fragments
5.6 Changer les r�gles pare-feu
5.7 Comment mettre en place la protection contre l'IP spoof ?
5.8 Projets avanc�s
5.8.1 SPF : Stateful Packet Filtering
5.8.2 Modification des donn�es ftp par Michael Hasenstein
5.9 Extensions futures
6. Probl�mes classiques
6.1 ipchains -L est gel� !
6.2 Le camouflage/redirection ne fonctionne pas !
6.3 -j REDIR ne marche pas !
6.4 Les interfaces joker ne fonctionnent pas !
6.5 TOS ne fonctionne pas !
6.6 ipautofw et ipportfw ne fonctionnent pas !
6.7 XosView ne marche pas !
6.8 Erreur de segmentation avec -j REDIRECT !
6.9 Je ne peux pas modifier les temps d'attente du camouflage !
6.10 Je veux firewaller IPX !
7. Un exemple s�rieux
7.1 L'arrangement
7.2 Buts
7.3 Avant le filtrage des paquets
7.4 Filtrage de paquets pour les paquets traversants
7.4.1 Configurer les sauts de la cha�ne de transmission
7.4.2 D�finir la cha�ne icmp-acc
7.4.3 Bon (interne) vers ZDM (serveurs)
7.4.4 Mauvais (ext�rieur) vers ZDM (serveurs)
7.4.5 Bon (int�rieur) vers Mauvais (ext�rieur).
7.4.6 ZDM vers Bon (int�rieur)
7.4.7 ZDM vers Mauvais (ext�rieur)
7.4.8 Mauvais (ext�rieur) vers Bon (int�rieur)
7.4.9 Filtrage de paquets pour la machine Linux elle-m�me
7.4.9.1 Interface Mauvais (ext�rieur)
7.4.9.2 Interface ZDM
7.4.9.3 Interface Bon (int�rieur)
7.5 Finalement
8. Annexe : diff�rences entre ipchains et ipfwadm
8.1 Guide de r�f�rence rapide
8.2 Exemples de commandes ipfwadm traduites
9. Annexe : utiliser le script ipfwadm-wrapper
10. Annexe : remerciements
______________________________________________________________________
11.. IInnttrroodduuccttiioonn
Ceci est le Linux IPCHAINS-HOWTO ; voyez la section ``O� ?'' pour le
site principal, qui d�tient la derni�re version. Vous devriez
�galement lire le Linux NET-3-HOWTO. Les howtos IP-Masquerading, PPP-
HOWTO, l'Ethernet-HOWTO et le Firewall HOWTO peuvent aussi �tre
int�ressants � lire (une fois de plus, la FAQ de alt.fan.bigfoot peut
l'�tre aussi).
Si le filtrage des paquets vous semble d�pass�, lisez la section
``Pourquoi ?'', la section ``Comment ?'', et lisez les titres de la
section ``Cha�nes de protection IP''.
Si vous vous adaptez en partant d'ipfwadm, lisez la section
``Introduction'', la section ``Comment ?'', et les annexes des
sections ``Diff�rences entre ipchains et ipfwadm'' et ``Utiliser le
script `ipfwadm-wrapper'''.
11..11.. QQuu''eesstt ccee qquuee cc''eesstt ??
Le Linux ipchains est une r��criture du code de firewalling de l'IPv4
de Linux (qui avait �t� principalement emprunt� � BSD) et une
r��criture d'ipfwadm, lui m�me r��criture d'ipfw de BSD, je crois. Il
est n�cessaire pour administrer le filtrage des paquets IP dans les
noyaux Linux � partir de la version 2.1.102.
11..22.. PPoouurrqquuooii ??
L'ancien code de firewalling de Linux ne pouvait g�rer les fragments,
utilisait des compteurs 32 bits (au moins sur Intel), ne permettait
pas la sp�cification de protocoles autres que TCP, UDP ou ICMP, ne
pouvait faire de grands changements atomiquement, ne permettait pas la
sp�cification de r�gles inverses, avait quelques bizarreries, et
pouvait �tre une catastrophe � g�rer (le rendant propice aux erreurs
des utilisateurs).
11..33.. CCoommmmeenntt ??
Actuellement le code se trouve dans le noyau principal � partir du
2.1.102. Pour la s�rie des noyaux 2.0, vous devrez r�cup�rer une
correction pour le noyau sur une page web. Si votre noyau 2.0 est plus
r�cent que la correction r�cup�r�e, la correction ancienne devrait
fonctionner ; cette partie des noyaux 2.0 est relativement stable (la
correction pour le noyau 2.0.34 fonctionne bien sur le noyau 2.0.35).
Cependant, le correctif 2.0 est incompatible avec les correctifs pour
l'ipportfw et l'ipautofw, je recommande donc de ne pas l'appliquer, �
moins que vous n'ayez r�ellement besoin de l'une des fonctionnalit�s
offertes par ipchains.
11..44.. OO�� ??
La page officielle est la Page des cha�nes de filtrage IP de Linux
<
http://www.rustcorp.com/linux/ipchains>.
Il y a une liste de diffusion pour les rapports d'erreurs, les
discussions, le d�veloppement et l'utilisation. Vous pouvez rejoindre
la liste de diffusion en envoyant un message contenant le mot
``subscribe'' � ipchains-request de rustcorp.com. Pour �crire � la
liste utilisez `ipchains' � la place de `ipchains-request'.
22.. BBaasseess dduu ffiillttrraaggee ddee ppaaqquueettss
22..11.. QQuu''eesstt ccee qquuee cc''eesstt ??
Tout le trafic circulant dans un r�seau est envoy� sous la forme de
ppaaqquueettss. Par exemple, pour charger ce paquetage (disons qu'il fait
50k) vous avez d� recevoir plus ou moins 36 paquets de 1460 octets
chacun (pour prendre des valeurs au hasard).
Le d�but de chaque paquet pr�cise o� celui-ci va, d'o� il vient, le
type du paquet, et divers autres d�tails administratifs. Le d�but de
chaque paquet est appel� l'eenntt��ttee. Le reste du paquet, contenant les
donn�es � transmettre, est couramment appel� le ccoorrppss.
Quelques protocoles, comme le TTCCPP, qui est utilis� pour le trafic web,
mail et les connexions � distance, utilisent le concept de `connexion'
-- avant que le moindre paquet de donn�es ne soit envoy�, divers
paquets de configuration (avec des ent�tes sp�ciales) sont �chang�s en
disant `je veux me connecter', `OK' et `Merci'. Ensuite les paquets
normaux sont �chang�s.
Un filtre de paquet est un logiciel qui regarde l'_e_n_t_�_t_e des paquets
lorsque ceux-ci passent, et d�cide du destin du paquet entier. Il peut
d�cider de le rreeffuusseerr (le supprimer comme s'il n'avait jamais �t�
re�u), de l'aacccceepptteerr (le laisser circuler) ou de le rreejjeetteerr (effet
identique au refus, mais il est pr�cis� � la source que le paquet n'a
pas �t� accept�).
Sous Linux, le filtrage des paquets est inclus dans le noyau, et il y
a diverses choses que nous pouvons faire avec les paquets, mais le
principe g�n�ral (regarder les ent�tes et d�cider du destin du paquet)
est toujours pr�sent.
22..22.. PPoouurrqquuooii ??
Contr�le. S�curit�. Vigilance.
CCoonnttrr��llee ::
Lorsque vous utilisez un ordinateur sous Linux pour connecter
votre r�seau interne � un autre r�seau (disons, l'Internet) vous
aurez l'opportunit� de permettre certains types de trafics, et
d'interdire les autres. Par exemple, l'ent�te d'un paquet
contient l'adresse de destination du paquet, et vous pouvez
ainsi �viter que des paquets aillent vers un certain endroit du
r�seau ext�rieur. Comme autre exemple, j'utilise Netscape pour
acc�der aux archives de Dilbert. Il y a des publicit�s provenant
de doubleclick.net sur la page, et Netscape perd du temps en les
chargeant gentiment. Dire au filtre des paquets de ne pas
autoriser la circulation de paquets provenant ou allant vers
doubleclick.net r�soud le probl�me (il y a cependant de
meilleurs moyens pour y parvenir).
SS��ccuurriitt�� ::
Lorsque votre machine Linux est le seul rempart entre le chaos
de l'Internet et votre r�seau propre et bien ordonn�, il est
utile de savoir que vous pouvez restreindre ce qui vient sonner
� votre porte. Par exemple, vous pouvez autoriser tout ce qui
sort de votre r�seau, mais vous pouvez vous inqui�ter du fort
connu 'Ping of Death' pouvant provenir d'intrus ext�rieurs.
Comme autre exemple, vous pouvez interdire aux personnes
ext�rieures de se connecter en telnet sur votre machine Linux,
m�me si tous vos comptes ont des mots de passe ; peut-�tre
d�sirerez-vous (comme la plupart des gens) �tre un simple
observateur sur l'Internet, et non un serveur (de bonne volont�
ou non) -- simplement en ne laissant personne se connecter, le
filtrage de paquets rejetant tous les paquets entrants utilis�s
pour cr�er des connexions.
VViiggiillaannccee ::
Parfois, une machine mal configur�e du r�seau local d�cidera
d'envoyer des paquets au monde ext�rieur. Il est sympathique de
pouvoir sp�cifier au filtre de paquets de vous informer si
quelque chose d'anormal se produit ; vous pourrez �ventuellement
y faire quelque chose, ou bien laisser libre cours � la simple
curiosit�.
22..33.. CCoommmmeenntt ??
22..33..11.. UUnn nnooyyaauu aavveecc llee ffiillttrraaggee ddee ppaaqquueettss
Vous aurez besoin d'un noyau disposant du nouveau code de cha�nes de
protection IP. Vous pouvez savoir si le noyau que vous utilisez
actuellement en dispose en cherchant le fichier
`/proc/net/ip_fwchains'. Si ce fichier existe, alors c'est tout bon.
Sinon, vous devez cr�er un noyau contenant le code de cha�nes de
protection IP. Tout d'abord, r�cup�rez les sources du noyau que vous
d�sirez. Si vous avez un noyau dont le num�ro est sup�rieur ou �gal �
2.1.102, vous n'aurez pas besoin de le corriger (il se trouve d�j�
inclus dans le noyau). Autrement, appliquez le correctif que vous
trouverez sur la page web list�e plus haut, et utilisez la
configuration d�taill�e ci-dessous. Si vous ne savez pas comment le
faire, ne paniquez pas -- lisez le Kernel-HOWTO.
Les options de configuration que vous devez utiliser pour les _n_o_y_a_u_x
_d_e _s_�_r_i_e _2_._0 sont :
______________________________________________________________________
CONFIG_EXPERIMENTAL=y
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_FIREWALL_CHAINS=y
______________________________________________________________________
Pour les s�ries de _n_o_y_a_u_x _2_._1 ou _2_._2 :
______________________________________________________________________
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y
______________________________________________________________________
L'outil ipchains parle au noyau et lui dit quels paquets filtrer. �
moins que vous ne soyez un programmeur, ou un curieux inv�t�r�, c'est
ainsi que vous contr�lerez le filtrage des paquets.
22..33..22.. iippcchhaaiinnss
L'outil ipchains ins�re et efface des r�gles dans la section de
filtrage de paquets du noyau. Ce qui signifie que quoi que vous
configuriez, tout sera perdu lors d'un red�marrage ; voyez la section
``Rendre les r�gles permanentes'' pour savoir comment s'assurer que
les r�gles seront restaur�es au prochain lancement de Linux.
ipchains remplace ipfwadm, qui �tait utilis� par l'ancien code pare-
feu. Il y a un ensemble de scripts utiles disponibles sur le site ftp
d'ipchains :
ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
<
ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz>
Cette archive contient un script shell appell� ipfwadm-wrapper qui
vous autorisera � utiliser le filtrage de paquets comme avant. Vous ne
devriez probablement pas utiliser ce script � moins que vous ne
souhaitiez un moyen rapide de mettre � jour un syst�me utilisant
ipfwadm (ce script est plus lent, ne v�rifie pas les arguments, etc.).
Dans ce cas, vous n'avez pas non plus besoin de ce howto.
Voyez l'annexe ``Diff�rences entre ipchains et ipfwadm'' et l'annexe
``Utiliser le script `ipfwadm-wrapper''' pour des d�tails
suppl�mentaires concernant ipfwadm.
22..33..33.. RReennddrree lleess rr��gglleess ppeerrmmaanneenntteess
Votre configuration actuelle de pare-feu est sauv�e dans le noyau, et
sera ainsi perdue lors d'un red�marrage. Je vous recommande d'utiliser
les scripts `ipchains-save' et `ipchains-restore' pour rendre vos
r�gles permanentes. Pour ce faire, configurez vos r�gles, puis
utilisez (en tant que super-utilisateur) :
# ipchains-save > /etc/ipchains.rules
#
Cr�ez un script comme le suivant :
#! /bin/sh
# Script to control packet filtering.
# If no rules, do nothing.
[ -f /etc/ipchains.rules ] || exit 0
case "$1" in
start)
echo -n "Turning on packet filtering:"
/sbin/ipchains-restore < /etc/ipchains.rules || exit 1
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "."
;;
stop)
echo -n "Turning off packet filtering:"
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipchains -X
/sbin/ipchains -F
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT
/sbin/ipchains -P forward ACCEPT
echo "."
;;
*)
echo "Usage: /etc/init.d/packetfilter {start|stop}"
exit 1
;;
esac
exit 0
Assurez vous que ceci est lanc� suffisamment t�t dans la proc�dure de
lancement. Dans mon cas (Debian 2.1), j'ai cr�� un lien symbolique
appell� `S39packetfilter' dans le r�pertoire `/etc/rcS.d' (il sera
ainsi lanc� avant S40network).
33.. JJee ssuuiiss ttrroouubbll�� !! RRoouuttaaggee,, ccaammoouuffllaaggee,, rreeddiirreeccttiioonn ddee ppoorrttss,,
iippaauuttooffww......
Ce HOWTO a pour sujet le filtrage de paquets. Ce filtrage permet la
prise de d�cision concernant le destin d'un paquet : s'il est autoris�
� passer ou non. Cependant, Linux �tant le joujou pour bidouilleurs
qu'il est, vous voudriez probablement en savoir un peu plus.
Un des probl�mes est que le m�me outil ("ipchains") est utilis� pour
contr�ler � la fois le camouflage et le cache transparent, alors que
ce sont des notions s�par�es du filtrage de paquets (l'impl�mentation
actuelle de Linux les brouille tous les trois de fa�on inhabituelle,
laissant l'impression qu'ils sont tr�s proches).
Le camouflage et le cachage sont recouverts par des HOWTOs s�par�s, et
les possibilit�s de redirection automatique et de redirection de ports
sont contr�l�es par des outils s�par�s, mais puisque de nombreuses
personnes continuent � me harceler � leur propos, je vais ajouter un
ensemble de sc�narios classiques en indiquant les moments o� chacun
doit �tre utilis�. Les m�rites de la s�curit� de chacun de ces
sc�narios ne seront n�anmoins pas discut�s ici.
33..11.. LLee gguuiiddee dduu ccaammoouuffllaaggee eenn 33 lliiggnneess ppaarr RRuussttyy
Ces lignes pr�sument que votre interface eexxtteerrnnee est appell�e "ppp0".
Utilisez ifconfig pour le v�rifier, et ajustez selon votre go�t.
# ipchains -P forward DENY
# ipchains -A forward -i ppp0 -j MASQ
# echo 1 > /proc/sys/net/ipv4/ip_forward
33..22.. PPuubblliicciitt�� ggrraattuuiittee :: llee zz��llee ddee WWaattcchhGGuuaarrdd
Vous pouvez acheter des pare-feu tout faits. Un excellent est le
FireBox de WatchGuard. C'est excellent parce que je l'appr�cie, parce
qu'il est s�curis�, bas� sur Linux, et parce qu'ils financent la
maintenance d'ipchains ainsi que du nouveau code pare-feu (pr�vu pour
le 2.3). En bref, WatchGuard me paye � manger lorsque je travaille
pour vous. Donc, je vous prierai de prendre leur travail en compte.
http://www.watchguard.com <
http://www.watchguard.com>
33..33.. CCoonnffiigguurraattiioonnss ccllaassssiiqquueess ddee ttyyppee ppaarree--ffeeuu
Vous �tes petiteboite.com. Vous avez un r�seau interne, et une
connexion intermittente (PPP) simple � l'Internet
(firewall.petiteboite.com a pour IP 1.2.3.4). Vous �tes en Ethernet
sur votre r�seau local, et votre machine personnelle s'appelle
"mamachine".
Cette section illustrera les diff�rents arrangements classiques. Lisez
attentivement, car ils sont tous subtilement diff�rents.
33..33..11.. RR��sseeaauuxx pprriivv��ss :: ccaacchheess ttrraaddiittiioonnnneellss
Dans ce sc�nario, les paquets venant d'un r�seau priv� ne traversent
jamais l'Internet, et vice versa. Les adresses IP du r�seau priv�
doivent �tre assign�es en utilisant les adresses priv�es r�serv�es par
la RFC 1597 (c�d 10.*.*.*, 172.16.*.* ou 192.168.*.*).
La seule m�thode pour que les choses soient connect�s � l'Internet est
en se connectant au pare-feu, qui est la seule machine sur les deux
r�seaux qui sont connect�s plus loin. Vous lancez un programme (sur le
pare-feu) appell� un proxy pour ce faire (il y a des proxy (caches)
pour le FTP, l'acc�s web, telnet, RealAudio, les News Usenet et autres
services). Voyez le Firewall HOWTO.
Tous les services auxquels vous voulez que l'Internet puisse avoir
acc�s doivent �tre sur le pare-feu (mais voyez ``Services internes
limit�s'' plus bas).
Exemple : autoriser l'acc�s web d'un r�seau priv� vers l'Internet.
1. On a assign� les adresses 192.168.1.* au r�seau priv�, avec
mamachine �tant 192.168.1.100, et l'interface Ethernet du pare-feu
�tant assign�e � 192.168.1.1.
2. Un cache web (comme "squid") est install� et configur� sur le pare-
feu, disons tournant sur le port 8080.
3. Netscape sur le r�seau priv� est configur� pour utiliser le pare-
feu port 8080 comme cache.
4. Le DNS n'a pas besoin d'�tre configur� sur le r�seau priv�.
5. Le DNS doit �tre configur� sur le pare-feu.
6. Le r�seau priv� n'a pas besoin de disposer de route par d�faut
(passerelle).
Netscape sur mamachine lit
http://slashdot.org.
1. Netscape se connecte sur le port 8080 du pare-feu, en utilisant le
port 1050 de mamachine. Il demande la page web de
"
http://slashdot.org".
2. Le cache recherche le nom "slashdot.org", et obtient
207.218.152.131. Il ouvre alors une connexion sur cette adresse IP
(en utilisant le port 1025 de l'interface externe du pare-feu), et
demande la page au serveur web (port 80).
3. En recevant la page web par sa connexion au serveur web, le pare-
feu copie les donn�es vers la connexion de Netscape.
4. Netscape affiche la page.
C'est-�-dire que du point de vue de slashdot.org, la connexion est
r�alis�e par 1.2.3.4 (interface PPP du pare-feu), port 1025, vers
207.218.152.131 (slashdot.org) port 80. Du point de vue de mamachine,
la connexion est faite de 192.168.1.100 (mamachine) port 1050, vers
192.168.1.1 (interface Ethernet du pare-feu), port 8080.
33..33..22.. RR��sseeaauuxx pprriivv��ss :: ccaacchheess ttrraannssppaarreennttss
Dans ce sc�nario, les paquets venant du r�seau priv� ne traversent
jamais l'Internet, et vice versa. Les adresses IP du r�seau priv�
doivent �tre assign�es en utilisant les adresses priv�es r�serv�es par
la RFC 1597 (c�d 10.*.*.*, 172.16.*.* ou 192.168.*.*).
La seule m�thode pour que les choses soient connect�es � l'Internet
est en se connectant au pare-feu, qui est la seule machine sur les
deux r�seaux, qui sont connect�s plus loin. Vous lancez un programme
(sur le pare-feu) appell� un cache transparent pour ce faire ; le
noyau envoie les paquets sortants au cache transparent au lieu de les
envoyer plus loin (c�d qu'il rend b�tard le routage).
Le cachage transparent signifie que les clients n'ont pas besoin de
savoir qu'il y a un proxy dans l'histoire.
Tous les services que l'Internet peut utiliser doivent �tre sur le
pare-feu (mais voyez ``Services internes limit�s'' plus bas).
Exemple : autoriser l'acc�s web du r�seau priv� vers l'Internet.
1. On a assign� les adresses 192.168.1.* au r�seau priv�, avec
mamachine �tant 192.168.1.100, et l'interface Ethernet du pare-feu
�tant assign�e � 192.168.1.1.
2. Un proxy web transparent (je pr�sume qu'il existe des correctifs
pour squid lui permettant d'op�rer de cette fa�on, sinon, essayez
"transproxy") est install� et configur� sur le pare-feu, disons
tournant sur le port 8080.
3. On dit au noyau de rediriger les connexions sur le port 80 du
proxy, en utilisant ipchains.
4. Netscape, sur le r�seau priv�, est configur� pour se connecter
directement.
5. Le DNS doit �tre configur� sur le r�seau priv� (c�d que vous devez
faire tourner un serveur DNS de la m�me mani�re que le proxy sur le
pare-feu).
6. La route par d�faut (passerelle) doit �tre configur� sur le r�seau
priv�, pour envoyer les paquets au pare-feu.
Netscape sur mamachine lit
http://slashdot.org.
1. Netscape recherche le nom "slashdot.org", et obtient
207.218.152.131. Il ouvre alors une connexion vers cette adresse
IP, en utilisant le port local 1050, et demande la page au serveur
web (port 80).
2. Comme les paquets venant de mamachine (port 1050) et allant sur
slashdot.org (port 80) passent par le pare-feu, ils sont redirig�s
sur le proxy transparent en attente sur le port 8080. Le cache
transparent ouvre alors une connexion (en utilisant le port local
1025) vers 207.218.152.131 port 80 (vers lequel les paquets de
d�part allaient).
3. Alors que le cache re�oit la page web par sa connexion avec le
serveur web, il copie les donn�es vers la connexion avec Netscape.
4. Netscape affiche la page.
C'est � dire que du point de vue de slashdot.org, la connexion est
r�alis�e par 1.2.3.4 (interface PPP du pare-feu) port 1025 vers
207.218.152.131 (slashdot.org) port 80. Du point de vue de mamachine,
la connexion est faite � partir de 192.168.1.100 (mamachine) port
1050, vers 207.218.152.131(slashdot.org) port 80, mais il parle en
fait au proxy transparent.
33..33..33.. RR��sseeaauuxx pprriivv��ss :: ccaammoouuffllaaggee
Dans ce sc�nario, les paquets venant du r�seau priv� ne traversent
jamais l'Internet sans traitement sp�cial, et vice versa. Les adresses
IP du r�seau priv� doivent �tre assign�es en utilisant les adresses
priv�es r�serv�es par la RFC 1597 (c�d 10.*.*.*, 172.16.*.* ou
192.168.*.*).
Au lieu d'utiliser un cache, nous utilisons une sp�cificit� sp�ciale
du noyau nomm�e "camouflage" (masquerading). Le camouflage r��crit les
paquets lorsqu'ils passent par le pare-feu, ce qui fait qu'ils
semblent toujours venir du pare-feu lui-m�me. Il r��crit ensuite les
r�ponses afin qu'elles semblent venir du destinataire originel.
Le camouflage dispose de modules s�par�s afin de g�rer les protocoles
"�tranges", comme FTP, RealAudio, Quake, etc. Pour les protocoles
vraiment difficiles � g�rer, la sp�cificit� de "redirection
automatique" (auto forwarding) peut en g�rer quelques-uns en
configurant automatiquement la redirection de ports pour un ensemble
donn� de ports : voyez "ipportfw" (noyaux 2.0) ou "ipmasqadm" (noyaux
2.1 et sup�rieurs).
Tous les services auxquels vous voulez que l'Internet puisse avoir
acc�s doivent �tre sur le pare-feu (mais voyez ``Services internes
limit�s'' plus bas).
Exemple : autoriser l'acc�s web du r�seau priv� sur l'Internet.
1. On a assign� les adresses 192.168.1.* au r�seau priv�, avec
mamachine �tant 192.168.1.100, et l'interface Ethernet du pare-feu
�tant assign�e � 192.168.1.1.
2. Le pare-feu est configur� pour camoufler tous les paquets venant du
r�seau priv� et allant sur le port 80 d'un h�te sur Internet.
3. Netscape est configur� pour se connecter directement.
4. Le DNS doit �tre configur� correctement sur le r�seau priv�.
5. Le pare-feu doit �tre la route par d�faut (passerelle) du r�seau
priv�.
Netscape sur mamachine lit
http://slashdot.org.
1. Netscape recherche le nom "slashdot.org", et obtient
207.218.152.131. Il ouvre alors une connexion vers cette adresse
IP, en utilisant le port local 1050, et demande la page au serveur
web (port 80).
2. Comme les paquets venant de mamachine (port 1050) et allant sur
slashdot.org (port 80) passent par le pare-feu, ils sont r��crits
pour venir de l'interface PPP du pare-feu, port 65000. Le pare-feu
a une adresse Internet valide (1.2.3.4), donc les paquets venant de
slashdot.org sont rout�s correctement.
3. Lorsque les paquets venant de slashdot.org (port 80) sur
firewall.petiteboite.com (port 65000) arrivent, ils sont r��crits
pour aller sur mamachine, port 1050. La v�ritable magie du
camouflage se trouve ici : il se souvient des paquets sortants
r��crits afin de pouvoir r��crire les paquets entrants qui en sont
la r�ponse.
4. Netscape affiche la page.
C'est � dire que du point de vue de slashdot.org, la connexion est
r�alis�e de 1.2.3.4 (interface PPP du pare-feu), port 65000 vers
207.218.152.131 (slashdot.org) port 80. Du point de vue de mamachine,
la connexion est faite entre 192.168.1.100 (mamachine) port 1050, et
207.218.152.131 (slashdot.org) port 80.
33..33..44.. RR��sseeaauuxx ppuubblliiccss
Dans ce sc�nario, votre r�seau personnel fait partie de l'Internet :
les paquets peuvent passer sans avoir � changer de r�seau. Les
adresses IP du r�seau interne doivent �tre assign�es en utilisant un
bloc d'adresses IP, de mani�re � ce que le reste du r�seau sache
comment vous envoyer des paquets. Ceci implique une connexion
permanente.
Dans ce r�le, le filtrage de paquets est utilis� pour restreindre les
paquets qui peuvent �tre redirig�s entre votre r�seau et le reste de
l'Internet, c�d pour restreindre le reste de l'Internet � acc�der
uniquement au serveur web qui se trouve en interne.
Exemple : autoriser l'acc�s web du r�seau priv� vers l'Internet.
1. Votre r�seau interne dispose du bloc d'adresses IP que vous avez
enregistr�, disons 1.2.3.*.
2. Le pare-feu est configur� pour autoriser tout le trafic.
3. Netscape est configur� pour se connecter directement.
4. Le DNS doit �tre configur� correctement sur votre r�seau.
5. Le pare-feu doit �tre la route par d�faut (passerelle) pour le
r�seau priv�.
Netscape sur mamachine lit
http://slashdot.org.
1. Netscape recherche le nom "slashdot.org", et obtient
207.218.152.131. Il ouvre alors une connexion vers cette adresse
IP, en utilisant le port local 1050, et demande la page au serveur
web, port 80.
2. Les paquets passent par votre pare-feu, comme ils passent par
d'autres routeurs entre vous et slashdot.org.
3. Netscape affiche la page.
C'est � dire qu'il n'y a qu'une seule connexion : � partir de
1.2.3.100 (mamachine) port 1050, vers 207.218.152.131 (slashdot.org)
port 80.
33..33..55.. SSeerrvviicceess iinntteerrnneess lliimmiitt��ss
Il y a quelques trucs que vous pouvez utiliser pour autoriser
l'Internet � acc�der � vos services internes, plut�t que de faire
tourner vos services internes sur le pare-feu. Ils fonctionneront soit
avec un proxy, soit avec une approche type camouflage pour les
connexions externes.
L'approche la plus simple est de faire tourner un "redirecteur", qui
est un cache de pauvre, attendant une connexion sur un port donn�, et
ouvrant une connexion sur un h�te et un port interne fix�, et copiant
les donn�es entre les deux connexions. Un exemple de ceci est le
programme "redir". Du point de vue de l'Internet, la connexion est
faite sur votre pare-feu. Du point de vue de votre serveur interne, la
connexion est faite par l'interface interne du pare-feu sur le
serveur.
Une autre approche (qui n�cessite un noyau 2.0 corrig� pour ipportfw,
ou un noyau 2.1 ou sup�rieur) est d'utiliser la redirection des ports
du noyau. Il effectue le m�me travail que "redir" d'une mani�re
diff�rente : le noyau r��crit les paquets lorsqu'ils passent, en
changeant leur adresse de destination et le port pour les faire
pointer sur un port et un h�te interne. Du point de vue de
l'Internet, la connexion est faite sur votre pare-feu. Du point de vue
de votre serveur interne, une connexion directe est r�alis�e entre
l'h�te Internet et votre serveur.
33..44.. PPoouurr pplluuss dd''iinnffoorrmmaattiioonnss ssuurr llee ccaammoouuffllaaggee
David Ranch a �crit un excellent howto tout neuf sur le camouflage,
qui en grande partie recouvre ce howto. Vous pouvez le trouver sur
http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html
<
http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html>
J'esp�re pouvoir bient�t le trouver h�berg� sous les auspices du LDP
(Linux Documentation Project), sur
http://www.metalab.unc.edu/LDP
<
http://www.metalab.unc.edu/LDP>.
La page officielle du camouflage se trouve sur
http://ipmasq.cjb.net
<
http://ipmasq.cjb.net>.
44.. CChhaa��nneess ddee pprrootteeccttiioonn IIPP
Cette section d�crit tout ce que vous avez r�ellement besoin de savoir
pour construire un filtre de paquets adapt� � vos besoins.
44..11.. CCoommmmeenntt lleess ppaaqquueettss ttrraavveerrsseenntt lleess ffiillttrreess
Le noyau commence avec trois listes de r�gles : ces listes sont
appell�es cchhaa��nneess ddee pprrootteeccttiioonn ou juste cchhaa��nneess. Ces trois cha�nes
sont appell�es iinnppuutt (entr�e), oouuttppuutt (sortie) et ffoorrwwaarrdd
(transmission). Lorsqu'un paquet arrive (disons, par une carte
Ethernet), le noyau utilise la cha�ne input pour d�cider de son
destin. S'il survit � ce passage, alors le noyau d�cide o� envoyer le
paquet par la suite (ceci est appel� rroouuttaaggee). S'il est destin� � une
autre machine, il consulte alors la cha�ne de transmission. Enfin,
juste avant que le paquet ne ressorte, le noyau consulte la cha�ne de
sortie.
Une cha�ne est une v�rification de rr��gglleess. Chaque r�gle dit `si
l'ent�te de ce paquet ressemble � ceci, alors voil� quoi faire de ce
paquet'. Si la r�gle ne v�rifie pas le paquet, alors la r�gle suivante
dans la cha�ne est consult�e. Enfin, s'il n'y a plus de r�gles �
consulter, alors le noyau regarde la cha�ne ppoolliiccee pour d�cider ce
qu'il doit faire. Dans un syst�me orient� s�curit�, cette police dit
g�n�ralement au noyau de rejeter ou de refuser le paquet.
Pour les fans de l'art ASCII, ceci montre le chemin complet d'un
paquet arrivant � une machine.
-----------------------------------------------------------------------------
| ACCEPTER/ interface lo |
v REDIRIGER _________ |
--> S --> V --> ______ --> D --> ~~~~~~~~ -->| Cha�ne |----> _______ -->
o a |cha�ne| e {D�cision} |transfert| |Cha�ne |ACCEPTER
m l |entr�e| m {Routage } |_________| --->|sortie |
m i |______| a ~~~~~~~~ | | ->|_______|
e d | s | | | | |
| i | q | NON/ | | |
| t v u v REJET | | v
| � NON/ e Processus | | NON/
| | REJET r Local | | REJET
| v | ---------------------- |
v NON \ ------------------------------/
NON
Voici une description point par point de chaque partie :
SSoommmmee ((cchheecckkssuumm)) ::
C'est un test v�rifiant si le paquet n'a pas �t� corrompu d'une
mani�re ou d'une autre. S'il l'a �t�, il est refus�.
VVaalliiddiitt�� ((ssaanniittyy)) ::
Il y a en fait un de ces tests sanitaires avant chaque cha�ne de
protection, mais les cha�nes d'entr�e sont les plus importantes.
Quelques paquets malform�s peuvent rendre confus le code de
v�rification des r�gles, et ceux-ci sont refus�s ici (un message
est envoy� au syslog si ceci arrive).
CChhaa��nnee dd''eennttrr��ee ((iinnppuutt cchhaaiinn)) ::
C'est la premi�re cha�ne de protection qui teste le paquet. Si
le verdict de la cha�ne n'est ni DENY ni REJECT, le paquet
continue son chemin.
DDeemmaassqquueerraaddee ::
Si le paquet est une r�ponse � un paquet pr�c�demment masqu�, il
est d�masqu�, et envoy� directement � la cha�ne de sortie. Si
vous n'utilisez pas le masquage IP, vous pouvez mentalement
supprimer ceci du diagramme.
DD��cciissiioonn rroouuttaaggee ((RRoouuttiinngg ddeecciissiioonn)) ::
Le champ de destination est examin� par le code de routage, pour
d�cider si le paquet doit aller vers un processus local (voir
processus local plus bas) ou transmis � une machine distante
(voyez les cha�nes de renvoi plus bas).
PPrroocceessssuuss llooccaall ((LLooccaall pprroocceessss)) ::
Un processus tournant sur la machine peut recevoir des paquets
apr�s l'�tape de d�cision de routage, et peut envoyer des
paquets (qui passent par l'�tape de d�cision de routage, puis
traversent la cha�ne de sortie).
IInntteerrffaaccee lloo ::
Si les paquets venant d'un processus local sont destin�s � un
autre processus local, alors ils passeront par la cha�ne de
sortie en utilisant l'interface lo, puis reviendront par la
cha�ne d'entr�e en utilisant la m�me interface. L'interface lo
est g�n�ralement nomm�e interface loopback.
llooccaall ::
Si le paquet n'a pas �t� cr�� par un processus local, alors la
cha�ne de transmission est v�rifi�e, sinon le paquet se dirige
vers la cha�ne de sortie.
ffoorrwwaarrdd cchhaaiinn ::
Cette cha�ne est travers�e par tout paquet qui tente de passer
par cette machine vers une autre.
oouuttppuutt cchhaaiinn ::
Cette cha�ne est travers�e par tous les paquets juste avant
qu'ils ne soient envoy�s � l'ext�rieur.
44..11..11.. UUttiilliisseerr iippcchhaaiinnss
Tout d'abord, v�rifiez que vous avez la version d'ipchains � laquelle
se r�f�re ce document :
$ ipchains --version
ipchains 1.3.9, 17-Mar-1999
Notez que je recommande l'utilisation du 1.3.4 (qui ne dispose pas des
options longues comme `--sport'), ou du 1.3.8 et suivants ; ils sont
en effet tr�s stables.
ipchains dispose d'une page de manuel plut�t bien d�taill�e (man
ipchains), et si vous avez besoin de plus de d�tails en particulier,
vous pouvez consulter l'interface de programmation (man 4 ipfw), ou le
fichier net/ipv4/ip_fw.c dans les sources des noyaux 2.1.x, qui est
(bien �videmment) la r�f�rence.
Il y a �galement une carte de r�f�rence rapide par Scott Bronson dans
le paquetage source, aux formats PostScript (TM) a4 et US letter.
Il y a plusieurs choses diff�rentes que vous pouvez faire avec
ipchains. Tout d'abord les op�rations servant � g�rer les cha�nes
enti�res. Vous commencez avec trois cha�nes int�gr�es input, output et
forward que vous ne pouvez effacer.
1. Cr�er une nouvelle cha�ne (-N) ;
2. Supprimer une cha�ne vide (-X) ;
3. Changer la police d'une cha�ne int�gr�e (-P) ;
4. Lister les r�gles d'une cha�ne (-L) ;
5. Supprimer les r�gles d'une cha�ne (-F) ;
6. Mettre � z�ro les compteurs de paquets et d'octets sur toutes les
r�gles d'une cha�ne (-Z).
Il y a plusieurs moyens pour manipuler les r�gles � l'int�rieur d'une
cha�ne :
1. Ajouter une nouvelle r�gle � une cha�ne (-A) ;
2. Ins�rer une nouvelle r�gle � une position quelconque de la cha�ne
(-I) ;
3. Remplacer une r�gle � une position quelconque de la cha�ne (-R) ;
4. Supprimer une r�gle � une position quelconque de la cha�ne (-D) ;
5. Supprimer la premi�re r�gle v�rifi�e dans la cha�ne (-D).
Il y a quelques op�rations pour le masquage, qui se trouvent dans
ipchains dans l'attente d'un bon endroit pour les mettre :
1. Lister les connexions masqu�es actuelles (-M -L) ;
2. Configurer les valeurs de timeout (-M -S) (mais voyez id="no-
timeout" name="Je ne peux pas modifier les temps d'attente du
camouflage !">).
La fonction finale (et peut-�tre la plus utile) vous permet de
v�rifier ce qui arriverait � un paquet donn� s'il avait � traverser
une cha�ne donn�e.
44..11..22.. OOpp��rraattiioonnss ssuurr uunnee rr��ggllee ssiimmppllee
Ceci est le B.A.-Ba d'ipchains ; manipuler des r�gles. Plus
g�n�ralement, vous utiliserez probablement les commandes d'ajout (-A)
et de suppression (-D). Les autres (-I pour l'insertion et -R pour le
remplacement) sont des simples extensions de ces concepts.
Chaque r�gle sp�ficie un ensemble de conditions que le paquet doit
suivre, et ce qu'il faut faire s'il les suit (une "destination"). Par
exemple, vous pouvez vouloir refuser tous les paquets ICMP venant de
l'adresse IP 127.0.0.1. Donc, dans ce cas nos conditions sont que le
protocole doit �tre ICMP et que l'adresse source doit �tre 127.0.0.1.
Notre destination est "DENY" (rejet).
127.0.0.1 est l'interface "loopback", que vous avez m�me si vous
n'avez de connexion r�seau r�elle. Vous pouvez utiliser le programme
"ping" pour g�n�rer de tels paquets (il envoie simplement un paquet
ICMP de type 8 (requ�te d'�cho) � qui tous les h�tes coop�ratifs
doivent obligeamment r�pondre avec un paquet ICMP de type 0 (r�ponse �
un �cho)). Ceci le rend utile pour les tests.
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
# ipchains -A input -s 127.0.0.1 -p icmp -j DENY
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
#
Vous pouvez voir ici que le premier ping r�ussit (le "-c 1" dit � ping
de n'envoyer qu'un seul paquet).
Puis nous ajoutons (-A) � la cha�ne d'entr�e ("input"), une r�gle
sp�cifiant que tous les paquets provenant de 127.0.0.1 ("-s
127.0.0.1") avec le protocole ICMP ("-p ICMP") doivent �tre refus�s
("-j DENY").
Ensuite nous testons notre r�gle, en utilisant le second ping. Il y
aura une pause avant que le programme ne se termine, attendant une
r�ponse qui ne viendra jamais.
Nous pouvons supprimer la r�gle avec l'un des deux moyens. Tout
d'abord, puisque nous savons que c'est la seule r�gle de la cha�ne
d'entr�e, nous pouvons utiliser une suppression num�rot�e, comme
dans :
# ipchains -D input 1
#
Pour supprimer la r�gle num�ro 1 de la cha�ne d'entr�e.
La deuxi�me possibilit� est de copier la commande -A, mais en
rempla�ant le -A par -D. C'est utile lorsque vous avez une cha�ne
complexe de r�gles et que vous ne voulez pas avoir � les compter afin
de savoir que c'est la r�gle 37 que vous voulez supprimer. Dans ce
cas, nous pouvons utiliser :
# ipchains -D input -s 127.0.0.1 -p icmp -j DENY
#
La syntaxe de -D doit avoir exactement les m�mes options que la com�
mande -A (ou -I ou -R). S'il y a des r�gles multiples identiques dans
la m�me cha�ne, seule la premi�re sera supprim�e.
44..11..33.. SSpp��cciiffiiccaattiioonnss dduu ffiillttrraaggee
Nous avons vu l'utilisation de "-p" pour sp�cifier le protocole, et de
"-s" pour sp�cifier l'adresse souce, mais il y a d'autres options que
nous pouvons utiliser pour sp�cifier les caract�ristiques des paquets.
Ce qui suit en est une description exhaustive.
44..11..33..11.. SSpp��cciiffiieerr lleess aaddrreesssseess IIPP ssoouurrccee eett ddeessttiinnaattiioonn
Les adresses IP source (-s) et destination (-d) peuvent �tre
sp�cifi�es de quatre fa�ons diff�rentes. La fa�on la plus classique
est d'utiliser le nom complet, comme "localhost" ou "www.linuxhq.com".
La deuxi�me m�thode est de sp�cifier l'adresse IP, comme "127.0.0.1".
Les deux autres m�thodes permettent la sp�cification d'un groupe
d'adresses IP, comme "199.95.207.0/24" ou
"199.95.207.0/255.255.255.0". Toutes deux sp�cifient toutes les
adresses IP de 192.95.207.0 � 192.95.207.255, incluse ; les chiffres
suivant le "/" indiquent quelles parties de l'adresse IP sont
significatives. "/32" ou "/255.255.255.255" sont les d�fauts
(v�rifient toutes les adresses IP). Pour ne sp�cifier aucune adresse
IP, "/0" peut �tre utilis�, par exemple :
# ipchains -A input -s 0/0 -j DENY
#
Ceci est rarement utilis�, car l'effet produit par cette ligne de
commande est le m�me que celui obtenu en ne sp�cifiant pas l'option
"-s".
44..11..33..22.. SSpp��cciiffiieerr ll''iinnvveerrssiioonn
De nombreuses options, incluant les options "-s" et "-d" peuvent avoir
leurs propres arguments pr�c�d�s par "!" (prononc� "non") pour ne
v�rifier que les adresses n'�tant PAS �quivalentes � celles donn�es.
Par exemple, "-s ! localhost" v�rifiera tout paquet ne provenant PAS
de localhost.
44..11..33..33.. SSpp��cciiffiieerr llee pprroottooccoollee
Le protocole peut �tre sp�cifi� en utilisant l'option "-p". Le
protocole peut �tre soit un nombre (si vous connaissez les valeurs
num�riques des protocoles pour IP), soit le nom des cas sp�ciaux
parmis "TCP", "UDP" ou "ICMP". La casse n'est pas prise en compte,
donc "tcp" fonctionne aussi bien que "TCP".
Le nom du protocole peut �tre pr�fix� par un "!", pour l'inverser,
comme dans "-p ! TCP".
44..11..33..33..11.. SSpp��cciiffiieerr lleess ppoorrttss UUDDPP eett TTCCPP
Pour les cas sp�ciaux o� un protocole TCP ou UDP est sp�cifi�, il peut
y avoir un argument suppl�mentaire indiquant le port TCP ou UDP, ou un
intervalle (inclusif) de ports (mais voyez ``Utiliser les fragments''
plus bas). Un intervalle est repr�sent� en utilisant le caract�re ":",
par exemple "6000:6010", qui couvre 11 ports, du 6000 au 6010, de
mani�re inclusive. Si la borne inf�rieure est omise, alors elle se met
par d�faut � 0. Si la borne sup�rieure est omise, elle est consid�r�e
par d�faut comme �tant 65535. Ainsi, pour sp�cifier les connexions TCP
venant des ports inf�rieurs � 1024, la syntaxe pourrait �tre "-p TCP
-s 0.0.0.0/0 :1023". Les num�ros de ports peuvent �tre sp�cifi�s par
leur nom, par exemple "www".
Notez que la sp�cification du port peut �tre pr�c�d�e par un "!", qui
l'inverse. Ainsi, pour sp�cifier tous les paquets TCP, SAUF un paquet
WWW, vous pourriez sp�cifier
-p TCP -d 0.0.0.0/0 ! www
Il est important de r�aliser que sp�cifier
-p TCP -d ! 192.168.1.1 www
est tr�s diff�rent de
-p TCP -d 192.168.1.1 ! www
La premi�re ligne sp�cifie tout paquet TCP dirig� vers le port WWW de
n'importe quelle machine sauf 192.168.1.1. La seconde sp�cifie toute
connexion TCP vers tout port de 192.168.1.1 sauf le port WWW.
Enfin, le cas suivant sp�cifie tout, sauf le port WWW et la machine
192.168.1.1 :
-p TCP -d ! 192.168.1.1 ! www
44..11..33..33..22.. SSpp��cciiffiieerr lleess ttyyppeess eett ccooddeess IICCMMPP
ICMP permet aussi un argument optionnel, mais comme l'ICMP ne dispose
pas de ports (ICMP a un ttyyppee et un ccooddee), ils ont une signification
diff�rente.
Vous pouvez les sp�cifier par les noms ICMP (utilisez ipchains -h icmp
pour lister les noms disponibles) apr�s l'option "-s", ou en tant que
type et code ICMP num�rique, o� le type suit l'option "-s" et le code
suit l'option "-d".
Les noms ICMP sont relativement longs : vous avez uniquement besoin de
suffisamment de lettres pour rendre chaque nom distinct des autres.
Voici un petit r�sum� de quelques-uns des paquets ICMP les plus
communs :
Num�ro Nom Utilis� par
0 echo-reply ping
3 destination-unreachable Tout trafic TCP/UDP
5 redirect Routage, si pas de d�mon de routage
8 echo-request ping
11 time-exceeded traceroute
Notez que les noms ICMP ne peuvent �tre pr�c�d�s de "!" pour le
moment.
NE PAS, SURTOUT NE PAS bloquer tous les paquets ICMP de type 3 ! (voir
``Paquets ICMP'' plus bas).
44..11..33..44.. SSpp��cciiffiieerr uunnee iinntteerrffaaccee
L'option "-i" sp�cifie le nom d'une iinntteerrffaaccee � v�rifier. Une
interface est le p�riph�rique physique d'o� vient le paquet, ou bien
par o� sort ce paquet. Vous pouvez utiliser la commande ifconfig pour
lister les interfaces qui sont "up" (c�d en fonctionnement).
L'interface pour les paquets entrants (ie. les paquets traversant la
cha�ne d'entr�e) est consid�r�e comme �tant l'interface d'o� les
paquets proviennent. Logiquement, l'interface des paquets sortants
(les paquets traversant la cha�ne de sortie) est l'interface o� ils
vont. L'interface pour les paquets traversant la cha�ne de
retransmission est �galement l'interface par laquelle ils sortiront ;
une d�cision plut�t arbitraire � mon sens.
Il est parfaitement autoris� de sp�cifier une interface qui n'existe
pas au moment de la sp�cification ; la r�gle ne v�rifiera rien jusqu'�
ce que l'interface soit mise en place. Ceci est extr�mement utile pour
les connexions ppp intermittentes (habituellement les interfaces du
type ppp0) et autres.
En tant que cas sp�cial, un nom d'interface se finissant par un "+"
v�rifiera toutes les interfaces (qu'elles existent � ce moment ou non)
qui commencent par cette cha�ne. Par exemple, pour sp�cifier une r�gle
qui v�rifiera toutes les interfaces PPP, l'option -i ppp+ pourrait
�tre utilis�e.
Le nom d'interface peut �tre pr�c�d� par un "!" pour v�rifier un
paquet qui ne v�rifie PAS l'(les) interface(s) sp�cifi�e(s).
44..11..33..55.. SSpp��cciiffiieerr uunniiqquueemmeenntt ddeess ppaaqquueettss TTCCPP SSYYNN
Il est parfois utile d'autoriser des connexions TCP dans une
direction, mais pas dans l'autre. Par exemple, vous pouvez vouloir
autoriser les connexions vers un serveur WWW externe, mais pas les
connexions venant de ce serveur.
L'approche na�ve serait de bloquer les paquets TCP venant du serveur.
Malheureusement, les connexions TCP utilisent des paquets circulant
dans les deux sens pour fonctionner.
La solution est de bloquer uniquement les paquets utilis�s pour la
demande d'une connexion. Ces paquets sont nomm�s paquets SSYYNN (ok,
techniquement ce sont des paquets avec le drapeau SYN mis, et les
drapeaux FIN et ACK supprim�s, mais nous les appellerons des paquets
SYN). En interdisant seulement ces paquets, nous pouvons stopper toute
demande de connexion dans l'oeuf.
L'option "-y" est utilis�e pour cel� : elle est valide seulement pour
les r�gles qui sp�cifient TCP comme leur protocole. Par exemple, pour
sp�cifier une demande de connexion TCP venant de 192.168.1.1 :
-p TCP -s 192.168.1.1 -y
Une fois de plus, ce drapeau peut �tre invers� en le faisant pr�c�der
par un "!", qui v�rifie tout paquet autre que ceux d'initialisation de
connexion.
44..11..33..66.. UUttiilliisseerr lleess ffrraaggmmeennttss
Parfois, un paquet est trop large pour rentrer dans le c�ble en une
seule fois. Lorsque ceci arrive, le paquet est divis� en ffrraaggmmeennttss, et
envoy� en plusieurs paquets. Le receveur r�assemble les fragments pour
reconstruire le paquet en entier.
Le probl�me avec les fragments se situe dans certaines des
sp�cifications list�es ci-dessus (en particulier, le port source, le
port de destination, le type et le code ICMP, ou le drapeau TCP SYN),
qui demandent au noyau de jeter un regard sur le d�but du paquet, qui
est contenu seulement dans le premier fragment.
Si votre machine est la seule connexion vers un r�seau ext�rieur, vous
pouvez demander � votre noyau Linux de r�assembler tous les fragments
qui passent par lui, en compilant le noyau avec l'option IP: always
defragment mise � "Y". Ceci �vite proprement la plupart des probl�mes.
D'autre part, il est important de comprendre comment les fragments
sont trait�s par les r�gles de filtrage. Toute r�gle de filtrage qui
demande des informations dont nous ne disposons pas ne v�rifiera _r_i_e_n.
Ceci signifie que le premier fragment est trait� comme tout autre
paquet. Le deuxi�me fragment et les suivants ne le seront pas. Ainsi,
une r�gle -p TCP -s 192.168.1.1 www (sp�cifiant un port source de
"www" ne v�rifiera jamais un fragment (autre que le premier fragment).
La r�gle oppos�e -p TCP -s 192.168.1.1 ! www ne fonctionnera pas non
plus.
Cependant, vous pouvez sp�cifier une r�gle sp�ciale pour le deuxi�me
fragment et les suivants, en utilisant l'option "-f". �videmment, il
est ill�gal de sp�cifier un port TCP ou UDP, un type ou un code ICMP,
ou un drapeau TCP SYN dans une r�gle de fragment.
Il est �galement autoris� de sp�cifier une r�gle qui ne s'applique _p_a_s
au deuxi�me fragment et aux suivants, en pla�ant un "!" avant le "-f".
Habituellement, il est consid�r� comme s�r de laisser passer le
deuxi�me fragment et les suivants, puisque le filtrage s'effectuera
sur le premier fragment, et pr�viendra donc le r�assemblage sur la
machine cible. Cependant, des bogues, connus, permettent de crasher
des machines en envoyant de simples fragments. � vous de voir.
� noter pour les gourous r�seau : les paquets malform�s (TCP, UDP et
paquets ICMP trop courts pour que le code pare-feu puisse lire les
ports ou les types et codes ICMP) sont �galement trait�s comme des
fragments. Seuls les fragments TCP d�butant en position 8 sont
supprim�s explicitement par le code pare-feu (un message doit
appara�tre dans le syslog si cel� arrive).
Par exemple, la r�gle suivante supprimera tout fragment allant sur
192.168.1.1 :
# ipchains -A output -f -d 192.168.1.1 -j DENY
#
44..11..44.. EEffffeettss ddee bboorrdd dduu ffiillttrraaggee
OK, maintenant nous connaissons tous les moyens pour v�rifier un
paquet en utilisant une r�gle. Si un paquet v�rifie une r�gle, les
choses suivantes arrivent :
1. Le compteur d'octets de cette r�gle est augment� de la taille de ce
paquet (ent�te et autres) ;
2. Le compteur de paquets de cette r�gle est incr�ment� ;
3. Si la r�gle le demande, le paquet est enregistr� ;
4. Si la r�gle le demande, le champ "Type Of Service" du paquet est
modifi� ;
5. Si la r�gle le demande, le paquet est marqu� (sauf dans la s�rie
des noyaux 2.0) ;
6. La destination de la r�gle est examin�e afin de d�cider ce que nous
ferons ensuite du paquet.
Pour la diversit�, je d�taillerai ceux-ci en ordre d'importance.
44..11..44..11.. SSpp��cciiffiieerr uunnee ddeessttiinnaattiioonn
Une ddeessttiinnaattiioonn dit au noyau ce qu'il doit faire d'un paquet qui
v�rifie une r�gle. ipchains utilise "-j" (penser � "jump-to") pour la
sp�cification de la destination. Le nom de la cible doit comporter
moins de 8 caract�res, et la casse intervient : "RETOUR" et "retour"
sont totalement diff�rents.
Le cas le plus simple est lorsqu'il n'y a pas de destination
sp�cifi�e. Ce type de r�gle (souvent appell�e r�gle de "comptage") est
utile pour simplement compter un certain type de paquet. Que cette
r�gle soit v�rifi�e ou non, le noyau examine simplement la r�gle
suivante dans la cha�ne. Par exemple, pour compter le nombre de
paquets venant de 192.168.1.1, nous pouvons faire ceci :
# ipchains -A input -s 192.168.1.1
#
(En utilisant "ipchains -L -v" nous pouvons voir les compteurs de
paquets et d'octets associ�s � chaque r�gle).
Il y a six destinations sp�ciales. Les trois premi�res, ACCEPT, REJECT
et DENY sont relativement simples. ACCEPT autorise le passage du
paquet. DENY supprime le paquet comme s'il n'avait jamais �t� re�u.
REJECT supprime le paquet, mais (si ce n'est pas un paquet ICMP)
g�n�re une r�ponse ICMP vers la source pour lui dire que la
destination n'est pas accessible.
La suivante, MASQ dit au noyau de camoufler le paquet. Pour que ceci
fonctionne, votre noyau doit �tre compil� avec le camouflage IP
int�gr�. Pour les d�tails sur ceci, voyez le Masquerading-HOWTO et
l'annexe ``Diff�rences entre ipchains et ipfwadm''. Cette destination
est valide uniquement pour les paquets qui traversent la cha�ne
forward.
L'autre destination majeure sp�ciale est REDIRECT qui demande au noyau
d'envoyer un paquet vers un port local au lieu de l� o� il �tait
destin�. Ceci peut �tre sp�cifi� uniquement pour les r�gles sp�cifiant
TCP ou UDP en tant que protocole. Optionnellement, un port (nom ou
num�ro) peut �tre sp�cifi� apr�s "-j REDIRECT" qui redirigera la
paquet vers ce port particulier, m�me si celui-ci �tait dirig� vers un
autre port. Cette destination est valide uniquement pour les paquets
traversant la cha�ne input.
La derni�re destination sp�ciale est la RETURN qui est identique � une
terminaison imm�diate de la cha�ne (voir ``Choisir une police'' plus
bas).
Toute autre destination indique une cha�ne d�finie par l'utilisateur
(d�crite dans ``Op�rations sur une cha�ne enti�re'' plus bas). Le
paquet traversera tout d'abord les r�gles de cette cha�ne. Si cette
cha�ne ne d�cide pas du destin du paquet, lorsque la travers�e de
cette cha�ne sera achev�e, la travers�e reprendra sur la r�gle
suivante de la cha�ne courante.
Il est temps de faire encore un peu d'art ASCII. Consid�rons deux
(�tranges) cha�nes : input (la cha�ne int�gr�e) et Test (une cha�ne
d�finie par l'utilisateur).
`input' `Test'
----------------------------- -----------------------------
| R�gle1: -p ICMP -j REJECT | | R�gle1: -s 192.168.1.1 |
|---------------------------| |---------------------------|
| R�gle2: -p TCP -j Test | | R�gle2: -d 192.168.1.1 |
|---------------------------| -----------------------------
| R�gle3: -p UDP -j DENY |
-----------------------------
Consid�rons un paquet TCP venant de 192.168.1.1, allant vers 1.2.3.4.
Il p�n�tre dans la cha�ne input, et est test� par la R�gle1 - pas de
correspondance. La R�gle2 correspond, et sa destination est Test, donc
la r�gle suivante � examiner est le d�but de Test. La R�gle1 de Test
correspond, mais ne sp�cifie pas de destination, donc la r�gle
suivante est examin�e (R�gle2). Elle ne correspond pas, nous avons
donc atteint la fin de la cha�ne. Nous retournons alors � la cha�ne
input, dont nous avons juste examin� la R�gle2, et nous examinons
alors la R�gle3, qui ne correspond pas non plus.
Le chemin suivi par le paquet est donc le suivant :
v __________________________
`entr�e' | / `Test' v
------------------------|--/ -----------------------|----
| R�gle1 | /| | R�gle1 | |
|-----------------------|/-| |----------------------|---|
| R�gle2 / | | R�gle2 | |
|--------------------------| -----------------------v----
| R�gle3 /--+---------------------------/
------------------------|---
v
Voyez la section ``Comment organiser vos r�gles pare-feu'' pour les
moyens d'utiliser efficacement les cha�nes d�finies par l'utilisateur.
44..11..44..22.. EEnnrreeggiissttrreemmeenntt ddeess ppaaqquueettss
C'est un effet de bord que la v�rification d'une r�gle peut avoir ;
vous pouvez enregistrer les paquets v�rifi�s en utilisant l'option
"-l". Vous n'aurez g�n�ralement pas besoin de ceci pour les paquets
habituels, mais ce peut �tre une option tr�s utile si vous d�sirez
�tre tenu au courant des �v�nements exceptionnels.
Le noyau enregistre cette information de la mani�re suivante :
Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
L=34 S=0x00 I=18 F=0x0000 T=254
Ce message d'information est pr�vu pour �tre concis, et contient des
informations techniques qui ne sont utiles qu'aux gourous r�seau, mais
qui peuvent n�anmoins �tre int�ressantes pour le commun des mortels.
Il se d�compose de la fa�on suivante :
1. `input' est la cha�ne qui contenait la r�gle correspondant au
paquet, et qui a caus� l'apparition du message.
2. `DENY' est ce que la r�gle a dit au paquet de faire. Si ceci est un
`-' alors la r�gle n'a pas du tout affect� le paquet (une r�gle de
comptage).
3. `eth0' est le nom de l'interface. Puisque ceci �tait la cha�ne
d'entr�e, cel� signifie que le paquet vient de `eth0'.
4. `PROTO=17' signifie que le paquet �tait de protocole 17. Une liste
des num�ros de protocoles est donn�e dans `/etc/protocols'. Les
plus communs sont 1 (ICMP), 6 (TCP) et 17 (UDP).
5. `192.168.2.1' signifie que l'adresse IP source du paquet �tait
192.168.2.1.
6. `:53' signifie que le port source �tait le port 53. En regardant
dans `/etc/services' on voit que ceci est le port `domain' (c�d que
c'est probablement une r�ponse DNS). Pour UDP et TCP, ce num�ro est
le port source. Pour ICMP, c'est le type ICMP. Pour les autres, ce
sera 65535.
7. `192.168.1.1' est l'adresse IP de destination.
8. `:1025' signifie que le port de destination �tait 1025. Pour UDP et
TCP, ce num�ro est le port de destination. Pour ICMP, il s'agit du
code ICMP. Pour les autres, ce sera 65535.
9. `L=34' signifie que le paquet avait une longueur totale de 34
octets.
10.
`S=0x00' est le champ "Type Of Service" (divisez par 4 pour obtenir
le Type of Service utilis� par ipchains).
11.
`I=18' est l'identificateur de l'IP.
12.
`F=0x0000' est l'offset du fragment 16 bits, avec les options. Une
valeur d�butant par `0x4' ou `0x5' signifie que le bit "Don't
Fragment" (ne pas fragmenter) est mis. `0x2' ou `0x3' signifie que
le bit "More Fragments" (des fragments suivent) est mis ; attendez
vous � recevoir plus de fragments apr�s. Le reste du nombre est le
d�calage de ce fragment, divis� par 8.
13.
`T=254' est la dur�e de vie du paquet. On soustrait 1 � cette
valeur � chaque saut (hop), et on d�bute g�n�ralement � 15 ou 255.
14.
`(#5)' il peut y avoir un num�ro entre parenth�ses sur les noyaux
les plus r�cents (peut-�tre apr�s le 2.2.9). Il s'agit du num�ro de
la r�gle qui a caus� l'enregistrement du paquet.
Sur les syst�mes Linux standards, la sortie du noyau est captur�e par
klogd (d�mon d'information du noyau) qui le repasse � syslogd (d�mon
d'information du syst�me). Le fichier `/etc/syslog.conf' contr�le le
comportement de syslogd, en sp�cifiant une destination pour chaque
"partie" (dans notre cas, la partie est le "noyau") et un "niveau"
(pour ipchains, le niveau utilis� est "info").
Par exemple, mon /etc/syslog.conf (Debian) contient deux lignes qui
v�rifient `kern.info' :
kern.* -/var/log/kern.log
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
Ceci signifie que les messages sont dupliqu�s dans `/var/log/kern.log'
et `/var/log/messages'. Pour plus de d�tails, voyez `man syslog.conf'.
44..11..44..33.. MMaanniippuulleerr llee ttyyppee ddee sseerrvviiccee
Il y a quatre bits utilis�s par eux-m�mes dans l'ent�te IP, appel�s
les bits de TTyyppee ooff SSeerrvviiccee (TOS). Ceux-ci ont pour effet de modifier
la mani�re dont les paquets sont trait�s : les quatres bits sont
"Minimum Delay", "Maximum Throughput", "Maximum Reliability" et
"Minimum Cost". Un seul de ces bits est autoris� � �tre plac�. Rob van
Nieuwkerk, l'auteur du code de gestion du TOS, les d�crit comme suit :
Tout sp�cialement, le "Minimum Delay" est important pour
moi. Je le mets pour les paquets "interactifs" dans mon rou�
teur principal (Linux). Je suis derri�re une connexion modem
33,6k. Linux rend les paquets prioritaires en 3 queues. De
cette fa�on, j'obtiens des performances interactives accept�
ables tout en faisant de gros transferts de fichiers en m�me
temps. (Cel� pourrait m�me �tre encore mieux s'il n'y avait
pas de grosse queue dans le pilote s�rie, mais le temps de
latence est maintenu en dessous des 1,5 secondes pour
l'instant).
Note : bien entendu, vous n'avez aucun contr�le sur les paquets
arrivants ; vous pouvez seulement contr�ler la priorit� des paquets
qui quittent votre machine. Pour n�gocier les priorit�s de chaque
c�t�, un protocole comme RSVP (dont je ne connais rien) doit �tre
utilis�.
L'utilisation la plus commune est de placer les connexions telnet et
contr�le du ftp en "Minimum Delay" et les donn�es FTP en "Maximum
Throughput". Ceci peut �tre fait de la mani�re suivante :
ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08
L'option "-t" prend deux param�tres suppl�mentaires, tous les deux en
hexad�cimal. Ceci permet un contr�le complexe des bits du TOS : le
premier masque est AND� avec le TOS actuel du paquet, et ensuite le
deuxi�me masque est XOR� avec lui. Si cel� est trop confus, utilisez
simplement le tableau suivant :
Nom du TOS Valeur Utilisations typiques
Minimum Delay 0x01 0x10 ftp, telnet
Maximum Throughput 0x01 0x08 ftp-data
Maximum Reliability 0x01 0x04 snmp
Minimum Cost 0x01 0x02 nntp
Andi Kleen revient sur ce point pour ce qui suit (mod�r�ment �dit�
pour la post�rit�) :
Peut-�tre serait-il utile d'ajouter une r�f�rence au
param�te txqueuelen de ifconfig dans la discussion sur les
bits TOS. La longueur par d�faut de la queue d'un
p�riph�rique est r�gl�e pour les cartes ethernet, sur les
modems elle est trop longue et rend le fonctionnement de la
planification 3 bandes (qui place la queue en fonction du
TOS) sous-optimal. C'est donc une bonne id�e de le config�
urer avec une valeur comprise entre 4 et 10 sur un modem ou
un lien RNIS b simple : sur les p�riph�riques rapide une
queue plus longue est n�cessaire. C'est un probl�me des 2.0
et 2.1, mais dans le 2.1 c'est une option de ifconfig (dans
les nettools r�cents), alors que dans le 2.0 il n�cessite
une modification des sources des pilotes du p�riph�rique
pour le changer.
Ainsi, pour voir les b�n�fices maximum des changements de TOS pour les
liaisons modem PPP, ajoutez un `ifconfig $1 txqueuelen' dans votre
script /etc/ppp/ip-up. Le nombre � utiliser d�pend de la vitesse du
modem et de la taille du tampon du modem ; voici � nouveau les id�es
d'Andi :
La meilleure valeur pour une configuration donn�e n�cessite
de l'exp�rimentation. Si les queues sont trop courtes sur le
routeur, alors les paquets sauteront. Bien s�r, on peut tou�
jours gagner m�me sans changer le TOS, c'est juste que le
changement du TOS aide � gagner les b�n�fices sur les pro�
grammes non coop�ratifs (mais tous les programmes Linux
standards sont coop�ratifs).
44..11..44..44.. MMaarrqquuaaggee dd''uunn ppaaqquueett
Ceci permet des interactions complexes et puissantes avec la nouvelle
impl�mentation de Quality of Service d'Alexey Kuznetsov, ainsi que de
la redirection bas�e sur le marquage dans la derni�re s�rie de noyaux
2.1. Des d�tails suppl�mentaires vont arriver puisque nous l'avons
dans la main. Cette option est toutefois ignor�e dans la s�rie des
noyaux 2.0.
44..11..44..55.. OOpp��rraattiioonnss ssuurr uunnee cchhaa��nnee eennttii��rree
Une des options les plus utiles d'ipchains est la possibilit� de
regrouper des r�gles dans des cha�nes. Vous pouvez appeller les
cha�nes de la mani�re qui vous pla�t, tant que les noms ne sont pas
ceux des cha�nes int�gr�es (input, output et forward) ou des
destinations ((MASQ, REDIRECT, ACCEPT, DENY, REJECT ou RETURN). Je
sugg�re d'�viter compl�tement les noms en majuscules, car je pourrais
les utiliser pour des extensions futures. Le nom de la cha�ne ne doit
pas d�passer 8 caract�res.
44..11..44..66.. CCrr��eerr uunnee nnoouuvveellllee cchhaa��nnee
Cr�ons une nouvelle cha�ne. �tant un type imaginatif, je l'appellerai
test.
# ipchains -N test
#
C'est aussi simple. Maintenant vous pouvez y rajouter des r�gles,
comme d�taill� ci-dessus.
44..11..44..77.. SSuupppprriimmeerr uunnee cchhaa��nnee
La suppression d'une cha�ne est tout aussi simple.
# ipchains -X test
#
Pourquoi "-X" ? Eh bien, toutes les bonnes lettres �taient d�j�
prises.
Il y a quelques restrictions � la suppression des cha�nes : elles
doivent �tre vides (voir ``Vider une cha�ne'' plus bas) et elles ne
doivent pas �tre la destination d'une quelconque r�gle. Vous ne pouvez
pas supprimer les cha�nes int�gr�es.
44..11..44..88.. VViiddeerr uunnee cchhaa��nnee
Il y a un moyen simple de vider toutes les r�gles d'une cha�ne, en
utilisant la commande "-F".
# ipchains -F forward
#
Si vous ne sp�cifiez pas de cha�ne, alors _t_o_u_t_e_s les cha�nes seront
vid�es.
44..11..44..99.. AAffffiicchheerr uunnee cchhaa��nnee
Vous pouvez afficher toutes les r�gles d'une cha�ne en utilisant la
commande "-L".
# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT)
target prot opt source destination ports
ACCEPT icmp ----- anywhere anywhere any
# ipchains -L test
Chain test (refcnt = 0):
target prot opt source destination ports
DENY icmp ----- localnet/24 anywhere any
#
La "refcnt" list�e pour test est le nombre de r�gles qui ont test
comme destination. Ceci doit �tre �gal � z�ro (et la cha�ne doit �tre
vide) avant que cette cha�ne ne puisse �tre supprim�e.
Si le nom de la cha�ne est omis, toutes les cha�nes sont list�es, m�me
les cha�nes vides.
Il y a trois options qui peuvent accompagner "-L". L'option "-n"
(num�rique) est tr�s utile et emp�che ipchains d'essayer de v�rifier
les adresses IP, ce qui (si vous utilisez DNS comme la plupart des
gens) causera de longs d�lais si votre DNS n'est pas configur�
proprement, ou si vous filtrez les requ�tes DNS. Ceci affichera
�galement les ports par leur num�ro plut�t que par leur nom.
L'option "-v" vous montrera tous les d�tails des r�gles, comme les
compteurs de paquets et d'octets, les masques de TOS, l'interface, et
les marques de paquets. Autrement, ces valeurs seront omises. Par
exemple :
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
Notez que les compteurs de paquets et d'octets sont affich�s en
utilisant les suffixes "K", "M" ou "G" pour 1000, 1.000.000 et
1.000.000.000, respectivement. En utilisant �galement l'option "-x"
(d�veloppe les nombres), ipchains affichera les nombres en entier,
quelque soit leur taille.
44..11..44..1100.. RReemmiissee �� zz��rroo ddeess ccoommpptteeuurrss
Il est parfois utile de pouvoir remettre � z�ro les compteurs. Ceci
peut �tre fait par l'option "-Z" (compteurs � Z�ro). Par exemple :
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
# ipchains -Z input
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
0 0 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
#
Le probl�me de cette approche est que parfois vous voudrez conna�tre
les valeurs du compteur tout de suite apr�s la remise � z�ro. Dans
l'exemple ci-dessus, quelques paquets peuvent passer entre les
commandes "-L" et "-Z". Pour cette raison, vous pouvez utiliser le
"-L" et le "-Z" _e_n_s_e_m_b_l_e, pour remettre � z�ro les compteurs tout en
les lisant. Malheureusement, si vous fa�tes ceci, vous ne pouvez
op�rer sur une seule cha�ne : vous devrez lister et remettre � z�ro
toutes les cha�nes en une seule fois.
# ipchains -L -v -Z
Chain input (policy ACCEPT):
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
0 0 DENY icmp ----- 0xFF 0x00 ppp0 localnet/24 anywhere any
# ipchains -L -v
Chain input (policy ACCEPT):
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
0 0 DENY icmp ----- 0xFF 0x00 ppp0 localnet/24 anywhere any
#
44..11..44..1111.. CChhooiissiirr uunnee ppoolliiccee
Nous avons dissert� sur ce qui se passe lorsqu'un paquet atteint la
fin de la cha�ne int�gr�e, lorsque nous avons discut� sur la mani�re
dont un paquet parcourait les cha�nes dans ``Sp�cifier une
destination'' plus haut. Dans ce cas, la ppoolliiccee de la cha�ne d�termine
le destin du paquet. Seules les cha�nes int�gr�es (input, output et
forward) ont des polices, car si un paquet atteint la fin d'une cha�ne
d�finie par l'utilisateur, le paquet revient sur la cha�ne pr�c�dente.
La police peut �tre une des quatre premi�res destinations sp�ciales :
ACCEPT, DENY, REJECT ou MASQ. MASQ est la seule destination valide
pour la cha�ne "forward".
Il est �galement important de noter qu'une destination RETURN dans une
r�gle de l'une des cha�nes int�gr�es est utile pour expliciter la
destination de la cha�ne lorsqu'un paquet correspond � la r�gle.
44..11..55.. OOpp��rraattiioonnss ssuurr llee ccaammoouuffllaaggee
Il y a plusieurs param�tres que vous pouvez modifier pour le
camouflage IP. Ils sont int�gr�s avec ipchains car il n'est pas
�vident d'�crire un outil s�par� pour eux (bien que ceci devrait
changer).
La commande du camouflage IP est "-M", et peut �tre combin�e avec "-L"
pour lister les connexions actuellement camoufl�es, ou avec "-S" pour
configurer les param�tres du camouflage.
La commande "-L" peut �tre accompagn�e par "-n" (montre des nombres �
la place des noms de machines et de ports) ou "-v" (affiche les deltas
dans les s�quences de nombres pour la connexion camoufl�e, au cas o�
vous vous demanderiez).
La commande "-S" doit �tre suivie par trois valeurs de fin d'attente,
toutes en secondes : pour les sessions TCP, pour les sessions TCP
pr�c�d�es d'un paquet FIN, et pour les paquets UDP. Si vous ne voulez
pas changer l'une de ces valeurs, donnez-lui simplement une valeur de
"0".
Les valeurs par d�faut sont list�es dans
"/usr/src/linux/include/net/ip_masq.h", actuellement 15 minutes, 2
minutes et 5 minutes, respectivement.
La valeur chang�e le plus souvent est la premi�re, pour le FTP (voir
``Cauchemars du FTP'' plus bas).
Notez que les probl�mes avec la mise en place de temps de fin
d'attente sont list�s dans ``Je n'arrive pas � configurer mes temps
d'attente !''.
44..11..66.. VV��rriiffiieerr uunn ppaaqquueett
Parfois, vous voulez savoir ce qui arrive lorsqu'un certain paquet
entre dans votre machine, par exemple pour d�boguer votre cha�ne pare-
feu. ipchains dispose de la commande "-C" pour autoriser cel�, en
utilisant exactement les m�mes routines que celles que le noyau
utilise pour v�rifier les vrais paquets.
Vous sp�cifiez sur quelle cha�ne le paquet doit �tre test� en mettant
son nom apr�s l'argument "-C". M�me si le noyau commence toujours par
traverser les cha�nes input, output ou forward, vous �tes autoris� �
commencer en traversant n'importe quelle cha�ne pour tester.
Les d�tails du "paquet" sont sp�cifi�s en utilisant la m�me syntaxe
que celle utilis�e pour sp�cifier les r�gles pare-feu. En particulier,
un protocole ("-p"), une adresse source ("-s"), une adresse de
destination ("-d") et une interface ("-i") sont n�cessaires. Si le
protocole est TCP ou UDP, alors une source unique et une destination
unique doivent �tre sp�cifi�es, et un type et un code ICMP doivent
�tre sp�cifi�s pour le protocole ICMP (� moins que l'option "-f" soit
sp�cifi�e pour indiquer une r�gle de fragment, auquel cas ces options
sont ill�gales).
Si le protocole est TCP (et que l'option "-f" n'est pas sp�cifi�e),
l'option "-y' doit �tre explicit�e, afin d'indiquer que le paquet test
doit �tre configur� avec le bit SYN.
Voici un exemple de test d'un paquet TCP SYN venant de 192.168.1.1,
port 60000, et allant sur 192.168.1.2, port www, arrivant de
l'interface eth0 et entrant dans la cha�ne "input" (il s'agit d'une
initialisation classique d'une connexion WWW) :
# ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
packet accepted
#
44..11..77.. VVooiirr ccee qquuii aarrrriivvee aavveecc ddeess rr��gglleess mmuullttiipplleess pprr��cciiss��eess eenn uunnee
sseeuullee ffooiiss
Parfois, une simple ligne de commande peut affecter de multiples
r�gles. Ceci se fait par deux m�thodes. Premi�rement, si vous
sp�cifiez un nom de machine qui correspond (en utilisant DNS) � de
multiples adresses IP, ipchains agira comme si vous aviez tap� de
multiples commandes avec chaque combinaison d'adresses.
Ainsi, si le nom de machine "www.foo.com" correspond � trois adresses
IP, et si le nom de machine "www.bar.com" correspond � deux adresses
IP, alors la commande "ipchains -A input -j reject -s www.bar.com -d
www.foo.com" ajoutera six r�gles � la cha�ne input.
L'autre m�thode pour avoir ipchains r�alisant de multiples actions est
d'utiliser l'option bidirectionnelle ("-b"). Cette option fait agir
ipchains comme si vous aviez tap� la commande deux fois, la deuxi�me
fois avec les arguments "-s" et "-d" invers�s. Ainsi, pour �viter la
transmission soit de, soit vers 192.168.1.1, vous pourriez utiliser la
commande :
# ipchains -b -A forward -j reject -s 192.168.1.1
#
Personnellement, je n'aime pas beaucoup l'option "-b" ; si vous
pr�f�rez la convivialit�, voyez ``Utiliser ipchains-save'' plus bas.
L'option -b peut �tre utilis�e avec les commandes ins�rer ("-I"),
supprimer ("-D") (mais pas avec la variation qui prend un num�ro de
r�gle), ajouter ("-A") et v�rifier ("-C").
Une autre option utile est "-v" (bruyant) qui imprime exactement ce
que ipchains fait avec vos commandes. Ceci est utile si vous traitez
avec des commandes qui peuvent affecter de multiples r�gles. Par
exemple, nous devons ici v�rifier le comportement de fragments entre
192.168.1.1 et 192.168.1.2.
# ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
tcp opt ---f- tos 0xFF 0x00 via lo 192.168.1.1 -> 192.168.1.2 * -> *
packet accepted
tcp opt ---f- tos 0xFF 0x00 via lo 192.168.1.2 -> 192.168.1.1 * -> *
packet accepted
#
44..22.. EExxeemmpplleess uuttiilleess
J'ai une connexion intermittente en PPP (-i ppp0). Je r�cup�re les
news (-p TCP -s news.virtual.net.au nntp) et le courrier (-p TCP -s
mail.virtual.net.au pop-3) � chaque fois que je me connecte. J'utilise
la m�thode ftp de Debian pour mettre ma machine � jour r�guli�rement
(-p TCP -y -s ftp.debian.org.au ftp-data). Je visionne le web au
travers du proxy de mon FAI (Fournisseur d'Acc�s Internet) lorsque je
suis en ligne (-p TCP -d proxy.virtual.net.au 8080), mais je d�teste
les publicit�s de doubleclick.net des Archives de Dilbert (-p TCP -y
-d 199.95.207.0/24 et -p TCP -y -d 199.95.208.0/24).
J'autorise les gens � essayer le ftp sur ma machine lorsque je suis en
ligne (-p TCP -d $LOCALIP ftp), mais je n'autorise personne de
l'ext�rieur � pr�tendre avoir une adresse IP sur mon r�seau interne
(-s 192.168.1.0/24). Ceci est commun�ment appel� IP spoofing, et il y
a un meilleur moyen de se prot�ger dans les noyaux 2.1.x et suivants :
voir ``Comment mettre en place la protection contre l'IP spoof ?''.
Cette configuration est relativement simple, car il n'y a pour
l'instant aucune autre machine sur mon r�seau interne.
Je ne veux pas que des processus locaux (ie. Netscape, lynx, etc.) se
connectent � doubleclick.net :
# ipchains -A output -d 199.95.207.0/24 -j REJECT
# ipchains -A output -d 199.95.208.0/24 -j REJECT
#
Maintenant je d�sire changer les priorit�s des divers paquets sortants
(il n'y a pas vraiment d'int�r�t � le faire pour les paquets
entrants). Puisqu'il y a un certain nombre de ces r�gles, il y a
int�r�t � les mettre ensemble dans une seule cha�ne, nomm�e ppp-out.
# ipchains -N ppp-out
# ipchains -A output -i ppp0 -j ppp-out
#
D�lai minimal pour le trafic web et telnet :
# ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
# ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
#
Co�t faible pour les donn�es ftp, nntp et pop-3 :
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
#
Il y a quelques restrictions sur les paquets venant de l'interface
ppp0 ; cr�ons une cha�ne nomm�e "ppp-in" :
# ipchains -N ppp-in
# ipchains -A input -i ppp0 -j ppp-in
#
Maintenant, aucun des paquets venant de ppp0 ne doit pr�tendre avoir
une adresse source de la forme 192.168.1.*, donc nous les enregistrons
et les interdisons :
# ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
#
J'autorise l'entr�e des paquets UDP pour le DNS (je fais tourner un
serveur de nom cache qui renvoie toutes les demandes sur 203.29.16.1,
donc je m'attend � des r�ponses DNS venant uniquement de l�), l'entr�e
du ftp, et le retour des donn�es ftp (ftp-data) uniquement (ce qui
doit �tre uniquement entre un port strictement sup�rieur � 1023, et
pas sur les ports X11 autour de 6000).
# ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
# ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
#
Enfin, les paquets local vers local sont OK :
# ipchains -A input -i lo -j ACCEPT
#
Maintenant, ma police par d�faut sur la cha�ne input est DENY, ce qui
fait que tout le reste dispara�t :
# ipchains -P input DENY
#
NOTE : Je ne configurerais pas mes cha�nes dans cet ordre, car des
paquets pourraient passer durant la configuration. Le moyen le plus
s�r est g�n�ralement de configurer la police � DENY tout d'abord, et
ensuite d'ins�rer les r�gles. Bien s�r, si vos r�gles ont besoin
d'effectuer des demandes DNS pour r�soudre des noms de machines, vous
pourriez avoir des probl�mes.
44..22..11.. UUttiilliisseerr iippcchhaaiinnss--ssaavvee
Configurer des cha�nes pare-feu de la mani�re exacte dont vous le
voulez, et se rappeller ensuite des commandes que vous avez utilis�
pour le faire la fois suivante est insupportable.
Donc, ipchains-save est un script qui lit votre configuration actuelle
des cha�nes et la sauve dans un fichier. Pour le moment, je
conserverais le suspens en ce qui concerne l'utilit� de ipchains-
restore.
ipchains-save peut sauver une cha�ne seule, ou toutes les cha�nes (si
aucun nom de cha�ne n'a �t� sp�cifi�). La seule option actuellement
autoris�e est le "-v" qui affiche les r�gles (vers stderr)
lorsqu'elles sont sauv�es. La police de la cha�ne est aussi sauv�e
pour les cha�nes input, output et forward.
# ipchains-save > my_firewall
Saving `input'.
Saving `output'.
Saving `forward'.
Saving `ppp-in'.
Saving `ppp-out'.
#
44..22..22.. UUttiilliisseerr iippcchhaaiinnss--rreessttoorree
ipchains-restore remet les cha�nes que vous avez sauv� avec ipchains-
save. Il peut prendre deux options : "-v" qui d�crit chaque r�gle
lorsqu'elle est ajout�e, et "-f" qui force le nettoyage des cha�nes
d�finies par l'utilisateur si elles existent, comme d�crit plus bas.
Si une cha�ne d�finie par l'utilisateur est trouv�e � l'entr�e,
ipchains-restore v�rifie que cette cha�ne existe d�j�. Si elle existe,
alors vous serez interrog� pour savoir si la cha�ne doit �tre nettoy�e
(suppression de toutes les r�gles) ou si la restauration de la cha�ne
doit �tre saut�e. Si vous sp�cifiez "-f" sur la ligne de commande,
vous ne serez pas interrog� ; la cha�ne sera nettoy�e.
Par exemple :
# ipchains-restore < my_firewall
Restoring `input'.
Restoring `output'.
Restoring `forward'.
Restoring `ppp-in'.
Chain `ppp-in' already exists. Skip or flush? [S/f]? s
Skipping `ppp-in'.
Restoring `ppp-out'.
Chain `ppp-out' already exists. Skip or flush? [S/f]? f
Flushing `ppp-out'.
#
55.. DDiivveerrss
Cette section contient toutes les informations et les questions
fr�quemment pos�es que je ne pouvais faire entrer dans la structure
ci-dessus.
55..11.. CCoommmmeenntt oorrggaanniisseerr vvooss rr��gglleess ppaarree--ffeeuu
Cette question n�cessite un peu de r�flexion. Vous pouvez tenter de
les organiser pour optimiser la vitesse (minimiser le nombre de
v�rifications de r�gles pour la plupart des paquets) ou pour augmenter
la maniabilit�.
Si vous avez une connexion intermittente, disons une connexion PPP,
vous pouvez configurer la premi�re r�gle de la cha�ne d'entr�e pour
�tre `-i ppp0 -j DENY' au lancement, puis avoir quelque chose comme
ceci dans votre script ip-up :
# Re-cr�e la cha�ne "ppp-in"
ipchains-restore -f < ppp-in.firewall
# Remplace la r�gle DENY par un saut vers la cha�ne se chargeant du ppp
ipchains -R input 1 -i ppp0 -j ppp-in
Votre script ip-down pourrait ressembler � �a :
ipchains -R input 1 -i ppp0 -j DENY
55..22.. CCee qquu''iill nnee ffaauutt ppaass ffiillttrreerr
Il y a un certain nombre de choses auxquelles vous devez faire
attention avant de commencer � filtrer quelque chose que vous n'auriez
pas voulu filtrer.
55..22..11.. LLeess ppaaqquueettss IICCMMPP
Les paquets ICMP sont utilis�s (entre autres choses) pour indiquer des
probl�mes aux autres protocoles (comme TCP et UDP). Les paquets
"destination-unreachable" (destination non accessible) en particulier.
Le bloquage de ces paquets signifie que vous n'obtiendrez jamais les
erreurs "Host unreachable" ou "No route to host" ; toute connexion
attendra une r�ponse qui ne viendra jamais. C'est irritant, mais
rarement fatal.
Un probl�me plus inqui�tant est le r�le des paquets ICMP dans la
d�couverte MTU. Toutes les bonnes impl�mentations de TCP (y compris
celle de Linux) utilisent la recherche MTU pour tenter de trouver quel
est le plus grand paquet qui peut atteindre une destination sans �tre
fragment� (la fragmentation diminue les performances, principalement
lorsque des fragments occasionnels sont perdus). La recherche MTU
fonctionne en envoyant des paquets avec le bit "Don't Fragment" mis,
et en envoyant ensuite des paquets plus petits s'il re�oit un paquet
ICMP indiquant "Fragmentation needed but DF set" (`fragmentation-
needed'). C'est un paquet de type "destination-unreachable", et s'il
n'est jamais re�u, l'h�te local ne r�duira pas le MTU, et les
performances seront abyssales ou inexistantes.
Notez qu'il est commun de bloquer tous les messages ICMP de
redirection (type 5) ; ils peuvent �tre utilis�s pour manipuler le
routage (bien que les piles IP bien con�ues disposent de gardes-fou),
et sont donc souvent consid�r�s comme quelques peu risqu�s.
55..22..22.. CCoonnnneexxiioonnss TTCCPP aauu DDNNSS ((sseerrvveeuurr ddee nnoomm))
Si vous tentez de bloquer toutes les connexions TCP sortantes,
rappellez vous que le DNS n'utilise pas toujours UDP ; si la r�ponse
du serveur d�passe les 512 octets, le client utilise une connexion TCP
(allant toujours sur le port num�ro 53) pour obtenir les donn�es.
Ceci peut �tre un pi�ge car le DNS fonctionnera "en gros" si vous
interdisez de tels transferts TCP ; vous pouvez exp�rimenter des
d�lais longs et �tranges, et d'autres probl�mes li�s au DNS si vous le
faites.
Si les demandes de votre DNS sont toujours dirig�es vers les m�mes
sources externes (soit directement en utilisant la ligne nameserver
dans /etc/resolv.conf ou en utilisant un serveur de noms cache en mode
de redirection), alors vous n'aurez besoin d'autoriser que les
connexions du port domain sur ce serveur de nom � partir du port local
domain (si vous utilisez un serveur de nom cache) ou d'un port �lev�
(> 1023) si vous utilisez /etc/resolv.conf.
55..22..33.. CCaauucchheemmaarrss dduu FFTTPP
L'autre probl�me classique du filtrage de paquets est celui pos� par
le FTP. Le FTP a deux mmooddeess ; le mode traditionnel est appel� mmooddee
aaccttiiff et le plus r�cent est appel� mmooddee ppaassssiiff. Les navigateurs web
utilisent souvent le mode passif par d�faut, mais les programmes de
ftp en ligne de commmande utilisent en g�n�ral par d�faut le mode
actif.
En mode actif, lorsque l'h�te distant d�sire envoyer un fichier (ou
m�me les r�sultats d'une commande ls ou dir), il essaye d'ouvrir une
connexion TCP sur la machine locale. Cel� signifie que vous ne pouvez
filtrez ces connexions TCP sans supprimer le FTP actif.
Si vous avez comme option l'utilisation du mode passif, alors tout va
bien ; le mode passif fait passer les connexions de donn�es du client
au serveur, m�me pour les donn�es arrivantes. Autrement, il est
recommend� de n'autoriser que les connexions TCP vers les ports
sup�rieurs � 1024 et de les interdire entre 6000 et 6010 (6000 est
utilis� par X-Windows).
55..33.. FFiillttrreerr llee ppiinngg ddee llaa mmoorrtt ((PPiinngg ooff DDeeaatthh))
Les machines Linux sont maintenant immunis�es du fameux PPiinngg ooff DDeeaatthh,
qui implique l'envoi de paquets ICMP ill�galement grands qui font
d�border les buffers de la pile TCP du r�cepteur et causent de gros
d�g�ts.
Si vous voulez prot�ger des machines qui peuvent �tre vuln�rables, vos
pouvez simplement bloquer les fragments ICMP. Les paquets ICMP normaux
ne sont pas assez gros pour n�cessiter la fragmentation, et vous ne
casserez rien � part les gros pings. J'ai entendu parler (non
confirm�) de rapports comme quoi quelques syst�mes ont seulement
besoin du dernier fragment d'un paquet ICMP d�form� pour les
corrompre, donc bloquer seulement le premier fragment n'est pas
recommand�.
M�me si tous les programmes exploitant cette erreur que j'ai vu
utilisent l'ICMP, il n'y a pas de raisons qu'un fragment TCP ou UDP
(ou d'un protocole inconnu) ne puisse �tre utilis� pour cette attaque,
donc le bloquage des fragments ICMP est seulement une solution
temporaire.
55..44.. FFiillttrreerr tteeaarrddrroopp eett bboonnkk
Teardrop et Bonk sont deux attaques (principalement contre les
machines sous Microsoft Windows NT) qui reposent sur des fragments
superpos�s. Avoir votre routeur Linux d�fragmenter, ou interdisant
tous les fragments vers vos machines vuln�rables sont d'autres
options.
55..55.. FFiillttrreerr lleess bboommbbeess �� ffrraaggmmeennttss
Quelques piles TCP moins fiables sont connues pour avoir des probl�mes
� g�rer de larges ensembles de fragments de paquets lorsqu'elles ne
re�oivent pas tous les fragments. Linux n'a pas ce probl�me. Vous
pouvez filtrer les fragments (ce qui peut casser les utilisations
l�gitimes) ou compiler votre noyau avec l'option "IP: always
defragment" mise sur "Y" (seulement si votre machine Linux est la
seule route possible pour ces paquets).
55..66.. CChhaannggeerr lleess rr��gglleess ppaarree--ffeeuu
Il y a quelques probl�mes de temps qui sont impliqu�s dans la
modification des r�gles pare-feu. Si vous n'y faites pas attention,
vous pouvez laisser entrer des paquets lorsque vous avez fait la
moiti� de vos changements. Une approche simpliste serait de faire la
suite :
# ipchains -I input 1 -j DENY
# ipchains -I output 1 -j DENY
# ipchains -I forward 1 -j DENY
... Mise en place des changements ...
# ipchains -D input 1
# ipchains -D output 1
# ipchains -D forward 1
#
Ceci supprime tous les paquets pour la dur�e des changements.
Si vos changements sont restreints � une cha�ne simple, vous pouvez
cr�er une nouvelle cha�ne avec les nouvelles r�gles, et ensuite
remplacer ("-R") la r�gle qui pointait sur la vieille cha�ne par une
qui pointe sur la nouvelle cha�ne ; ensuite, vous pouvez supprimer la
vieille cha�ne. Le remplacement se fera � vitesse atomique.
55..77.. CCoommmmeenntt mmeettttrree eenn ppllaaccee llaa pprrootteeccttiioonn ccoonnttrree ll''IIPP ssppooooff ??
L'IP spoofing est une technique dans laquelle un h�te envoie des
paquets qui pr�tendent venir d'un autre h�te. Puisque le filtrage des
paquets prend ses d�cisions sur la base de cette adresse source, l'IP
spoofing est utilis� pour abuser les filtres de paquets. Elle est
�galement utilis�e pour cacher l'identit� d'un attaquant utilisant les
techniques SYN, Teardrop, Ping of Death et autres d�riv�s (ne vous
inqui�tez si vous ne savez pas ce que c'est).
Le meilleur moyen de se prot�ger de l'IP spoofing est la v�rification
de l'adresse source, et il est r�alis� par le code de routage, et non
par le pare-feu et autres.
Cherchez un fichier nomm� /proc/sys/net/ipv4/conf/all/rp_filter. S'il
existe, alors l'activation de la v�rification de l'adresse source �
chaque lancement est la bonne solution pour vous. Pour se faire,
ins�rez les lignes suivantes quelque part dans vos scripts
d'initialisation, avant l'initialisation des interfaces r�seau :
# This is the best method: turn on Source Address Verification and get
# spoof protection on all current and future interfaces.
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
echo -n "Setting up IP spoofing protection..."
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
echo "done."
else
echo PROBLEMS SETTING UP IP SPOOFING PROTECTION. BE WORRIED.
echo "CONTROL-D will exit from this shell and continue system startup."
echo
# Start a single user shell on the console
/sbin/sulogin $CONSOLE
fi
Si vous ne pouvez faire ceci, vous pouvez ins�rer manuellement les
r�gles pour prot�ger chaque interface. Ceci n�cessite la connaissance
de chaque interface. La s�rie des noyaux 2.1 et sup�rieurs rejette
automatiquement les paquets qui pr�tendent venir des adresses 127.*
(r�serv�es pour l'interface de loopback, lo).
Par exemple, disons que vous avez trois interfaces, eth0, eth1 et
ppp0. Nous pouvons utiliser ifconfig pour nous donner les adresses et
les masques de r�seau de chaque interface. Disons que eth0 est
rattach�e � un r�seau 192.168.1.0 avec le masque de sous-r�seau
255.255.255.0, eth1 est raccord�e � un r�seau 10.0.0.0 avec le masque
de sous-r�seau 255.0.0.0, et ppp0 connect�e � l'Internet (o� toutes
les adresses sauf les adresses IP priv�es r�serv�es sont autoris�es),
nous ins�rerions les r�gles suivantes :
# ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
# ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
# ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
# ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
#
Cette approche n'est pas aussi bonne que l'approche par v�rification
de l'adresse source, parce que si votre r�seau change, vous devrez
changer vos r�gles pare-feu pour �tre � jour.
Si vous utilisez un noyau de s�rie 2.0, vous pouvez �galement vouloir
prot�ger l'interface loopback, en utilisant une r�gle telle que :
# ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
#
55..88.. PPrroojjeettss aavvaanncc��ss
Il y a une biblioth�que dans l'espace utilisateur que j'ai �crit et
qui est inclue avec la distribution source, nomm�e "libfw". Elle
utilise la capacit� de IP Chains 1.3 et suivants pour copier un paquet
vers l'espace utilisateur (via l'option du noyau IP_FIREWALL_NETLINK).
La valeur "mark" peut �tre utilis�e pour sp�cifier les param�tres de
Qualit� de Service pour les paquets, ou pour sp�cifier comment les
paquets doivent �tre renvoy�s. Je ne l'ai cependant jamais utilis�e,
mais si vous voulez �crire sur ce sujet, contactez moi.
Des choses comme le ssttaatteeffuull iinnssppeeccttiioonn (je pr�f�re le terme "pare-feu
dynamique") peuvent �tre impl�ment�es dans l'espace utilisateur en
utilisant cette biblioth�que. D'autres id�es g�niales peuvent �tre le
contr�le des paquets sur une base "par utilisateur" en faisant une
demande sur un d�mon r�sidant dans l'espace utilisateur. Ceci devrait
�tre relativement simple.
55..88..11.. SSPPFF :: SSttaatteeffuull PPaacckkeett FFiilltteerriinngg
ftp://ftp.interlinx.bc.ca/pub/spf <
ftp://ftp.interlinx.bc.ca/pub/spf>
est le site du projet SPF de Brian Murrell, qui permet le suivi de
connexion dans l'espace utilisateur. Ceci ajoute une dose
significative de s�curit� pour les sites � faible bande passante.
Il y a peu de documentation pour le moment, mais voici un message que
Brian a envoy� � la liste de diffusion en r�pondant � quelques
questions :
> Je pr�sume qu'il fait exactement ce que je veux~: installer une r�gle de
> "retour" temporaire pour laisser entrer des paquets en r�ponse � une
> requ�te ext�rieure.
Yup, c'est exactement ce � quoi il sert. Plus il comprendra de protocoles,
plus il obtiendra de r�gles de retour exactes. Pour l'instant il supporte
(de m�moire, excusez les erreurs ou les omissions) le FTP (� la fois actif et
passif, int�rieur et ext�rieur), un peu de RealAudio, de traceroute, d'ICMP et
d'un ICQ basique (transmission des serveurs ICQ, connexions TCP directes, mais
h�las la seconde connexion directe TCP pour des trucs comme le transfert de
fichiers, etc., ne sont pas encore pr�sentes)
> S'agit-il d'un rempla�ant pour ipchains ou d'un ajout~?
C'est un ajout. Pensez � ipchains comme �tant le moteur pour autoriser et
emp�cher les paquets de traverser une machine Linux. SPF est le pilote, g�rant
et surveillant constamment le traffic et disant � ipchains comment changer ses
polices pour refl�ter les changements dans les sch�mas du traffic.
55..88..22.. MMooddiiffiiccaattiioonn ddeess ddoonnnn��eess ffttpp ppaarr MMiicchhaaeell HHaasseennsstteeiinn
Michael Hasenstein de SuSE a cod� un correctif pour le noyau qui
ajoute le suivi des connexions ftp � ipchains. Celui-ci peut �tre
trouv� sur
http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz
<
http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz>
55..99.. EExxtteennssiioonnss ffuuttuurreess
Les codes de pare-feu et de NAT sont en cours de remise � jour pour le
2.3. Les plans et les discussions sont disponibles sur l'archive de
netdev, et sur la liste ipchains-dev. Ces extensions doivent nettoyer
de nombreux probl�mes d'utilisation (r�ellement, la mise en place du
pare-feu et le camouflage ne devrait pas �tre _a_u_s_s_i _d_u_r, et devrait
autoriser une croissance pour un pare-feu beaucoup plus flexible).
66.. PPrroobbll��mmeess ccllaassssiiqquueess
66..11.. iippcchhaaiinnss --LL eesstt ggeell�� !!
Vous bloquez probablement les demandes DNS ; il finira probablement
par stopper. Essayez d'utiliser l'option "-n" (num�rique) d'ipchains,
qui supprimera la recherche des noms.
66..22.. LLee ccaammoouuffllaaggee//rreeddiirreeccttiioonn nnee ffoonnccttiioonnnnee ppaass !!
V�rifiez si la redirection de paquets est activ�e (dans les noyaux
r�cent, elle est d�sactiv�e par d�faut ce qui signifie que les paquets
ne tentent jamais de traverser la cha�ne "forward"). Vous pouvez
changer ce d�faut (en tant que super-utilisateur) en tapant
# echo 1 > /proc/sys/net/ipv4/ip_forward
#
Si ceci marche pour vous, vous pouvez le mettre quelque part dans vos
scripts de lancement, de mani�re � ce que la redirection soit activ�e
� chaque fois ; vous devrez toutefois configurer votre pare-feu avant
le lancement de cette commande, autrement il peut y avoir passage de
paquets.
66..33.. --jj RREEDDIIRR nnee mmaarrcchhee ppaass !!
Vous devez autoriser la retransmission des paquets (voir plus haut)
pour que celle-ci fonctionne ; sinon le code de routage supprime le
paquet. Ainsi, si vous utilisez juste la redirection sans avoir de
transmission, vous devez y faire attention.
Notez que REDIR (dans la cha�ne d'entr�e) n'affecte pas les connexions
d'un processus local.
66..44.. LLeess iinntteerrffaacceess jjookkeerr nnee ffoonnccttiioonnnneenntt ppaass !!
Il y avait une erreur dans les versions 2.1.102 et 2.1.103 du noyau
(et dans quelques anciens correctifs que j'avais sorti) qui faisait
planter les commandes ipchains utilisant une interface joker (comme -i
ppp+).
Cette erreur a �t� corrig�e dans les noyaux r�cents, et dans le
correctif 2.0.34 du site web. Vous pouvez aussi le corriger � la main
dans les sources du noyau en changeant la ligne 63 de
include/linux/ip_fw.h :
#define IP_FW_F_MASK 0x002F /* All possible flag bits mask */
Ceci doit en fait �tre "0x003F". Corrigez et recompilez le noyau.
66..55.. TTOOSS nnee ffoonnccttiioonnnnee ppaass !!
C'est de ma faute : la configuration du champ Type of Service ne
change pas le Type of Service dans les noyaux 2.1.102 � 2.1.111. Ce
probl�me a �t� corrig� dans le 2.1.112.
66..66.. iippaauuttooffww eett iippppoorrttffww nnee ffoonnccttiioonnnneenntt ppaass !!
Pour les 2.0.x, c'est vrai ; je n'ai pas le temps de cr�er et de
maintenir un correctif de taille gigantesque pour ipchains et
ipautofw/ipportfw.
Pour les 2.1.x, r�cup�rez ipmasqadm de Juan Ciarlante sur
<url url="
http://juanjox.linuxhq.com/"
name="
http://juanjox.linuxhq.com/">
et utilisez-le exactement de la mani�re dont vous auriez utilis�
ipautofw ou ipportfw, � part qu'� la place de ipportfw vous devez
taper ipmasqadm portfw, et � la place de ipautofw vous devez taper
ipmasqadm autofw.
66..77.. XXoossVViieeww nnee mmaarrcchhee ppaass !!
Mettez � jour � la version 1.6.0 ou sup�rieure, qui ne n�cessite pas
de r�gle pare-feu pour les noyaux 2.1.x. Il semblerait �tre � nouveau
cass� dans le 1.6.1 ; veuillez voir l'auteur (ce n'est pas de ma
faute !).
66..88.. EErrrreeuurr ddee sseeggmmeennttaattiioonn aavveecc --jj RREEDDIIRREECCTT !!
C'�tait une erreur dans ipchains version 1.3.3. Veuillez mettre �
jour.
66..99.. JJee nnee ppeeuuxx ppaass mmooddiiffiieerr lleess tteemmppss dd''aatttteennttee dduu ccaammoouuffllaaggee !!
C'est vrai (pour les noyaux 2.1.x) jusqu'au et incluant le 2.1.112.
Ceci est pour le moment vigoureusement traqu�, et au moment o� vous
lirez ce document il se pourrait que ce soit r�solu. Ma page web
contiendra un correctif lorsqu'il sera disponible.
66..1100.. JJee vveeuuxx ffiirreewwaalllleerr IIPPXX !!
Ainsi qu'un certain nombre d'autres personnes, il semble. Mon code
couvre seulement IP, malheureusement. Du bon c�t�, tout est l� pour
pouvoir firewaller IPX ! Vous devrez juste �crire le code ; je vous
aiderai joyeusement l� o� ce sera possible.
77.. UUnn eexxeemmppllee ss��rriieeuuxx
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.
77..11.. LL''aarrrraannggeemmeenntt
� 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)
77..22.. BBuuttss
Sur la machine filtrant les paquets :
PPIINNGG ttoouutt rr��sseeaauu
Tr�s utile si la machine est hors-service.
TTRRAACCEERROOUUTTEE ttoouutt rr��sseeaauu
Une fois de plus, utile pour les diagnostics.
AAcccc��ss aauu DDNNSS
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 :
AAuuttoorriissee WWWWWW,, ffttpp,, ttrraacceerroouuttee eett sssshh vveerrss ll''eexxtt��rriieeuurr
Ce sont des services standards � autoriser : on autorise parfois
les machines internes � tout faire, mais ici nous serons plus
restrictifs.
AAuuttoorriissee llee SSMMTTPP vveerrss llee sseerrvveeuurr mmaaiill
Bien entendu, nous voulons qu'il leur soit possible d'envoyer du
courrier vers l'ext�rieur.
AAuuttoorriissee llee PPOOPP33 vveerrss llee sseerrvveeuurr mmaaiill
C'est ainsi qu'ils lisent leur courrier.
AAuuttoorriissee lleess rreeqquu��tteess DDNNSS vveerrss llee sseerrvveeuurr ddee nnoomm
Ils doivent pouvoir rechercher des noms externes pour le web, le
ftp, traceroute ou ssh.
AAuuttoorriissee rrssyynncc vveerrss llee sseerrvveeuurr wweebb
C'est ainsi qu'ils synchronisent le serveur web externe avec
l'interne.
AAuuttoorriissee lleess rreeqquu��tteess WWWWWW vveerrss llee sseerrvveeuurr wweebb
Bien entendu, nous voulons qu'ils puissent se connecteur au
serveur web externe.
AAuuttoorriissee llee ppiinngg vveerrss llee ffiillttrree ddee ppaaqquueettss
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�).
77..33.. AAvvaanntt llee ffiillttrraaggee ddeess ppaaqquueettss
� 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
#
77..44.. FFiillttrraaggee ddee ppaaqquueettss ppoouurr lleess ppaaqquueettss ttrraavveerrssaannttss
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
77..44..11.. CCoonnffiigguurreerr lleess ssaauuttss ddee llaa cchhaa��nnee ddee ttrraannssmmiissssiioonn
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
77..44..22.. DD��ffiinniirr llaa cchhaa��nnee iiccmmpp--aacccc
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
77..44..33.. BBoonn ((iinntteerrnnee)) vveerrss ZZDDMM ((sseerrvveeuurrss))
Restrictions internes :
� Autorise WWW, ftp, traceroute, ssh vers l'ext�rieur
� AAuuttoorriissee llee SSMMTTPP vveerrss llee sseerrvveeuurr mmaaiill
� AAuuttoorriissee llee PPOOPP33 vveerrss llee sseerrvveeuurr mmaaiill
� AAuuttoorriissee lleess rreeqquu��tteess DDNNSS vveerrss llee sseerrvveeuurr ddee nnoomm
� AAuuttoorriissee llee rrssyynncc vveerrss llee sseerrvveeuurr wweebb
� AAuuttoorriissee llee WWWWWW vveerrss llee sseerrvveeuurr wweebb
� 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
77..44..44.. MMaauuvvaaiiss ((eexxtt��rriieeuurr)) vveerrss ZZDDMM ((sseerrvveeuurrss))
� Restrictions de la ZDM :
� Serveur mail :
� SSMMTTPP vveerrss ll''eexxtt��rriieeuurr
� AAcccceeppttee llee SSMMTTPP vveennaanntt de l'int�rieur et eexxtt��rriieeuurr
� Accepte le POP3 de l'int�rieur
� Serveur de noms :
� EEnnvvooii ddee rreeqquu��tteess DDNNSS vveerrss ll''eexxtt��rriieeuurr
� AAcccceeppttee llee DDNNSS vveennaanntt de l'int�rieur, eexxtt��rriieeuurr et du filtre de
paquets
� Serveur web :
� AAcccceeppttee lleess rreeqquu��tteess HHTTTTPP vveennaanntt ddee l'int�rieur et de ll''eexxtt��rriieeuurr
� 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
77..44..55.. BBoonn ((iinntt��rriieeuurr)) vveerrss MMaauuvvaaiiss ((eexxtt��rriieeuurr))..
� Restrictions internes :
� AAuuttoorriissee llee WWWWWW,, ffttpp,, ttrraacceerroouuttee,, sssshh vveerrss ll''eexxtt��rriieeuurr
� 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
77..44..66.. ZZDDMM vveerrss BBoonn ((iinntt��rriieeuurr))
� Restrictions internes :
� Autorise WWW, ftp, traceroute, ssh vers l'ext�rieur
� AAuuttoorriissee SSMMTTPP vveerrss llee sseerrvveeuurr mmaaiill
� AAuuttoorriissee PPOOPP33 vveerrss llee sseerrvveeuurr mmaaiill
� AAuuttoorriissee DDNNSS vveerrss llee sseerrvveeuurr ddee nnoommss
� AAuuttoorriissee rrssyynncc vveerrss llee sseerrvveeuurr wweebb
� AAuuttoorriissee WWWWWW vveerrss llee sseerrvveeuurr wweebb
� 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
77..44..77.. ZZDDMM vveerrss MMaauuvvaaiiss ((eexxtt��rriieeuurr))
� Restrictions de la ZDM :
� Serveur mail
� SSMMTTPP vveerrss ll''eexxtt��rriieeuurr
� AAcccceeppttee SSMMTTPP vveennaanntt ddee l'int�rieur et de ll''eexxtt��rriieeuurr
� Accepte POP3 venant de l'int�rieur
� Serveur de noms
� EEnnvvooii ddee rreeqquu��tteess DDNNSS vveerrss ll''eexxtt��rriieeuurr
� AAcccceeppttee llee DDNNSS ddee l'int�rieur, ll''eexxtt��rriieeuurr et du filtre de paquets
� Serveur web
� AAcccceeppttee HHTTTTPP vveennaanntt ddee l'int�rieur et de ll''eexxtt��rriieeuurr
� 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
77..44..88.. MMaauuvvaaiiss ((eexxtt��rriieeuurr)) vveerrss BBoonn ((iinntt��rriieeuurr))
� 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
77..44..99.. FFiillttrraaggee ddee ppaaqquueettss ppoouurr llaa mmaacchhiinnee LLiinnuuxx eellllee--mm��mmee
� 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
77..44..99..11.. IInntteerrffaaccee MMaauuvvaaiiss ((eexxtt��rriieeuurr))
� Machine de filtrage des paquets :
� PPIINNGG ttoouuss lleess rr��sseeaauuxx
� TTRRAACCEERROOUUTTEE ttoouuss lleess rr��sseeaauuxx
� 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
77..44..99..22.. IInntteerrffaaccee ZZDDMM
� Restrictions du filtre de paquets :
� PPIINNGG ttoouuss lleess rr��sseeaauuxx
� TTRRAACCEERROOUUTTEE ttoouuss lleess rr��sseeaauuxx
� AAcccc��ss DDNNSS
� 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
77..44..99..33.. IInntteerrffaaccee BBoonn ((iinntt��rriieeuurr))
� Restrictions du filtre de paquets
� PPIINNGG ttoouuss lleess rr��sseeaauuxx
� TTRRAACCEERROOUUTTEE ttoouuss lleess rr��sseeaauuxx
� AAcccc��ss DDNNSS
� 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
� AAuuttoorriissee ppiinngg vveerrss llee ffiillttrree ddee ppaaqquueettss
� 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
77..55.. FFiinnaalleemmeenntt
� Supprime les r�gles de bloquage :
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1
88.. AAnnnneexxee :: ddiiffff��rreenncceess eennttrree iippcchhaaiinnss eett iippffwwaaddmm
Quelques-uns de ces changements sont le r�sultat de changements du
noyau, et quelques autres sont un r�sultat des diff�rences entre
ipchains et ipfwadm.
1. De nombreux arguments ont �t� modifi�s : les majuscules indiquent
dor�navant une commande, et les minuscules indiquent une option.
2. Les cha�nes arbitraires sont support�es, ainsi m�me les cha�nes
int�gr�es ont des noms complets plut�t que des options (c�d,
"input" � la place de "-I").
3. L'option "-k" a saut� : utilisez "! -y".
4. L'option "-b" ins�re/ajoute/supprime actuellement deux r�gles,
plut�t qu'une r�gle "bidirectionnelle" simple.
5. L'option "-b" peut �tre pass�e � "-C" pour effectuer deux
v�rifications (une dans chaque direction).
6. L'option "-x" de "-l" a �t� remplac�e par "-v".
7. Les ports sources et destinations multiples ne sont plus support�s.
Heureusement, la possibilit� d'employer un intervalle de port aura
le m�me effet.
8. Les interfaces peuvent seulement �tre sp�cifi�es par leur nom (pas
par leurs adresses). L'ancienne s�mantique a �t� silencieusement
chang�e dans la s�rie des noyaux 2.1, de toute mani�re.
9. Les fragments sont examin�s, mais pas automatiquement autoris�s.
10.
On s'est d�barrass� des cha�nes de comptage explicites.
11.
On peut �crire des r�gles qui porteront uniquement sur certains
protocoles IP.
12.
L'ancien comportement de v�rification de SYN et ACK (qui �tait
auparavant ignor� pour les paquets non TCP) a chang� ; l'option SYN
n'est plus valide pour les r�gles non sp�cifiques au TCP.
13.
Les compteurs sont maintenant de 64 bits sur les machines 32 bits,
et non plus 32 bits.
14.
L'inversion des options est dor�navant support�e.
15.
Les codes ICMP sont maintenant support�s.
16.
Les interfaces joker sont maintenant support�es.
17.
Les manipulations de TOS sont maintenant v�rifi�es : l'ancien code
du noyau les stoppait silencieusement pour vous en manipulant
(ill�galement) le bit TOS "Must Be Zero" ; ipchains retourne
maintenant une erreur si vous essayez, de m�me que pour d'autres
cas ill�gaux.
88..11.. GGuuiiddee ddee rr��ff��rreennccee rraappiiddee
[ Dans l'ensemble, les arguments des commandes sont en MAJUSCULES, et
les options des arguments sont en minuscules ]
Une chose � noter, le camouflage est sp�cifi� par "-j MASQ" ; ceci est
compl�tement diff�rent de "-j ACCEPT", et n'est pas trait� comme un
effet de bord, au contraire d'ipfwadm.
===========================================================================
| ipfwadm | ipchains | Notes
---------------------------------------------------------------------------
| -A [both] | -N acct | Cr�e une cha�ne "acct"
| |& -I 1 input -j acct | ayant des paquets entrants et
| |& -I 1 output -j acct | sortants qui la traversent.
| |& acct |
---------------------------------------------------------------------------
| -A in | input | Une r�gle sans destination
---------------------------------------------------------------------------
| -A out | output | Une r�gle sans destination
---------------------------------------------------------------------------
| -F | forward | Utilise �a comme [cha�ne].
---------------------------------------------------------------------------
| -I | input | Utilise �a comme [cha�ne].
---------------------------------------------------------------------------
| -O | output | Utilise �a comme [cha�ne].
---------------------------------------------------------------------------
| -M -l | -M -L |
---------------------------------------------------------------------------
| -M -s | -M -S |
---------------------------------------------------------------------------
| -a policy | -A [chain] -j POLICY | (voir -r et -m).
---------------------------------------------------------------------------
| -d policy | -D [chain] -j POLICY | (voir -r et -m).
---------------------------------------------------------------------------
| -i policy | -I 1 [chain] -j POLICY| (voir -r et -m).
---------------------------------------------------------------------------
| -l | -L |
---------------------------------------------------------------------------
| -z | -Z |
---------------------------------------------------------------------------
| -f | -F |
---------------------------------------------------------------------------
| -p | -P |
---------------------------------------------------------------------------
| -c | -C |
---------------------------------------------------------------------------
| -P | -p |
---------------------------------------------------------------------------
| -S | -s | Prend seulement un port ou un
| | | intervalle, pas de multiples.
---------------------------------------------------------------------------
| -D | -d | Prend seulement un port ou un
| | | intervalle, pas de multiples.
---------------------------------------------------------------------------
| -V | <none> | Utilise -i [nom].
---------------------------------------------------------------------------
| -W | -i |
---------------------------------------------------------------------------
| -b | -b | Dor�navant cr�e deux r�gles.
---------------------------------------------------------------------------
| -e | -v |
---------------------------------------------------------------------------
| -k | ! -y | Ne fonctionne pas � moins que
| | | -p tcp ne soit �galement sp�cifi�.
---------------------------------------------------------------------------
| -m | -j MASQ |
---------------------------------------------------------------------------
| -n | -n |
---------------------------------------------------------------------------
| -o | -l |
---------------------------------------------------------------------------
| -r [redirpt] | -j REDIRECT [redirpt] |
---------------------------------------------------------------------------
| -t | -t |
---------------------------------------------------------------------------
| -v | -v |
---------------------------------------------------------------------------
| -x | -x |
---------------------------------------------------------------------------
| -y | -y | Ne fonctionne pas � moins que
| | | -p tcp ne soit �galement sp�cifi�.
---------------------------------------------------------------------------
88..22.. EExxeemmpplleess ddee ccoommmmaannddeess iippffwwaaddmm ttrraadduuiitteess
Ancienne commande : ipfwadm -F -p deny
Nouvelle commande : ipchains -P forward DENY
Ancienne commande : ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
Nouvelle commande : ipchains -A forward -j MASQ -s 192.168.0.0/24 -d
0.0.0.0/0
Ancienne commande : ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D
0.0.0.0/0
Nouvelle commande : ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8
-d 0.0.0.0/0
(Notez qu'il n'y a pas d'�quivalent pour la sp�cification des
interfaces par leur adresse : utilisez le nom de l'interface. Sur
cette machine, 10.1.2.1 correspond � eth0).
99.. AAnnnneexxee :: uuttiilliisseerr llee ssccrriipptt iippffwwaaddmm--wwrraappppeerr
Le script shell ipfwadm-wrapper doit �tre un remplacement d'ipfwadm
pour la compatibilit� descendante avec ipfwadm 2.3a.
La seule option qu'il ne peut vraiment pas supporter est l'option
"-V". Lorsqu'elle est utilis�e, un avertissement est affich�. Si
l'option "-W" est �galement utilis�e, l'option "-V" est ignor�e.
Autrement, le script essaye de trouver le nom de l'interface associ�e
� cette adresse, en utilisant ifconfig. Si �a ne marche pas (comme
pour une interface d�sactiv�e), alors il sortira avec un message
d'erreur.
Cet avertissement peut �tre supprim� soit en changeant le "-V" pour un
"-W", ou en dirigeant la sortie standard du script vers /dev/null.
Si vous trouvez des erreurs dans ce script, ou une modification entre
les effets du vrai ipfwadm et de ce script, _v_e_u_i_l_l_e_z me rapporter le
probl�me : envoyez un courrier �
[email protected] avec le sujet
"BUG-REPORT". Veuillez lister la version d'ipfwadm (ipfwadm -h), votre
version d'ipchains (ipchains --version), la version du script
d'emballage (ipfwadm-wrapper --version). Envoyez moi �galement la
sortie de ipchains-save. Merci d'avance.
Le m�lange d'ipchains avec le script ipfwadm-wrapper se fait � votre
propre p�ril.
1100.. AAnnnneexxee :: rreemmeerrcciieemmeennttss
Un grand merci � Michael Neuling, qui a �crit la pr�-version du code
d'IP chains en travaillant pour moi. Des excuses publiques pour avoir
rejet� son id�e de cache des r�sultats, qu'Alan Cox a propos� plus
tard et que j'ai finalement commenc� � impl�menter, ayant vu l'erreur
de mon c�t�.
Merci � Alan Cox pour son support technique par email 24h/24, et pour
ses encouragements.
Merci � tous les auteurs du code d'ipfw et d'ipfwadm, sp�cialement Jos
Vos. Rester aux chevilles des g�ants et tout �a... Ceci s'applique
�galement � Linux Torvalds et � tous les bricoleurs du noyau et de
l'espace utilisateur.
Merci aux beta testeurs, chasseurs d'erreurs diligents, surtout Jordan
Mendelson, Shaw Carruthers, Kevin Moule, Dr. Liviu Daia, Helmut Adams,
Franck Sicard, Kevin Littlejohn, Matt Kemner, John D. Hardin, Alexey
Kuznetsov, Leos Bitto, Jim Kunzman, Gerard Gerritsen, Serge Sivkov,
Andrew Burgess, Steve Schmidtke, Richard Offer, Bernhard Weisshuhn,
Larry Auton, Ambrose Li, Pavel Krauz, Steve Chadsey, Francesco
Potorti` et Alain Knaff.