Description
Reprenant le principe des informations renfermées dans mon autre article , à-propos des recommandations faites pour autoriser ou bloquer le flux ICMPv6, voici les règles PF adéquates pour tout BSD qui utilise Packet Filter, dont OpenBSD :
Gestion
Les codes ICMP à rejeter
Ces types ICMPv6 sont à rejeter absolument :
icmp6_block = "{ 100 101 127 138 139 140 144 145 146 147 150 200 201 }"
block drop quick log on egress inet6 proto icmp6 icmp6-type $icmp6_block
Les codes ICMPv6 à autoriser
⇒ Gestion d’une station :
icmp6_auth = "{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }"
pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 }
pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv }
pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts
pass in quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts
Explications
-
La première règle définit les types ICMPv6 autorisés nécessaires, au minimum.
-
La deuxième règle autorise en sortie :
- les sollicitations depuis notre station à destination d’un routeur
—
ff02::2
est l’adresse multicast local de tout routeur — - ainsi que les messages “Multicast Listener Report Message v2”
listenrepv2
- ces deux types ICMPv6 sont nécessaires pour communiquer localement
- cette règle est placée en premier car il faut bien que la station annonce qu’elle a besoin d’une adresse routable.
- les sollicitations depuis notre station à destination d’un routeur
—
-
La troisième règle autorise en entrée les annonces de routeur — type 143 — à destination du nœud local de notre station —
ff02::1
.- c’est la réponse du routeur vers la requête précédente de notre station
-
La quatrième règle autorise en entrée et en sortie, tous les types mentionnés dans la première règle — la macro
$icmp6_auth
. -
La cinquième règle autorise en entrée toute annonce ICMPv6 de redirection vers une route plus courte.
Les règles deux et trois sont strictement nécessaires pour débuter une communication sur le protocole IPv6 ; sans elles, la station sera incapable de le faire correctement !
⇒ Gestion d’un routeur :
Pour débuter, faisons simplement :
icmp6_auth = "{ echoreq echoreq neighbradv neighbrsol }"
pass in quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 }
pass out quick on egress inet6 proto icmp6 icmp6-type routeradv
pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth
Limiter le trafic
Pour limiter le trafic ICMPv6, PF peut utiliser les STO .
Pour reprendre l’exemple ci-dessus, en utilisant l’option
max-src-conn-rate
:
icmp6_auth = "{ unreach toobig timex paramprob echoreq neighbradv neighbrsol }"
icmp6_sto = "( max-src-conn-rate 100/10 )"
pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 }
pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv }
pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto
pass in quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts $icmp6_sto
Autorisations plus restrictives
icmp6_auth = "{ unreach, toobig, timex code 0, timex code 1, paramprob code 1, paramprob code 2, echorep, echoreq, neighbradv, neighbrsol }"
icmp6_out = "{ echorep, echoreq, neighbradv, neighbrsol }"
icmp6_sto = "( max-src-conn-rate 100/10 )"
pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 }
pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv, redir }
pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto
pass out quick on egress inet6 proto from egress to any icmp6 icmp6-type $icmp6_out allow-opts $icmp6_sto
Explications
-
La règle
icmp6_auth
ne gére que ce qui est absolument nécessaire… attention à bien utiliser les virgules séparant les codes, autrement elle ne serait pas fonctionnelle ! -
La règle
icmp6_out
n’autorise seulement que les messages d’echo et les messages de découvertes des voisins. -
on a ajouté dans la première règle
in
la gestion des messages de redirection vers une route plus courte, seulement depuis un routeur vers notre machine. ATTENTION : autoriser le message de redirection de toute autre manière posera des problèmes de sécurité, à tel point qu’il semble recommander de les supprimer dans le contexte de parefeu !
⇒ Cas d’un routeur :
icmp6_auth = "{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }"
icmp6_sto = "( max-src-conn-rate 100/10 )"
pass in quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 }
pass out quick on egress inet6 proto icmp6 icmp6-type { routeradv, redir }
pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto