Automatizando o bloqueio de sites no Brasil pelo DNS usando a API da anablock.net.br (BIND9+RPZ)
Neste tutorial, abordaremos a configuração de uma Zona de Política de Resposta DNS (RPZ) com o objetivo de simplificar a resolução de nomes alterados, especialmente quando lidamos com escalas substanciais. Nosso objetivo é bloquear milhares de domínios de forma eficiente, minimizando o consumo de recursos de hardware em nosso servidor.
Não abordarei a instalação do BIND neste momento, pois já disponibilizamos um tutorial completo em nosso blog, que pode ser acessado através do seguinte link:
Servidor DNS Bind9 (Debian 12).
Para configurar sempre que um domínio bloqueado for resolvido pelo seu DNS em um IP da sua rede, você precisará criar um subdomínio no seu servidor DNS autoritativo. No arquivo de configuração dos seus hosts irei criar um subdomínio chamado bloqueadonobrasil, vejamos um exemplo:
# vim /var/cache/bind/master-aut/remontti.com.br/remontti.com.br.hosts
Exemplo “bloqueadonobrasil“, ou então apontando para os IPs de localhost mesmo 127.0.0.1 e ::1 onde neste caso se o usuário acessar o domínio bloqueado simplesmente não irá abrir nada.
//... bloqueadonobrasil A x.xx.xxx.x AAAA xxxx:xxxx:xxxx::y //...
DNS PRIMÁRIO (MASTER)
Agora crie uma zona chamada rpz.zone em seu /etc/bind/named.conf.local. em allow-transfer e also-notify informe os IPs de seus servidores Slaves.
# vim /etc/bind/named.conf.local
zone "rpz.zone" { type master; file "/var/cache/bind/rpz/db.rpz.zone.hosts"; allow-query { none; }; allow-transfer { 10.51.51.3; }; also-notify { 10.51.51.3; }; };
Vamos criar o diretório “rpz” e os arquivos de hosts que serão bloqueados.
# mkdir /var/cache/bind/rpz/
Criarei um atalho em /etc/bind para facilitar o acesso da pastar também.
# ln -s /var/cache/bind/rpz/ /etc/bind/rpz
Entendendo como os domínios são bloqueados. A seguir, apresentamos um exemplo do arquivo que servirá como base para o nosso próximo script a seguir:
Nome do arquivo: /var/cache/bind/rpz/db.rpz.zone.hosts
$TTL 1H @ IN SOA LOCALHOST. bloqueadonobrasil.remontti.com.br. ( 2024012201 ; Serial 1h ; Refresh 15m ; Retry 30d ; Expire 2h ; Negative Cache TTL ) NS bloqueadonobrasil.remontti.com.br. ; ou ; 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 será bloqueado, o mesmo será adicionado:
sitequeprecisabloquear.com IN CNAME . *.sitequeprecisabloquear.com IN CNAME .
Assim qualquer subdomínio (*).domino.com seja traduzido sempre irá ser apontado para seu IP ou localhost.
Antes de criar o script, ajuste 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 bloqueadonobrasil.remontti.com.br; }; //...
Ou se você irá apontar para localhost use:
options { //... response-policy { zone "rpz.zone" policy CNAME localhost; }; //...
Script AnaBlock
Para simplificar nossa tarefa, criaremos um script que utiliza o site https://anablock.net.br, uma plataforma desenvolvida por Patrick Brandão da Nuva. Ele projetou uma página abrangente que oferece todas as informações necessárias para acompanhar os bloqueios de conteúdo regulados pela Anatel e pelas autoridades da República Federativa do Brasil.
Porém ANATEL solicitou a remoção dessa lista:
Para liberação da lista você deve entrar em contato com Patrick Brandão
Crie um diretório onde iremos salvar nosso script:
# mkdir /etc/bind/scripts
Subi meu script no Github, mas iremos entrar na nossa pasta /etc/bind/scripts e baixar ele direto para nosso servidor.
# cd /etc/bind/scripts # wget https://raw.githubusercontent.com/remontti/anablock_bind9/main/anablock_bind9.py
Esse scrip ira verificar verificar qual sua versão e sempre que existir uma nova ou se for sua primeira vez ele irá baixar a lista de todos os domínios e cria o arquivo db.rpz.zone.hosts com a lista completa de siste que serão bloqueados pelo seu DNS.
Script foi feito em python3 instale os pacotes necessários para executa-lo.
# apt install python3 python3-requests tree
Execute o script:
# python3 /etc/bind/scripts/anablock_bind9.py bloqueadonobrasil.remontti.com.br
Arquivo de zona RPZ atualizado. Permissões do diretório alteradas com sucesso. Serviço Bind9 reiniciado com sucesso.
# tree -h /var/cache/bind/rpz/
Seu diretório terá os seguintes arquivos
/var/cache/bind/rpz/ ├── [159K] db.rpz.zone.hosts ├── [ 46K] domain_all └── [ 11] version
Se você executar o script novamente nada irá acontecer até que uma nova versão seja lancada.
Para que tenhamos nossa lista sempre atualizada, colocamos o script para ser executado todos os dias a meia noite.
# echo '00 00 * * * root python3 /etc/bind/scripts/anablock_bind9.py bloqueadonobrasil.remontti.com.br'\ >> /etc/crontab # systemctl restart cron
Testes
Agora faça um teste para ver o que seu servidor ira traduzir corretamente:
# dig 2filmestorrent.top @localhost
; <<>> DiG 9.11.5-P4-5.1+deb10u9-Debian <<>> 2filmestorrent.top @localhost ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42124 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: be484fb71dfe219dd9e6544465ae7d4b7e142ef750ed0d80 (good) ;; QUESTION SECTION: ;2filmestorrent.top. IN A ;; ANSWER SECTION: 2filmestorrent.top. 5 IN CNAME bloqueadonobrasil.remontti.com.br. bloqueadonobrasil.remontti.com.br. 10800 IN A x.x.x.x ;; Query time: 479 msec ;; SERVER: ::1#53(::1) ;; WHEN: seg jan 22 11:35:55 -03 2024 ;; MSG SIZE rcvd: 137
DNS SECUNDÁRIO's (SLAVE's)
Agora crie uma entrada zona chamada rpz.zone em seu /etc/bind/named.conf.local. em masters e also-notify informe os IPs de seus servidores Master.
# vim /etc/bind/named.conf.local
zone "rpz.zone" { type slave; file "/var/cache/bind/rpz/db.rpz.zone.hosts"; masters { 10.51.51.2; }; allow-notify { 10.51.51.2; }; };
Configure o response-policy
# vim /etc/bind/named.conf.options
Deve ficar dentro de options { ... } adcione:
options { //... response-policy { zone "rpz.zone" policy CNAME bloqueadonobrasil.remontti.com.br; // ou // zone "rpz.zone" policy CNAME localhost; // }; //...
Crie o diretório, de permissão, e reinicie o bind.
# mkdir /var/cache/bind/rpz/ # chown bind: /var/cache/bind/rpz/ -R # systemctl restart bind9
Arquivo db.rpz.zone.hosts será criado dentro de /var/cache/bind/rpz/
# tree /var/cache/bind/rpz/
/var/cache/bind/rpz/ └── db.rpz.zone.hosts
Configurando uma Página de Bloqueio em Seu Servidor Web
Vou deixar exemplo com fazer isso em um Apache.Crie o diretório onde iremos criar nossa página:
# mkdir /var/www/bloqueadonobrasil
Apache
Crie o arquivo de configuração do apache.
# vim /etc/apache2/sites-available/bloqueadonobrasil.conf
<virtualhost *:80> Protocols h2 http/1.1 ServerName bloqueadonobrasil.remontti.net.br ServerAlias x.xxx.xxx.x ServerAlias [xxxx:xxxx:xxxx:xxxx::x] ServerAdmin noc@remontti.com.br ErrorDocument 404 /index.php DocumentRoot /var/www/bloqueadonobrasil <Directory /var/www/bloqueadonobrasil/> Options FollowSymLinks AllowOverride All # Restringe o acesso apenas para os IPs do seu ISP Require ip 127.0.0.1 ::1 100.64.0.0/10 x.xx.xxx.x/22 xxxx:xxxx::/32 </Directory> LogLevel warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </virtualhost>
Habilite a configuração e reinicie o Apache
# a2ensite bloqueadonobrasil.conf # systemctl restart apache2
Instale o certbot para gerar um certificado ssl para o domínio
# apt install certbot python3-certbot-apache
Execute:
# certbot
Selecione seu domínio, e em sguinda reponda com No redirect
Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: remontti.com.br 2: bloqueadonobrasil.remontti.com.br - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 2 <<<<<<<<<<<<<<<<<<<< Obtaining a new certificate Performing the following challenges: http-01 challenge for bloqueadonobrasil.remontti.com.br Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/apache2/sites-available/bloqueadonobrasil-le-ssl.conf Deploying Certificate to VirtualHost /etc/apache2/sites-available/bloqueadonobrasil-le-ssl.conf Enabling available site: /etc/apache2/sites-available/bloqueadonobrasil-le-ssl.conf Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1 <<<<<
Agora vou deixar um exemplo de página para ajudar você:
Vamos excluir o diretório que foi criado, já que estou prestes a baixar minha página, que, ao ser descompactada, conterá o mesmo nome.
# rm -rf /var/www/bloqueadonobrasil/ # cd /var/www/ # wget https://github.com/remontti/anablock_bind9/raw/main/bloqueadonobrasil.tar.gz # tar -vxzf bloqueadonobrasil.tar.gz # rm bloqueadonobrasil.tar.gz
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!
Olá! É Possível implantar esta API utilizando o modelo RECURSIVO?
Olá, excelente tutorial.
Como posso usar o RPZ para filtrar URLs específicos?
Para implementar o bloqueio de páginas, devo ter o servidor autoritativo e o servidor recursivo ou pode ser implementado apenas com o servidor recursivo?
Olá! Tudo bem, pessoal? Implantei aqui e rodou tudo certinho, mas agora não está mais atualizando ao rodar o script, está gerando os seguintes erros:
Traceback (most recent call last):
File “/etc/bind/scripts/anablock_bind9.py”, line 113, in
main(sys.argv[1])
File “/etc/bind/scripts/anablock_bind9.py”, line 102, in main
if download_and_update_version(version_url, version_file_path):
File “/etc/bind/scripts/anablock_bind9.py”, line 32, in download_and_update_version
download_file(url, temp_file_path)
File “/etc/bind/scripts/anablock_bind9.py”, line 12, in download_file
response.raise_for_status()
File “/usr/lib/python3/dist-packages/requests/models.py”, line 943, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.anablock.net.br/api/version
Obs.: Todos os domínios já bloqueados anteriormente foram removidos do arquivo de hosts.
Grato desde já!
Está pago por isso que está dando isso
Mas você a minha pode subir a minha versão https://anablock.lapsus.com.br
Entre em contato Patrick Brandao. Ele esta liberando somente para administradores de rede dos provedores, para nao permitir mais acesso a civis diretamente ao anablock ja que é segredo de justiça e é mandado somente aos provedores. no site do Anablock encontra o contato dele. https://anablock.net.br/
Muito bom, top top !
Olá,
No caso aqui coloco os IP’s do NS1 mesmo ou tenho que montar outro servidor DNS?
//…
bloqueadonobrasil A x.xx.xxx.x
AAAA xxxx:xxxx:xxxx::y
//…
Agradeço a atenção.
Muito massa esse tutorial, não pesquisei sobre, tem a possibilidade de fazer funcionar esse script no UNBOUND ?
Faz o modelo via unbound se for possível
Paulo Jr Andrade fez uma adaptação:
https://pastebin.com/raw/UPQNRJVy
Pra quem quiser usar no unbound
https://pastebin.com/raw/UPQNRJVy
Paulo ficou excelente mas fazer um restart do serviço causa a perda do cache do unbound. No unbound novo, presente no Debian 12 e backports do Debian 11 já temos o comando: unbound-control reload_keep_cache
Dessa forma podemos recarregar o rpz sem matar o cache. Consegues fazer uma versão com ele só que precisaria testar a versão do unbound antes pelo menos a versão 1.17.1 eu sei que já tem essa opção.
Obrigado pela dica mestre, já alterei !!!
Simplesmente perfeito mano, parabéns mesmo, tenho certeza que ajudará muitos no nosso país!
Para quem me pediu ex do NGINX, segue:
Aqui no nginx colocando meu dominio a pagina carrega, ao colocar uma pagina bloqueada da erro 404.
Será que faltou algo na instalação ou config do nginx?