Iptables: “-p udp --state ESTABELECIDO”

18

vejamos essas duas regras do iptables que são frequentemente usadas para permitir o DNS de saída:

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

Minha pergunta é: como exatamente devo entender o estado ESTABELECIDO no UDP? O UDP é sem estado.

Aqui está a minha intuição - eu gostaria de saber se ou onde isso está incorreto:

A página do manual me diz isso:

Estado

Este módulo, quando combinado com o rastreamento de conexão, permite o acesso ao
estado de rastreamento de conexão para este pacote.

  --Estado ...

Portanto, o iptables basicamente lembra o número da porta que foi usada para o pacote de saída (o que mais ele poderia lembrar para um pacote UDP?) E , em seguida, permite o primeiro pacote recebido que é enviado de volta em um curto período de tempo? Um invasor teria que adivinhar o número da porta (isso seria realmente muito difícil?)

Sobre como evitar conflitos:

O kernel controla quais portas estão bloqueadas (por outros serviços ou por pacotes UDP de saída anteriores), para que essas portas não sejam usadas para novos pacotes DNS de saída dentro do prazo? (O que aconteceria se eu tentasse acidentalmente iniciar um serviço nessa porta dentro do prazo - essa tentativa seria negada / bloqueada?)

Encontre todos os erros no texto acima :-) Obrigado,

Chris

Chris Lercher
fonte

Respostas:

12

Portanto, o iptables basicamente lembra o número da porta que foi usada para o pacote de saída (o que mais ele poderia lembrar para um pacote UDP?),

Tenho certeza de que, para o UDP, as portas e os endereços de origem e destino estão armazenados.

Se você deseja inspecionar as tabelas de estado, instale conntrack e / ou netstat-nat.

(O que aconteceria se eu tentasse acidentalmente iniciar um serviço nessa porta dentro do prazo - essa tentativa seria negada / bloqueada?)

Como você está usando OUTPUT e INPUT, está falando sobre serviços locais. A porta já está em uso. Não acredito que seu sistema permita que você inicie outro serviço, pois algo já está escutando nessa porta. Acho que você poderia interromper o primeiro serviço e iniciar outro, se realmente quisesse, nesse caso, a resposta provavelmente chegaria ao seu serviço. O que o serviço faz com o pacote depende de qual é o conteúdo do pacote e de que serviço é.

Zoredache
fonte
Portanto, se eu começar a dizer uma instância do Tomcat na porta 8080, terei 1: (65535-1023) de chance de a inicialização falhar, se acidentalmente uma consulta DNS estiver sendo executada na mesma porta? Ou será apenas esperar até o prazo expirar? Quanto tempo dura o período por padrão?
precisa
6
No Linux, acredito que o intervalo efetivo de portas é geralmente 32768-61000 (consulte / proc / sys / net / ipv4 / ip_local_port_range), isso não inclui o seu exemplo de porta 8080. É muito incomum configurar serviços para escutar portas dentro da faixa efêmera. O tempo que um UDP entrada estados na tabela é normalmente de 30 segundos (ver / proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache
2
+1 Obrigado, especialmente pelos caminhos / proc!
quer
1
No caso de qualquer um deseja estender o udp_timeout, usoecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran
8

Nota: esta resposta foi editada.

Apesar do que as páginas de manual dizem, ESTABLISHEDparece significar "stateful". Para UDP, isso significa simplesmente (como você sugere) lembrar cada pacote UDP de saída (a tupla "src ip, src port dst ip, dst port") por um tempo e reconhecer suas respostas.

FWIW, minhas regras normais para o tráfego DNS seriam algo como isto:

# 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

ou seja, controlar o tráfego na OUTPUTcadeia e, em seguida, deixar que os iptablesmódulos de estado tratem de tudo o mais na INPUTcadeia.

Veja também esta questão relacionada .

Alnitak
fonte
1
Estou ciente de que devo permitir o TCP também. Mas o que RELATED significaria para o UDP? Manpage: "RELATED significa que o pacote está iniciando uma nova conexão, mas está associado a uma conexão existente, ..." Conexões para UDP? Talvez faça realmente mais sentido do que ESTABELECIDO, mas é isso que eu gostaria de descobrir.
precisa
Quando uso suas regras, mas restrito o uPD INPUT a RELATED, minhas consultas DNS não funcionam. Parece que tenho que permitir ESTABELECIDO. Existe algum motivo para permitir também RELATED (para UDP)?
precisa
ok, parece que ESTABELECIDO significa mais do que a página de manual diz. De qualquer forma, se você usar filtros OUTPUT como o meu e não aceitar tráfego inbonud, a regra INPUT será a única de que você precisará.
Alnitak
1
Dado o que descobrimos, os pacotes udp RELACIONADOS não existem AFAIK. No entanto (por exemplo), se você fizer um FTP de saída a partir dessa caixa, precisará de uma regra de estado RELATED para o canal de dados. A regra única "ESTABELECIDO, RELACIONADO" é AFAIK a regra única mais ideal para o tráfego de entrada.
Alnitak
1
na verdade, RELATEDpacotes UDP podem existir para o RTP.
Alnitak
1

Os desenvolvedores do iptables consideraram que um estado "ESTABELECIDO" era a situação em que os pacotes eram vistos nas duas direções, independentemente do protocolo entre dois clientes.

a extensão do estado faz parte do conntrack. O kernel entende o estado da tabela

/proc/net/nf_conntrack

Exemplo de estados iptable para UDP na tabela nf_conntrack do ponto de vista do remetente. Vamos imaginar que você envie uma consulta DNS no 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

Um pacote foi enviado. Não respondeu e, oh, a tabela possui os dados para o que é esperado em retorno (o pacote para a resposta 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

A resposta chegou, o sinalizador não respondido desapareceu, significa que essa conexão UDP está no estado ESTABELECIDO por um pequeno período de tempo definido em seu sistema.

Nicolas Guérinet
fonte