Filtrage

Présentation des différentes méthodes de filtrage du traffic IPv6

Iptables : Un exemple de mise en oeuvre sur Phoce'an

Ce document présente la mise en place d’un « filtrage iptables » pour le trafic ipv6 sur un noyau linux supérieur à 2.4.4.

Le filtrage ipv4 peut être réalisé par « iptables » mais nous ne nous intéressons ici qu’au filtrage IPv6 “ip6tables” apparu dans la version 1.2.4 d’iptables. Il faut noter qu’ip6tables n’est pas aussi complet que dans la version standard pour IPv4. D’autre part, il est très facile de faire cohabiter le filtrage des deux protocoles.

Fonctionnement d’iptables

« Netfilter » est une infrastructure générale du noyau sur laquelle viennent se greffer d’autres modules parmis lesquels le module iptables. Iptables agit au niveau espace kernel ce qui le rend très sur puisqu’il ne peut être modifié par un utilisateur ou un programme donné. Il agit en 5 endroits du système de gestion de la pile IP. Pour chacun d’eux Netfilter associe une chaîne, qui est un ensemble de règles concernant les paquets IP sur leur origine, destination, taille, etc. En fonction de ces règles, iptables décide que faire du paquet. Les actions fréquemment utilisées sont :

  • DROP : le paquet est détruit.
  • ACCEPT : le paquet est autorisé à continuer à passer.
  • LOG : le paquet est autorisé à continuer mais ses caractéristiques sont loguées.
  • D’autres actions comme MARK, MASQUERADE, etc. existent aussi mais ont moins d’intérêt dans le cadre de ce document. Se référer au manuel d’ « ip6tables » pour connaître leur utilité en cas de besoin.

Chaque chaîne, définissant un ensemble de règles, peut être associée aux trois tables principales :

  • Filter : sert au filtrage des paquets IP.
  • Nat : utilisée pour la translation d’adresse.
  • Mangle : utilisée pourla modification des paquets IP notamment pour la qualité de service.

Mise en œuvre du filtrage

Dans le cadre du filtrage on n’utilisera que la table « Filter » qui concerne trois chaînes par défaut :

  • INPUT : contrôle les paquets à destinations des applications.
  • FORWARD : filtre les paquets qui passent d’une interface réseau à une autre.
  • OUTPUT : contrôle les paquets sortants des applications.

Remarque : il est possible de créer des chaînes supplémentaires si nécessaire.

La commande qui permet de manipuler les tables est ip6tables (voir à la fin du document : principales options de la commande ip6tables). Cette commande peut être utilisée en ligne de commande, mais les tables n’étant pas permanentes il est vivement conseillé de créer un script qui génère les tables et de le lancer automatiquement au démarrage du système (à positionner sous ../init.d). Toutes les commandes ip6tables s’appliquent à la table spécifiée : filter par défaut.

Au lancement de notre script, les actions suivantes sont réalisées :

  • Nettoyage pour partir sur des bases claires : Vider les règles pour toutes les tables par la commande ip6tables -F et supprimer les chaînes qui ne sont pas par défaut dans la table filter par la commande ip6table -X
  • Ajout des nouvelles chaînes par la commande ip6tables –N nom-de-la-chaine suivi des actions
  • Définition des politiques de sécurité par défaut pour chaque chaîne : généralement DROP ou ACCEPT, par la commande ip6tables –P nom-de-la-chaine action
  • Définition des règles d’usage local sous la forme Ip6tables –A nom-de-la-chaîne règle

Où règle défini par exemple le protocole, le port source et/ou destination, l’adresse source et/ou destination ou le réseau source et/ou le réseau destination et l’action à entreprendre. Pour plus de détail sur la syntaxe se référer au manuel d’ip6tables. L’ordre des règles de filtrage est important car lorsqu’une règle correspond les autres ne sont pas évaluées.

Pour lister les règles (en ligne de commande) utiliser la commande ip6tables –L qui affiche le contenu des règles en abrégé, pour une forme plus explicite utiliser les options : ip6tables -L -n -v –line-numbers.

Exemple de script

#/bin/bash

# ports bas
dw_ports="0:1023"

# ports hauts
up_ports="1024:65535"

start_fw() 
{

# Vidage des règles pour toutes les tables** 
ip6tables -F

# permet l’effacement de toutes les chaînes qui ne sont pas par défaut dans la
# table filter notamment LOG_ACCEPT
ip6tables -X

# Ajout d’une nouvelle chaîne qui a pour fonction de logguer
# dans syslog ce qui est accepté
ip6tables -N LOG_ACCEPT
ip6tables -A LOG_ACCEPT -j LOG -m limit --limit 500/hour --log-level 6 -log-prefix "[ip6tables-accept]"
ip6tables -A LOG_ACCEPT -j ACCEPT

# Mise en oeuvre des politiques de sécurité positionnées à DROP : par 
# défaut tout est refusé
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

# La machine est saine et les processus locaux peuvent communiquer
# entre eux via l'interface locale :
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

# Nos règles d'usage local
# Accès SSH depuis la zone de confiance et log
ip6tables -A OUTPUT -p tcp --sport ssh -d X:X:X:X::/64 --dport $up_ports ! –syn -j LOG_ACCEPT
ip6tables -A INPUT -p tcp --dport ssh --sport $up_ports  -s X:X:X:X::/64 -j LOG_ACCEPT

#Autorisation accès DNS udp 53 vers 53
ip6tables -A OUTPUT -p udp --dport domain --sport domain -j ACCEPT
ip6tables -A INPUT -p udp --sport domain --dport domain -j ACCEPT

#Autorisation acces DNS udp 53 et tcp 53 (requetes longues)
ip6tables -A OUTPUT -p udp --dport domain --sport $up_ports -j ACCEPT
ip6tables -A INPUT -p udp --sport domain --dport $up_ports -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport domain --sport $up_ports -j ACCEPT
ip6tables -A INPUT -p tcp --sport domain --dport $up_ports -j ACCEPT

# Autorisation serveur DNS udp 53 et tcp 53 (requêtes longues)
ip6tables -A INPUT -p udp --dport domain --sport $up_ports -j ACCEPT
ip6tables -A OUTPUT -p udp --sport domain --dport $up_ports -j ACCEPT
ip6tables -A INPUT -p tcp --dport domain --sport $up_ports -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport domain --dport $up_ports -j ACCEPT

#Autorisation ftp pour la zone de confiance
ip6tables -A OUTPUT -p tcp --dport 21 --sport $up_ports -d X:X:X:X::/64 -m state --state NEW,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p tcp --sport 21 --dport $up_ports -s X:X:X:X::/64 -m state --state ESTABLISHED -j ACCEPT

# Accès http et https
ip6tables -A INPUT -p tcp --sport http --dport $up_ports -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport http --sport $up_ports -j ACCEPT
ip6tables -A INPUT -p tcp --sport https --dport $up_ports -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport https --sport $up_ports -j ACCEPT

# Autorisations icmpv6 
ip6tables -A INPUT -p icmpv6 –icmpv6-type echo request -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT

# Log des paquets rejetés dans syslog
ip6tables -A INPUT -j LOG -m limit --limit 500/hour --log-level 6 --log-prefix "[ip6tables-in-reject]"
ip6tables -A OUTPUT -j LOG  -m limit --limit 500/hour --log-level 6 --log-prefix "[ip6tables-out-reject]"

}

load_modules() 
{

echo -en " Loading modules : "
echo -en "ip_tables, " ; /sbin/modprobe ip_tables
echo -en "ip_conntrack, " ; /sbin/modprobe ip_conntrack
echo -en "ip_conntrack_ftp, " ;/sbin/modprobe ip_conntrack_ftp
echo "ipt_limit" ; /sbin/modprobe ipt_limit

}

stop_fw() 
{

# Vidage des règles pour toutes les tables :
ip6tables -F

# permet l’effacement de toutes les chaînes qui ne sont pas par défaut dans la 
# table filter notamment LOG_ACCEPT
ip6tables -X

# On remet la politique par défaut à ACCEPT dans les trois tables par défaut
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

}

case "$1" in

start)

load_modules
start_fw
echo "firewall started"

stop)

stop_fw 
echo "firewall stopped"

restart)

stop_fw
echo "firewall stopped"
load_modules
start_fw
echo "firewall restarted"

*)

echo "usage: $0 [start|stop|restart]" >&2

;;

esac

ACL Cisco

Exemple de mise en oeuvre à Paris 1

Access-lists sur le routeur Cisco 7200 VXR

Sur l’interface du RAP : « permit » de tout ce qui n’est pas explicitement interdit

ipv6 access-list in-ipv6-pmf-rap
 deny ipv6 ::1/128 any
 deny ipv6 fec0::/48 any
 deny ipv6 2001:660:3305::/48 any
! entrée unique de la messagerie
 permit tcp any host 2001:660:3305:0:203::71 eq smtp
 deny tcp any any eq smtp
...
 permit ipv6 any any

Sur les interfaces du réseau local : access-lists réflexives correspondant aux sessions initialisées depuis les postes internes et « permits » spécifiques pour les serveurs.

ipv6 access-list in-ipv6-pmf-scipre
 permit icmp any any
 permit tcp any any reflect pmf-scipre-ipv6-tcpconnections
 permit udp any any reflect pmf-scipre-ipv6-udpsessions
 deny ipv6 any any log
ipv6 accesslist out-ipv6-pmf-scipre
# politique par défaut pour tout poste
 permit icmp any any
 evaluate pmf-scipre-ipv6-tcpconnections
 evaluate pmf-scipre-ipv6-udpsessions
# permits particuliers pour les serveurs du VLAN
! dns primaire, mailhub de campus (smtp), ssh en interne 
 permit udp any host 2001:660:3305:0:203::71 eq domain
 permit tcp any host 2001:660:3305:0:203::71 eq smtp
 permit tcp 2001:660:3305::/48 host 2001:660:3305:0:203::71 eq 22
...
deny ipv6 any any log

PF

Le site de référence pour Packet Filter alias PF (pour OpenBSD et FreeBSD)

PF : Le Filtre de Paquets d'OpenBSD

 
 
filtrage.txt · Dernière modification: 2006/02/24 18:23 par schreiner
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki