Iptables: «-p udp --state ESTABLISHED»

18

regardons ces deux règles iptables qui sont souvent utilisées pour autoriser les DNS sortants:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

Ma question est: Comment dois-je comprendre exactement l'état ESTABLISHED dans UDP? UDP est apatride.

Voici mon intuition - j'aimerais savoir si ou où c'est incorrect:

La page de manuel me dit ceci:

Etat

Ce module, combiné avec le suivi des connexions, permet d'accéder à la
état de suivi de connexion pour ce paquet.

  --Etat ...

Donc, iptables se souvient essentiellement du numéro de port qui a été utilisé pour le paquet sortant (que pourrait-il se souvenir d'autre pour un paquet UDP?) , Puis autorise le premier paquet entrant qui est renvoyé dans un court laps de temps? Un attaquant devrait deviner le numéro de port (serait-ce vraiment trop dur?)

Pour éviter les conflits:

Le noyau garde la trace des ports bloqués (soit par d'autres services, soit par les paquets UDP sortants précédents), de sorte que ces ports ne seront pas utilisés pour les nouveaux paquets DNS sortants dans le délai? (Que se passerait-il si j'essayais accidentellement de démarrer un service sur ce port dans le délai imparti - cette tentative serait-elle refusée / bloquée?)

Veuillez trouver toutes les erreurs dans le texte ci-dessus :-) Merci,

Chris

Chris Lercher
la source

Réponses:

12

Donc, iptables se souvient essentiellement du numéro de port qui a été utilisé pour le paquet sortant (que pourrait-il se souvenir d'autre pour un paquet UDP?),

Je suis à peu près sûr que pour UDP, les ports et adresses source et de destination sont stockés.

Si vous souhaitez inspecter les tables d'état, installez conntrack et / ou netstat-nat.

(Que se passerait-il si j'essayais accidentellement de démarrer un service sur ce port dans le délai imparti - cette tentative serait-elle refusée / bloquée?)

Puisque vous utilisez OUTPUT et INPUT, vous parlez de services locaux. Le port est déjà utilisé Je ne pense pas que votre système vous permette de démarrer un autre service car quelque chose est déjà à l'écoute sur ce port. Je suppose que vous pourriez arrêter le premier service et en démarrer un autre si vous le vouliez vraiment, dans ce cas, la réponse serait probablement à votre service. Ce que le service fait avec le paquet dépend du contenu du paquet et de son service.

Zoredache
la source
Donc, si j'ai commencé à dire une instance Tomcat sur le port 8080, j'aurai une chance 1: (65535-1023) que le démarrage échoue, si accidentellement une requête DNS s'exécute sur le même port? Ou attendra-t-il simplement que le délai expire? Quelle est la durée par défaut?
Chris Lercher
6
Sous Linux, je crois que la plage de ports éphémères est généralement 32768-61000 (voir / proc / sys / net / ipv4 / ip_local_port_range), cela n'inclurait pas votre exemple de port 8080. Il a tendance à être très rare de configurer des services pour écouter sur les ports dans la gamme éphémère. Le temps indiqué par une entrée UDP dans le tableau est généralement de 30 secondes (voir / proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache
2
+1 Merci, surtout pour les chemins / proc!
Chris Lercher
1
Dans le cas où quelqu'un souhaite étendre le udp_timeout, utilisezecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran
8

NB: Cette réponse a été modifiée.

Malgré ce que disent les pages de manuel, cela ESTABLISHEDsignifie "avec état". Pour UDP, cela signifie simplement (comme vous le suggérez) de se souvenir de chaque paquet UDP sortant (le tuple "src ip, src port dst ip, dst port") pendant un certain temps et de reconnaître ses réponses.

FWIW, mes règles normales pour le trafic DNS seraient quelque chose comme ceci:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

c'est-à-dire contrôler le trafic sur la OUTPUTchaîne, puis laisser les iptablesmodules d'état gérer tout le reste de la INPUTchaîne.

Voir aussi cette question connexe .

Alnitak
la source
1
Je suis conscient que je devrais également autoriser TCP. Mais que signifierait RELATED pour UDP? Page de manuel: "RELATED signifiant que le paquet démarre une nouvelle connexion, mais qu'il est associé à une connexion existante, ..." Connexions pour UDP? Peut-être que cela a plus de sens qu'ESTABLISHED, mais c'est ce que j'aimerais savoir.
Chris Lercher
Lorsque j'utilise vos règles, mais que je limite l'entrée udp à RELATED, mes requêtes DNS ne fonctionnent pas. Semble que je dois autoriser ESTABLISHED. Y a-t-il une raison d'autoriser également RELATED (pour UDP)?
Chris Lercher
ok, il semble que ESTABLISHED signifie plus que ce que dit la page de manuel. Dans tous les cas, si vous utilisez des filtres OUTPUT comme le mien et n'acceptez pas le trafic inbonud, cette règle INPUT est la seule dont vous aurez besoin.
Alnitak
1
Compte tenu de ce que nous avons trouvé, les paquets udp ASSOCIÉS n'existent pas AFAIK. Cependant (par exemple) si vous effectuez un FTP sortant à partir de cette boîte, vous avez besoin d'une règle d'état RELATED pour le canal de données. La règle unique "ESTABLISHED, RELATED" est AFAIK la règle unique la plus optimale pour le trafic entrant.
Alnitak
1
en fait, des RELATEDpaquets UDP peuvent exister pour RTP.
Alnitak
1

Les développeurs d'iptables ont considéré qu'un état "ÉTABLI" était la situation où des paquets ont été vus dans les deux sens quel que soit le protocole entre deux clients.

l'extension d'état fait partie de conntrack. Le noyau comprend l'état de la table

/proc/net/nf_conntrack

Exemple d'états iptables pour UDP dans la table nf_conntrack du point de vue de l'expéditeur. Imaginons que vous envoyiez une requête DNS sur UDP

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Un paquet a été envoyé. Il n'a pas répondu et oh, le tableau contient les données pour ce qui est attendu en retour (le paquet pour la réponse DNS).

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

La réponse est arrivée, l'indicateur non répondu a disparu, cela signifie que cette connexion UDP est à l'état ÉTABLI pour une petite durée définie dans votre système.

Nicolas Guérinet
la source