Pour tester l'interface de configuration de parefeu sur laquelle je travaille, j'ai mis en place des règles de filtrage strictes sur ma machine. Stricte car par défaut rien ne passe : il faut accepter chaque service explicitement avec une nouvelle règle. Cet article présente les cas particuliers que sont les sockets RAW et le multicast IPv4.

DHCP et table raw

Sur ma machine, l'attribution d'une adresse IPv4 est dynamique et utilise le protocole DHCP (niveau 4). Le premier paquet (DHCP Discover) est envoyé à destination de 255.255.255.255 (adresse de broadcast : envoi à tout le monde) avec comme source 0.0.0.0, et l'adresse MAC destination est aussi du broadcast (ff:ff:ff:ff:ff:ff). Bizzarement, même en bloquant tout en sortie avec iptables (iptables -F; iptables -P OUTPUT DROP), DHCP continue à fonctionner.

Ceci vient du fait que le programme dhclient utilise une socket de type RAW. les paquets sont forgés et n'entrent pas dans le suivi de connexion (conntrack) de Netfilter. On peut néanmoins loguer ou filtrer ces paquets en utilisant la table « raw ». Le schéma suivant montre que raw est le premier traitement pour les paquets entrant (chaîne PREROUTING) et sortant (OUTPUT) : schéma synthétique d'iptables.

Multicast DNS

Ubuntu active le démon avahi par défaut, système de découverte de services sur le réseau local. Il embarque un serveur DNS multicast qui n'est pas utilisé pour résoudre les noms de domaine Internet (comme google.com), mais pour la découverte de services. Ce système permet sans aucune configuration manuelle d'échanger des fichiers, d'écouter de la musique, de dialoguer, etc. avec les ordinateurs du réseau local.

Côté technique, avahi envoie et reçoit des paquets UDP sur le port « mDNS » (port 5353 vers 5353) et des des paquets IGMP (Internet Group Management Protocol, à ne pas confondre avec ICMP) en utilisant l'adresse destination 224.0.0.251. Cette adresse fait parti du réseau 224.0.0.0/24 : multicast local (réseau privé).

Note au sujet d'IPv6 : les paquets ICMPv6 multicast sont détectés comme invalides par -m state --state INVALID. Refuser tous les paquets invalides revient donc à se couper d'Internet... J'ai rapporté le bug à Netfilter.