內(nèi)網(wǎng)穿透工具的原理與開發(fā)實戰(zhàn)

2021-03-05    分類: 網(wǎng)站建設(shè)

在我國,由于網(wǎng)民眾多,運營商無法保證為每一個寬帶用戶提供全球唯一的公網(wǎng)IPv4地址。因此很多用戶會發(fā)現(xiàn)通過路由器端查看到的WAN端IP與百度“IP”關(guān)鍵詞所得到的IP不一致,并且前者的IP為一個私有IP。

而還有一些情況下,公網(wǎng)IP比較昂貴,企業(yè)雖然本身也持有少量的獨立的公網(wǎng)IP,但是由于成本限制無法為企業(yè)內(nèi)每一臺

首先通過判斷傳入?yún)?shù)決定當前使用何種轉(zhuǎn)發(fā)策略。

然后再判斷傳入?yún)?shù)是否正確,通過正則表達式等方式驗證IP的合法性以及端口范圍。

通過port2port函數(shù)實現(xiàn)了兩個端口同時監(jiān)聽雙向并且轉(zhuǎn)發(fā)數(shù)據(jù)。

在port2host操作中實現(xiàn)了跳板中轉(zhuǎn)。

在host2host中實現(xiàn)了主動連接打通隧道的功能。

看代碼便可以知道,在Golang中進行socket操作的net包要比C語言中的socket.h操作簡單很多。

轉(zhuǎn)發(fā)功能的核心就在于forward函數(shù)部分。

先輸出一個日志說明是對哪兩個連接進行雙向轉(zhuǎn)發(fā),然后通過sync包下的WaitGroup實現(xiàn)一個條件阻塞功能,防止在Goroutine還未執(zhí)行完,主線程就已經(jīng)退出了。

然后發(fā)射兩個Goroutine,分別處理連接1到連接2的IO數(shù)據(jù)包拷貝以及連接2到連接1的IO數(shù)據(jù)包拷貝。因為要保證兩個端口間的通信是全雙工的,也就是兩邊同時都要能夠互相交換數(shù)據(jù),所以要用Goroutine來實現(xiàn)這兩個操作的并發(fā)。

而IO數(shù)據(jù)包的拷貝核心代碼在connCopy函數(shù)中,根據(jù)是否要記錄流量日志判斷是否要使用io.MultiWriter這個多路寫數(shù)據(jù)流的函數(shù)。

如果打開日志文件的文件流成功,則通過io.MultiWriter函數(shù)生成一個多路寫入流,這里這個多路寫入流的變量名為w,任何寫入到w這個寫入流的數(shù)據(jù)都會同時寫入先前參與執(zhí)行多路寫入流創(chuàng)建函數(shù)io.MultiWriter的參數(shù)中,在這里參數(shù)為conn1和logFile,即為端口1和日志文件流。

接著調(diào)用io.Copy將第二參數(shù)的讀取流中讀取到的數(shù)據(jù)源源不斷地拷貝到第一個參數(shù)的寫入流中。

這里要注意io.Copy函數(shù)是同步阻塞的,意味著只要連接沒有斷開,那么程序執(zhí)行流將一直卡在這個函數(shù)。如果拷貝出錯,那么io.Copy函數(shù)就會返回,也就是執(zhí)行他下面的代碼??截惓鲥e意味著可能連接已斷開,那么先把寫入流的連接斷掉。

這里要重點注意,為什么是斷開寫入流而不是讀寫流全部斷開呢。因為我們前面發(fā)射了兩個Goroutine,如果盲目全部斷開,將會導致另一個Goroutine中可能還有未寫完的數(shù)據(jù)丟失。具體可以根據(jù)TCP四次揮手來分析。

實際執(zhí)行

如果沒有Golang環(huán)境的朋友可以直接下載編譯好的可執(zhí)行文件,下載地址:https://github.com/cw1997/NATBypass/releases

我們先來看看代碼編譯之后實際運行,上圖左邊為虛擬機跑的內(nèi)網(wǎng)服務(wù)器,他已經(jīng)設(shè)置了入站規(guī)則,通過直接連接192.168.2.112:3389是無法連上遠程桌面的。

此時此刻右圖開始通過listen命令監(jiān)聽7777和9999端口。

接著內(nèi)網(wǎng)服務(wù)器再通過slave命令開始雙向連接黑客的

大家可以根據(jù)netstat -an的結(jié)果以及控制臺日志輸出來綜合理解這個過程。

寫在最后

這個工具現(xiàn)在實現(xiàn)的仍然只是簡單的透明傳輸,并且存在諸多問題。比如說本地主動連接內(nèi)網(wǎng)服務(wù)是一開始就預連接好的,這樣會導致一些服務(wù)如果在連上之后長期沒有數(shù)據(jù)傳輸,會主動斷掉連接,導致公網(wǎng)端偶爾出現(xiàn)無法連接上,要重新斷開重連后才能連上的小BUG,具體在HTTP服務(wù)器要多刷新幾次頁面,遠程桌面則可能要連接上然后又取消,然后再連才能連上。而且在并發(fā)連接上處理還有一些細節(jié)沒有做好。并且目前還僅僅支持TCP連接的轉(zhuǎn)發(fā)等等,當然要實現(xiàn)UDP的轉(zhuǎn)發(fā)也不是很困難稍加改進即可。大家也可以點個star,提個pull request一起來改進這些問題。目前相關(guān)的開源項目也有做的比較成熟的,比如說Golang寫的ngork,大家也可以參考參考。

當前文章:內(nèi)網(wǎng)穿透工具的原理與開發(fā)實戰(zhàn)
當前網(wǎng)址:http://www.bm7419.com/news27/104327.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站制作、企業(yè)建站、商城網(wǎng)站、Google、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)