%

Linux : firewall ICMP

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

Cet article contient 1733 mots.
Source brute de l'article :
Commit version : 79c4c86

Description

Ou comment titrer : Filtrer le protocole ICMP sous Linux.

Certains déclament qu’il faut absolument tout bloquer, terminer les commandes telles traceroute, ping basta, et qu’on me fiche la paix !

D’autres disent, oui, mais c’est quand même bien pratique d’utiliser de telles commandes, sauf que…

Le but évident d’ICMP est de rapporter les messages d’erreurs, d’informations des états, de contrôle, liés à la communication IP d’un réseau, dont Internet, donc, relatifs à la délivrance des paquets IP.

Ce but intéressant a ses défauts : puisque par ce biais-là, toute personne qui utilise le protocole ICMP peut “cartographier” l’ensemble de votre réseau, un moindre mal en somme, voire à chercher à attaquer celui-là, par certaines attaques connues, telles que le déni de service Smurf, comme le fameux “Ping de la Mort” ou tout autre DOS existant. Certaines attaques permettent aussi de s’attaquer au protocole TCP, tel que le service HTTP (attaque SlowLoris), et d’autres…

Froid dans le dos ? Y’a de quoi…


Dans cet article, nous allons apprendre à gérer correctement ICMP, tout en tenant compte des recommandations faite par des organismes reconnus, tel l’IETF, l’IANA, au-travers de différentes RFC, qui seront toutes nommées.

Gérer ICMP

Les codes ICMP à refuser

Les codes ci-dessous sont reconnus pour être dépréciés, dangereux, et donc à ne plus utiliser :

  • 3/6 - Destination Network Unknown
  • 3/8 - Source Host Isolated
  • 4/0 - Source Quench
  • 15/0 - Information Request Message
  • 16/0 - Information Reply Message
Attention

N’hésitons même pas, les messages correspondant doivent ABSOLUMENT être refusés !


L’IANA, dans sa référence à la RFC 6918 considère que les codes suivants sont dépréciés et donc à filtrer - toute discrétion est laissé libre à l’administrateur de choisir son mode de filtrage - :

  • 6/0 - Alternate Host Address

  • 15 - Information Request

  • 16 - Information Reply

  • 17 - Address Mask Request

  • 18 - Address Mask Reply

  • 30 - Traceroute

  • 31 - Datagram Conversion Error

  • 32 - Mobile Host Redirect

  • 33 - IPv6 Where-Are-You

  • 34 - IPv6 I-Am-Here

  • 35 - Mobile Registration Request

  • 36 - Mobile Registration Reply

  • 37 - Domain Name Request

  • 38 - Domain Name Reply

  • 39 - SKIP

À vous de choisir, si vous les détruisez… alors, mode parano ?!

Quoiqu’il en soit, si vous décidez de filtrer le code 30, n’oubliez pas que l’utilitaire traceroute est capable de fonctionner sur les protocoles UDP:53, TCP:80, voire d’imiter le code ICMP:8/0 !

Les codes ICMP à limiter

Les recommandations sont de limiter, en entrée et en sortie de machine :

  • le code 0/0 - Echo Reply Message - (la fameuse réponse au Ping : le Pong, quoi :p)
  • tous les autres codes de type 3 - Destination Unreachable -
    • sauf un traitement légèrement particulier pour le 3/7 - Destination Host Unknown - à limiter en sortie et ignorer en entrée.
  • tous les codes 5 - Redirect
  • le code 8/0 - Echo Message - (la fameuse commande Ping)
  • le code 9/0 - Router Advertisement Message
  • le code 10/0 - Router Solicitation Message
  • tous les codes 11 - Time Exceeded - (Utile pour la commande traceroute, ainsi que le code 30/0 d’ailleurs)
  • tous les codes 12 - Parameter Problem
  • le code 13/0 - Timestamp Message
  • le code 14/0 - Timestamp Reply Message
  • le code 17/0 - Address Mask Request
  • le code 18/0 - Address Mask Reply

Pour limiter, dans le contexte d’une machine Linux, on utilisera l’option match limit avec iptables, tout simplement…

Exemples

ICMP en mode parano

En mode parano, vous pouvez très bien ouvrir :

  • en sortie le code 8/0,
  • et en entrée le code 0/0 relatif à la sortie, pour que vous vous puissiez pinguer…
  • et empêcher les autres d’en faire autant !
  • Puis de supprimer tous les autres codes…
iptables -A INPUT -p icmp --icmp-type echo-reply -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst 7 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst 7 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j DROP

ICMP filtré, limité

Voici, pour l’exemple, basé sur la compréhension des recommandations IETF, des règles ICMP filtrées, limitées ; puis de rejeter tous les autres codes, avec le message icmp-host-prohibited.

Code : sh

/sbin/iptables -A INPUT -i ethX -p icmp -m limit --limit 3/s --limit-burst 7 -j icmp4in
/sbin/iptables -A icmp4in -p icmp -m conntrack --ctstate INVALID -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Echo reply"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Destination Net Unreachable"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Destination Host Unreachable"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Destination Port Unreachable"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP PathMTU Discovery"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/6 -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/8 -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 4 -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 5 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Redirect mssg"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Echo mssg"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Router Advertisement Message"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Router Solicitation Message"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 11 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Time exceeded"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 12 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Param pb"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Timestamp Message"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Timestamp Reply Message"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 15 -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 16 -j DROP
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Address Mask Request"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Address Mask Reply"
/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 30 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment "ICMP Traceroute"

# REJECT Others
/sbin/iptables -A icmp4in -p icmp -j REJECT --reject-with icmp-host-prohibited

/sbin/iptables -A OUTPUT -o ethX -p icmp -m limit --limit 3/s --limit-burst 7 -j icmp4out
/sbin/iptables -A icmp4out -p icmp -m conntrack --ctstate INVALID -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/6 -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/7 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/8 -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 4/0 -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 5 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 11 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 12 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 15 -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 16 -j DROP
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 30 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT

/sbin/iptables -A icmp4out -p icmp -j REJECT --reject-with icmp-host-prohibited

Documentation

IETF

L’IETF est un organisme connu, reconnu qui écrit beaucoup de documents techniques, dont le propos est d’améliorer la technicité, la sécurité des usages liés à Internet.

Et, bien-sûr certains documents existants insistent sur le fait de filtrer ICMP, voire ICMPv6 - relatif à IPv6, tels que :

Ces documents tous intéressants, certains sont vieux, d’autres récents, ont pour propos de réfléchir sérieusement à la sécurité à mettre en place autour du protocole ICMP.

Le document de travail relatif au filtrage d’ICMP aborde l’ensemble des protocoles IPv4 et IPv6 et explique quelles sont les attaques possibles, et donnent des recommandations utiles, qui vont du refus du paquet à la limitation des autres.

Clairement certains codes de messages qui sont absolument à bloquer, refuser, tels que le code ICMP 4/0 alias “Source Quench” qui est explicitement déprécié, à ne plus utiliser, mais ce n’est pas le seul !


RFC 4890

IETF Tools
HTML, PDF, TXT
RFC Editor
HTML, PDF, TXT

RFC 5927

IETF Tools
HTML, PDF, TXT
RFC Editor
HTML, PDF, TXT

RFC 6633

IETF Tools
HTML, PDF, TXT
RFC Editor
HTML, PDF, TXT

RFC 6918

IETF Tools
HTML, PDF, TXT
RFC Editor
HTML, PDF, TXT

Wikipedia