Iodine项目中的DNS隧道协议00000402版本详解

Iodine项目中的DNS隧道协议00000402版本详解

iodine Official git repo for iodine dns tunnel iodine 项目地址: 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

技术要点解析

  1. Base32编码:协议中大量使用Base32编码,这是因为它能有效利用DNS标签的限制(63字节/标签),同时保持较好的编码效率。

  2. 缓存未命中计数器(CMC):每次使用都会递增,用于防止DNS缓存干扰隧道通信。

  3. 认证安全:采用MD5哈希和挑战值机制,虽然MD5现在被认为不够安全,但在这种特定场景下结合挑战响应机制仍能提供基本的安全保障。

  4. 分片处理:数据包头部包含分片标志位,支持大数据包的分片传输。

理解这些协议细节对于开发基于DNS隧道的应用或进行网络诊断都具有重要价值。该协议设计充分考虑了DNS协议的限制,在有限的空间内实现了完整的IP隧道功能。

iodine Official git repo for iodine dns tunnel iodine 项目地址: https://gitcode.com/gh_mirrors/io/iodine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛微娥Ross

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值