
图片来源
DNS (Eng。Domain Name System-域名系统)-用于获取有关域的信息的分布式计算机系统。
TLS ( 传输层安全协议)-提供Internet节点之间的安全数据传输。
消息传出后, “ Google Public DNS悄然启用了TLS支持的DNS”,我决定尝试一下。 我有一个Stunnel ,它将创建一个加密的TCP隧道。 但是程序通常使用UDP协议与DNS通信。 因此,我们需要一个代理,该代理将向与TCP流之间的UDP数据包转发。 我们将其写在Lua上 。
TCP和UDP DNS数据包之间的整体差异:
4.2.2。 TCP使用
通过TCP连接发送的消息使用服务器端口53(十进制)。 消息的前缀是两个字节的长度字段,该字段给出了消息的长度,但不包括两个字节的长度字段。 此长度字段允许低级处理在开始解析之前组装完整的消息。
RFC1035:域名-实施和规范
也就是说,我们在那里:
- 我们从UDP获取一个数据包
- 在开头添加几个字节,其中指示此数据包的大小
- 发送到TCP通道
而在相反的方向:
- 我们从TCP读取了几个字节,我们得到了数据包的大小
- 我们从TCP读取了一个数据包
- 通过UDP将其发送给收件人
自定义通道
- 使用Stunnel配置在目录中下载根证书Root-R2.crt
- 将证书转换为PEM
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
我们在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
也就是说,Stunnel:
- 将在127.0.0.1:53接受未加密的TCP
- 将打开一个加密的TLS隧道以寻址8.8.8.8:853(Google DNS)
- 将来回传输数据
发射隧道
可以使用以下命令检查隧道的运行情况:
nslookup -vc ya.ru 127.0.0.1
-vc选项强制nslookup使用与DNS服务器的TCP连接而不是UDP。
结果:
*** 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 )
编写脚本
我正在用Lua 5.3编写。 带有数字的二进制运算已经可用。 好吧,我们将需要Lua Socket模块。
文件名: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
让我们编写一个简单的函数,使您可以将转储包发送到控制台。 我想看看代理的作用。
--]]--
function serialize(data)
--[[--
UDP至TCP并返回
我们编写了两个可以在两个数据传输通道上运行的函数。
--]]--
--[[--
这两个函数在启动后立即执行coroutine.yield()。 这使您可以将函数的参数传递给第一个调用,然后执行coroutine.resume(co)而无需其他参数。
主要的
现在,主要功能将准备并启动主循环。
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
我们启动主要功能。 如果连接突然关闭,一秒钟后,我们将通过调用main再次建立连接。
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
检查
运行漏斗
运行我们的脚本
lua5.3 simple-udp-to-tcp-dns-proxy.lua
使用命令检查脚本操作
nslookup ya.ru 127.0.0.1
这次没有'-vc',这就是我们编写和启动代理的方式,该代理将UDP DNS请求包装到TCP隧道中。
结果:
*** 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 )
如果一切正常,则可以在连接设置中将DNS服务器指定为“ 127.0.0.1”
结论
现在我们的DNS查询受TLS保护。
连接后,Windows会尝试通过我们的隧道在Google的DNS服务器上注册我们。 通过取消选中此选项可在高级DNS设置中将其禁用。

仍然需要time.windows.com。 他不再那么个性,但我从未找到如何关闭它的方法。 自动时间同步已禁用。
连结
- RFC1035:域名-实施和规范
- TLS上的DNS
- 简单的udp到tcp-dns-proxy.lua
- 手动撰写DNS查询