什么是內網穿透
內網穿透
什么是內網穿透呢?
百度百科的描述
內網穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。
簡單來說內網穿透的目的是:讓外網能訪問你本地的應用,例如在外網打開你本地http://127.0.0.1指向的Web站點。
工作方式
網絡地址轉換(Network Address Translation,NAT)機制的問題在於,NAT設備自動屏蔽了非內網主機主動發起的連接,也就是說,從外網發往內網的數據
包將被NAT設備丟棄,這使得位於不同NAT設備之后的主機之間無法直接交換信息。這一方面保護了內網主機免於來自外部網絡的攻擊,另一方面也為P2P通信帶來了
一定困難。Internet上的NAT設備大多是地址限制圓錐形NAT或端口限制圓錐形 NAT,外部主機要與內網主機相互通信,必須由內網主機主動發起連接,使 NAT設
備產生一個映射條目,這就有必要研究一下內網穿透技術。
通信的一方處於內網
兩台主機進行通信,一方有公網ip,一方沒有
一台主機有一個公網 IP,另一台主機有一個內網 IP
我們假定Client:A有內網ip,Client:B有公網ip。
Client:A處於NAT之后,擁有ip(10.0.0.1:8080),Client:B位於 NAT 之前,並擁有IP(138.76.29.7:8080),NAT擁有公網 IP 155.99.25.11。
Client:B有公網ip,所以Client:A可以直接通過TCP連接到(138.76.29.7:8080),但是如果Client:B連接Client:A則會連接不成功,會找不到Client:A。
此時,需要一個公有的服務器輔助進行內網穿透。Client A 和 Client B 向服務器發起登陸請求,並保持一個 TCP 或 UDP 連接,服務器記錄其 IP 地址和端口號,
這里服務器對 Client A 是記錄其經過 NAT 映射之后的 IP 和端口號。當 Client B 想連接 Client A 時,首先向服務器提出請求,服務器在收到請求后向
Client A 發出打洞命令,並將 Client B 的[IP 地址:端口]對發給 Client A,Client A 根據接收到的 IP地址和端口號向 Client B 發起 TCP 連接
或發送 UDP 數據包。接下來 Client A 和Client B 之間便可以建立數據傳輸通道。
通信的雙方都處於內網
兩台主機進行通信,雙方處在內網中
兩方都處於內網中,直接的通信是不能連通的。這時候就需要借助於,一個位於公網的服務器,來協助雙方進行通信。
Client A首先向服務器提出連接請求,服務器將 Client A 的 IP地址和端口號對[155.99.25.11:51200]發給 Client B,並向 Client B 發出連接請求;
Client B 收到服務器的連接請求后首先向[155.99.25.11:51200]發送一定數目的 UDP探測包或 TCP 連接請求,在 NAT B 上記錄一下[155.99.25.11:51200]的
連接,Client B 隨后向服務器回復連接完成;服務器在收到 Client B 的報告后將 Client B 的公網IP 地址和端口號對[110.10.33.10:5000],此時由於
NAT B 上已經留下了對應於[155.99.25.11:51200]方向的連接,Client A 向[110.10.33.10:5000]發出的數據包或連接請求將不會被丟棄。
NAT穿透的原理
NAT設備(或軟件)維護一個狀態表,用來把內部網絡的私有IP地址映射到外部網絡的合法IP地址上去。每個包頭中的IP地址和端口信息在NAT設備(或軟件)中都
被修改並翻譯成一正確的IP地址發往下一級。當一個內網主機通過NAT打開一個“外出”的TCP或UDP會話時,NAPT分配給這個會話一個公網IP和端口,用來接收外網
的響應的數據包,並經過轉換通知內部網的主機。這樣,NAPT在[私有IP:私有端口]和[公網IP:公網端口]之間建立了一個端口綁定。
UDP內網穿透的實現流程
(1) 兩個需要通過內網穿透進行通訊的內網客戶端,分別將自己的外網收發接口注冊給一個具有公網ip的中轉服務器;
(2) 中轉服務器將兩個客戶端注冊的收發接口分別告知給對端;
(3) 一個內網客戶端使自己的接收端口作為源地址,向對端的發送端口發送一個udp數據包,這個數據包稱為打洞包。發送過這個打洞包后,可以在這個內網的出口
路由器上產生一條NAT記錄,令后續從對端發送端口發來的數據包都不被丟棄, 而是轉發給相應的內網客戶端的指定端口;
(4) 發送過打洞包后,對端發送至本端路由器指定接收端口的數據包,就會根據NAT記錄轉發至本端的內網服務器接收端口,從而實現了內網服務器接收外網數據包的功能;
(5) 另一個內網服務器同樣執行上述步驟 (3) 、 (4), 即可實現兩端內網服務器相互收發音頻數據包的功能。
最后附上一張完整的交互圖片
參考
【一分鍾實現內網穿透(ngrok服務器搭建)】https://www.cnblogs.com/best/p/7465444.html
【內網穿透】https://baike.baidu.com/item/內網穿透#reference-[1]-2066783-wrap