Iptables et icmp

Bonsoir.

La question est de savoir :

Un paquet icmp, qui n’a pas de type icmp, est normalement un paquet “incorrect”, donc par raccourci linguistique : invalide.

On est d’accord, cela ne devrait pas être … et l’on ne devrait pas recevoir de paquet icmp qui ne serait pas typé.

Est-ce qu’il est pour autant détecter comme étant d’état INVALID ?
Ou existerait-il une écriture pour détecter qu’il n’a pas de type icmp ?

Dans le premier cas, il faudrait écrire :

iptables -A INPUT -p icmp -m state --state INVALID -j DROP

Quant à la seconde écriture, elle serait :

iptables -A INPUT -p icmp -m icmp ! --icmp-type -j DROP

Malheureusement, cette écriture semble ne pas être comprise par iptables. :think:

Un paquet ICMP complet a forcément un type puisque c’est un des champs de l’en-tête ICMP. Dire qu’un paquet ICMP n’a pas de type, ce serait comme dire qu’un paquet TCP ou UDP n’a pas de port source ou destination.

Les cas qui me viennent à l’esprit où un paquet ICMP n’aurait pas de type :

  • Paquet ICMP fragmenté : seul le premier fragment contient l’en-tête ICMP et donc le champ type ; les fragments suivants n’en ont pas.
  • Paquet ICMP “tronqué” dont la taille est inférieure à la somme des en-têtes IP et ICMP, soit 20+8=28 octets plus d’éventuelles options IP intercalées entre les deux en-têtes.

Attention : les états de la correspondance “state” font référence au suivi de connexion, et non à la validité intrinsèque du paquet. L’état INVALID peut qualifier un paquet parfaitement correct mais qui ne correspond à aucune connexion connue et qui n’en crée pas une nouvelle, par exemple une réponse à un ping (echo reply) alors que la requête (echo request) n’a pas été vue (ou oubliée) par le suivi de connexion, ou un message d’erreur “destination unreachable” faisant référence à une demande de connexion TCP inconnue du suivi de connexion.

Certes, il est probable qu’un paquet ICMP tronqué sera classé dans l’état INVALID puisqu’il est impossible de le rattacher à une connexion, voire sera carrément éliminé. La correspondance “unclean” peut peut-être les détecter, mais son fonctionnement est signalé comme expérimental, à utiliser avec précaution.
Quant aux paquets fragmentés, le suivi de connexion procède au réassemblage avant de les analyser, donc si tous les fragments sont reçus, le paquet complet aura un type ICMP.

Merci pour ces précisions.

Ahhh, au fait, depuis la version 1.4.16.x d’iptables - que l’on dans la SID -, le suivi de connexion s’écrit plutôt avec ‘conntrack’, plutôt que ‘match’ sur l’état - qui est considéré comme obsolète. :

Ainsi, la première règle écrite ainsi :

S’écrit dorénavant :

Voyez surtout cette info, comme post-it … ma mémoire me faisant défaut :stuck_out_tongue:

La correspondance “conntrack” existe depuis très longtemps en parallèle avec la correspondance “state” dont elle reprend les fonctionnalités et en ajoute de nouvelles. On peut donc mettre à jour ses scripts sans attendre la version d’iptables de Sid.