Firewall IPv6
Par Sébastien Le Ray le vendredi 3 juillet 2009, 12:30 - Réseau - Lien permanent
Quelques notes en vrac sur la mise en place d'un firewall sur une machine avec la prise en charge IPv6
Déjà, sachez que si vous avez déjà un script pour l'IPv4, il vous faudra le refaire pour l'IPv6 (en conservant celui pour l'IPv4). Les outils changent mais les principes restent les mêmes avec les chaines, les tables, etc.
Au niveau de la configuration noyau, rien de plus compliqué que pour activer netfilter en IPv4, sauf que les options mentionnent IPv6. Les modules (si vous choisissez de ne pas intégrer directement IPv6 au noyau) commencent par ip6 au lieu de ip (ip6table_filter, ip6t_REJECT, etc). Même principe pour les outils, on passe de iptables à ip6tables.
Une chose importante à comprendre c'est que le filtrage IPv4 et le filtrage IPv6 sont totalement distincts dans le noyau. Vous pouvez avoir l'un sans l'autre et les configurer de façon totalement différente, ça ne pose pas de problème (donc si vous avez filtré vos ports sur IPv4 et que vous aviez une IPv6 de portée globale sans filtrage particulier, tout était ouvert).
La seule subtilité (en tout cas la seule que j'ai trouvée pour le moment), se situe au niveau ICMP. Dropper les paquets ICMP, c'est mal, quelle que soit la version d'IP utilisée (je vois pas en quoi interdire totalement la réponse au ping est un gage de sécurité), hormis peut-être pour les ICMP redirect qui peuvent être source d'ennuis et ne sont pas utiles si vous n'avez qu'une seule passerelle sur le même réseau. Dans IPv6, dropper l'ICMPv6 sans distinction vous permettra principalement de ne plus pouvoir accéder à votre machine. Il faut au minimum accepter neighbour-solicitation et neighbour-advertisement (ils remplissent le même rôle qu'ARP dans IPv4). Accepter le reste ne fait pas de mal (router-solicitation ne devrait pas être nécessaire si vous n'êtes pas un routeur IPv6 et redirect peut suivre les mêmes règles que pour IPv4).
Pour le reste, on fait comme en IPv4, on accepte les connexions établies et on ouvre les ports selon ce dont on n'a besoin. Voici un exemple de script :
#!/bin/bash
IP6TABLES=/sbin/ip6tables
# Ports TCP ouverts en entrée
TCP_INPUT_PORTS=21 22 53 443
# Ports UDP ouverts en entrée
UDP_INPUT_PORTS=53
[ -x "$IP6TABLES" ] || exit 0
# Accepte les connexions déjà établies
$IP6TABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Accepte l'ICMPv6 sauf redirect et router-solicitation
for type in packet-too-big destination-unreachable time-exceeded parameter-problem \
echo-request echo-reply router-advertisement neighbour-solicitation neighbour-advertisement
do
$IP6TABLES -A INPUT -p icmpv6 --icmpv6-type $type -j ACCEPT
done
# Ouverture des ports TCP
for port in $ aTCP_INPUT_PORTS
do
$IP6TABLES -A INPUT -p tcp --dport $port -j ACCEPT
done
# Ouverture des ports UDP
for port in $UDP_INPUT_PORTS
do
$IP6TABLES -A INPUT -p udp --dport $port -j ACCEPT
done
# Tout ce qu'on n'accepte pas disparaît
$IP6TABLES -P INPUT DROP
$IP6TABLES -P FORWARD DROP