iptables: diferença entre pacotes NOVOS, ESTABELECIDOS e RELACIONADOS

46

Parte de um firewall em um servidor:

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

Quando pesquiso on-line, sempre vejo NEW sendo usado nessa regra, mas não consigo entender por que ESTABELECIDO e RELACIONADO não está sendo usado.

Como isso :

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

Alguém pode me explicar quando exatamente um NOVO pacote muda para ESTABELECIDO e RELACIONADO?

Kris
fonte

Respostas:

46

Considere um pacote NOVO uma ligação telefônica antes que o receptor atenda. Um pacote ESTABELECIDO é o "Olá". E um pacote RELACIONADO seria se você estivesse ligando para informar sobre um e-mail que estava prestes a enviar. (O e-mail está sendo RELACIONADO.)

Caso minha analogia não seja tão boa, pessoalmente acho que as páginas de manual lidam bem com isso:

NOVO - o que significa que o pacote iniciou uma nova conexão ou foi associado a uma conexão que não viu pacotes nas duas direções, e

ESTABELECIDO - significa que o pacote está associado a uma conexão que viu pacotes nas duas direções,

RELATED - significa que o pacote está iniciando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados FTP ou um erro ICMP.

iptables (8) - página de manual do Linux

Aaron Copley
fonte
9
Por curiosidade, você sabe como ele determina pacotes RELACIONADOS? Existe algum mecanismo que os aplicativos podem usar para sinalizar para o iptables que uma conexão será uma conexão relacionada ou isso é apenas parte da parte com estado do iptables?
Matthew Scharley
9
Ele é tratado por uma série de módulos do kernel chamados ip_conntrack_ *, cada um escrito para um protocolo específico que usa conexões não relacionadas (como FTP). Para responder sua pergunta, acho que você precisaria carregar um módulo semelhante para seu aplicativo.
Kyle Smith
4
Ok, obrigada. Mas voltando à regra com NEW, não é possível que um pacote possa parecer que já está ESTABELECIDO e, portanto, não está bloqueado pela regra?
Kris
2
@Kris: É muito difícil falsificar pacotes de saída; portanto, pela redação da página de manual na resposta, não vejo como. Você está certo de que é possível falsificar um pacote que parece estar vinculado a uma conexão aberta, mas mesmo sem um firewall, a pilha TCP simplesmente deixaria o pacote cair no chão se ainda não soubesse sobre uma conexão aberta do remetente. Se isso estiver em um firewall em um roteador, ainda é possível manter esse estado inspecionando pacotes SYN/ ACK/ RST/ etc à medida que eles passam pelo roteador, e eu espero que o iptables faça isso.
Matthew Scharley
2
@ Kris: Algo semelhante a este (embora não seja tecnicamente idêntico) é usado pelo software VNC como o TeamViewer para fazer um túnel através de firewalls / roteadores. O processo é chamado de perfuração . Em resumo, você possui um PC host (que pode estar protegido por um firewall restritivo) ao qual deseja se conectar a partir de um dispositivo diferente (via Internet). Os dois PCs abrem uma conexão individual com um servidor separado (por exemplo, o TeamViewer Server), que "medeia" entre eles, de modo que eles olhem para os firewalls como se os pacotes estivessem relacionados, e com isso esses PCs podem estabelecer uma conexão separada com cada um. de outros.
Levite
14

Asumming para servidor e cliente um restritivo INPUTe aberto OUTPUT, ou seja:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

E de iptables-extensions (8) sobre o exemplo de FTP no modo ativo:

1. NOVO

NOVO O pacote iniciou uma nova conexão ou foi associado a uma conexão que não viu pacotes nas duas direções.

O cliente na porta 50000(qualquer porta sem privilégios aleatórios) se conecta ao servidor FTP na porta 21, o servidor precisaria pelo menos disso para aceitar esta conexão de entrada:

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

2. ESTABELECIDO

ESTABELECIDO O pacote está associado a uma conexão que viu pacotes nas duas direções.

Agora no lado do cliente, ele abriu uma conexão de saída para o servidor na porta 21usando uma porta local 50000e ele precisa as seguintes iptables para permitir a resposta a chegar a partir server (21)de client (50000):

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

3. RELACIONADOS

RELATED O pacote está iniciando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados FTP ou um erro ICMP.

Agora, depois que a conexão FTP for estabelecida e uma conexão de dados estiver prestes a ser realizada, o cliente abrirá um soquete do servidor (sim, com o cliente FTP ativo se torna um servidor para a conexão de dados) na porta 60000(para o meu entendimento, o cliente marcará essa porta 60000quanto RELATEDà outra conexão de 50000->21) e enviará esse número de porta ao servidor usando o PORTcomando FTP . Em seguida, o servidor FTP abrirá uma nova conexão de sua porta 20para porta 60000no cliente e, agora, o cliente exige o seguinte para permitir que essa nova conexão seja bem-sucedida:

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

Por fim, para que isso funcione, você precisa habilitar o ip_conntrack_ftpmódulo do kernel para permitir que o sistema marque conexões / pacotes como RELATED(este é meu entendimento, eu não cavei muito nisso):

modprobe ip_conntrack_ftp
Jaime Hablutzel
fonte
estabelecido apenas requer fluxo unidirecional previamente originado localmente, não aperto de mão de 3 vias tcp, meu entendimento está correto?
Sdaffa23fdsf 18/05
Obrigado pela resposta, pelo estabelecido, você disse "iptables para permitir que a resposta chegue do servidor (21) ao cliente (50000)" se for do servidor para o cliente, por que é INPUT e não OUTPUT?
Medya
@Medya, porque da perspectiva do cliente, os pacotes enviados do servidor (21) para o cliente (50000) são pacotes de entrada, portanto, para o cliente, é um INPUT.
Jaime Hablutzel