IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
next up previous contents index index
suivant: la translation d'adresses: NAT monter: Administration Réseaux précédent: les fichiers hosts.allow et   Table des matières   Index

Sous-sections


installation d'un Firewall

Avant de commencer il faudra différencier plusieurs cas:
  • le premier est la configuration du firewall sous kernel 2.2* auquel cas il faudra utiliser ``ipchains''.
  • le second sous kernel 2.4* auquel cas il faudra utiliser ``netfilter'' avec ``iptables''.
  • enfin sous OpenBSD3.0 avec l'utilisation de pf (packet filter and NAT subsystems).
Dans le cas d'une version de Mandrake > Mandrake8.0, on utilisera netfilter (iptables). Le firewall agit comme un goulot d'étranglement par lequel toutes les machines d'un réseau doivent passer pour communiquer avec l'extérieur. Il existe deux grandes familles de firewalls :
___________________________________________________________________
Les firewalls IP ou filtrants
Ils fonctionnent au niveau paquet (niveau 3 du modèle OSI). Ils sont conçus pour contrôler le flux de paquets en fonction de l'adresse IP d'origine, l'adresse IP de destination, ainsi que le port et l'information de type de paquet contenue dans chacun de ceux-ci. Ils permettent une bonne sécurité face aux différentes attaques.
___________________________________________________________________
les firewalls dits ``proxy''
Ils fonctionnement au niveau applicatif, et font passer les requêtes d'un réseau à l'autre: ils permettent ainsi l'accès indirect à internet. L'inconvénient ici est que chaque utilisateur doit configurer manuellement son navigateur web ou son client FTP pour communiquer avec l'extérieur via le proxy. Au contraire, un firewall filtrant permet un accès transparent pour l'utilisateur, tout en assurant une bonne sécurité, puisque l'on peut totalement contrôler le flux qui le traverse. Nous nous concentrerons essentiellement sur le premier type de firewall. Les proxys seront présentés dans la dernière partie de l'exposé traitant des autres développements applicatifs possibles sous Linux.
___________________________________________________________________
Configuration
________________________________________________________________
Architecture
Image images/pic1.jpg
La figure précédente représente une architecture classique de réseau d'entreprise derrière un firewall. On y distingue :
  1. Internet, auquel l'entreprise est reliée par le routeur du fournisseur d'accès,
  2. une DMZ (DeMilitarised Zone ou zone démilitarisée) qui contient les serveurs publics de l'entreprise : serveur web interne, serveur mail, serveur de fichiers public etc.,
  3. l'intranet de l'entreprise, zone privée et protégée de l'entreprise.
Physiquement, la machine sur laquelle tourne le firewall comporte trois cartes Ethernet, connectées au routeur, au LAN de la DMZ, et au LAN privé de l'entreprise. nous supposerons pour le reste de cette section que le réseau a pour paramètres:
  • address: 192.168.1.1
  • netmask: 255.255.255.0
  • network: 192.168.1.0
  • broadcoast: 192.168.1.255


Configuration de Netfilter (IPtables)

___________________________________________________________________
Installation
Système commande d'installation démarrage du service
RedHat rpm -Uvh iptables-*.rpm /etc/init.d/iptables start
Mandrake urpmi iptables /etc/init.d/iptables start
Debian il faudra utiliser un noyau 2.4
OpenBSD iptables n'existe pas sous OpenBSD

Le problème est que le firewall par défaut sur Mandrake et RedHat est pour des raisons de compatibilité ipchains. Il va donc être nécessaire d'arrêter ``ipchains'' avant de pouvoir utiliser ``iptables'', pour se faire:
/etc/init.d/ipchains stop
rmmod ipchains

Afin de vérifier que le noyau supporté a été compilé avec l'option Netfilter, il faut vérifier que ip_conntrack & ip_tables apparaissent bien avec la commande ``dmesg''.
dmesg | grep ip_conntrack
dmesg | grep ip_tables
sinon:
# modprobe ip_tables
# modprobe ip_nat_ftp
# modprobe ip_nat_irc
# modprobe iptable_filter
# modprobe iptable_mangle
# modprobe iptable_nat
Si on a besoin de pouvoir forwarder les paquets IP (dans la plupart des cas), il sera nécessaire d'exécuter cette commande :
# echo 1 > /proc/sys/net/ipv4/ip_forward
___________________________________________________________________
Utilisation
Dans la configuration de base les paquets passent par trois chaînes de règles:
  • INPUT: par laquelle passent tous les paquets entrant par une interface.
  • FORWARD: par laquelle passent tous les paquets qui sont transmis d'une interface à une autre.
  • OUTPUT: par laquelle passent tous les paquets avant de sortir d'une interface.
Les quatres comportements les plus courants sont:
  • ACCEPT: On laisse passer le paquet.
  • REJECT: On rejette le paquet et on envoie le paquet d'erreur associé.
  • LOG: Enregistre une notification du paquet dans syslog.
  • DROP: Le paquet est ignoré aucune réponse n'est envoyé.
Voici les principales options de iptables:
  • N: Création d'une nouvelle chaîne.
  • X: Suppression d'une chaîne vide.
  • P: Changement de la politique par défaut d'une chaîne.
  • L: Liste les règles d'une chaîne.
  • F: Élimine toutes les règles d'une chaîne.
Enfin pour les modifications de chaînes:
  • A: Ajoute une règle à la fin d'une chaîne.
  • I: Insère une nouvelle règle a une position donnée.
  • R: Remplace une règle donnée dans une chaîne.
  • D: Efface une règle dans une chaîne (numéro d'ordre ou règle).
___________________________________________________________________
Exemples
Pour nater sur l'interface eth0:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Pour créer un proxy transparent:
iptables -t nat -A PREROUTING -s ! 192.168.1.1
-i eth0 -p tcp -dport 80 -j REDIRECT -to-port 3128
Pour supprimer les règles actives:
iptables -F
iptables -F -t nat
iptables -X
Afin d'empêcher les ping des autres machines:
iptables -A INPUT -s 192.168.1.217 -p icmp -icmp-type echo-reply -j DROP
Afin de supprimer la première règle:
iptables -D INPUT 1
Afin de refuser tout trafic TCP sauf ce qui provient de l'adresse IP 192.168.1.217 sera traduite par la commande suivante :
iptables -A INPUT -p tcp -source ! 192.168.1.217 -j DENY
Afin de spécifier un protocole : tcp, udp, icmp, all (tous) -> -p -protocol
iptables -A INPUT -p icmp -j DENY
Afin de spécifier la source: -s -source
iptables -A INPUT -p tcp -s 192.168.42.42 -j ACCEPT
Afin de spécifier une adresse destination: -d -destination
iptables -A FORWARD -p tcp -d 10.1.0.1 -j ACCEPT
Afin de spécifier une interface d'entrée: -i -in-interface
iptables -A INPUT -p icmp -i eth0 -j DENY
Afin de spécifier une interface de sortie: -o -out-interface
iptables -A OUTPUT -p icmp -o eth0 -j DENY
Afin de spécifier le port source ou une plage de ports: -sport -source-port :
iptables -A INPUT -p tcp -sport 80 -j ACCEPT
iptables -A INPUT -p udp -sport 80 -j DROP
iptables -A OUTPUT -p tcp -m multiport -sport 3128,21,1000 -j DROP
iptables -A OUTPUT -p tcp -sport 1024:2042 -j ACCEPT
Afin de spécifier le port destination: -dport -destination-port
iptables -A INPUT -p tcp -dport 110 -j DENY
iptables -A INPUT -p udp -dport 110 -j DENY
iptables -A INPUT -p tcp -m multiport -dport 110,4242,119 -j DROP
iptables -A INPUT -p tcp -sport 4925:4633 -j ACCEPT
Pour rediriger sur la DMZ:
iptables -t nat -A PREROUTING -d 42.42.42.42
-p tcp -dport 80 -j DNAT -to-destination 192.168.1.2:80
Règle SSH:
iptables -A INPUT -i eth1 -s 192.168.2.42 -m state
-state NEW,ESTABLISHED -p tcp -dport 22 -j LOG_ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.2.42 -m state
-state ESTABLISHED -p tc -sport 22 -j LOG_ACCEPT
___________________________________________________________________
Exemples de script pour iptables
############### exemple de conf pour iptables #####################
_____________________________________________________________
#!/bin/sh
## Information sur le réseau.
INTERNALIF="eth1" # Carte donnant sur le réseau interne.
INTERNALNET="192.168.1.0/24" # IP Réseau Interne.
INTERNALBCAST="192.168.1.255" # IP Broadcast.
EXTERNALIF="eth0" # Carte donnant sur l'extérieur.
EXTERNALIP="1.2.3.4"# Adresse IP externe nécessaire en cas de DNAT.
_____________________________________________________________
## Suppression de toutes les règles:
iptables -F INPUT # règles sur les paquets entrants
iptables -F OUTPUT # règles sur les paquets sortants
iptables -F FORWARD # règles sur le Forwarding/masquerading
iptables -t nat -F # règles sur le Nat
_____________________________________________________________
##Modification des règles tcp/ip du noyau.
#Disabling IP Spoofing attacks.
echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter
# Ne pas répondre aux pings broadcast
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# autorisation du forwarding
echo 1 >/proc/sys/net/ipv4/ip_forward
# Blockage routage
echo 0 >/proc/sys/net/ipv4/conf/all/accept_source_route
# Suppression des timestamps.
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# autorisation des SYN Cookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# empêche les redirections
echo 0 >/proc/sys/net/ipv4/conf/all/accept_redirects
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# autorise les adresses IP dynamiques
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# Log pacquets avec des adresses impossibles.
echo 1 >/proc/sys/net/ipv4/conf/all/log_martians
#Set out local port range
echo "32768 61000" >/proc/sys/net/ipv4/ip_local_port_range
_____________________________________________________________
# Réduit les DoS en réduisant les timeouts
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
_____________________________________________________________
## Mise en place des règles de base.
# rejet des mauvais paquets: trop courts, les paquets
# TCP et UDP ayant zéro comme source ou comme destination,
# taille nulle ou trop grande, paquets fragmentés
# pour plus dinfo http://www.linux-mag.com/2000-01/bestdefense_02.php
iptables -A INPUT -m unclean -j DROP
iptables -A FORWARD -m unclean -j DROP
iptables -A INPUT -m state -state INVALID -j DROP
iptables -A FORWARD -m state -state INVALID -j DROP
_____________________________________________________________
# autorise toutes les connections sur l'interface interne
iptables -A INPUT -i lo -j ACCEPT
_____________________________________________________________
# Refuse les connections depuis l'interface interne vers l'extérieur.
iptables -A INPUT -d 127.0.0.0/8 -j REJECT
_____________________________________________________________
# traffic illimité depuis le réseau interne.
iptables -A INPUT -i $INTERNALIF -s $INTERNALNET -j ACCEPT
_____________________________________________________________
# autorise tunnel IPV6.
#iptables -A INPUT -p ipv6 -j ACCEPT
_____________________________________________________________
# autorise tunnel IPSEC.
#iptables -A INPUT -p 50 -j ACCEPT
# autorise tous paquets depuis le serveur ipsec vers le réseau interne.
#iptables -A FORWARD -i ipsec0 -o $INTERNALIF -j ACCEPT
_____________________________________________________________
# Refuse tous paquets depuis l'extérieur prétendant être du réseau interne.
iptables -A INPUT -i $EXTERNALIF -s $INTERNALNET -j REJECT
_____________________________________________________________
## ICMP
# ne pas faire suivre les pings de l'extérieur vers le réseau interne.
iptables -A FORWARD -p icmp -icmp-type echo-request -o
$INTERNALIF -j REJECT
_____________________________________________________________
#protection contre le ping flood.
iptables -A INPUT -p icmp -icmp-type echo-request -m limit
-limit 1/s -j ACCEPT
iptables -A INPUT -p icmp -icmp-type echo-request -j DROP
_____________________________________________________________
# Refuse l'icmp vers une adresse de broadcast.
iptables -A INPUT -p icmp -d $INTERNALBCAST -j DROP
_____________________________________________________________
# autorise tout autre icmp.
iptables -A INPUT -p icmp -j ACCEPT
_____________________________________________________________
# autorise les connections établies.
iptables -A INPUT -m state -state ESTABLISHED,RELATED -j ACCEPT
_____________________________________________________________
# Refuse de rediriger les paquets samba
iptables -A FORWARD -o $EXTERNALIF -p tcp -dport 137 -j REJECT
iptables -A FORWARD -o $EXTERNALIF -p tcp -dport 138 -j REJECT
iptables -A FORWARD -o $EXTERNALIF -p tcp -dport 139 -j REJECT
iptables -A FORWARD -o $EXTERNALIF -p udp -dport 137 -j REJECT
iptables -A FORWARD -o $EXTERNALIF -p udp -dport 138 -j REJECT
iptables -A FORWARD -o $EXTERNALIF -p udp -dport 139 -j REJECT
iptables -A INPUT -i $EXTERNALIF -p udp -dport 137 -j REJECT
_____________________________________________________________
# Autorise tous les autres paquets à être forwardé
iptables -A FORWARD -o $EXTERNALIF -i $INTERNALIF -j ACCEPT
iptables -A FORWARD -i $EXTERNALIF -m state
-state ESTABLISHED,RELATED -j ACCEPT
_____________________________________________________________
# autorise les requêtes DHCP en tant que client.
#iptables -A INPUT -p udp -d 255.255.255.255 -dport 68 -j ACCEPT
_____________________________________________________________
# autorise les requêtes DHCP en tant que serveur.
#iptables -A INPUT -i $INTERNALIF -p tcp -sport 68 -dport 67 -j ACCEPT
#iptables -A INPUT -i $INTERNALIF -p udp -sport 68 -dport 67 -j ACCEPT
_____________________________________________________________
# autorise les requêtes vers les serveur DNS contenus
# dans /etc/resolv.conf:
#cat /etc/resolv.conf |
#awk '/nameserver/ {print $2}' |
#xargs -n1 iptables -A INPUT -p udp -sport 53 -j ACCEPT -s
_____________________________________________________________
# autorise les paquets entrant pour les différents services listés:
iptables -A INPUT -p tcp -dport 20 -j ACCEPT # ftp-data
iptables -A INPUT -p tcp -dport 21 -j ACCEPT # ftp
iptables -A INPUT -p tcp -dport 22 -j ACCEPT # ssh
#iptables -A INPUT -p tcp -dport 23 -j ACCEPT #telnet
_____________________________________________________________
# autorise les paquets à destination du serveur de mail mais les limitent
# à 1 par seconde pour éviter les attaques de type DoS.
iptables -A INPUT -p tcp -dport 25 -syn -m limit -limit 1/s
-limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp -dport 25 -syn -j DROP
iptables -A INPUT -p tcp -dport 25 -j ACCEPT
# DNS
iptables -A INPUT -p tcp -dport 53 -j ACCEPT
iptables -A INPUT -p udp -dport 53 -j ACCEPT
# http
iptables -A INPUT -p tcp -dport 80 -j ACCEPT
# POP3
#iptables -A INPUT -p tcp -dport 110 -j ACCEPT
_____________________________________________________________
# Imaps
iptables -A INPUT -p tcp -dport 993 -j ACCEPT
# identd
#iptables -A INPUT -p tcp -dport 113 -j ACCEPT
# https
iptables -A INPUT -p tcp -dport 443 -j ACCEPT
#pserser
iptables -A INPUT -p tcp -dport 2401 -j ACCEPT
# autorise les paquets à destination du serveur VNC ce qui
# n'est pas forcément une bonne idée.
#iptables -A INPUT -p tcp -dport 5801 -j ACCEPT
#iptables -A INPUT -p tcp -dport 5901 -j ACCEPT
#iptables -A INPUT -p tcp -dport 6001 -j ACCEPT
_____________________________________________________________
## DNAT
#iptables -A PREROUTING -t nat -i $EXTERNALIF -p tcp
# -d $EXTERNALIP -dport 80 -j DNAT -to 192.168.0.10:80
#iptables -A FORWARD -i $EXTERNALIF -p tcp
# -d 192.168.0.10 -dport 80 -j ACCEPT
#iptables -A PREROUTING -t nat -i $EXTERNALIF -p tcp
# -d $EXTERNALIP -dport 25 -j DNAT -to 192.168.0.10:25
#iptables -A FORWARD -i $EXTERNALIF -p tcp
# -d 192.168.0.10 -dport 25 -j ACCEPT
_____________________________________________________________
# Certains services doivent être ``loggés'' et refusés
#iptables -A INPUT -p tcp -dport 1433 -m limit -j LOG
# -log-prefix "Firewalled packet: MSSQL "
#iptables -A INPUT -p tcp -dport 1433 -j DROP
#iptables -A INPUT -p tcp -dport 6670 -m limit -j LOG
# -log-prefix "Firewalled packet: Deepthrt "
#iptables -A INPUT -p tcp -dport 6670 -j DROP
#iptables -A INPUT -p tcp -dport 6711 -m limit -j LOG
# -log-prefix "Firewalled packet: Sub7 "
#iptables -A INPUT -p tcp -dport 6711 -j DROP
# -log-prefix "Firewalled packet: BO "
#iptables -A INPUT -p tcp -dport 31337 -j DROP
iptables -A INPUT -p tcp -dport 6000 -m limit -j LOG
-log-prefix "Firewalled packet: XWin "
iptables -A INPUT -p tcp -dport 6000 -j DROP
_____________________________________________________________
# traceroutes
iptables -A INPUT -p udp -dport 33434:33523 -j DROP
iptables -A INPUT -p tcp -dport 113 -j REJECT
_____________________________________________________________
# Ne pas ``logger'' les paquets igmp
iptables -A INPUT -p igmp -j REJECT
_____________________________________________________________
# Ne pas ``logger'' les requêtes http{s}
iptables -A INPUT -p tcp -dport 80 -j REJECT
iptables -A INPUT -p tcp -dport 443 -j REJECT
_____________________________________________________________
# Si les paquets ne correspondent à aucune des règles, on les
# ``log'' et on les rejettes
iptables -A INPUT -p tcp -syn -m limit -limit 5/minute -j LOG
-log-prefix "Firewalled packet:"
iptables -A FORWARD -p tcp -syn -m limit -limit 5/minute -j LOG
-log-prefix "Firewalled packet:"
_____________________________________________________________
# Rejet
iptables -A INPUT -p tcp -j REJECT -reject-with tcp-reset
iptables -A INPUT -p all -j DROP
iptables -A FORWARD -p tcp -j REJECT -reject-with tcp-reset
iptables -A FORWARD -p all -j DROP
_____________________________________________________________
# autorise tout de même si elles se dirigent vers l'extérieur
iptables -A OUTPUT -j ACCEPT
_____________________________________________________________
# Masquerage des connections internes vers l'extérieur
iptables -A POSTROUTING -t nat -o $EXTERNALIF -j MASQUERADE
exit 0


Configuration de pf (packet filter)

Pour toute information complémentaire vous pourrez consulter le OpenBSD
Packet Filter HOWTO à l'adresse: http://www.inebriated.demon.nl/pf-howto/html/http://www.inebriated.demon.nl/pf-howto/html
___________________________________________________________________
Commandes de base
Pour activer vos règles aprés avoir complété le fichier de configuration /etc/pf.conf
activation pfctl -f /etc/pf.conf
désactivation pfctl -F all
############### exemple d'un fichier /etc/pf.conf #####################
_____________________________________________________________
ext_if="xl0"
int_if="vr0"
unroutable="{ 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12,
192.168.0.0/16, 255.255.255.255/32 }"
services_tcp="{ smtp, submission, domain, auth, www, https, > 1024 }"
services_udp="{ domain }"
ipv6_net="{ 2001:470:1f00:ffff::245, 2001:470:1f00:390:0:0:0:0/64 }"
# See pf.conf(5) for syntax and examples
# My external interface is kue0 (62.65.145.30, my only routable address) and
# the private network is 10.0.0.0/8, for which i'm doing NAT. There's an
# IPv6 tunnel, too.
# normalize all packets
scrub out all
scrub in all
# nat private network to single routable address
nat on $ext_if inet from 192.168.1.0/24 to any -> $ext_if
# redirect https connections from work to sshd
#rdr on $ext_if inet proto tcp from 0.0.0.0
# to $ext_if port 443 -> $ext_if port 22
#rdr on $int_if inet proto tcp from 0.0.0.0
# to $int_if port 443 -> $ext_if port 22
# block and log everything by default
block out log all
block in log all
block return-rst out log inet proto tcp all
block return-rst in log inet proto tcp all
block return-icmp out log inet proto udp all
block return-icmp in log inet proto udp all
# unfiltered interfaces
pass out quick on { lo0, enc0, $int_if } all
pass in quick on { lo0, enc0, $int_if } all
# ==============================================
# common rules for all filtered interfaces
# ==============================================
# silently drop noise
block return-rst in quick proto tcp from any to any
port { 111, 6000, 6667 }
block return-icmp in quick proto udp from any to any
port { 137 }
# silently drop TCP non-SYN packets (only SYNs create state)
block out quick proto tcp all flags /S
block in quick proto tcp all flags /S
# ==============================================
# external interface (all external IPv4 traffic)
# ==============================================
# block and log outgoing packets that don't have my address as source, they are
# either spoofed or something is misconfigured (NAT disabled, for instance),
# we want to be nice and don't send out garbage.
block out log quick on $ext_if inet from !$ext_if to any
# silently drop broadcasts (ADSL noise)
block in quick on $ext_if inet from any to { 255.255.255.255, 62.65.145.31 }
# block and log incoming packets from reserved address space and invalid
# addresses, they are either spoofed or misconfigured, we can't reply to
# them anyway (hence, no return-rst).
block in log quick on $ext_if inet from $unroutable to any
# ICMP
pass out on $ext_if inet proto icmp from $ext_if to any
icmp-type 8 code 0 keep state
pass in on $ext_if inet proto icmp from any to $ext_if
icmp-type 8 code 0 keep state
# UDP
pass out on $ext_if inet proto udp from $ext_if to any
keep state
pass in on $ext_if inet proto udp from any to $ext_if
port $services_udp keep state
# TCP
pass out on $ext_if inet proto tcp from $ext_if to any
flags S/SA keep state
pass in on $ext_if inet proto tcp from any to $ext_if
port $services_tcp flags S/SA keep state
# other protocols (IPv6 tunnel)
pass out on $ext_if inet proto ipv6 from $ext_if to 64.71.128.82 keep state
pass in on $ext_if inet proto ipv6 from 64.71.128.82 to $ext_if keep state
# ==============================================
# tunnel interface (all external IPv6 traffic)
# ==============================================
# ICMP
pass out on gif0 inet6 proto ipv6-icmp from $ipv6_net to any
ipv6-icmp-type echoreq keep state
pass in on gif0 inet6 proto ipv6-icmp from any to $ipv6_net
ipv6-icmp-type echoreq keep state
# UDP
pass out on gif0 inet6 proto udp from $ipv6_net to any keep state
pass in on gif0 inet6 proto udp from any to $ipv6_net
port $services_udp keep state
# TCP
pass out on gif0 inet6 proto tcp from $ipv6_net to any flags S/SA keep state
pass in on gif0 inet6 proto tcp from any to $ipv6_net
port $services_tcp flags S/SA keep state


Configuration du filtrage IP (IPchains)

___________________________________________________________________
Installation
Système commande d'installation démarrage du service
RedHat rpm -Uvh ipchains-*.rpm
Mandrake urpmi ipchains

Les ipchains Linux sont une réécriture du code pare-feu IPv4 de Linux (en grande partie inspiré de BSD) ainsi que de ipfwadm qui était lui-même une réécriture du ipfw de BSD. Il est indispensable d'administrer les filtres de paquets IP dans les noyaux Linux versions 2.1.102 et au-delà. On travaille avec les chaînes par noms. Il existe au début trois chaînes prédéfinies input, output et forward, qu'il est impossible de supprimer. On peut créer des chaînes personnelles. Des règles peuvent ensuite être ajoutées et supprimées de ces ensembles de règles. Les opérations nécessaires pour travailler sur les chaînes sont les suivantes :
  1. création d'une nouvelle chaîne (-N) ;
  2. suppression d'une chaîne vide (-X) ;
  3. modification de la spécification pour une chaîne prédéfinie (-P)
  4. liste des règles d'une chaîne (-F) ;
  5. remise à zéro des compteurs de paquets et d'octets de toutes les règles d'une chaîne (-Z).
Il existe différentes méthodes pour manipuler les règles à l'intérieur des chaînes :
  1. ajout d'une nouvelle règle dans une chaîne (-A) ;
  2. insertion d'une nouvelle règle à une position donnée d'une chaîne (-I) ;
  3. remplacement d'une règle à une position donnée d'une chaîne (-R) ;
  4. suppression d'une règle à une position donnée d'une chaîne (-D) ;
  5. suppression de la première règle correspondante dans une chaîne (-D).
Il existe quelques opérations pour le masquage qui se trouvent dans ipchains dans l'attente d'un bon emplacement pour les placer :
  1. liste des connexions actuellement masquées (-M -L) ;
  2. positionnement du temps d'expiration du masquage (-M -S).
Il y a quelques détails de chronologie qui interviennent dans la modification des règles de pare-feu. Si l'on n'est pas suffisamment prudent, il est possible de laisser passer quelques paquets pendant la mise en place des modifications. Une approche simpliste est la suivante :
# ipchains -I input 1 -j DENY
# ipchains -I output 1 -j DENY
# ipchains -I forward 1 -j DENY
... réalisation des modification ...
# ipchains -D input 1
# ipchains -D output 1
# ipchains -D forward 1

Cela interdit tout passage de paquet durant les modifications. Voici une copie des règles de pare-feu qui précèdent dans IPchains :
#!/bin/sh
#
# rc.firewall
#
## Tout vider et repartir du debut
/sbin/ipchains -F input
/sbin/ipchains -F output
/sbin/ipchains -F forward
## Redirection pour le mandatement transparent de HTTP
#$IPCHAINS -A input -p tcp -s 192.1.2.0/24 -d 0/0 80 -j REDIRECT 8080
## Création de nos propres chaînes
/sbin/ipchains -N ma-chaine
# On autorise le courriel entrant vers le serveur
/sbin/ipchains -A ma-chaine -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT
# On autorise les connexions courriel vers l'extérieur
/sbin/ipchains -A ma-chaine -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT
# On autorise les connexions web entrantes vers le serveur
/sbin/ipchains -A ma-chaine -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT
# On autorise les connexions web vers l'extérieur
/sbin/ipchains -A ma-chaine -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT
# On autorise le trafic DNS
/sbin/ipchains -A ma-chaine -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT
## Si on utilise le masquage
# On ne masque pas le trafic interne
/sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT
# On ne masque pas l'interface externe directe
/sbin/ipchains -A forward -s 199.1.2.0/24 -d 0/0 -j ACCEPT
# On masque tout paquet interne qui sort
/sbin/ipchains -A forward -s 192.1.2.0/24 -d 0/0 -j MASQ
## On interdit tout le reste
/sbin/ipchains -P my-chains input DENY
Il ne faut pas s'arrêter là. Ce n'est pas un pare-feu très puissant (cf. IPCHAINS-HOWTO).
next up previous contents index index
suivant: la translation d'adresses: NAT monter: Administration Réseaux précédent: les fichiers hosts.allow et   Table des matières   Index