
fonte da imagem
DNS (Eng. Domain Name System - um sistema de nomes de domínio) - um sistema de computador distribuído para obter informações sobre domínios.
TLS ( Transport Layer Security Protocol) - fornece transferência segura de dados entre nós da Internet.
Após a notícia "O DNS público do Google ativou silenciosamente o suporte ao DNS por TLS" , decidi tentar. Eu tenho um Stunnel que criará um túnel TCP criptografado. Mas os programas geralmente se comunicam com o DNS usando o protocolo UDP . Portanto, precisamos de um proxy que encaminhe pacotes UDP de e para o fluxo TCP. Vamos escrever em Lua .
Toda a diferença entre pacotes DNS TCP e UDP:
4.2.2 Uso de TCP
As mensagens enviadas por conexões TCP usam a porta 53 do servidor (decimal). A mensagem é prefixada com um campo de dois bytes que fornece o comprimento da mensagem, excluindo o campo de dois bytes. Esse campo de comprimento permite que o processamento de baixo nível monte uma mensagem completa antes de começar a analisá-la.
RFC1035: NOMES DE DOMÍNIO - IMPLEMENTAÇÃO E ESPECIFICAÇÃO
Ou seja, fazemos lá:
- pegamos um pacote do UDP
- adicione a ele no começo alguns bytes nos quais o tamanho deste pacote é indicado
- enviar para o canal TCP
E na direção oposta:
- lemos alguns bytes do TCP, obtemos o tamanho do pacote
- lemos um pacote do TCP
- envie para o destinatário via UDP
Personalizar Stunnel
- Faça o download do certificado raiz Root-R2.crt no diretório com a configuração Stunnel
- Converter certificado em PEM
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
Escrevemos em stunnel.conf:
[dns] client = yes accept = 127.0.0.1:53 connect = 8.8.8.8:853 CAfile = Root-R2.pem verifyChain = yes checkIP = 8.8.8.8
Ou seja, Stunnel:
- aceitará TCP não criptografado em 127.0.0.1:53
- abrirá um túnel TLS criptografado para endereçar 8.8.8.8:853 (DNS do Google)
- irá transferir dados para frente e para trás
Launch Stunnel
A operação do túnel pode ser verificada com o comando:
nslookup -vc ya.ru 127.0.0.1
A opção -vc força o nslookup a usar uma conexão TCP com um servidor DNS em vez do UDP.
Resultado:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Escrevendo um script
Estou escrevendo em Lua 5.3 . Operações binárias com números já estão disponíveis nele. Bem, precisaremos do módulo Lua Socket .
Nome do arquivo: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
Vamos escrever uma função simples que permita enviar um pacote de despejo para o console. Eu quero ver o que o proxy faz.
--]]--
function serialize(data)
--[[--
UDP para TCP e vice-versa
Escrevemos duas funções que funcionarão com dois canais de transmissão de dados.
--]]--
--[[--
Ambas as funções executam coroutine.yield () imediatamente após o lançamento. Isso permite que você passe os parâmetros da função para a primeira chamada e, em seguida, coroutine.resume (co) sem parâmetros adicionais.
principal
E agora a função principal que irá preparar e iniciar o loop principal.
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
Lançamos a função principal. Se a conexão for fechada repentinamente, após um segundo a estabeleceremos novamente chamando main.
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
verificar
Executar stunnel
Execute nosso script
lua5.3 simple-udp-to-tcp-dns-proxy.lua
Verifique a operação do script com o comando
nslookup ya.ru 127.0.0.1
Desta vez, sem o '-vc', foi assim que escrevemos e iniciamos o proxy, que envolve solicitações de DNS UDP no túnel TCP.
Resultado:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Se estiver tudo bem, você pode especificar nas configurações de conexão como o servidor DNS "127.0.0.1"
conclusão
Agora, nossas consultas DNS estão protegidas por TLS .
Logo após a conexão, o Windows tenta nos registrar nos servidores DNS do Google através do nosso túnel. Isso está desabilitado nas configurações avançadas de DNS desmarcando.

Ainda há uma solicitação para time.windows.com. Ele não é mais tão pessoal, mas nunca achei como desligá-lo. A sincronização automática de hora está desativada.
ligações
- RFC1035: NOMES DE DOMÍNIO - IMPLEMENTAÇÃO E ESPECIFICAÇÃO
- DNS sobre TLS
- simple-udp-to-tcp-dns-proxy.lua
- Redigir manualmente uma consulta DNS