Como bloquear sites pelo DNS (BIND9) Response Policy Zones

Neste tutorial vamos aprender a configurar um DNS Response Policy Zones (RPZ) para que retornem resultados de resoluções de nomes modificados de uma foma simples pensando em grandes escalas, pois parece que no Brasil vai virar modinha solicitar que os provedores fiquem bloqueando sites. Diga olá a censura!.

Não irei ensinar instalar o bind até porque já tem tutorial explicando aqui no blog.

Se você deseja configurar que toda vez que o domínio bloqueado for traduzido, traduza um IP da sua rede qual tenha um serviço web rodando com alguns dizerem por exemplo, será necessário configurar um subdomínio no seu DNS Autoritativo. Exemplo:

# vim /var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts

Exemplo “umbrella” , ou então apontando para os IPs de localhost mesmo 127.0.0.1 e ::1

//...
umbrella                A       45.10.20.5
                        AAAA    2804:f123:bebe:cafe::5
//...

Agora basta criar uma zona chamada rpz.zone em seu /etc/bind/named.conf.local.

# vim /etc/bind/named.conf.local
zone "rpz.zone" {
    type master;
    file "/var/cache/bind/rpz/db.rpz.zone";
    allow-query { none; };
};

Criaremos o diretório rpz, bem como o arquivos de hosts quais serão bloqueados

# mkdir /var/cache/bind/rpz/
# ln -s /var/cache/bind/rpz/ /etc/bind/rpz
# vim /var/cache/bind/rpz/db.rpz.zone

Se você está resolvendo para subdomínio exemplo umbrella.cursodns.com.br, crie o arquivo da seguinte forma:

$TTL 1H
@       IN      SOA LOCALHOST. umbrella.cursodns.com.br. (
                2022042801      ; Serial  
                1h              ; Refresh
                15m             ; Retry
                30d             ; Expire 
                2h              ; Negative Cache TTL
        )
        NS  umbrella.cursodns.com.br.
 
sitequeprecisabloquear.com     IN CNAME .
*.sitequeprecisabloquear.com   IN CNAME .
elesmandamnosfaz.bo.bo         IN CNAME .
*.elesmandamnosfaz.bo.bo       IN CNAME .

Ou se só ta querendo jogar para o infinito e além, aponte para localhost mesmo.

$TTL 1H
@       IN      SOA LOCALHOST. localhost.localhost. (
                2022042801      ; Serial  
                1h              ; Refresh
                15m             ; Retry
                30d             ; Expire 
                2h              ; Negative Cache TTL
        )
        NS  localhost.
 
sitequeprecisabloquear.com     IN CNAME .
*.sitequeprecisabloquear.com   IN CNAME .
elesmandamnosfaz.bo.bo         IN CNAME .
*.elesmandamnosfaz.bo.bo       IN CNAME .

Sendo que para cada domínio que você deseja bloquear, siga o formato:

alllllandossssantos.com        IN CNAME .
*.alllllandossssantos.com      IN CNAME .

Assim qualquer subdomínio (*).domino.com seja traduzido sempre irá ser apontado para seu IP ou Localhost.

Agora adicione o response-policy dentro do seu /etc/bind/named.conf.options

# vim /etc/bind/named.conf.options

Deve ficar dentro de options { … } adcione:

options {
//...
    response-policy {
      zone "rpz.zone" policy CNAME umbrella.cursodns.com.br;
    };
//...

Se usou os ips de localhost use:

options {
//...
    response-policy {
      zone "rpz.zone" policy CNAME localhost;
    };
//...

Altere as permissões do diretório /var/cache/bind/rpz/ para que o bind consiga ler o mesmo e reinicie o serviço.

# chown bind. /var/cache/bind/rpz/ -R
# systemctl restart bind9

Testes

Agora faça um teste para ver o que seu servidor ira traduzir corretamente:

# dig @localhost alllllandossssantos.com
; <<>> DiG 9.16.27-Debian <<>> @localhost alllllandossssantos.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20245
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: d9b8e60a2ecf09ad01000000626ad597bd40b368154c9bdb (good)
;; QUESTION SECTION:
;alllllandossssantos.com.	IN	A

;; ANSWER SECTION:
alllllandossssantos.com. 5	IN	CNAME	localhost.
localhost.		604800	IN	A	127.0.0.1

;; ADDITIONAL SECTION:
rpz.zone.		1	IN	SOA	LOCALHOST. localhost.localhost. 2022042801 3600 900 2592000 7200

;; Query time: 4 msec
;; SERVER: ::1#53(::1)
;; WHEN: Thu Apr 28 14:57:43 -03 2022
;; MSG SIZE  rcvd: 182
# dig sitequeprecisabloquear.com
; <<>> DiG 9.16.27-Debian <<>> sitequeprecisabloquear.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11551
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: dc78338a3afd94bc01000000626ad6724eeea9366a7d771d (good)
;; QUESTION SECTION:
;sitequeprecisabloquear.com.    IN  A

;; ANSWER SECTION:
sitequeprecisabloquear.com. 5   IN  CNAME   umbrella.cursodns.com.br.
umbrella.cursodns.com.br.   14362   IN  A   45.10.20.5

;; ADDITIONAL SECTION:
rpz.zone.       1   IN  SOA LOCALHOST. umbrella.cursodns.com.br. 2022042801 3600 900 2592000 7200

;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Apr 28 15:01:22 -03 2022
;; MSG SIZE  rcvd: 186
# host sitequeprecisabloquear.com
sitequeprecisabloquear.com is an alias for umbrella.cursodns.com.br.
umbrella.cursodns.com.br has address 45.10.20.5
umbrella.cursodns.com.br has IPv6 address 2804:f123:bebe:cafe::5
# ping sitequeprecisabloquear.com
PING sitequeprecisabloquear.com(webhost.cursodns.com.br (2804:f123:bebe:cafe::5)) 56 data bytes
64 bytes from webhost.cursodns.com.br (2804:f123:bebe:cafe::5): icmp_seq=1 ttl=61 time=1.06 ms
64 bytes from webhost.cursodns.com.br (2804:f123:bebe:cafe::5): icmp_seq=2 ttl=61 time=1.17 ms
64 bytes from webhost.cursodns.com.br (2804:f123:bebe:cafe::5): icmp_seq=3 ttl=61 time=1.18 ms
--- sitequeprecisabloquear.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.061/1.116/1.171/0.055 ms
# ping -4  sitequeprecisabloquear.com
PING  (45.10.20.5) 56(84) bytes of data.
64 bytes from webhost.cursodns.com.br (45.10.20.5): icmp_seq=1 ttl=61 time=0.991 ms
64 bytes from webhost.cursodns.com.br (45.10.20.5): icmp_seq=2 ttl=61 time=1.32 ms
64 bytes from webhost.cursodns.com.br (45.10.20.5): icmp_seq=3 ttl=61 time=1.59 ms
64 bytes from webhost.cursodns.com.br (45.10.20.5): icmp_seq=4 ttl=61 time=0.789 ms
---  ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4703ms
rtt min/avg/max/mdev = 0.789/1.172/1.590/0.306 ms

Gostou? Se quiser apoiar o blog e fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

14 Resultados

  1. apresenta este erro

    named-checkconf named-checkconf /etc/bind/named.conf.options
    /etc/bind/named.conf.options:23: response-policy zone ‘rpz.zone’ is not a primary or secondary zone

    /etc/bind/named.conf.options:23: response-policy zone ‘rpz.zone’ is not a primary or secondary zone

    named-checkconf -p
    named-checkconf -p
    acl “autorizados” {
    127.0.0.1/32;
    ::1/128;
    77.77.700.0/22;
    7777:7777::/32;
    100.64.0.0/10;
    fd00::/8;
    fe80::/10;
    fc00::/8;
    };
    logging {

    };
    options {
    directory “/var/cache/bind”;
    listen-on {
    “any”;
    };
    listen-on-v6 {
    “any”;
    };
    version “RR DNS Server”;
    allow-query-cache {
    “autorizados”;
    };
    allow-recursion {
    “autorizados”;
    };
    auth-nxdomain no;
    dnssec-validation auto;
    minimal-responses yes;
    response-policy {
    zone “rpz.zone” policy CNAME “localhost”;
    };
    allow-query {
    “any”;
    };
    allow-transfer {
    77.77.700.3/32;
    7777:7777:0:1::3/128;
    };
    also-notify {
    77.77.700.3;
    7777:7777:0:1::3;
    };
    masterfile-format text;
    };
    zone “meu-site.net.br” {
    type master;
    file “/var/cache/bind/master-aut/meu-site.net.br/meu-site.net.br.hosts”;
    inline-signing yes;
    dnssec-policy “default”;
    key-directory “/var/cache/bind/master-aut/meu-site.net.br/keys/”;
    serial-update-method unixtime;
    };
    zone “rpz.zone” {
    type master;
    file “/var/cache/bind/rpz/db.rpz.zone”;
    allow-query {
    “none”;
    };

  2. addmin disse:

    Boa tarde,

    Seria possível fazer o bloqueio de um domínio com diversas variações no nome do domínio?
    Exemplo: gostaria de bloquear o site-*.com, bloquear qualquer coisa que tenha no nome do dominio site-*.

  3. Junior Damazio disse:

    Opa, beleza?
    No caso eu estou usando o autoritativo direto do registro br,
    eu consigo fazer os bloqueios pelo recursivo?

  4. Ari disse:

    é possível fazer esse bloqueio somente com servidor recursivo?

  5. Guilherme de menezes jardin disse:

    No meu caso o bind restartou normal, estava dando uns erros mas corrigi….porem ele continua resolvendo os nomes normalmente, mesmo com a policy

  6. Henrique disse:

    Parabens ! muito didatico e funcional seus tutoriais ! ajuda demais ! parabens!

  7. Elias Moreira disse:

    Como sempre o conteúdo é rico em conhecimento. Parabeéns!

  8. Marcelo Gondim disse:

    Quem quiser fazer com o unbound precisa ser versão >= 1.10.0. No unbound.conf você habilita assim:
    Carregando o respip:

    server:
              module-config: "respip validator iterator"
    

    Ainda no unbound.conf:

    rpz:
      name: rpz.block.host.local.zone
      zonefile: /etc/unbound/rpz.block.hosts.zone
      rpz-action-override: nxdomain
    

    Cria o arquivo /etc/unbound/rpz.block.hosts.zone conforme esse conteúdo de exemplo:

    $TTL 2h
    @ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)
      IN NS  localhost.
    ; RPZ manual block hosts
    *.dominio.com.br CNAME .
    dominio.com.br CNAME .
    

    Pronto só reiniciar o unbound.

  9. Herivaldo Junior disse:

    Parabéns pelos conteúdos!
    Sempre acompanho, e sempre fico esperando, para poder ver o que de bom você traz de novidade, para poder aprender mais com o que você ensina.

  10. Rodrigo Steinhorst disse:

    Top!
    ótimo material.

  11. Cláudio Lemes disse:

    show de bola Rudimar mais uma vez compartilhando conhecimento.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *