Iptables et DNS

Bonjour,
je teste en ce moment des règles de filtrages pour iptables. Avant d’avoir des règles perfectionnées et restrictives je commence avec des règles simples et peu restrictives.
Le but final de la manip est qu’un “ping google.fr” marche.
Comme politique par défaut j’utilise un simple:

iptables -P INPUT DROP iptables -P OUTPUT ACCEPT
j’arrive à autoriser le icmp grâce à cette règle:

et effectivement un “ping 192.168.1.1” fonctionne.
Pour ajouter le DNS, j’essaie ceci sans succès:

iptables -A INPUT -p TCP --dport 53 -j ACCEPT iptables -A INPUT -p UDP -dport 53 -j ACCEPT
Une idée ? Faut-il charger un module précis ?

salut,
c’est de la doc qu’il te faut si tu veux filtrer proprement:)

inetdoc.net/guides/iptables-tutorial/

Salut Panthere, ami félin, et merci pour ton lien vers une doc très complète.
En cherchant j’ai trouvé sur cette page.
Dans mon cas ceci fonctionne:

iptables -A INPUT -p TCP --sport 53 -j ACCEPT iptables -A INPUT -p UDP -sport 53 -j ACCEPT
Explications:
Avant de parler du DNS, considérons le protocole http. Une connexion http utilise le même port, le 80, sur les deux machines connectées. Pour désigner le http à iptables, on peut donc utiliser le port destination (–dport) ou le port source (–sport), c’est le même port, le port 80. Pour le DNS, les ports sources et destinations sont différents. Le port ouvert sur le serveur DNS est le 53 et le port ouvert sur le client est un port aléatoire. Donc, coté client, un paquet entrant aura un --sport 53 et un --dport aléatoire et un paquet sortant aura un --sport aléatoire et un --dport 53.
En espérant que ce sujet vous aidera.

Non. À de très rares exceptions près, tous les protocoles se comportent comme ce que tu as expliqué pour le DNS : port aléatoire côté client (celui qui initie la connexion) et port fixe côté serveur. Le HTTP ne fait aucunement exception, pour le constater tu n’as qu’à faire un netstat -tapn juste après avoir affiché une page web.
D’ailleurs, si une connexion utilisait le port 80 côté client y’aurait comme un problème, vu qu’il faut être root pour accéder aux ports inférieurs à 1024. Et accessoirement tu ne pourrais pas avoir deux connexions HTTP simultanées.

[quote=“petitchat”]j’arrive à autoriser le icmp grâce à cette règle:

et effectivement un “ping 192.168.1.1” fonctionne.

Dans mon cas ceci fonctionne:

iptables -A INPUT -p TCP --sport 53 -j ACCEPT iptables -A INPUT -p UDP -sport 53 -j ACCEPT [/quote]
C’est mauvais. Beaucoup trop permissif.
La règle ICMP accepte tous les paquetes ICMP entrants, et pas seulement les réponses au ping sortant.
Les règles DNS acceptent tous les paquets TCP et UDP entrants ayant le port source 53, et pas seulement les réponses aux requêtes DNS. Notamment une connexion entrante vers n’importe quel port de ta machine est acceptés pourvu que le port source (contrôlé par l’émetteur) est 53.

La bonne façon de faire est d’accepter uniquement les paquets de réponse, en exploitant les états du suivi de connexion de netfilter (“conntrack”).