Como bloquear querys especificas de DNS via iptables

Bom dia a todos.

Ultimamente tenho visto bastante tráfego de DNS causado por banners e popup’s que inundam de querys os dns servers que administro.
Com tanta query, o load nos servidores sofre introduzindo-se latência indesejada nas respostas.

Assim sendo, como resolver?
Após algumas pesquisas pelo google cheguei à ideia abaixo. Simples, direta e out-of-the-box.

As querys de DNS em si são simples e não encriptadas, pelo que  forma mais rápida de resolver a questão é utilizar as firewalls de perímetro bloquear a query em si.

Isto pode ser facilmente efetuado utilizando iptables, e fazendo estes bloquear certas strings hexadecimais presentes nos pacotes.
O truque reside aqui. As querys de DNS não contem a string total, mas são codificadas da seguinte maneira: X domain Y TLD.

Neste caso o X é o numero de bytes na porção de domínio e Y é o numero de bytes na secção de TLD.
Para fazer esta gestão, é necessário que as vossas regras de iptables sejam algo como isto (vamos imaginar que o domínio em questão é o .facebook.com):

iptables -A INPUT -i $interface -p udp –dport 53 -m string –hex-string “|09|facebook|03|com” –algo bm -j DROP
iptables -A INPUT -i $interface -p udp –dport 53 -m string –hex-string “|03|www|07|facebook|04|com” –algo bm -j DROP

Construções avançadas de regras:

Observando sob uma lupa, uma query é algo como domain Y TLD o onde o zero indica que não existem mais partes do domínio. Isto é imediatamente seguido por dois bytes que indicam o tipo de query.
Isto em si permite que se possam construir regras elaboradas, que bloqueiam apenas alguns tipos de queries de domínio enquanto se permitem as restantes.

Tipo Hexadecial Code
Any 00ff
A 0011
CNAME 0005
MX 000f
AAAA 001c
NS 0002
SOA 0006

Se por exemplo se quiser bloquear todas as querys MX para o domínio outlook.com,  teremos algo como:
iptables -A INPUT -i $interface -p udp –dport 53 -m string –hex-string “|06|outlook|03|com|00000f|” –algo bm -j DROP

Não se esqueçam de como o iptables converte as regras para hexadecial, é boa ideia ter comentários em cada regra de forma a que se consigam orientar utilizando o iptables -vnL

Abr,

Nuno

Referencias: Este post é uma tradução/adaptação para Português deste site. O meu obrigado a eles.