如何获取域名的TSIG历史记录并通过验证TSIG签名防范DNS中间人攻击
首先得说,你的思路真的挺有前瞻性——想靠TSIG签名做终端侧的DNS记录验证,从根源上防MITM攻击,这个方向抓得很准,但确实得先理清几个核心的现实障碍:
先搞懂TSIG的本质:它不是给终端用户用的
TSIG(RFC3645)的核心是DNS服务器之间的身份验证工具,比如主从DNS服务器同步区域数据(AXFR/IXFR)、或者域名管理员给权威服务器发UPDATE请求时,用来确认对方是可信的。这些签名有两个关键特点:
- 是临时且私密的:TSIG签名只会在两台授权的服务器之间传递,不会被包含在给普通递归 resolver 或终端用户的DNS查询响应里;
- 没有公开归档:权威服务器不会把TSIG签名对外存储或提供查询接口,哪怕是域名持有者,也只能拿到自己域名的TSIG操作记录,其他域名的完全碰不到。
关于你问的几个具体问题:
能不能获取TSIG历史记录?
基本不可能。因为TSIG只出现在DNS的控制类交易(比如区域传输、记录更新)里,不属于普通DNS查询响应的内容。没有任何公开渠道能获取全量域名的TSIG历史,甚至单个非自有域名的TSIG记录都拿不到。能不能实时嗅探TSIG签名?
除非你能成为每个目标域名的授权对等节点——比如成为它的从服务器,或者和它的权威服务器建立TSIG认证的连接,但这需要每个域名的管理员单独授权,显然不可能覆盖所有域名。如果只是做普通的递归DNS服务器,你拿到的响应里根本不会有TSIG字段,因为递归服务器和权威服务器之间的TSIG通信是私密的,不会透传给终端。那怎么实现你要的防MITM需求?
其实你要的是「DNS记录的不可篡改验证」,TSIG走不通的话,有几个更可行的替代方案:- 用DNSSEC:这是专门为终端侧验证设计的标准机制。权威服务器会给所有DNS记录做数字签名,你可以部署支持DNSSEC的本地递归服务器(比如Unbound、Bind),开启DNSSEC验证后,就能确保拿到的记录是权威服务器签发的,没有被篡改。这是最贴合你需求的标准解决方案。
- 本地可信快照+哈希验证:定期从可信的权威源拉取目标域名的记录,计算哈希值存在本地,每次查询后对比哈希。但这个方法有延迟,没法处理实时更新的记录,适合对更新频率要求不高的场景。
- 加密DNS查询:部署本地递归服务器,用DoH(DNS over HTTPS)或DoT(DNS over TLS)发起查询,确保你的查询和响应在传输过程中是加密的,防止MITM在传输层篡改数据。这是目前最常用的DNS防MITM方法,实施成本低,效果稳定。
最后澄清你的一个误解
你提到“DNS zone servers are just trusted to give authoritative answers after they verify tsig”——没错,TSIG是服务器之间的信任机制,终端用户根本接触不到这个验证环节。而且TSIG用的是对称加密密钥,这些密钥是服务器之间共享的私密信息,绝对不会公开,就算你拿到了签名,没有对应的密钥也没法验证。
所以总结下来:用TSIG做终端侧的全域名记录验证是不可行的,换用DNSSEC或加密DNS查询,才是实现你防MITM需求的现实路径。
备注:内容来源于stack exchange,提问作者John Targaryen

