Como posso rejeitar todos os pacotes UDP de entrada, exceto para pesquisas de DNS?

3

Eu configurei meu servidor para rejeitar TODOS os pacotes UDP de entrada, para evitar inundações UDP. No entanto, foi-me dito que, porque eu uso meu próprio domínio e servidor para meus servidores de nomes, isso pode causar alguns problemas. Como posso contornar isso?

Meu firewall é iptables, minha distro é CentOS5.5.

    
por Rob 14.01.2011 / 19:25

4 respostas

5

Se você estiver seguindo as práticas de segurança padrão, sua política de firewall padrão será bloquear tudo. Tudo o que você precisa fazer é escrever uma regra para permitir o tráfego tcp e udp para a porta 53 se você quiser permitir solicitações DNS de entrada.

O tráfego de que você está falando é UDP. UDP é sem estado. Isso significa que as pessoas interessadas em saturar sua conexão podem enviar os pacotes para o seu endereço, mesmo se você simplesmente os soltar. Ainda assim, você poderá fazer algo semi-útil com a correspondência recente do iptables, para permitir que apenas uma quantidade limitada de tráfego seja realmente aceita e processada pelo sistema. Evan tem um exemplo do uso deste para o SSH aqui. Podemos ter que ver toda a sua regra de firewall definida para informar quais regras devem ser adicionadas.

Se você tem um DoS sério contra o seu sistema, você quase certamente precisa do seu ISP para ajudá-lo, tentando lidar com uma inundação com um firewall baseado em host em um VPS realmente não será muito útil.

Se você ainda não o fez, considere configurar alguns servidores DNS secundários para suas zonas em uma rede completamente diferente.

    
por 14.01.2011 / 19:38
4

Em Iptables, Aceite o tráfego UDP de entrada para a porta 53 & rejeitar tudo no intervalo de portas para portas efêmeras.

O limite mais alto não deve ser muito alto. Caso contrário, seu servidor não poderá resolver domínios externos (por exemplo, quando você faz um "ping google.com") de dentro do seu servidor. Em um sistema operacional Linux, o 32768 é a primeira porta efêmera (também conhecida como portas dinâmicas) para soquetes de até 61000. Portanto, 32767 é a porta mais alta para portas alocadas estáticas. Isto só é verdade se você não usar seu servidor como servidor DNS de resolução de DNS aka servidor de cache de DNS com um /etc/resolv.conf apontando para o servidor de nomes 127.0.0.1 ou :: 1

Aqui está um exemplo do tcpdump:

 23:10:13.315832 IP b.b.b.b.34507 > a.a.a.a.53: 23674% [1au] A? whitehouse.gov. (38)
 23:10:13.377619 IP a.a.a.a.53 > b.b.b.b.34507: 23674*- 1/2/3 A 172.230.122.69(122)
  1. b.b.b.b solicita o servidor de nomes a.a.a.a da porta 34507 para fornecer um registro para whitehouse.gov na porta 53
  2. a.a.a.a da porta 53 responde b.b.b.b à porta 34507

Normalmente, para encontrar seus intervalos de portas dinâmicos locais (também chamados efêmeros ou privados) no seu Linux para UDP & TCP:

 cat /proc/sys/net/ipv4/ip_local_port_range

No entanto, ele só funciona para servidores que não hospedam o resolvedor de DNS (por exemplo, quando você aponta seu /etc/resolv.conf para 8.8.8.8).

O servidor não é um resolvedor de DNS:

 -A INPUT -p udp -m udp --dport 53 -j ACCEPT
 -A INPUT -p udp -m udp --dport 0:32767 -j DROP

o servidor é um resolvedor de DNS:

-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 0:1023 -j DROP

Isso deve ser levado em conta se você quiser hospedar seu próprio resolvedor de DNS, para resolver todos os nomes de domínio.

O melhor seria verificar você mesmo:

Você pode monitorar o envio de portas usando

tcpdump udp and port 53 and not dst host *yourserveripaddress*

veja o envio de portas e tente encontrar o menor número. Esse número mais baixo não deve ser menor que o número da porta xxxx em --dport 0: xxxx, caso contrário, você bloqueia ou reduz suas solicitações de DNS.

    
por 22.08.2015 / 19:55
1

Você realmente precisa permitir que estranhos na internet executem consultas DNS em seu servidor? Eu suspeito que você só precisa ter certeza de que seu firewall permite que seu servidor faça solicitações DNS de saída.

Com o firewall você começa bloqueando tudo e, em seguida, sendo muito preciso / detalhado sobre a abertura de combinações específicas de porta / serviço / protocolo e limitá-lo por endereço IP (intervalo).

    
por 14.01.2011 / 19:56
1

How can I reject all incoming UDP packets except for DNS lookups?

Isso pode ser declarado mais amplo: como posso rejeitar todo o tráfego que eu não iniciei com o netfilter do Linux?

A resposta é simplesmente 2 linhas:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP

( Tendo em conta que você não deseja filtrar o tráfego de loopback para salvar alguns ciclos de CPU, você pode adicionar uma exceção para ele. )

Se o OTOH tiver servidor DNS no mesmo computador e seu qn puder ser definido com mais precisão como " Como posso rejeitar todo o tráfego UDP recebido, exceto consultas externas ao servidor DNS? " você usaria o mesmo 2 linhas base e adicione outra que permita explicitamente o tráfego DNS:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p udp --dport 53 -j ACCEPT -m comment --comment "we serve DNS"
iptables -A INPUT -p tcp --dport 53 -j ACCEPT -m comment --comment "DNS uses TCP too sometimes"

iptables -A INPUT -j DROP

Observe que você normalmente não precisa especificar nenhuma -m state de itens para nada além da primeira linha, pois a primeira linha é um atalho que permite que qualquer tráfego legítimo continue, caso seus pacotes-piloto tenham recebido permissão para entrar.

Outros avisos

@ O conselho do Zoredache para recent não é aplicável. recent tem um escopo de caso de uso muito limitado porque não usa estruturas de dados eficientes, mas lista e hashes, sem árvores, não. Por padrão, ele pode se lembrar de apenas 100 IPs por lista que podem ser estendidos, mas o hashing não é muito eficaz para pesquisar de qualquer maneira.

    
por 01.10.2015 / 11:29

Tags