ip6tables, et ICMP recommandations

Bonjour,

Pour des raisons personnelles, gestion d’un serveur “on the web”, je me penche sur la question de la gestion ip6tables, entre autres … et j’aimerais l’avis de ceux qui me semblent sérieusement plus calé que moi, sur la question :ugeek:

[size=85]À ce propos d’ailleurs, je link ici la page de l’IANA sur les paramètres d’ICMPv6.[/size]

Je viens de lire les recommandations du CERTA en 2006, à-propos de l’usage d’ICMPv6 :
certa.ssi.gouv.fr/site/CERTA-2006-INF-004/

Et, tout particulièrement le bloc suivant :

Je peux certainement me tromper mais traduit en langue ip6tables pour icmpv6 nous donnerait ceci :

ip6tables -N INPUT_ICMPV6
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -j ACCEPT
# needed for mobylity (not needed for a server)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -j ACCEPT
# address configuration and routeur selection mssg (received with hop limit = 255)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -s fe80::/64 -p icmpv6 --icmpv6-type 134/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
# link-local multicast receive notification mssg (need link-local src address)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -s fe80::/64 -j ACCEPT

# SEND certificate path notification mssg (received with hop limit = 255)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT
# multicast routeur discovery mssg (need link-local src address and hop limit = 1)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT
# all others are dropped
#ip6tables -A INPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP
ip6tables -A INPUT_ICMPV6 -p icmpv6 -m state --state INVALID -j DROP
ip6tables -A INPUT_ICMPV6 -p icmpv6 -j DROP

Alors, qu’en pensez-vous ?

Les paquets ICMPv6 d’erreur valides (types 1 à 4 ici) sont toujours émis en réaction à un autre paquet, donc doivent normalement être classés dans l’état RELATED.

Les paquets echo request (ping6) ont l’état NEW, et les echo reply l’état ESTABLISHED (sauf dans le cas d’un ping6 vers une adresse multicast, voir plus bas). Autoriser le ping6 n’est pas une obligation, c’est juste plus pratique.

A moins que ça ait changé dans les versions récentes du noyau Linux, le suivi de connexion de netfilter ne sait pas gérer le multicast, donc tout ce qui implique du multicast, notamment neighbour discovery incluant router discovery (NS, NA, RS, RA) risque d’être classé dans l’état INVALID. Il ne faut pas se fier à l’état du suivi de connexion pour traiter ces paquets.

Toujours concernant le multicast, on n’a pas forcément besoin de tout autoriser. Les seuls types ICMPv6 strictement nécessaires sur une interface de type broadcast (comme ethernet) sont NS et NA. On ajoutera RS et RA dans le bon sens (RS sortant et RA entrant pour un hôte, RS entrant et RA sortant pour un routeur) si on utilise l’autoconfiguration sans état. Le reste (que je ne connais pas) est à autoriser en fonction des besoins.

Dernière remarque : utiliser les noms des types/codes plutôt que les numéros dans les règles est plus parlant.

Merci de tes explications, fortes utiles.

Donc, si j’ai bien compris ton propos, si la station n’est pas routeur (GW), donc station ou serveur, elle ne doit pas accepter de message ICMP étant d’information '* Solicitation ', en entrée ; elle n’accepte que les réponses d’informations ’ Advertissement ’ relatif (RELATED) ou " Reply *" de réponse (ESTABLISHED) quand c’est le cas.
Reste à bien comprendre, quand est-ce que le type est de l’un ou l’autre, mais je pense que le nom du type nous en informe.

La réécriture serait donc de ce style, n’est-ce pas ? :

ip6tables -N INPUT_ICMPV6
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1/1 -j DROP -m comment --comment "Dest. unreachable: communication prohibited"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1/4 -j DROP -m comment --comment "Dest. unreachable: port unreachable"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m state --state RELATED -j ACCEPT -m comment --comment "Dest. unreachable"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -m state --state RELATED -j ACCEPT -m comment --comment "Packet too big"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3 -m state --state RELATED -j ACCEPT -m comment --comment "Time exceeded"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m state --state RELATED -j ACCEPT -m comment --comment "Param. problem: unrecognized next header"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m state --state RELATED -j ACCEPT -m comment --comment "Param. problem: unrecognized ipv6 option"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m state --state NEW -j ACCEPT -m comment --comment "Echo request"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m state --state ESTABLISHED -j ACCEPT -m comment --comment "Echo reply"

# needed for mobylity (not needed for a server)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -m state --state NEW -j ACCEPT -m comment --comment "Home Agent Address Discovery Request Message"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -m state --state ESTABLISHED -j ACCEPT -m comment --comment "Home Agent Address Discovery Reply Message"
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -m state --state NEW -j ACCEPT -m comment --comment "Mobile Prefix Solicitation"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -m state --state RELATED -j ACCEPT -m comment --comment "Mobile Prefix Advertisement"

# address configuration and routeur selection mssg (received with hop limit = 255)
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -m state --state NEW -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Router Solicitation"
ip6tables -A INPUT_ICMPV6 -s fe80::/64 -p icmpv6 --icmpv6-type 134/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Router Advertisement"
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m state --state NEW -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Neighbor Solicitation"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Neighbor Advertisement"
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Redirect Message"
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -m state --state NEW -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Inverse Neighbor Discovery Solicitation Message"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Inverse Neighbor Discovery Advertisement Message"

# link-local multicast receive notification mssg (need link-local src address)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m state --state NEW -j ACCEPT -m comment --comment "Multicast Listener Query"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m state --state RELATED -j ACCEPT -m comment --comment "Multicast Listener Report"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m state --state RELATED -j ACCEPT -m comment --comment "Multicast Listener Done"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -s fe80::/64 -j ACCEPT -m comment --comment "Version 2 Multicast Listener Report"

# SEND certificate path notification mssg (received with hop limit = 255)
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m state --state NEW -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Certification Path Solicitation Message"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT -m comment --comment "Certification Path Advertisement Message"

# multicast routeur discovery mssg (need link-local src address and hop limit = 1)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m hl --hl-eq 1 -m state --state RELATED -j ACCEPT -m comment --comment "Multicast Router Advertisement"
#ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m hl --hl-eq 1 -m state --state NEW -j ACCEPT -m comment --comment "Multicast Router Solicitation"
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m hl --hl-eq 1 --state RELATED -j ACCEPT -m comment --comment "Multicast Router Termination"

# all others are dropped
#ip6tables -A INPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP
ip6tables -A INPUT_ICMPV6 -p icmpv6 -m state --state INVALID -j DROP
ip6tables -A INPUT_ICMPV6 -p icmpv6 -j DROP

ip6tables -A INPUT -i eth0 -d ${mon_ip} -p icmpv6 -j INPUT_ICMPV6


ip6tables -N OUTPUT_ICMPV6
ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -m state --state INVALID -j DROP
ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type -m state --state NEW 128/0 -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -d ff02::/16 -p icmpv6 --icmpv6-type 133/0 -m state --state NEW -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -d ff02::/16 -p icmpv6 --icmpv6-type 134/0 -m state --state RELATED -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m state --state NEW -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m state --state RELATED -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -d ff02::/16 -s ::/128 -p icmpv6 --icmpv6-type 143/0 -j ACCEPT
ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -j DROP

ip6tables -A OUTPUT -o eth0 -p icmpv6 -j OUTPUT_ICMPV6

Ne pas se méprendre sur mes intentions, je ne cherche pas à ce que vous faisiez pour moi l’écriture de ces règles … loin s’en faut !

Je cherche surtout à m’assurer de la compréhension dudit document du CERTA, et de l’équivalence [size=85]- sachant d’autant que je n’ai strictement rien à voir avec le CERTA, et rien à leur reprocher (au cas où l’on se poserait la question :p) -[/size] en écriture formelle.

Si cela peut poser des bases, bonnes et intéressantes, avec et pour les autres lecteurs, tant mieux … 8)

Si, un hôte non routeur doit accepter les messages NS (Neighbour Solicitation), qui sont l’équivalent pour IPv6 de ce que sont les requêtes ARP pour IPv4, donc indispensables sur un réseau de type ethernet (contrairement à un lien point à point). En revanche il n’a pas besoin d’accepter les RS (Router Solicitation) puisque de toute façon il n’y répondra pas.

Où as-tu vu que les messages de réponse de type Advertisement pouvaient avoir l’état RELATED ? A ma connaissance, les messages Neighbour Advertisement et Router Advertisement ont l’état INVALID de même que les messages Solicitation correspondants, à moins que ça ait changé, et alors ça m’intéresse. Je ne connais pas les autres types et ne peux me prononcer à leur sujet.

Le seul message de type Reply que je connais est l’Echo Reply, qui est effectivement dans l’état ESTABLISHED lorsqu’il répond à un Echo Request dans les délais. Là encore, je ne connais pas les autres types et ne peux me prononcer à leur sujet.

Tiens, je remets une couche sur ce sujet - on ne pourra pas me dire qu’il ne m’intéresse pas - :stuck_out_tongue:

En effet, pour certaines raisons récentes, je me suis replonger dans certaines documentations glanées sur le web, et principalement auprès de l’IETF … dont la fameuse RFC 4890, et ces recommandations de filtrage ICMPv6 en local, ainsi que de ce document de travail de 2013-2014 !

Selon lesdites recommandations, il semble intéressant d’écrire ainsi les règles ICMPv6 :

 ip6tables -N INPUT_ICMPV6
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m limit --limit 1/second -j ACCEPT   # destination-unreachable; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -j ACCEPT   # packet too big; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/0 -j ACCEPT # time exceeded; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/1 -j ACCEPT # time exceeded; Should Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/0 -m limit --limit 1/second -j ACCEPT   # parameter pb: Erroneous header field encountered; Should Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m limit --limit 1/second -j ACCEPT   # parameter pb: Unrecognized Next Header Type encountered; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m limit --limit 1/second -j ACCEPT   # parameter pb: Unrecognized IPv6 option encountered; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m limit --limit 1/second -j ACCEPT   # ping tool: echo request message; Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m limit --limit 1/second -j ACCEPT  # ping tool: echo reply message; Must Not Be Dropped

# link-local multicast receive notification mssg (need link-local src address)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -j ACCEPT   # Must Not Be Dropped

# address configuration and routeur selection mssg (received with hop limit = 255)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -s fe80::/64 -p icmpv6 --icmpv6-type 134/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped

ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped

# link-local multicast receive notification mssg (need link-local src address)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -s fe80::/64 -j ACCEPT   # Must Not Be Dropped

# SEND certificate path notification mssg (received with hop limit = 255)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m state --state RELATED -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped
# multicast routeur discovery mssg (need link-local src address and hop limit = 1)
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped

# all others are dropped
ip6tables -A INPUT_ICMPV6 -p icmpv6 -j DROP

Bien-sûr, l’équivalent en sortie est à traiter …


Voilà, où j’en suis de mes recherches et compréhensions actuelles, selon lesdites documentations.

Ces règles sont légèrement modifiées - lire mon article sur ce propos !

Ne pas hésitez à participer à une relecture, une participation, ou une correction, si besoin :wink:

L’URL de l’article en question a changé :

1 J'aime