%

PF accepte de gérer le protocole ICMPv6

Article publié, le et modifié le
4 minutes de lecture

Cet article contient 844 mots.
Source brute de l'article :
Commit version : 8f43228

Description

Astuce

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 :

Attention

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
Info

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.
  • 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

Documentation