Como fazer a filtragem de domínio no Linux?

12

De preferência algo semelhante a iptables. Basicamente, quero fazer a filtragem de domínio / lista de permissões / lista negra como faria com IPs iptables. Existem recomendações sobre como fazer isso?


fonte
o que / por que você está tentando bloquear? Você está tentando filtrar HTTP / SMTP ou NTP de saída / entrada? Diferentes ferramentas podem ser usadas para diferentes cenários.
Creek
1
Algumas sugestões que podem ajudá-lo são denyhosts.sourceforge.net/faq.html e fail2ban.org/wiki/index.php/Main_Page .
Ramesh
1
@josten idealmente você usaria um proxy HTTP como o Squid . Bloqueio de nomes de domínio no iptablespode ser feito , mas pode ser arriscado
Creek

Respostas:

8

Se você eliminar o tráfego usando a resolução de nomes com as regras do iptables, os nomes serão resolvidos durante a criação dessa regra. Se algo mudar, sua regra não será mais válida. Esta poderia ser uma solução (não a mais bonita ...):

# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP

De outro host dentro da LAN:

# host www.facebook.com
www.facebook.com A record not found, try again

Basicamente, você está dizendo a cada pacote DNS ( udp/53) que tem a cadeia hexadecimal de www.facebook.com toser descartada. Observe que isso reduzirá a resolução de nomes, e não o tráfego http em si.

Os números hexadecimais separados por pipes ( |03|www|08|facebook|03|com) são a representação do .simbol do ponto nas consultas DNS. Ele informará quantos dos seguintes caracteres de caracterização representarão cada parte de um FQDN (host, domínio, domínio de nível superior) Exemplo:

hospedeiro: mail.google.com

representação hexadecimal: 04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d

"representação visual: 04mail06google03com

Obtendo o pacote com tcpdump:

# tcpdump -i eth0 -X dst port 53

15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
        0x0000:  4500 003d 779a 4000 4011 b390 c949 4742  E..=w.@[email protected]
        0x0010:  d8ef 260a 8424 0035 0029 0fc0 4092 0000  ..&..$.5.)..@...
        0x0020:  0001 0000 0000 0000 046d 6169 6c06 676f  .........mail.go
        0x0030:  6f67 6c65 0363 6f6d 0000 0100 01         ogle.com.....

Mas lembre-se:

  • Se você está tentando filtrar um tráfego mais específico, como smtp, ftp ou http, um proxy desse protocolo deve ser melhor.
  • Você está "sequestrando" consultas DNS e não está bloqueando o domínio. Os usuários não são tão burros;)

Fontes: Aqui e aqui


fonte
por que algo do tipo é bm?
Gaurav Kansal
Algoritmo Boyer-Moore - pt.wikipedia.org/wiki/…
4

Talvez a resposta para sua pergunta seja tarde demais, mas recentemente precisei resolver um problema semelhante e o Google me trouxe aqui

Após pesquisas malsucedidas, escrevi um pequeno utilitário em C que intercepta respostas DNS, compara o nome de domínio com o regex especificado e lista os endereços IP correspondentes. Aqui está: https://github.com/vmxdev/sidmat/

Você não precisa configurar seu próprio servidor DNS, o utilitário pode capturar respostas DNS de qualquer servidor

Por exemplo, para ver os endereços IP do facebook.com (e subdomínios) resolvidos agora, você pode executar

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...

onde eth0 é a interface de rede no roteador (ou onde as respostas DNS passam)

Você pode integrá-lo facilmente ao iptables (ou iptables com ipset)

Mas:

  • utilitário é realmente simples. Ele não realiza muitas verificações, portanto o invasor pode enganá-lo
  • essa técnica é inútil se os usuários não usarem o DNS para resolução de nomes
vmx
fonte
3

Para colocar na lista negra a maneira mais fácil é provavelmente usar o dnsmasq

Instalar dnsmasq

$ sudo apt-get install dnsmasq

e adicione esta linha a /etc/dnsmasq.conf

address=/facebook.com/127.0.0.1

Isso bloqueará o facebook.com e todos os seus subdomínios.

Nota: Para o ubuntu, veja este post .

limões
fonte
1

Se a execução de um bind9 de armazenamento em cache local, geralmente é realizada por um dummy-block

zone "facebook.com" { type master; file "dummy-block"; };

e o dummy-blockarquivo:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                          2         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
*       IN      A       127.0.0.1   

Veja também:

Executando BIND9 e ISC-DHCP com facebook.comexemplo.

Uma abordagem simples baseada em DNS para bloquear a publicidade na Web


fonte