Iodine项目中的DNS隧道协议00000402版本详解
iodine Official git repo for iodine dns tunnel 项目地址: https://gitcode.com/gh_mirrors/io/iodine
协议概述
Iodine是一款基于DNS协议实现隧道通信的工具,它能够将IP数据包封装在DNS查询中传输。本文详细解析其00000402版本的通信协议规范,帮助开发者深入理解其工作原理。
版本协商机制
版本协商是建立连接的第一步,确保客户端和服务器使用兼容的协议版本。
客户端请求格式:
- 首字节为'v'或'V'(大小写敏感)
- 后续内容使用Base32编码:
- 4字节大端序协议版本号
- 2字节缓存未命中计数器(CMC)
服务器响应:
- 4字符状态码:
- "VACK":版本确认,后接登录挑战
- "VNAK":版本不匹配,后接服务器协议版本
- "VFUL":服务器无空闲槽位,后接最大用户数
- 4字节值:根据状态码不同,可能是登录挑战、服务器协议版本或最大用户数
- 1字节用户ID(仅当状态为VACK时有效)
用户认证流程
完成版本协商后,客户端需要进行身份认证。
客户端登录请求:
- 首字节为'l'或'L'
- Base32编码内容:
- 1字节用户ID
- 16字节MD5哈希值(计算方式:密码前32字节与8次重复的登录挑战值异或后取MD5)
- 2字节CMC
服务器响应:
- "LNAK":认证失败
- "x.x.x.x-y.y.y.y-mtu":认证成功,包含服务器IP、客户端IP和MTU值
数据传输机制
数据包格式
数据包采用特殊的头部结构:
321 0
+---+-+
|UUU|L|
+---+-+
- UUU:3位用户ID
- L:1位标志位,表示是否为最后一个分片
编码方式:
- 首字节为头部,以ASCII十六进制字符表示(4位)
- 后续数据使用Base32编码
服务器响应
对于Ping和数据包,服务器统一使用DNS NULL类型响应:
- 无数据发送时:数据长度为0字节
- 有数据发送时:包含完整的原始IP数据包,前缀为32位隧道数据
特殊功能测试
协议提供了大小写测试功能,用于验证DNS服务器是否保留大小写信息:
客户端请求:
- 首字节为'z'或'Z'
- 包含大量不应解码的原始数据
服务器响应:
- 原样返回请求的域名
心跳检测机制
客户端可以发送Ping包维持连接:
Ping包格式:
- 首字节为'p'或'P'
- Base32编码内容:
- 1字节用户ID
- 2字节CMC
技术要点解析
-
Base32编码:协议中大量使用Base32编码,这是因为它能有效利用DNS标签的限制(63字节/标签),同时保持较好的编码效率。
-
缓存未命中计数器(CMC):每次使用都会递增,用于防止DNS缓存干扰隧道通信。
-
认证安全:采用MD5哈希和挑战值机制,虽然MD5现在被认为不够安全,但在这种特定场景下结合挑战响应机制仍能提供基本的安全保障。
-
分片处理:数据包头部包含分片标志位,支持大数据包的分片传输。
理解这些协议细节对于开发基于DNS隧道的应用或进行网络诊断都具有重要价值。该协议设计充分考虑了DNS协议的限制,在有限的空间内实现了完整的IP隧道功能。
iodine Official git repo for iodine dns tunnel 项目地址: https://gitcode.com/gh_mirrors/io/iodine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考