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ù)決定當(dāng)前使用何種轉(zhuǎn)發(fā)策略。
然后再判斷傳入?yún)?shù)是否正確,通過正則表達(dá)式等方式驗證IP的合法性以及端口范圍。
通過port2port函數(shù)實現(xiàn)了兩個端口同時監(jiān)聽雙向并且轉(zhuǎn)發(fā)數(shù)據(jù)。
在port2host操作中實現(xiàn)了跳板中轉(zhuǎn)。
在host2host中實現(xiàn)了主動連接打通隧道的功能。
看代碼便可以知道,在Golang中進(jìn)行socket操作的net包要比C語言中的socket.h操作簡單很多。
轉(zhuǎn)發(fā)功能的核心就在于forward函數(shù)部分。
先輸出一個日志說明是對哪兩個連接進(jìn)行雙向轉(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í)行他下面的代碼。拷貝出錯意味著可能連接已斷開,那么先把寫入流的連接斷掉。
這里要重點注意,為什么是斷開寫入流而不是讀寫流全部斷開呢。因為我們前面發(fā)射了兩個Goroutine,如果盲目全部斷開,將會導(dǎo)致另一個Goroutine中可能還有未寫完的數(shù)據(jù)丟失。具體可以根據(jù)TCP四次揮手來分析。
實際執(zhí)行
如果沒有Golang環(huán)境的朋友可以直接下載編譯好的可執(zhí)行文件,下載地址:https://github.com/cw1997/NATBypass/releases
我們先來看看代碼編譯之后實際運行,上圖左邊為虛擬機(jī)跑的內(nèi)網(wǎng)服務(wù)器,他已經(jīng)設(shè)置了入站規(guī)則,通過直接連接192.168.2.112:3389是無法連上遠(yuǎn)程桌面的。
此時此刻右圖開始通過listen命令監(jiān)聽7777和9999端口。
接著內(nèi)網(wǎng)服務(wù)器再通過slave命令開始雙向連接黑客的
大家可以根據(jù)netstat -an的結(jié)果以及控制臺日志輸出來綜合理解這個過程。
寫在最后
這個工具現(xiàn)在實現(xiàn)的仍然只是簡單的透明傳輸,并且存在諸多問題。比如說本地主動連接內(nèi)網(wǎng)服務(wù)是一開始就預(yù)連接好的,這樣會導(dǎo)致一些服務(wù)如果在連上之后長期沒有數(shù)據(jù)傳輸,會主動斷掉連接,導(dǎo)致公網(wǎng)端偶爾出現(xiàn)無法連接上,要重新斷開重連后才能連上的小BUG,具體在HTTP服務(wù)器要多刷新幾次頁面,遠(yuǎn)程桌面則可能要連接上然后又取消,然后再連才能連上。而且在并發(fā)連接上處理還有一些細(xì)節(jié)沒有做好。并且目前還僅僅支持TCP連接的轉(zhuǎn)發(fā)等等,當(dāng)然要實現(xiàn)UDP的轉(zhuǎn)發(fā)也不是很困難稍加改進(jìn)即可。大家也可以點個star,提個pull request一起來改進(jìn)這些問題。目前相關(guān)的開源項目也有做的比較成熟的,比如說Golang寫的ngork,大家也可以參考參考。
標(biāo)題名稱:內(nèi)網(wǎng)穿透工具的原理與開發(fā)實戰(zhàn)
瀏覽地址:http://jinyejixie.com/news/104327.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、軟件開發(fā)、小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航、服務(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)
猜你還喜歡下面的內(nèi)容