1. 程式人生 > >DNS+tunnel(DNS隧道)技術-DNS2tcp的使用方法及原理

DNS+tunnel(DNS隧道)技術-DNS2tcp的使用方法及原理

最近遇到了國內某大牛,聽說了一個叫做DNS tunnel的技術,經過一番研究,發現很有趣,記錄一下。

什麼是DNS tunnel?

DNS tunnel 即 DNS隧道。從名字上來看就是利用DNS查詢過程建立起隧道,傳輸資料。

為什麼使用DNS tunnel?

當你在酒店、機場等公共場所,通常有Wifi訊號,但是當你訪問一個網站時,如www.guanwei.org,可能會彈出個視窗,讓你輸入使用者名稱、密碼,登陸之後才可以繼續上網(該技術一般為透明http代理,不在本文討論範圍之內,以後再講)。這時,你沒有賬號,就無法上網。但是有時你會發現,你獲取到得DNS地址是有效的,並且可以用以進行DNS查詢,這時你便可以用DNS tunnel技術來實現免費上網了!

DNS tunnel的原理

首先,要知道DNS系統的工作原理,見:[DNS系統(伺服器)的工作原理及攻擊防護方法論] 。你在做 DNS 查詢的時候,如果查的域名在 DNS 伺服器本機的 cache 中沒有,它就會去網際網路上查詢,最終把結果返回給你。如果你在網際網路上有臺定製的伺服器。只要依靠 DNS 的這層約定,就可以交換資料包了。從 DNS 協議上看,你是在一次次的查詢某個特定域名,並得到解析結果。但實際上,你在和外部通訊。你沒有直接連到區域網外的機器,因為閘道器不會轉發你的 IP 包出去。但區域網上的 DNS 伺服器幫你做了中轉。這就是 DNS Tunnel 了。

 

上圖簡單介紹了DNS tunnel的原理。當你連線上wifi後,你可以使用DNS伺服器,向這個伺服器的53埠傳送資料,請求一個域名,比如b.guanwei.org 。這臺DNS伺服器上沒有b.guanwei.org,那麼它將向root,也就是根域名伺服器請求,看看根知道不。root一看是.org的域名,就交給.org域名伺服器進行解析。.org的域名伺服器一看是.guanwei.org那麼就會去找.guanwei.org的域名伺服器(f1g1ns1.dnspod.net),看看它有沒有這條記錄。.guanwei.org的域名伺服器上一看是b.guanwei.og,如果它有這條A記錄,那麼就會返回b.guanwei.org的地址。

但是,如果沒有,你可以再在guanwei.org的域名伺服器上設定一個NS型別的記錄人,如:guanwei.org NS 111.222.333.444(通常這裡不讓設定為地址,那麼也好辦,你可以先在DNS伺服器上新增一條A記錄,如ns.guanwei.org 111.222.333.444,再新增NS記錄:guanwei.org NS ns.guanwei.org),這裡指定一個公網伺服器,也就是上圖綠色的伺服器,這臺伺服器中跑著DNS tunnel的server端,是一臺假的DNS伺服器,他不會返回b.guanwei.org的地址,但是它會將你的請求轉發到已經設定的埠中,比如SSH的22埠,22埠返回的資料它將轉發到53埠返回給客戶端(也就是你的電腦)。這時,你就可以用這臺公網伺服器的資源了,如果是一臺http或者sock代理,那麼你就可以用這個代理免費上網了。

DNS tunnel實現的工具

DNS tunnel實現的工具有很多,比如:OzymanDNS、tcp-over-dns、heyoka、iodine、dns2tcp。由於BT4、5系統自帶了dns2tcp工具。這裡僅介紹dns2tcp的使用方法。

DNS2TCP的DNS tunnel實驗

環境準備

  • 一個已經申請好的公網域名,在這裡我就用本blog的域名了guanwei.org。給該域名指定一個DNS伺服器(在域名管理的控制面板即可看到),本環境為DNSpod的伺服器:f1g1ns1.dnspod.net。
  • 一個公網伺服器server(執行著BT4系統,主要使用裡面的dns2tcpd V4程式)。這裡使用區域網中的一臺PC,在防火牆上做埠對映,將UDP的53埠映射出去。公網IP為111.222.333.444
  • 一個客戶端client(執行著BT4系統,主要使用裡面的dns2tcpc V4程式)。這裡模擬在機場的環境,能連線區域網(與上面的伺服器不在一個區域網內,是另一個連線公網的區域網),能夠獲取到DNS伺服器,如遼寧網通的202.96.64.68,並可以通過它進行DNS查詢(測試方法:nslookup www.guanwei.org 202.96.64.68,後面的域名伺服器請根據實際情況替換)。

前期配置

客戶端client可以使用域名伺服器查詢域名,這裡設定該域名為dnstunnel.guanwei.org(該域名不能在dnspod的域名伺服器上有任何記錄,因為這個記錄是由server進行應答的)

在guanwei.org的域名伺服器上建立兩條DNS記錄

ns.guanwei.org A 111.222.333.444(這裡的目的就是給DNS伺服器設定一個域名,按原理來說是可以捨去的,但是DNSpod上不可以將NS記錄配置為IP,只能配置為域名,所以需要加上這條記錄)

guanwei.org NS ns.guanwei.org(這裡建立一條NS記錄,意思是如果本臺DNS伺服器上沒有客戶端查詢的域名(dnstunnel.guanwei.org),請去ns.guanwei.org(也就是111.222.333.444)上去查詢)

在server上開啟SSH服務。用以進行測試,如果DNS tunnel建立,client可以使用SSH連線到伺服器上。

詳細配置方法

server端:

編輯/etc/dns2tcpd.conf檔案,內容如下:

listen = 192.168.10.88(Linux伺服器的IP) 
port = 53 
user = nobody 
chroot = /var/empty/dns2tcp/ 
domain = dnstunnel.guanwei.org(對該域名的請求進行轉發,將返回資料包進行封裝) 
resources = ssh:127.0.0.1:22(可以為客戶端提供的服務,也可以為http:127.0.0.1:3128,如果該伺服器開啟了http代理服務)

然後,執行dns2tcpd伺服器程式: #./dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf

================================================

client端: #./dns2tcpc -z dnstunnel.guanwei.org ns.guanwei.org

如果ns.guanwei.org生效了,便可以連線伺服器,提示:

Available connection(s):
        ssh

但是如果ns.guanwei.org還沒有生效,會提示:no response from dns server 。這時可以先使用: #./dns2tcpc -z dnstunnel.guanwei.org 202.96.64.68

如果成功連線伺服器,則說明dnstunnel可以成功建立了,如果沒有,請測試你獲取到得dns伺服器地址是否可用,並且guanwei.org的ns記錄是否生效。測試方法:將111.222.333.444對映到另外一個真正的dns伺服器上,加一條A記錄,如:test.guanwei.org A 192.168.10.254 。然後使用nslookup test.guanwei.org 202.96.64.68,觀察能否成功解析。如果不能解析,請檢查dnspod的配置及dns記錄生效情況。

測試可以成功連線伺服器後,使用#./dns2tcpc -r ssh -l 4430 -z dnstunnel.guanwei.org 202.96.64.68 這時會在本地監聽一個埠,類似一個反彈木馬。使用ssh 127.0.0.1 -p 4430 便可以成功連線server的22埠。如果server提供http代理服務,那麼你就可以設定http代理伺服器免費上網了!

PS:我發現客戶端在監聽4430埠時是監聽127.0.0.1:4430埠,只能本機訪問,其他機器不能連線,如果有牛發現該問題的解決辦法,請聯絡我,謝謝!