Cette présentation va aborder plusieurs points distincts :
$ cd /usr/src/linux $ make [config|menuconfig|xconfig]
CONFIG_NETFILTER=y
CONFIG_NETFILTER_DEBUG=y
CONFIG_FILTER=y
$ make dep $ make clean $ make [zImage|bzimage] $ make modules # make modules_install
$ cd /usr/src/archives $ wget -m http://www.samba.org/netfilter/netfilter-0.1.17.tar.bz2 $ md5sum netfilter-0.1.17.tar.bz2 85aefbdf845b520cf316e37ae92d6501 netfilter-0.1.17.tar.bz2
Somme MD5 sur le site officiel : md5sum 85aefbdf845b520cf316e37ae92d6501
$ cd /usr/src $ bzip2 -dc /usr/src/archives/netfilter-0.1.17.tar.bz2 | tar xvf - $ cd /usr/src/netfilter-0.1.17 $ make # make install
Pour que le filtrage soit pris en compte, puisque Netfilter fonctionne à base de modules, il est nécessaire de les charger.
# /sbin/modprobe netfilter_devPermet le chargement du module de gestion du filtrage de paquets.
# /sbin/modprobe iptablesPermet de charger le module admettant l'interaction entre le module de filtrage et iptables (outil supportant la gestion du filtrage).
# /sbin/modprobe ipt_statePermet de charger le module gérant la table d'états des connexions.
# /sbin/modprobe ipt_tcpPermet de charger le module régissant les connexions TCP.
# /sbin/modprobe ipt_udpPermet de charger le module gérant les connexions UDP.
# /sbin/modprobe ipt_LOGPermet de charger le module fournissant la journalisation.
# /sbin/modprobe ipt_defragPermet de charger le module admettant le ré-assemblage des paquets fragmentés.
# /sbin/modprobe ip_conntrackPermet de charger le module gérant la mise en mémoire des demandes de connexions.
# /sbin/modprobe ip_conntrack_ftpPermet de charger le module gérant la mise en mémoire des demandes de connexions pour le cas du FTP.
# /sbin/modprobe ip_natPermet de charger le module gérant la table des masquages d'adresses.
# /sbin/modprobe ip_nat_ftpPermet de charger le module gérant la table des masquages d'adresses pour le cas du FTP.
Pour que le filtrage soit en place à chaque démarrage, il est nécessaire de charger les modules à chaque 'boot', puis de lancer les règles de filtrage/masquage.
# cd /etc/init.d # cat filtres.sh #!/bin/sh # modprobe=/sbin/modprobe iptables=/sbin/iptables # $modprobe iptables || exit 1 $modprobe ipt_state || exit 1 $modprobe ipt_tcp || exit 1 $modprobe ipt_udp || exit 1 $modprobe ipt_LOG || exit 1 $modprobe ipt_defrag || exit 1 $modprobe ip_conntrack || exit 1 $modprobe ip_conntrack_ftp || exit 1 $modprobe ip_nat || exit 1 $modprobe ip_nat_ftp || exit 1 # $iptables -F $iptables -P INPUT DROP $iptables -P OUTPUT DROP $iptables -P FORWARD DROP # [... règles de filtrage ...] # # ln -s /etc/init.d/filtres.sh /etc/rc2.d/S10filtres(Le lien lançant les filtres dépend des distributions de Linux)
Le 'stateful' est la possibilité de garder en mémoire, dans une table d'états, les connexions en cours. Cela permet d'associer que tel client (adresse IP cliente) vers tel serveur (adresse IP serveur) est en train de faire telle chose (connexion du port source x vers le port destination y).
On ne filtre plus simplement maintenant, sur le filtrage TCP/UDP, mais sur l'état en cours des connexions. La fenêtre du paquet retour correspond bien à la transaction en cours, et aux numéros de séquence associés.
La fonction ACCEPT permet, lorsqu'elle est appliquée à une règle, d'accepter les paquets qui correspondent à cette règle
La fonction DROP permet, lorsqu'elle est appliquée à une règle, de refuser un paquet, mais sans avertir le demandeur que sa demande de connexion lui a été refusée.
La fonction REJECT permet, lorsqu'elle est appliquée à une règle, de refuser un paquet, mais en avertissant le demandeur que sa demande de connexion lui a été refusée en lui envoyant un paquet RESET (RST).
IMPORTANT :
Il y a par défaut, trois chaînes. Ces chaînes sont :
Les paquets sont filtrés par la chaîne INPUT lorsqu'ils arrivent sur l'interface sur laquelle ils sont appliqués (en entrée d'interface et à destination de la machine sur laquelle les filtres sont appliqués).
Les paquets sont filtrés par la chaîne OUTPUT lorsqu'ils sortent de l'interface sur laquelle ils sont appliqués (en sortie d'interface de la machine sur laquelle les filtres sont appliqués).
Les paquets sont filtrés par la chaîne FORWARD lorsqu'ils traversent la machine (il peut s'agir de filtre en entrée d'interface, comme en sortie d'interface).
Une chaîne peut être assimilée à une 'politique' de sécurité par rapport à des services prédéfinis faisant partie de cette politique. Ces chaînes ou 'politiques' sont decidées et définies par l'administrateur du garde barrière (service sécurité et direction).
Exemples :
# iptables -N internet
# iptables -A INPUT -i eth0 -j internet
# iptables -A internet -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A internet -p all -s any/0 -d any/0 -j LOG
# iptables -A internet -i eth0 -p tcp -s 0/0 -d 10.0.0.1/32 --source-port 1023: --destination-port 22 -j ACCEPT
# iptables -A internet -i eth0 -p all -s any/0 -d any/0 -j DROP
iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -s 0/0 -d 0/0 -p icmp --icmp-type 3 -j ACCEPT iptables -A OUTPUT -s 0/0 -d 0/0 -p icmp --icmp-type 3 -j ACCEPT iptables -A FORWARD -s 0/0 -d 0/0 -p icmp --icmp-type 3 -j ACCEPT iptables -N internet_vers_web_local iptables -A FORWARD -i eth0 -j internet_vers_web_local iptables -A internet_vers_web_local -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A internet_vers_web_local -i eth0 -p tcp -s 0/0 -d 192.70.106.71/32 --source-port 1023: --destination-port 80 -j ACCEPT iptables -A internet_vers_web_local -p all -s any/0 -d any/0 -j LOG iptables -A internet_vers_web_local -i eth0 -p all -s any/0 -d any/0 -j DROP iptables -N interne_vers_internet iptables -A FORWARD -o eth0 -j interne_vers_internet iptables -A interne_vers_internet -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A interne_vers_internet -o eth0 -p tcp -s 192.70.106.0/0 -d 0/0 --dport 53 -j ACCEPT iptables -A interne_vers_internet -o eth0 -p udp -s 192.70.106.0/0 -d 0/0 --dport 53 -j ACCEPT iptables -A interne_vers_internet -o eth0 -p tcp -s 192.70.106.0/0 -d 0/0 --sport 1023: --dport 80 -j ACCEPT iptables -A interne_vers_internet -o eth0 -p all -s 192.70.106.0/0 -d 0/0 --sport 1023: --dport 137:139 -j DROP iptables -A interne_vers_internet -p all -s any/0 -d any/0 -j LOG iptables -A interne_vers_internet -o eth0 -p tcp -s 192.70.106.0/0 -d 0/0 --dport 22 -j ACCEPT iptables -A interne_vers_internet -o eth0 -p all -s any/0 -d any/0 -j DROP