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?

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.