關於內網穿透

在我國,因爲網民衆多,運營商沒法保證爲每個寬帶用戶提供全球惟一的公網 IPv4 地址。所以不少用戶會發現經過路由器端查看到的 WAN 端 IP 與百度「IP」關鍵詞所獲得的 IP 不一致,而且前者的 IP 爲一個私有 IP。html

而還有一些狀況下,公網 IP 比較昂貴,企業雖然自己也持有少許的獨立的公網 IP,可是因爲成本限制沒法爲企業內每一臺主機都提供一個公網 IP,或者內網並非全部服務都須要暴露到公網中進行訪問,那麼企業有可能就會使用 NAT 技術將大量的內網 IP 經過必定規則映射到公網 IP 上。web

而最多見的其中一種技術就是 NAPT,也叫「網絡端口地址轉換」。由於通常一個服務都是經過一個端口來提供,所以經過這種方式能夠將特定的服務經過特定的規則開放到少許的公網 IP 上。緩存

國內家庭寬帶 常見的就是 100 開頭的地址,公司學校的網絡也可能如此,這種狀況沒法經過端口映射 DMZ等方法讓內網設備暴露給外網,只能經過內網穿透方式。安全

什麼是NAT

在計算機網絡中,網絡地址轉換(Network Address Translation,縮寫爲NAT),也叫作網絡掩蔽或者IP掩蔽(IP masquerading),是一種在IP數據包經過路由器或防火牆時重寫來源 IP 地址或目的 IP 地址的技術。服務器

這種技術被廣泛使用在有多臺主機但只經過一個公有 IP 地址訪問因特網的私有網絡中。根據規範,路由器是不能這樣工做的,但它的確是一個方便且獲得了普遍應用的技術。固然,NAT 也讓主機之間的通訊變得複雜,致使了通訊效率的下降網絡

NAT 最初發明的一大目的就是解決公網 IP 的 IPv4 地址資源枯竭的問題,因此國內大城市的主流運營商常常會使用這種方法來規避資源枯竭的問題(我國普及 IPV6 可能還須要必定時間),端口 NAT 轉換讓 IP 地址獲得了極大的利用,NAT 的一個特色就是:對外隱藏了真實地址負載均衡

在一個典型的配置中,一個本地網絡使用一個專有網絡的指定子網(好比192.168.x.x或10.x.x.x)和連在這個網絡上的一個路由器。這個路由器佔有這個網絡地址空間的一個專有地址(好比192.168.0.1),同時它還經過一個或多個因特網服務提供商提供的公有的IP地址(叫作「過載」NAT)鏈接到因特網上。當信息由本地網絡向因特網傳遞時,源地址從專有地址轉換爲公用地址。由路由器跟蹤每一個鏈接上的基本數據,主要是目的地址和端口。當有回覆返回路由器時,它經過輸出階段記錄的鏈接跟蹤數據來決定該轉發給內部網的哪一個主機;若是有多個公用地址可用,當數據包返回時,TCP或UDP客戶機的端口號能夠用來分解數據包。工具

固然它是有一些缺點的,一些須要初始化從外部網絡建立的TCP鏈接和無狀態協議(好比UDP)沒法實現。除非NAT路由器管理者預先設置了規則,不然送來的數據包將不能到達正確的目的地址。測試

在必定程度上,NAT 依賴於本地網絡上的一臺機器來初始化和路由器另外一邊的主機的任何鏈接(通常的家居路由器就充當這個角色,路由器會給本身分配一個內網地址,通常是 192.168.1.1),它能夠阻止外部網絡上的主機的惡意活動。這樣就能夠阻止網絡蠕蟲病毒來提升本地系統的可靠性,阻擋惡意瀏覽來提升本地系統的私密性。不少具備NAT功能的防火牆都是使用這種功能來提供核心保護的。另外,它也爲 UDP 的跨局域網的傳輸提供了方便。網站

假設個人 PC 機是 192.168.1.100,個人手機是 192.168.1.101,與百度通訊的公網 IP 都是 1.1.1.1,但百度服務器沒法直接從 IP 判斷我訪問的設備,這就致使了外網 IP 不能直接地對內網設備發起通訊。

咱們能夠先對公網設備發起通信,對方的回覆會經過路由器發給咱們,可是公網裏的主機沒法主動跟咱們通信,好比咱們的電腦就不能做爲 web 服務器,當用戶訪問 1.1.1.1 的時候,路由器並不能區分到底訪問的是那個設備。

基本網絡地址轉換(Basic NAT)

這一種也可稱做 NAT 或「靜態 NAT」,在 RFC 2663 中提供了信息。它在技術上比較簡單,僅支持地址轉換,不支持端口映射。

Basic NAT 要求對每個當前鏈接都要對應一個公網IP地址,所以要維護一個公網的地址池。寬帶(broadband)路由器一般使用這種方式來容許一臺指定的設備去管理全部的外部連接,甚至當路由器自己只有一個可用外部IP時也如此,這臺路由器有時也被標記爲 DMZ主機

因爲改變了 IP 源地址,在從新封裝數據包時候必須從新計算校驗和,網絡層以上的只要涉及到IP地址的頭部校驗和都要從新計算。

Basic NAT 要維護一個無故口號NAT表,結構以下:

內網IP 外網IP
192.168.1.55 219.152.168.222
192.168.1.59 219.152.168.223
192.168.1.155 219.152.168.224

網絡地址端口轉換(NAPT)

NAPT

這種方式支持端口的映射,並容許多臺主機共享一個公網 IP 地址。

支持端口轉換的 NAT 又能夠分爲兩類:源地址轉換和目的地址轉換

前一種情形下發起鏈接的計算機的 IP 地址將會被重寫,使得內網主機發出的數據包可以到達外網主機

後一種狀況下被鏈接計算機的 IP 地址將被重寫,使得外網主機發出的數據包可以到達內網主機

實際上,以上兩種方式一般會一塊兒被使用以支持雙向通訊該技術應用於內部網絡主機地址與公網上主機地址重疊的狀況。

NAPT 維護一個帶有 IP 以及端口號的 NAT 表,結構以下:

內網IP 外網IP
192.168.1.55:5566 219.152.168.222:9200
192.168.1.59:80 219.152.168.222:9201
192.168.1.59:4465 219.152.168.222:9202
簡單說:

在 NAT 網關上會有一張映射表,表上記錄了內網向公網哪一個 IP 和端口發起了請求,而後若是內網有主機向公網設備發起了請求,內網主機的請求數據包傳輸到了 NAT 網關上,那麼 NAT 網關會修改該數據包的 IP 地址和端口爲 NAT 網關自身的 IP 地址和任意一個不衝突的自身未使用的端口,而且把這個修改記錄到那張映射表上。

最後把修改以後的數據包發送到請求的目標主機,等目標主機發回了響應包以後,再根據響應包裏面的目的 IP 地址和目的端口去映射表裏面找到該轉發給哪一個內網主機。

這樣就實現了內網主機在沒有公網 IP 的狀況下,經過 NAPT 技術藉助路由器惟一的一個公網 IP 來訪問公網設備。

說一下它的特色吧,也能夠說是 NAT 的特色:

  1. 網絡被分爲私網和公網兩部分,NAT 網關設置私網到公網的路由出口.
  2. 網絡只能由私網側發起,公網沒法主動訪問私網主機 (是這樣設計的,可是能夠經過打洞的方式,就是內網穿透)
  3. NAT 網關在兩個訪問方向上完成兩次地址的轉換,出口替換源地址,入口替換目的地址
  4. NAT 網關的存在對通訊雙方保持透明
  5. NAT 網關爲了實現雙向翻譯,須要維持一張關聯表,將會話信息保存

從這裏咱們能夠看到,NAPT 只解決了內網主機在沒有公網 IP 的狀況下如何訪問公網主機的問題,可是並不能解決公網主機如何主動向內網主機發起請求的問題。

其餘用途

NAT 還能夠用做負載均衡、失效終結、透明代理等。

關於私有地址

複習下網絡方面的知識,這個確定都學過,至於還記不記得.....

因特網域名分配組織 IANA 組織(Internet Assigned Numbers Authority)保留了如下三個 IP 地址塊用於私有網絡。

10.0.0.0 - 10.255.255.255 (10/8比特前綴)

172.16.0.0 - 172.31.255.255 (172.16/12比特前綴)

192.168.0.0 - 192.168.255.255 (192.168/16比特前綴)

主流的家用路由器使用 C 類私有地址做爲路由器 LAN 端的 IP 地址較多,因此咱們能夠看到路由器設置頁面的 IP 通常都爲 192.168 開頭。

一些大型企業就須要使用B類甚至A類地址段做爲內部網絡的地址段。A類地址的容量最大,能夠容納16777214個主機,B類地址能夠容納65534個主機,C類地址能夠容納254個主機。

爲何要內網穿透

先說說家庭寬帶的狀況吧。家庭寬帶若是沒有公網 IP,那麼意味着你在本機上監聽的任何端口,都只能在本機網卡所在的網絡中訪問,這個網絡通常是路由器 LAN 端所在的網絡。若是沒有作特定的映射規則,那麼路由器 WAN 端所鏈接到的網絡將沒法正常訪問該主機提供的服務。

若是這種狀況下想要讓 WAN 端(若是運營商爲你分配了公網 IP,那麼 WAN 端所鏈接到的網絡一般就是公網),那麼須要在路由器上作端口映射。好比說路由器的 LAN IP 爲 192.168.1.1,WAN IP 爲23.23.23.23,我想讓內網 192.168.1.2 主機的 80 端口提供的 HTTP 服務器直接可以在公網中經過 http://23.23.23.23 訪問,那麼就要將 192.168.1.2:80 映射到 23.23.23.23:80 上。

可是一般狀況下,運營商是不會給普通用戶公網 IP 的。那麼用這種方法映射,在公網仍然是沒法訪問的,由於你的路由器 WAN 端鏈接的又是運營商更上一級的路由器 LAN 端;嚴重一點,甚至是層層鏈接最後纔到公網,這種行爲稱做流量穿透
國內某電,某動的寬帶就有大量這種行爲。經過流量穿透的方式來提供的寬帶服務,看似便宜,實則影響很大,因爲你們公用一個 IP,可能會致使不少網站的反 SPAM 策略傷及無辜,或者內部爲了節省帶寬,使用緩存,致使一些不應緩存的敏感安全頁面被緩存起來,甚至致使部分網站緩存失效徹底打不開。

有的人發現,即便本身有公網 IP,可是仍然沒法經過常規方法架設服務器,這是怎麼回事呢?
這是運營商爲了防止我的隨意開設各類非法服務,也防止黑客經過掃描器進行抓雞和批量掃描,將一些經常使用端口進行了封禁,好比說咱們這的中國電信就將 80,8080 等端口封禁了。這樣封禁,雖然必定程度上保證了咱們的網絡安全,好比說以前的勒索病毒正由於國內大部分用戶沒有獨立的公網 IP,而且操做系統最容易爆發漏洞的 135,139 等端口被運營商封禁了,使得國內我的家庭電腦中招的機率小了不少;
可是致使即便有公網 IP,也沒法使用經常使用端口向外網提供服務,只能更換到其餘端口。這樣有什麼很差呢?比較典型的問題就是 WEB 網站默認使用 80 端口,那麼在輸入網址的時候能夠不用帶上端口號,顯得比較美觀。

還有的時候咱們在對企業作滲透測試的時候,發現企業某臺公網服務器只對公網開放了常見的 80 端口,而咱們提權時須要用到的 3389 等端口沒有對公網開放,這個時候又該怎麼辦呢?

若是咱們沒有一臺公網服務器,咱們可使用國內大名鼎鼎的「花生殼」,「nat123」等服務來實現,可是他們背後的原理是什麼呢?

咱們若是在本身擁有一臺具備公網 IP 服務器的狀況下,咱們能夠藉助這臺公網 IP 服務器提供服務。解決這些問題的方式就是內網穿透了。

內網穿透原理

先假設咱們本身有一臺公網服務器,他的 IP 爲 45.45.45.45。咱們又有一臺內網服務器 IP 爲 23.23.23.23. 咱們如今想把 23.23.23.23:80,即內網服務器上的 HTTP 服務開放到 45.45.45.45 上。

最簡單粗暴的方式就是,咱們能夠直接將整個內網服務器環境在公網服務器上從新搭建一遍。

可是這樣作很麻煩,咱們有的時候並不想這樣作,咱們只是想簡單的藉助公網服務器的網絡來發佈一個內網服務

前面咱們經過 NAPT 原理得知:

NAPT 實現了內網主機在沒有公網 IP 的狀況下訪問公網主機。那麼咱們能夠這樣作:

假設分配的公網 IP 爲 23.23.23.23,內網IP爲 192.168.1.2。公網主機(45 那臺)先監聽 80 端口,監聽這個端口是用於向外部提供一個 HTTP 服務。

同時其餘任意一個端口(這裏咱們假設爲 7777),監聽這個端口是用於讓內網服務器主動鏈接進來打通一個隧道 ,使用心跳鏈接來維持,這樣看起來就像公網主機直接向內網主機發送消息。接着內網再主動向公網主機(45 那臺)的 7777 發起一個請求,這樣內網就成功與公網主機創建了一個鏈接通道。

而後當有任何客戶端主動鏈接公網的 80 端口時,公網接收到鏈接請求以後立刻把這鏈接請求經過先前創建好的隧道轉發到內網主機,內網主機接收到來自隧道的數據包後再主動鏈接內網主機自身的 80 端口,鏈接成功以後將數據包原封不動地轉發數據包給 80 端口,待 HTTP 服務器程序處理完這個數據包,生成了響應報文以後再原路轉發回去,最終到達公網的 80 端口,而後返回給最開始請求公網服務器 80 端口的客戶端。

看起來是否是比較繞呢?事實上大名鼎鼎的花生殼內網版以及 nat123 等內網穿透工具的原理基本就是如此,可是並不徹底是這樣。由於一個運輸層端口只能同時提供一種服務,可是咱們會發現花生殼這種內網穿透服務是藉助一個公網 IP 同時給不少用戶提供了服務,這是由於花生殼在流量轉發這一層上並非像我以前所說的原封不動的將報文進行轉發,而是在轉發以前加了一些控制協議的內容,用於指明該轉發到哪一個花生殼客戶端所在的內網主機上。前者這種原封不動的轉發方式一般叫作透明傳輸或者透明代理。

這種方法基本適用於全部的網絡環境,只要你的設備能上互聯網,前提是你得擁有一臺擁有"公網IP"的主機充當"跳板"

穿透防火牆

爲了安全起見,一般會在網絡中加入防火牆,防火牆有入站規則和出站規則。若是不是很是嚴格的安全管控,一般是不會設置出站規則的,可是入站規則通常都會設置的,好比說外部能夠經過 80 端口傳入內網的 WEB 服務器訪問網頁,可是不能經過 3389 端口登錄內網的遠程桌面。

而在內網滲透的過程當中碰到這種狀況,咱們也能夠藉助上面內網傳統的方式實現穿透防火牆的入站規則。由於防火牆一般只攔截了入站,沒有攔截出站,那麼咱們可讓內網服務器主動出站(主動鏈接到黑客的服務器),與黑客本身的服務器打通隧道,最終繞過防火牆連上 3389 遠程桌面。

還有一種狀況就是咱們已經拿下了內網其中一臺並無作任何防火牆規則的白名單服務器,可是咱們想連上內網另外一臺作了入站規則的目標服務器,那麼咱們可讓這臺白名單服務器做爲一個跳板,讓他先監聽自身任意一個端口,而後在有任何用戶連上這個端口以後,白名單服務器就主動連上內網的目標服務器,而後藉助這臺白名單服務器打通黑客和目標服務器的鏈接隧道。

而在黑客工具中大名鼎鼎的 lcx 原理也就是如此,前者的實現是 lcx 的 listen 和 slave 命令,後者的實現是 lcx 的 tran 命令。

IP 隧道是指一種可在兩網絡間用網際協議進行通訊的通道。在該通道里,會先封裝其餘網絡協議的數據包,以後再傳輸信息。

在 IP 隧道中,每一個 IP 包、來源/目的地址信息都被封裝在一個數據包中,該數據包用於實際物理網絡傳遞。

由於防火牆的本質及原始數據報文被隱藏了,IP 隧道常常用於繞過簡單的防火牆規則,一般須要經過內容控制軟件才能對 IP 隧道進行篩查。

其餘方案

除了內網穿透這個通用的解決方案,還有些其餘方案也能夠作到,畢竟內網穿透須要一臺服務器作跳板是有點成本的。

但若是 ISP 給你分了個內網 IP ,你就只能用內網穿透的方案了。

DDNS

在路由器的管理界面應該看到過,因爲運營商分配的 IP 地址不斷變更,直接操做這個變更的 IP 地址是至關麻煩的,而操做一個不變的域名(bfchengnuo.com)是至關方便的,DDNS 的原理就是內網設備(通常是路由器)每隔一段時間對 DDNS 服務器發起請求,DNS 服務器將請求的 IP 記錄下來而且刷新相關域名的解析記錄(通常是 A 記錄),這樣每次撥號怎麼變更 ,域名 bfchengnuo.com 老是指向路由器所分配的公網 IP。

這個對擁有「公網 IP 」的寬帶纔有做用,對於沒有「公網 IP 」的寬帶沒啥做用,由於擁有"公網 IP "的這臺網關設備在運營商機房裏,你通常沒有權限對它進行端口映射等操做。

通常 DDNS 服務都是免費的,常見的路由器裏會集成。

另外 DNS 解析服務商,國內常見的 alidns,cloudxns,dnspod 都開放管理域名解析的 API,能夠定時運行腳本進行 DDNS,不過 API 請求的間隔時間是有限制的。

不過讓我想到了之前玩遠控時候用的動態域名,肉雞上線後會自動連接這個域名,而後經過 DDNS 就至關於都在連接你的電腦了(不過須要先進行端口映射,直接撥號上網而且分配的是公網 IP 的話就不須要了)。

應用:解決不少網絡視頻服務器和網絡攝像機經過遠程訪問時須要一個固定的 IP,在家搭建 web 服務器(若是 80 沒被封的話)等。

端口映射&DMZ

這個方法適用於對公網 IP 網關設備具備控制權而且擁有完整的路由轉發。

端口映射的教程網上都找獲得,通常拿到"公網 IP "的電信寬帶(親測)基本能夠,拿不到就去投訴,國內基本上也是「不包含 80 端口的公網 IP」,也就是說,若是你想架設 Web 服務器且不想改變默認端口,那就必須使用內網穿透 80


至於 DMZ ,由於外網客戶端沒法直接訪問內網的主機,當配置了 DMZ 主機後全部的請求路由器都會直接轉發給配置的 DMZ 主機(能夠是內網主機)。

在一些家用路由器中,DMZ 是指一部全部端口都暴露在外部網絡的內部網絡主機,除此之外的端口都被轉發。嚴格來講這不是真正的 DMZ,由於該主機仍能訪問內部網絡,並不是獨立於內部網絡以外的。但真正的 DMZ 是不容許訪問內部網絡的,DMZ 和內部網絡是分開的。

自建

若是你手上有閒置的 vps,同樣可使用:

  • frp(推薦,項目一直在維護)
  • ngrok(原做者棄坑)

其餘

外網的主機沒法主動訪問內網,這個不是絕對的,好比有個協議叫 P2P .......像 QQ 的視頻聊天等都是經過這個來進行穿透的。

對於 QQ 來講,實現應該要簡單的多,由於必需要登錄,也就是必需要首先訪問公網的服務器,而後服務器會記錄 公網IP/內網IP 和端口號,這樣兩我的直接 P2P 就能找獲得映射了。

至於 P2P 是如何穿透 NAT 的其餘方法,這個感興趣的能夠搜搜看看。

參考

https://www.jianshu.com/p/a67...
https://zh.wikipedia.org/wiki...
https://zhuanlan.zhihu.com/p/...
https://www.sfantree.com/publ...
https://www.zhihu.com/questio...

相關文章
相關標籤/搜索