內網穿透原理

學了網絡之後,我們知道了公網和私網。私網是不能在公網傳輸和通信的。我們一個學校,一個小區,都是在自己單獨的私網裡面。通過這個私網內部的路由器(NAPT方式)和外界通信。

那麼問題來了,假如我要和其他學校的小夥伴通信,那怎麼辦呢?我和小夥伴都是在單獨的私網裡面,而私網的地址是不能通信的,那麼我怎麼才能和他通信呢?內網穿透

這就要說到內網穿透了!

如下圖,有這麼一個環境。小明和小王分別是清華和北大的學生。他們都各自處在自己學校的內網中,他們的ip地址可以是一樣的,都是192.168.10.2。清華大學的小明想約北京大學的小王晚上吃飯。於是小明想給小王發一個消息,約她晚上一起吃飯。那麼,小明該如何給小王發消息才能讓小王收到消息呢?小明只知道小王的ip地址和自己的一樣,都是192.168.10.2。很顯然,如果小明給192.168.10.2這個ip地址發消息,小王是肯定不能收到消息的。

內網穿透原理

那麼我們就會想,平時我們使用QQ、微信和其他地方、其他學校的小夥伴進行通信,消息是怎麼發送的呢?

原因在於QQ和微信在公網有服務器。我們和小夥伴通信是先將消息發送給公網的服務器,公網服務器再將消息發送給位於私網內部的其他小夥伴。數據在我們和小夥伴之間並不是直接傳送的。

那麼問題又來了?

我們發消息給公網服務器這個可以理解,我們知道他們的公網ip,數據可以到達。但是,公網服務器是如何將我們發送給他的消息發送給位於其他私網內部的小夥伴的呢? 公網服務器並不知道位於私網內部的小夥伴的ip地址。

就算他知道了小夥伴私網邊界的路由器的公網ip地址,發消息給路由器的公網ip,路由器收到消息也不會發送給小夥伴,因為在路由器裡面並沒有一條記錄說收到qq或者微信服務器發來的消息然後轉發給小王。

就算路由器知道從qq或者微信服務器發來的這條消息是轉發給小王的,小王收到這條信息之後也不會接受。因為出於安全起見,除非是主機主動向對方發起了連接請求(這時會在該主機的數據結構中留下一條記錄)。否則,當主機接收到數據包時,如果在其數據結構中查詢不到對應的記錄,那些不請自來的數據包將會被丟棄。

那麼我們究竟是如何通過QQ或者微信和其他學校的小夥伴通信的呢?

我們首先看一個簡單的情形,位於私網中的我們要訪問百度,我們知道百度的域名:www.baidu.com 。於是,我們在瀏覽器中輸入www.baidu.com ,然後我們就可以在百度上查閱我們想查的東西了。域名解析的過程我們不去分析,這個不是本文的重點。這裡假設已經將域名進行解析了,解析成了對應的公網ip。當我們訪問這個公網ip的時候,我們把流量交給路由器,路由器再根據ip地址請求百度的服務器。百度服務器回消息給路由器,路由器再把消息發送給我們。但是,內網中有這麼多機器都是共用路由器的這一個地址,假如同時有好多人訪問百度,那麼路由器是如何知道百度回的消息是送給小王而不是小李的呢?因為在路由器體內有一個私網ip和端口的對照表,每個私網ip對應一個端口,所以根據端口就能知道消息是發送給內網中的哪臺主機了。而我們是主動訪問百度的,所以在我們的主機中會有一條記錄,當我們接收到百度回的消息時,會接收這條數據。

假如小明以22222端口(隨機,大於1024即可)訪問百度服務器的80端口,則在我們本地可以看到這麼一條連接:

192.168.10.10:22222 119.75.217.26:80

但是在路由器或者百度服務器上看到的連接則是這樣的

100.100.10.10:10000 119.75.217.26

在路由器體內有這麼一條Session記錄

192.168.10.10:22222 10000

當我們訪問百度這個事情做完之後的一定時間內,Session記錄就會在路由器的體內消失,這個10000端口可以繼續分配給其他用戶

內網穿透原理

那麼現在我們再來分析一下位於內網中的我們如何和同樣是內網中的小夥伴通過QQ通信。

首先,當我們登陸上QQ後,我們就會和QQ的服務器建立一個長連接,基於這個長連接,我們可以給QQ服務器發送消息,QQ服務器也可以給我們發送消息(原理和上面百度的類似)。

我們有小夥伴的QQ號,於是我們給小夥伴QQ號發消息。這個消息通過我們私網邊界的路由器發送給了QQ的服務器。QQ的服務器根據QQ號,會查找小夥伴是否在線。如果小夥伴此時也登錄上了QQ號的話,那麼QQ服務器就會把消息發送給小夥伴。如果小夥伴此時沒有登錄QQ,那麼QQ服務器將不會給小夥伴發送這條消息,因為QQ服務器此時並沒有和小夥伴建立長連接,所以他根本不知道小夥伴的位置。只有等小夥伴登錄了QQ之後,QQ服務器才會將我們的消息發送給小夥伴。然後小夥伴回消息,後面的過程和之前一樣

所以,要讓位於兩個私網內部主機通信的話,必須得有一個公網的服務器來做中間人,幫我們傳遞消息。我們私網內部是不能直接通信的!內網穿透工具

常用的內網穿透的工具有:NAT APP基於ngrok的國內高速內網轉發工具

這款軟件可以把你內網的ip和端口映射成一個公網的ip和端口,這樣,我們就可以實現內網穿透了!

去NAT APP的官網註冊一個賬號,然後點擊購買隧道,選擇免費隧道按照提示填寫內容,然後我們在去運行這個軟件, 怎麼運行我就不說了,傳送門——>https://natapp.cn/article

./natapp -authtoken=7436320f81b1328e

最後給大家看運行軟件的截圖,它把我本地192.168.10.27:8888 的端口映射成了公網的 112.74.89.58:41553 ,所以,我們就實現了內網穿透。任何發往 112.74.89.58:41553 端口的數據都會被我們的 192.168.10.27:8888的端口給收到!

內網穿透原理


分享到:


相關文章: