iodine - IP over DNS

iodine 是一款能將網路封包偽裝成 DNS 的軟體,使用者可以透過 iodine 實現 DNS Proxy。若您身處受限制的網路中(如機場須登入之 Wi-Fi),只要測試 nslookup google.com 能得到正確的 IP,即可使用 iodine 達成 DNS 翻牆。

步驟一、Domain 設定

要使用 iodine,您必須擁有一個域名(以下假設為 example.com)。首先,請進入您的 DNS 託管網站,新增下列三項 DNS Zone 紀錄。

Record Type Host Points To TTL
A tunnel [Server IP] 1hr
A ns.tunnel [Server IP] 1hr
NS tunnel ns.tunnel.example.com 1hr

上列設定的目的是,將 tunnel.example.com 的 Name Server 設定為 ns.tunnel.example.com,但是 ns.tunnel.example.com 的指向為你的 iodine server IP。

故當你送出查詢 tunnel.example.com 的要求時,收到要求的 DNS 伺服器會去詢問 ns.tunnel.example.com,而伺服器上正在執行的 iodine 會監聽 0.0.0.0:53 然後回應正確的 DNS Proxy 封包。

步驟二、伺服器設定

首先,請開啟 Linux 核心的 ipv4 轉發功能

# echo 1 > /proc/sys/net/ipv4/ip_forward
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/60-ipv4-forward.conf

允許 DNS 通過防火牆 (若您的 Server 在 NAT 後面,請自行設定 port forward)

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -t filter -A FORWARD -i eth0 -o dns0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A FORWARD -i dns0 -o eth0 -j ACCEPT
# iptables-save > /etc/iptables.rules

安裝 iodine

$ sudo apt-get install iodine

也可進入 iodine 網站 查詢其他發行版之套件名稱

執行 iodine (推薦使用 tmux 或 screen 持續執行,server 是 iodine*d* 不是 iodine)

$ sudo iodined -f -c -P [Server Password] -p [Listen Port] 172.16.0.0 tunnel.example.com

完成後,應該顯示如下輸出

接著請到 http://code.kryo.se/iodine/check-it/ 測試 iodine 設定狀況。若您的 domain 才剛剛設定好,請記得到 Google DNS Flush 更新一下 DNS 紀錄 (三個紀錄都要 flush)

步驟三、客戶端設定

請至 iodine 下載符合您作業系統的套件。Mac OSX 可直接使用 Homebrew

$ brew install iodine

iodine 安裝完成後,請執行下列命令

sudo iodine -f -P [Server Password] tunnel.example.com

iodine 會自動判斷該使用何種 DNS Query Type,每個 DNS 封包的最大值,您可使用 -T TXT 直接指定使用 TXT Query,使用 -m 直接指定每個 DNS 封包的長度(注意,過長的封包可能無法通過 Gateway DNS Server)。若連線成功則顯示:

您可 ping 172.16.0.0 測試 DNS Proxy 是否正常,如收到 ping 回應,則可進行 SSH Tunnel 連線

$ ssh -D 3128 user@172.16.0.0

最後在您的瀏覽器設定 Socks 5 proxy localhost:3128 即可透過 SSH Tunnel 穿過 DNS Proxy 上網了。

Enjoy your free internet (誤

comments powered by Disqus