Fonte: https://blog.remontti.com.br/3637
Neste tutorial vamos aprender como criar um servidor para consultar o DNS através de HTTPS, usando o
Google DNS-over-protocolo HTTPS e
IETF DNS-over-HTTPS (RFC 8484).
O
Google Chrome já a partir da versão 78 irá implantar o DNS-over-HTTPS (DoH), criptografando as solicitações de DNS.
Pressupõe que você tenha um servidor DNS em funcionamento (
eu uso o bind9).
Estou utilizando Debian 10 (
Instalação limpa) para fazer esta instalação
Também será necessário configurar o seu ambiente
Golang, veja
aqui como proceder
Com o Golang já preparado vamos instalar alguns pacotes necessários para compilação:
|
# apt install curl software-properties-common build-essential wget unzip
|
Vamos usar o projeto
m13253/DNS-over-HTTPS.
|
# cd /tmp
# wget https://github.com/m13253/dns-over-https/archive/master.zip
# unzip master.zip
# cd dns-over-https-master/
# make
# make install
|
Agora vamos configurar o servidor DoH, seu arquivo de configuração fica em /etc/dns-over-https/doh-server.conf
Supondo que você esteja instalando no mesmo servidor de DNS, vamos
apenas alterar o upstream para usar as consultar para localhost
(127.0.0.1:53).
|
# mv /etc/dns-over-https/doh-server.conf /etc/dns-over-https/doh-server.conf.old
# vim /etc/dns-over-https/doh-server.conf
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# HTTP listen port
listen = [
"127.0.0.1:8053",
"[::1]:8053"
]
# Endereço local e porta para DNS upstream
# Se deixado em branco, um endereço local é escolhido automaticamente.
local_addr = ""
# TLS certification file
cert = ""
# TLS private key file
key = ""
# Caminho HTTP para resolver o aplicativo
path = "/dns-query"
# Resolvedor de DNS upstream
# Se vários servidores forem especificados, um servidor aleatório será escolhido a cada vez.
upstream = [
"127.0.0.1:53"
]
# Tempo limite upstream
timeout = 10
# Número de tentativas se o DNS upstream falhar
tries = 3
# Use apenas TCP para consulta DNS
tcp_only = false
# Ativar log
verbose = false
# Ative o IP de log do cabeçalho do proxy reverso HTTPS: X-Forwarded-For ou X-Real-IP
# Nota: o log http uri/useragent não pode ser controlado por esta configuração
log_guessed_client_ip = false
|
Vamos ativa-lo na inicialização do sistema e restartar o serviço.
|
# systemctl enable doh-server
# systemctl restart doh-server
|
Verifique se o serviço esta rodando
|
# systemctl status doh-server
|
Perfeito nosso doh-server já está rodando!
Instalação de configuração do
Apache2 com um domínio virtual utilizando o
Let’s Encrypt para criptografar nossa conexão HTTPs.
|
# apt install apache2 apache2-utils letsencrypt python-certbot-apache
# a2enmod http2 proxy proxy_http proxy_connect
# systemctl restart apache2
|
Vou editar a configuração padrão do servidor web, informado meu real
ServerName, no exemplo “
doh.remontti.com.br“, e
ErrorDocument quando um IP não autorizado acessar ser redirecionado.
|
# vim /etc/apache2/sites-available/000-default.conf
|
Faça as devidas alterações, não esqueça de alterar em
Require ip para os IPs que você vai autorizar as conexões.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<virtualhost *:80>
Protocols h2 http/1.1
ServerName doh.remontti.com.br
ServerAdmin noc@remontti.com.br
ErrorDocument 403 http://www.remontti.com.br/
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require ip 127.0.0.1 ::1 192.168.0.0/16 172.16.0.0/12 100.64.0.0/10 10.0.0.0/8 250.0.0.0/22 2000:000::/32
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</virtualhost>
|
Por segurança recomendo remover a assinatura do servidor, para isso edite:
|
# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-enabled/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-enabled/security.conf
|
Para que quando alguém (autorizado) acessar seu endereço DoH não veja
aquela tela Default do Apache2, vamos remover o
/var/www/html/index.html e criar uma index mais legal
|
# rm /var/www/html/index.html
# wget https://blog.remontti.com.br/wp-content/uploads/2019/10/doh.jpg -O /var/www/html/doh.jpg
# vim /var/www/html/index.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Dns Over Https - DoH</title>
<!-- Altere para o endereço que você deseja que ele seja direcionado apos 5seg-->
<meta http-equiv="refresh" content="5; URL='http://www.remontti.com.br/'"/>
<style type="text/css">
body, html {
background-color: #fff112;
}
img {
width: 95%;
height: auto;
}
</style>
</head>
<body>
<img src="doh.jpg">
</body>
</html>
|
Geramos o certificado
|
# systemctl stop apache2
# letsencrypt --authenticator standalone --installer apache -d doh.remontti.com.br
|
Agora já é possível acessar
“doh.remontti.com.br” com HTTPS, faça um teste se seu domínio esta respondendo corretamente. Teste também seu HTTP2 em
https://tools.keycdn.com/http2-test
Para evitar que o certificado expire faça um script e colocando ele no cron para que o mesmo renove automaticamente.
Adicione
|
#!/bin/bash
/usr/bin/systemctl stop apache2
/usr/bin/certbot -q renew
/usr/bin/systemctl start apache2
|
De permissão de execução:
|
# chmod 777 /etc//renovassl.sh
|
Adicione ao cron e restarte o cron
|
# echo '00 00 * * * root /etc/renovassl.sh' >> /etc/crontab
# systemctl restart cron
|
Altere algumas configuração no 000-default-le-ssl.conf criado pelo Let’s Encrypt para trabalhar como um proxy do nosso DoH
|
# vim /etc/apache2/sites-enabled/000-default-le-ssl.conf
|
Adicione as entradas destacadas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<IfModule mod_ssl.c>
SSLProtocol TLSv1.2
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+3DES:!aNULL:!MD5:!DSS:!eNULL:!EXP:!LOW:!MD5
SSLUseStapling on
SSLStaplingCache shmcb:/var/lib/apache2/stapling_cache(512000)
<VirtualHost *:443>
Protocols h2 http/1.1
ServerName doh.remontti.com.br
ServerAdmin noc@remontti.com.br
ErrorDocument 403 http://www.remontti.com.br/
ProxyPass /dns-query http://[::1]:8053/dns-query
ProxyPassReverse /dns-query http://[::1]:8053/dns-query
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require ip 127.0.0.1 ::1 192.168.0.0/16 172.16.0.0/12 100.64.0.0/10 10.0.0.0/8 250.0.0.0/22 2000:000::/32
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/su-151.speedrs.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/su-151.speedrs.com.br/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
|
Restar o apache
|
# systemctl restart apache2
|
Configuramos o apache para encaminhar solicitações para nosso servidor DoH. Agora vamos fazer alguns testes.
O servidor DoH retorna em formato JSON, e para testar apenas abra no seu navegador:
https://doh.remontti.com.br/dns-query?name=remontti.com.br&type=A
Ou já que você está com o terminal aberto digite:
|
# curl -s "https://doh.remontti.com.br/dns-query?name=google.com.br&type=A" | python -m json.tool
|
Vai retornar:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{
"AD": false,
"Answer": [
{
"Expires": "Fri, 04 Oct 2019 16:48:23 UTC",
"TTL": 300,
"data": "172.217.29.227",
"name": "google.com.br.",
"type": 1
}
],
"CD": false,
"Question": [
{
"name": "google.com.br.",
"type": 1
}
],
"RA": true,
"RD": true,
"Status": 0,
"TC": false,
"edns_client_subnet": "186.250.168.0/0"
}
|
Legal, nosso DoH esta funcionando!
Configure seu navegador
Bem, no Firefox, isso é bem fácil, entre no menu
Preferências, role até o final e clique em
Configurar Conexão… em seguida marque a caixa
Ativar DNS sobre HTTPS selecione
Personalizado e informe o endereço do seu servidor DoH
https://doh.exemplo.com.br/dns-query
No linux a versão que utilizei foi uma beta, pois na estável ainda não aparecia a opção.
Já no Chrome Versão Dev 79.0.3921.0 no linux não consegui testar, pois a opção aparece como: Not available on your platform.
Agora basta navegar! E para ter certeza que ele realmente ta fazendo
as consulta em seu DoH Server, verifique os logs do seu apache:
|
# tail -f /var/log/apache2/access.log
|
Parabéns você concluiu!
O que você vai acontecer quando o DoH estiver ativado?
Quando o DoH está ativado, você não notará nada. O Firefox e o Chrome
implementaram extensos mecanismos de fallback para situações em que o
DoH pode cair, como um provedor de DNS que não oferece suporte a DoH.
Quais navegadores suportam o DoH?
Por enquanto, os únicos principais navegadores programados para oferecer
suporte ao DoH são o Mozilla Firefox e Chrome 78 ou superior (embora,
especialmente, o Chrome para iOS e o Chrome para Linux não suportem esse
recurso ainda). Resta saber se o Safari da Apple seguirá o exemplo.
Ambos os navegadores se o DoH não funcionar como planejado simplesmente retornará ao método padrão de pesquisa de DNS.