NAT穿透(兩個不同內網主機通訊)
問題就在於NAT。首先介紹下NAT。
NAT的作用NAT(Network Address Translator),網路地址轉換。顧名思義,它是一種把內部私有網路IP地址翻譯成公有網路IP地址的技術,如圖5-1所示。NAT是在IP地址日益缺乏的情況下產生的,它的主要目的是使地址能夠重用[9]。
圖5-1 NAT模型
IP地址分為五類:A類,B類,C類,D類,E類(這裡不考慮保留的IP地址)。A、B、C類可被計算機作為IP地址,D類為組播地址,E類為特殊用途的地址。A、B、C類中,又可分為公有地址和私有地址,私有地址用於內網,不同的內網,私有地址可重用,從而節省了公網地址,它不可在公網中被路由,所以內網的主機要訪問公網的伺服器,便要經過NAT。公有地址是全球唯一的,能在公網上被路由。
內網主機用私有地址在內網能與其它的內網主機無誤地通訊,但它不能直接用私有地址訪問外網的主機,因為私有地址不能被路由。它要與外網通訊,必須經過NAT裝置(如閘道器,路由器),如圖5-2所示。主機A與伺服器S通訊,它須先通過閘道器,此時閘道器改變它的資料包地址及埠,把私有地址(10.0.0.2)改為公有地址(155.99.25.11),使資料包能在公網上被路由,送至伺服器端。伺服器端返回的資料包到達閘道器後,閘道器把公網地址改為相應的私有地址,然後轉發到主機A。通過這種方法,一個內網只需一個公有IP地址,就把整個內網的計算機接入Internet,從而解決IP地址缺乏的問題。
NAT功能通常被整合到路由器、防火牆、ISDN路由器或者單獨的NAT裝置中。也可通過軟體實現這一功能,Windows 98 SE、Windows 2000 都包含了這一功能。
NAT的分類及工作原理
基本NAT與NAPT如圖5-3所示,NAT分為兩大類,基本的NAT和NAPT(Network Address/Port Translator)[10][11]。
基本的NAT,它僅將內網主機的私有IP地址轉換成公網IP地址,但並不將TCP/UDP埠資訊進行轉換,有動態與靜態之區分。由於現在大部分都屬於另一種型別,即NAPT,故這裡不詳細討論基礎NAT。
另外一種NAT叫做NAPT(Network Address/Port Translator),從名稱上我們也可以看得出,NAPT不但會改變經過這個NAT裝置的IP資料報的IP地址,還會改變IP資料報的TCP/UDP埠。NAPT的地址及埠的轉換過程,請看圖5-4:
私有網路中某一主機Client A(10.0.0.2),它的某個程序通過1234埠,想訪問外網伺服器18.181.0.31的1235埠。那麼當資料包通過NAT時,這個NAT的外網地址是155.99.25.11,首先NAT會改變這個資料包的原IP地址,改為155.99.25.11。並分配一個埠(如62000)給Client A,把資料包的原埠號改為62000。所以本來是(10.0.0.2:1234->18.181.0.31:1235)的資料包到了網際網路上變為了(155.99.25.11:62000->18.181.0.31:1235),如圖5-4左圖所示。NAT會記住62000埠對應的是10.0.0.2的1234埠,以後從外網伺服器18.181.0.31傳送到62000埠的資料會被NAT自動的改變目的IP和埠號,然後轉發到10.0.0.2上(如圖5-4右圖所示)
錐型NAT與對稱型NAT
NAPT又分為錐型(Cone)和對稱型(Symmetric),如圖5-5所示,它們的區別在於,在NAT已分配埠號給Client A的情況下,如果Client A繼續用1235埠與另一外網伺服器通訊,錐型NAT還會繼續用原來62000埠,即所分配的埠號不變。而對於對等型NAT,NAT將會分配另一埠號(如62001)給Client A的1235埠。也就是說,同一內網主機同一埠號,對於錐型NAT,無論與哪一外網主機通訊,都不改變所分配的埠號;而對於對等型NAT,同一內網主機同一埠號,每一次與不同的外網主機通訊,就重新分配另一個埠號。
完全錐型NAT、受限制錐型NAT與埠受限制型NAT
錐型NAT可另外分類為完全錐形(Full Cone)NAT,受限制錐形(Restricted Cone)NAT,埠受限制錐形(Port Restricted Cone)NAT。
①完全錐形(Full Cone)NAT
這種NAT內部的主機A連線過外網主機C後,NAT會開啟一個埠。然後外網的任何發到這個開啟的埠的UDP資料報都可以到達A,不管是不是C發過來的[12]。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何傳送到NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)。
②受限制錐形(Restricted Cone)NAT
這種NAT內部的主機A連線過外網的主機C後,NAT開啟一個埠。然後C可以用任何埠和A通訊,但其他的外網主機不可以。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何從C傳送到NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)。
③埠受限制錐形(Port Restricted Cone)NAT
這種NAT內部的主機A連線過外網的主機C後,NAT開啟一個埠。然後C只能用原來的埠和A通訊,其他的外網主機不可以。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
只有C(202.88.88.88:2000)傳送到 NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)。
NAT產生的問題
NAT很好地解決了地址緊缺的問題,遮蔽了內部網路,但也帶來一些問題。內網的主機向外連線是很容易的(NAT相當於透明的,內網的和外網的主機均不用知道NAT的情況)。但如果外部的計算機想訪問子網內的計算機就比較困難了,這可以使內網主機先發起連線從而解決問題。但是如果兩臺主機都分別位於兩不同NAT後面時,兩臺主機無法通訊。當分別位於兩不同NAT(NAT A,NAT B)後面的兩臺主機A和B欲進行通訊時,若主機B主動發起連線,它該連哪個地址呢?第一種情況:試圖直接連到主機A的內網私有地址(10.0.0.2:1234)肯定會失敗,因為10.0.0.2根本就不是一個可以在公網上路由的IP地址;第二種情況,試圖直接連到B的NAT公有地址(155.99.25.11:62000),NAT A會拒絕這個資料包,因為這個埠並無繫結內網主機的某個埠,或即使有所繫結,但這個埠所繫結的外網地址和埠並不是B的地址和埠。若A主動連線B,結果一樣。
有兩種方法解決這個問題。方法一:通過伺服器,伺服器作為中間人,轉發主機間的資料。但若使用者數量到達一定數目時,這方法浪費頻寬且給伺服器帶來很大壓力,所以方法不可行。方法二,還是通過伺服器,但伺服器只充當“介紹人”,不轉發主機間的資料,具體請看下面的“UDP打孔技術” (UDP hole punching)
穿透NAT——UDP打孔技術
所謂的“打孔技術”,就是在內網的NAT裝置上打上一個“孔”(也就是在NAT上建立一個會話,繫結地址和埠號),這個孔不能由外部來打,只能由內網內的主機來打。而且這個孔可能是有方向的,比如從內部某臺主機(比如:192.168.0.10)向外部的某個IP(比如:219.237.60.1)傳送一個UDP包,那麼就在這個內網的NAT裝置上打了一個方向為219.237.60.1的“孔”,以後219.237.60.1就可以通過這個孔與內網的192.168.0.10聯絡了[13]。
下面就根據NAT的各種型別詳細解析如何“打孔”,如何穿透NAT。
1.完全錐形(Full Cone)NAT
處於不同內網的主機A和主機B,各自先連線伺服器,從而在各自NAT裝置上打開了一個“孔”,伺服器收到主機A和主機B的連線後,知道A與B的公網地址和NAT分配給它們的埠號,然後把這些NAT地址與埠號告訴A與B,由於在完全錐形NAT的特點,A和B給伺服器所開啟的“孔”,能給別的任何的主機使用。故A與B可連線對方的公網地址和埠直接進行通訊。伺服器在這裡充當“介紹人”,告訴A與B對方的地址和埠號。
2.受限制錐形(Restricted Cone)NAT
A和B還是要先連線伺服器,伺服器傳送A和B的地址和埠資訊給A和B,但由於受限制錐形NAT的特點,他們所開啟的“孔”,只能與伺服器通訊。要使他們可以直接通訊,解決辦法如下:
假如主機A開始傳送一個UDP資訊到主機B的公網地址上,與此同時,它又通過伺服器中轉發送了一個邀請資訊給主機B,請求主機B也給主機A傳送一個UDP資訊到主機A的公網地址上。這時主機A向主機B的公網IP傳送的資訊導致NAT A開啟一個處於主機A的和主機B之間的會話,與此同時,NAT B也打開了一個處於主機B和主機A的會話。一旦這個新的UDP會話各自向對方打開了,主機A和主機B之間就可以直接通訊了[14]。
3.埠受限制錐形(Port Restricted Cone)NAT
對於該型別的NAT,解決辦法跟上面的方法一樣。
4.對稱型(Symmetric)NAT
相關推薦
NAT穿透(兩個不同內網主機通訊)
在網路編碼中會發現程式在區域網中是可以適用的,但是在外網與內網之間和內網與內網之間就不可行。 問題就在於NAT。首先介紹下NAT。 NAT的作用NAT(Network Address Translator),網路地址轉換。顧名思義,它是一種把內部私有網路IP地址翻譯成公有網路IP地址的技術,如圖5-1所示。
閘道器的作用(兩個內網主機通訊原理)
閘道器是一種充當轉換重任的計算機系統或裝置。在使用不同的通訊協議、資料格式或語言,甚至體系結構完全不同的兩種系統之間,閘道器是一個翻譯器。與網橋只是簡單地傳達資訊不同,閘道器對收到的資訊要重新打包,以適應目的系統的需求。同時,閘道器也可以提供過濾和安全功能
frp 內網穿透實現 ssh 訪問內網主機
本文目的 frp 是一個可用於內網穿透的高效能的反向代理應用,支援 tcp, udp, http, https 協議。 本文將基於 frp 來實現內網穿透,從而實現從外網 ssh 登入內網主機,而不對 frp 其他的應用做過多的說明。 frp 的作用
vSphere Client中宿主主機如何同時使用兩個不同網段的網路
宿主主機esxi網絡卡配置 在我們工作中,我們有時候需要在虛擬機器中使用兩種不同網段的網路,比如:172.16.0.0/24,192.168.0.0/24兩個網段。但是不知道怎麼去新增網絡卡和配置,那麼我通過自己的實踐和經驗來告訴你。我們先登入到我們的宿主主機:
使用 ssh 反向隧道穿透 NAT 訪問 Linux 內網主機
前言 由於公司經常會有專案需要去業主那邊搭建伺服器,基本不需要什麼流量所以就準備用 4G 網絡卡搭建。而該網絡卡無固定公網 ip,只有內網 ip,我們目的就是為了可以遠端操控以避免有時因業務需要往業主那邊跑,要是地方比較遠來回一趟也得花個把星期,不划算。所以就
計算機網路 兩個不同網段相同vlan的主機是否能通過二層交換機ping通
兩個不同網段相同vlan的主機是否能通過二層交換機ping通? https://zhidao.baidu.com/question/544596022.html?qbl=relate_question_6&word=packet tracer vlanЭ�� 拓展:相同的網段不同
不同內網的兩臺主機之間的通訊
若是兩臺主機分別處於兩個不同內網,他們之間要通訊,兩邊都無法主動發出連線請求,誰也不知道誰的公網地址,那該如何做呢? 這時就得需要一箇中介來聯絡這兩個內網主機。 現在我們來看看一個P2P軟體的流程,以下圖為例: 首先,Client A登入伺服器,NAT A為這次的Session分配了一個埠60000,
兩個不同網段的PC直連是否可以Ping通,肯定可以Ping的通(轉)
文章 解決 .net spl splay ttr str proc ipv4 在這一篇文章中http://blog.csdn.net/zhangdaisylove/article/details/46892917的案例,明確的說明兩個不同網段的PC不能Ping的通,其實他給
區域網兩個不同網段互相訪問 不同網段裝置相互訪問
區域網內為便於管理和接入,經常劃分為不同的網段,不同網段的PC通過一個路由器與上層網段連線,可訪問外網或上層網路;但上層或同層網路不同網段PC不能訪問其他網段PC。 PC通過一個路由器與主網或上層網路連線時,也出現上述現象:自己的路由器連線到主網上,PC和嵌入式裝置連線到路由器,PC和嵌入式裝置可訪問上層網
efcore 跨表查詢,實現一個介面內查詢兩個不同資料庫裡各自的表資料
最近有efcore跨庫查詢的需求,研究了下colder框架裡文件的分庫實現,發現並不能完全實現一個介面下的跨庫查詢請求,只能滿足一個業務層構造指定的唯一一個數據庫訪問介面。 先說下文件是怎麼實現的 DbAccessor實現使用多資料庫 預設框架會自動注入IDbAccessor作為資料庫訪問介面,在需要的時
pfsense 映射公網IP給內網主機
pfsense 公網ip 映射 內網 主機pfsense的功能非常強大,今天就介紹一下pfsense的公網IP映射功能。一般寬帶提供商給你安裝寬帶的時候,都會多給幾個IP地址。路由上網只用到一個公網IP,如果想用內網的機器做FTP、WEB服務器,除了用端口映射,也可以使用余下的公網IP直接映射到內網某個主機來
C程序中讓兩個不同版本的庫共存
lua compile c 原文連接:http://blog.gotocoding.com/archives/875今天有同學提出,如何在一個C程序中讓兩個不同版本的庫共存。首先想到的方案是,把其中一個版本的庫函數全部重命名,比如把每一個函數名都加一個_v2的後綴。人工替換到沒什麽,但是如果函數個
兩個不同的林根域之間如何建立信任關系
張兆森兩個不同的林根域之間如何建立信任關系 標簽:張兆森步驟:DC的IP地址:192.168.1.1 (DC1)域名為:benet.com2、另一個林根域的IP地址:192.168.1.2 (DC2) DNS不要指向主DC了,因為這裏跟主DC沒有關系了,3、安裝DC4、創建轉發器5、建立信任關系實驗步驟:
ASA的Twice-NAT實現anyconnectVPN地址池內網無路由的PAT
asa twice-nat 一.說明 anyconnect VPN的地址池地址,正常情況下,需要內網能路由,路由指向為ASA的inside接口地址,但是如果內網不能添加路由的情況下,客戶端撥通VPN之後,能夠順利訪問內網呢?二.思路 ASA的inside接口地址為內網地址,內網可以路由,因
python之pygal:擲兩個不同的骰子並統計大小出現次數
range 截圖 pan lis label 一個 出現 pen des 代碼示例: 1 # 擲兩個不同的骰子並統計大小出現次數 2 import pygal 3 from die_class import Die 4 5 die = Die(6) # 實例
SpringCloud的Hystrix(二) 兩個消費者內的兩個服務監控
ring pan 其他 pro 驗證 app pri style 應用 一、驗證斷路保護監控是否管理多個消費者 app 1、第1個消費者應用:訪問自己封裝rest服務 saleProd 2、第2個消費者應用:第二個應用沒有反應 說明 1、每個應用實例的斷路保護機制,只對
兩個不同vim之間復制內容
line 函數 readline 我們 可視化 進行 操作 tro 文件的 常規想法是打開兩個vim,然後進行yy和p操作,但是實踐證明根本是不行的。此時,我們需要分割窗口,然後就可以復制粘貼了。步驟如下: 假設我要把srv.c文件的readline函數整體復制到cli.c
Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的兩個python內核版本(2.7x,3.5x)
kernel 路徑 ins des ubuntu lsp python sudo 下載 Ubuntu Desktop 16.04 LTS 安裝好系統默認就有python兩個不同版本(2.7.12和3.5.2) 現在來熟悉一下jupyter的對python這
不用比較找到數組中兩個不同的值
java 算法 /** * 找到數組中兩個不同的值 * / public static void main(String[] args) { int[] arr={2,2,1,1,3,4}; int eo = eh(arr); int o
將兩個不同的正則表達式合並為一個(要用與的關系)
mysql 做出 阿裏雲 enc 加載 gre 運行 oracl 廣搜 怎麽做出下圖的效果,求教!JSP中SESSION用法及其屬性介紹50模版加載不了OPENCART助理批量采集、自動翻譯、快速上傳商品 在oracle11g中運行下列代碼為什麽會提示ORA1-01008