
fuente de imagen
DNS (Ing. Domain Name System - un sistema de nombres de dominio) - un sistema informático distribuido para obtener información sobre dominios.
TLS (Protocolo de seguridad de la capa de transporte ): proporciona transferencia de datos segura entre nodos de Internet.
Después de la noticia, "Google Public DNS activó silenciosamente DNS sobre TLS" , decidí probarlo. Tengo un Stunnel que creará un túnel TCP encriptado. Pero los programas generalmente se comunican con DNS usando el protocolo UDP . Por lo tanto, necesitamos un proxy que reenvíe los paquetes UDP hacia y desde la secuencia TCP. Lo escribiremos en Lua .
La diferencia entre los paquetes DNS TCP y UDP:
4.2.2 Uso de TCP
Los mensajes enviados a través de conexiones TCP utilizan el puerto del servidor 53 (decimal). El mensaje tiene como prefijo un campo de longitud de dos bytes que proporciona la longitud del mensaje, excluyendo el campo de longitud de dos bytes. Este campo de longitud permite que el procesamiento de bajo nivel reúna un mensaje completo antes de comenzar a analizarlo.
RFC1035: NOMBRES DE DOMINIO - IMPLEMENTACIÓN Y ESPECIFICACIÓN
Es decir, hacemos allí:
- tomamos un paquete de UDP
- agregue al principio un par de bytes en los que se indica el tamaño de este paquete
- enviar al canal TCP
Y en la dirección opuesta:
- leemos un par de bytes de TCP, obtenemos el tamaño del paquete
- leemos un paquete de TCP
- envíalo al destinatario a través de UDP
Personalizar Stunnel
- Descargue el certificado raíz Root-R2.crt en el directorio con la configuración Stunnel
- Convertir certificado a PEM
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
Escribimos en 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
Es decir, Stunnel:
- aceptará TCP sin cifrar en 127.0.0.1:53
- abrirá un túnel TLS cifrado para direccionar 8.8.8.8:853 (Google DNS)
- transferirá datos de ida y vuelta
Lanzar Stunnel
El funcionamiento del túnel se puede verificar con el comando:
nslookup -vc ya.ru 127.0.0.1
La opción -vc obliga a nslookup a usar una conexión TCP a un servidor DNS en lugar de 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 )
Escribir un guion
Estoy escribiendo en Lua 5.3 . Las operaciones binarias con números ya están disponibles en él. Bueno, necesitaremos el módulo Lua Socket .
Nombre de archivo: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
Escribamos una función simple que le permitirá enviar un paquete de volcado a la consola. Quiero ver qué hace el proxy.
--]]--
function serialize(data)
--[[--
UDP a TCP y viceversa
Escribimos dos funciones que operarán con dos canales de transmisión de datos.
--]]--
--[[--
Ambas funciones ejecutan coroutine.yield () inmediatamente después del lanzamiento. Esto le permite pasar los parámetros de la función a la primera llamada y luego hacer coroutine.resume (co) sin parámetros adicionales.
principal
Y ahora la función principal que preparará e iniciará el bucle principal.
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
Lanzamos la función principal. Si la conexión se cierra repentinamente, después de un segundo la estableceremos nuevamente llamando a main.
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
comprobar
Correr aturdimiento
Ejecute nuestro script
lua5.3 simple-udp-to-tcp-dns-proxy.lua
Verifique la operación del script con el comando
nslookup ya.ru 127.0.0.1
Esta vez, sin el '-vc', así es como escribimos e iniciamos el proxy, que envuelve las solicitudes UDP DNS en el 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 )
Si todo está bien, puede especificar en la configuración de conexión como el servidor DNS "127.0.0.1"
conclusión
Ahora nuestras consultas DNS están protegidas por TLS .
Justo después de la conexión, Windows intenta registrarnos en los servidores DNS de Google a través de nuestro túnel. Esto está deshabilitado en la configuración avanzada de DNS desmarcando.

Todavía hay una solicitud para time.windows.com. Ya no es tan personal, pero nunca encontré cómo apagarlo. La sincronización horaria automática está deshabilitada.
enlaces
- RFC1035: NOMBRES DE DOMINIO - IMPLEMENTACIÓN Y ESPECIFICACIÓN
- DNS sobre TLS
- simple-udp-to-tcp-dns-proxy.lua
- Redactar manualmente una consulta DNS