iptables: différence entre les paquets NEW, ESTABLISHED et RELATED

46

Partie d'un pare-feu sur un serveur:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

Quand je fais des recherches en ligne, je vois toujours le mot NEW utilisé dans cette règle, mais j'ai du mal à comprendre pourquoi ESTABLISHED et RELATED ne sont pas utilisés.

Comme ça :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

Quelqu'un peut-il m'expliquer quand exactement un NOUVEAU paquet devient ESTABLISHED et RELATED?

Kris
la source

Réponses:

46

Considérons un NOUVEAU paquet comme un appel téléphonique avant que le destinataire ne décroche. Un paquet ESTABLISHED est leur "Bonjour". Et un paquet RELATED serait si vous appeliez pour leur parler d'un courrier électronique que vous alliez leur envoyer. (L'e-mail étant CONNEXE.)

Au cas où mon analogie ne serait pas si grande, je pense personnellement que les pages de manuel la traitent bien:

NEW - signifiant que le paquet a démarré une nouvelle connexion ou est associé d'une autre manière à une connexion qui n'a pas vu de paquets dans les deux sens, et

ESTABLISHED - signifiant que le paquet est associé à une connexion qui a vu des paquets dans les deux sens,

RELATED - signifie que le paquet commence une nouvelle connexion, mais qu'il est associé à une connexion existante, telle qu'un transfert de données FTP ou une erreur ICMP.

iptables (8) - page de manuel Linux

Aaron Copley
la source
9
Par curiosité, savez-vous comment il détermine les paquets RELATED? Existe-t-il un mécanisme que les applications peuvent utiliser pour signaler à iptables qu'une connexion sera une connexion associée, ou s'agit-il uniquement d'une partie de la partie stateful d'iptables?
Matthew Scharley
9
Il est géré par une série de modules du noyau appelée ip_conntrack_ *, chacun écrit pour un protocole particulier qui utilise des connexions non liées (telles que FTP). Pour répondre à votre question, je pense que vous auriez besoin de charger un module similaire pour votre application.
Kyle Smith
4
D'accord, merci. Mais revenons à la règle contenant NEW, n’est-il pas possible de donner l’impression qu’un paquet est déjà ÉTABLI et n’est donc pas bloqué par la règle?
Kris
2
@Kris: Il est assez difficile de simuler des paquets sortants, donc d'après le libellé de la page de manuel de la réponse, je ne vois pas comment. Vous avez raison de dire qu'il est possible de simuler un paquet qui semble lié à une connexion ouverte, mais même sans pare-feu, la pile TCP laisserait simplement tomber le paquet sur le sol si elle ne savait pas déjà si une connexion ouverte était ouverte. expéditeur. S'il s'agit d'un pare-feu sur un routeur, il est toujours possible de conserver cet état en inspectant les paquets SYN/ ACK/ RST/ etc lors de leur passage dans le routeur, et je m'attendrais à ce que iptables le fasse.
Matthew Scharley
2
@Kris: Quelque chose de semblable à cela (bien que pas identique techniquement) est utilisé par VNC Software comme TeamViewer pour le tunneling à travers des pare-feu / routeurs. Le processus s'appelle la perforation . En bref, vous avez un PC hôte (qui peut se trouver derrière un pare-feu restrictif) auquel vous souhaitez vous connecter depuis un autre périphérique (via Internet). Les deux ordinateurs ouvrent une connexion individuelle vers un serveur séparé (le serveur TeamViewer, par exemple), qui "assure la médiation" entre eux, de sorte que leurs pare-feu ont l’impression que les paquets sont liés, ce qui leur permet d’établir une connexion distincte. autre.
Lévite
14

Asumming pour le serveur et le client un restrictif INPUTet ouvert OUTPUT, à savoir:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Et depuis iptables-extensions (8) sur l'exemple de FTP en mode actif:

1. NOUVEAU

NEW Le paquet a démarré une nouvelle connexion ou est associé d'une autre manière à une connexion qui n'a pas vu de paquets dans les deux sens.

Le client sur le port 50000(n'importe quel port non privilégié aléatoire) se connecte au serveur FTP sur le port 21, le serveur aurait au moins besoin de cela pour accepter cette connexion entrante:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. ÉTABLI

ESTABLISHED Le paquet est associé à une connexion qui a vu des paquets dans les deux sens.

Maintenant , du côté client, il a ouvert une connexion sortante vers le serveur sur le port à l' 21aide d' un port local 50000et il a besoin iptables suivantes pour permettre la réponse à arriver de server (21)à client (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. LIÉS

RELATED Le paquet commence une nouvelle connexion, mais est associé à une connexion existante, telle qu'un transfert de données FTP ou une erreur ICMP.

Maintenant, une fois que la connexion FTP a été établie et qu'une connexion de données est sur le point d'être établie, le client ouvre un socket de serveur (oui, avec un client FTP actif, il devient un serveur pour la connexion de données) sur le port 60000(le client, à ma connaissance, marquera ce port). 60000quant RELATEDà l’autre connexion depuis 50000->21) et enverra ce numéro de port au serveur à l’aide de la PORTcommande FTP . Ensuite, le serveur FTP ouvrira une nouvelle connexion de son port 20à un autre 60000sur le client. Et bien, le client a maintenant besoin des éléments suivants pour permettre à cette nouvelle connexion de réussir:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

Enfin, pour que cela fonctionne, vous devez activer le ip_conntrack_ftpmodule de noyau afin de permettre au système de marquer les connexions / packages de la manière suivante RELATED(c'est ce que je comprends, je n'ai pas trop creusé le sujet):

modprobe ip_conntrack_ftp
Jaime Hablutzel
la source
Etabli ne nécessite qu'un flux unidirectionnel d'origine locale, et non pas une prise de contact TCP à 3 voies. Ma compréhension est-elle correcte?
sdaffa23fdsf
Merci pour la réponse, car vous avez dit "iptables pour permettre à la réponse d’arriver du serveur (21) au client (50000)" si c’est du serveur au client, pourquoi est-ce que c’est INPUT et non OUTPUT?
Medya
@ Medya, parce que, du point de vue du client, les paquets envoyés du serveur (21) au client (50000) sont des paquets entrants, donc pour le client, il s'agit d'un INPUT.
Jaime Hablutzel le