Atelier Netfilter : Le firewall Linux en action

Introduction

I Rappels sur Netfilter

II Filtrages de base

III Filtrages plus évolués

IV Firewall et serveurs

Conclusion

Olivier ALLARD-JACQUIN

I - Rappels sur Netfilter

Vue générale et hooks

Règles

Chaînes

Tables

Iptables

Vue générale et hooks

Netfilter : 5 crochets (hooks) dans la pile réseau IP

Un crochet est composé d'une chaîne

Une chaîne est composée de règles

Une règle contient des critères et une cible

Règles

Critères :

Interface entrée / sortie

Adresse source / destination

Port source / destination

Type de trames

Nombre de paquets

Flags TCP

Etc...

Cible

DROP

REJECT

ACCEPT

LOG / ULOG

MASQUERAD

SNAT / DNAT

MARK

Chaîne utilisateur

Etc...

Chaînes

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

Tables

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

FILTER

MANGLE

NAT

Iptables

Syntaxe : iptables [table] [action] [critères] [cible]

[table]

-t

[action]

-Z, -F, -X, -L, -N, -A, -D, -P

[critères]

-i, -o, -s, -d, -p, --sport , --dport, -m, --state

[cible]

-j

II - Filtrages de base

Principes généraux du filtrage

Initialisation des chaînes

Cible/politique de filtrage par défaut

Filtrage de ports

Log

Principes généraux du filtrage

Initialisation du firewall (suppression des règles / chaînes existantes)

Tout interdire par défaut (définition des cibles par défaut)

Autoriser uniquement les connexions nécessaires

Exercice préparatoire

Créer dans un répertoire de travail

Télécharger le script "restor_netfilter.sh"

Donner les droits d'exécution à ce script

Exercice : Initialisation des chaînes

Créer le script « initialisation1.sh »

Pour chaque table :

Suppression des chaînes pré-définies (-F)

Suppression des chaînes utilisateurs (-X)

Exercice : Cible/politique de filtrage par défaut

Créer le script « initialisation2.sh »

Rajouter les cibles par défaut :

Table FILTER :

Tout refuser

Table NAT :

Tout accepter

Table MANGLE :

Tout accepter

Exercice : Filtrage de ports 1/2

Test : ping 127.0.0.1

Test : ping ma_machine

Test : ping machine_présentateur

Réinitialiser Netfilter avec « restor_netfilter.sh »

Exercice : Filtrage de ports 2/2

Créer le script « filter1.sh »

Autoriser tout sur l'interface loopback ( -i lo / -o lo )

Autoriser les pings entrants et sortants sur eth0 ( -p icmp )

Autoriser le HTTP vers le serveur

Tests :

nmap machine -P 80 -P0

Astuces :

iptables -L -n

iptables -L -n -v

Exercice : LOG

Créer le script « log1.sh » à partir de « filter1.sh »

Même contraintes de filtrage que pour l'exercice précédent

Rajouter le log ( -j LOG )

Pour les paquets entrants qui vont être détruits

Pour les paquets sortants qui vont être détruits

Astuces :

tail -f /var/log/messages

rxvt_log messages

III - Filtrages plus évolués

Insuffisances du filtrage par ports

Suivi de connexion

Ulog

Chaînes utilisateurs

Contraintes de l'état NEW

Exercice : Insuffisances du filtrage par port

Supprimer le filtrage par adresses IP dans « filter1.sh » et le lancer

Tester sur une machine de la salle (pas cette du présentateur) :

nmap machine -g 80 -P0

Conclusions ?

Exercice : Suivi de connexion

Créer le script « filter2.sh »

Autoriser tout sur l'interface loopback ( -i lo / -o lo )

Autoriser uniquement les pings sortants sur eth0 ( -p icmp )

Autoriser le HTTP vers toutes les machines

Tests :

nmap machine -g 80 -P 80 -P0

Exercice : ULOG

Créer le script « log2.sh » à partir de « filter2.sh »

Même contraintes de filtrage que pour l'exercice précédent

Rajouter le ulog ( -j ULOG ) :

Pour les paquets entrants qui vont être détruits

Pour les paquets sortants qui vont être détruits

Astuces :

tail -f /var/log/ulog.syslogemu

rxvt_log netfilter

Exercice : Chaînes utilisateurs 1/2

Créer le script « userchaine1.sh » à partir de « filter1.sh »

Toutes les cibles par défaut à ACCEPT

Supprimer le filtrage par adresse IP

Créer une table utilisateur « LogDrop », qui :

1) Log le paquet

2) Supprime le paquet

Exercice : Chaînes utilisateurs 2/2

Créer le script « userchaine2b.sh » à partir de « userchaine2a.sh »

Optimiser le script en utilisant les chaînes utilisateur.

Objectif : Un paquet ne doit pas être traité par plus de 10 règles...

Contrainte de l'état NEW 1/2

Implémentation de l'état NEW dans le conntrack. Pas forcément très sûre

Un solution : patch « tcp-nopickup », mais trop contraignant...

Idée : Créer un script utilisant le suivi de connexion , mais sans utiliser l'état NEW...

Algorithme :

Interdire toutes les connexions entrantes invalides (-j INVALID)

Autoriser les connexions entrantes/sortantes déjà existantes ( -j ESTABLISHED,RELATED )

Autoriser les paquets sortants initiés par la machine ( --syn )

Exercice : Contrainte de l'état NEW 2/2

Créer le script « nonew1.sh » à partir de « initialisation2.sh »

Autoriser tout sur l'interface loopback ( -i lo / -o lo )

Autoriser les connexions pings, le HTTP et le FTP sortants sur eth0

Logger tout le reste

Contrainte : Ne pas utiliser le NEW ( --state NEW )

IV Firewall et serveurs

Serveur HTTP

Serveur FTP

Exercice : Serveur HTTP (web)

Créer le script « serveur1.sh » à partir de « nonew1.sh »

Autoriser tout sur l'interface loopback ( -i lo / -o lo )

Autoriser les connexions pings, le HTTP et le FTP sortants sur eth0

Autoriser les connexions pings et HTTP entrantes sur eth0

Limiter le ping à connexion 1/s

Exercice : Serveur FTP (fichiers)

Créer le script « serveur2.sh » à partir de « serveur1.sh »

Adapter pour un serveur FTP, les règles du serveur HTTP de l'exercice précédent

Conclusion

Règles d'or :

1 : Initialisation des tables

2 : DROP par défaut

3 : ACCEPT pour le strict minimum

Autres possibilités de Netfilter

Serveurs : Netfilter n'est pas le seul élément de sécurité

2003-07-01T21:44:08