我是一個路由器

我就是網卡TP-Link 7954經常和大家提起的網關路由器, 我在網絡中的位置是這樣的:

我是一個路由器

為啥叫網關呢? 因為大家想上網,一定得經過我這一關 :-)

這不是開玩笑,確實是這樣, 所有的對局域網之外的訪問那非得經過我不可。

其實我直接和ISP(就是聯通!)的網絡相連, 我從聯通那裡搞了一個外網的地址: 61.52.247.112 。

可是隻有這麼一個地址, 我們局域網內這麼多電腦, 如果輪流著讓每個電腦去用, 那大家可就抱怨死了。

於是我巧妙的構思了一個網絡世界, 成功的欺騙了TP-Link 7954這些網卡們。

1

NAT (網絡地址轉換)

還記得上次TP-Link 7954 向我要地址的事兒嗎 ?

因為我不僅僅是個路由器, 還是一個DHCP服務器, 掌握著這個局域網的IP生殺大權。

我給TP-Link 7954 分配的IP是 192.168.1.2 , 但是他拿這個地址是無法直接上網的, 因為這是屬於我管轄的內網地址, 別的網站像www.baidu.com 根本都不知道!

即使知道了也沒用, 因為在這個世界上可能有無數的路由器都會分配192.168.xxx.xxx 這樣的地址, 你到底要找哪一個?

所以TP-Link 7954 想上網必須得通過我, 我需要施展一點點小魔法, 比如說它想訪問百度, 通過交換機給我發來這麼一個數據幀:

我是一個路由器

我把數據鏈路層的外衣去掉, 發現IP數據包中的目標地址是 115.239.211.112, 我就知道這是要向外網發出請求了。

於是我就把IP數據包中的源地址192.168.1.2 替換成我從聯通那裡搞到的外網地址 61.52.247.112。

這還不夠, 我會創建一個新的端口號2001, 把TCP數據包中的源端口也替換掉, 數據包就變成了這個樣子:

我是一個路由器

不知道你看出來其中的奧妙沒有,我把源地址和源端口都替換了, 其實我的目的就是讓外部的網絡認為這是我(路由器)發出的, 他們根本不知道什麼TP-Link 7954 這個網卡 !

然後我需要查一下我的路由表,確定到底轉發到哪個輸出端口去,再給這個IP數據報穿上數據鏈路層的外衣,把數據包發給了聯通的網絡, 剩下的事我就不管了。

我是一個路由器

注意看以太網幀的MAC地址, 源地址已經是我了,而不是TP-Link 7954了, 因為這是我和聯通網絡之間的數據鏈路。

這個替換源地址和源端口的小把戲就叫做網絡地址轉換 , 人類簡稱為NAT。

當然不只是TP-Link7954通過我上網, 還有很多別的電腦呢, 我得把我的小把戲記下來 ,形成這麼一張表:

我是一個路由器

過了不久, baidu 網站的回覆就會通過別的路由器轉到我這裡,正如你所想的, 我需要反過來處理一遍:

首先去掉數據鏈路層的外衣,發現TCP和IP數據報中包含這樣的信息:

目的地IP : 61.52.247.112 , 端口 2001

這時候我就去查表, 找到了 192.168.1.2:3345 , 我就明白這是給TP-Link 7954的信了。

那就再次把數據報中的IP地址和端口號改了吧, 讓TP-Link 7954 認為這個數據包就是我給他的。

就這樣, 我成功的用區區一個外網的IP就支持了局域網內多個電腦的上網需求, 並且他們根本就不知道是怎麼回事!

2

NAT 穿越

欺騙終究是不能長久的, 我的麻煩很快就來了。

TP-Link 7954 所在的機器為了下載一個大電影, 安裝了一個P2P軟件: 電驢。

所謂的P2P 就是Peer to Peer, 即網絡中的機器是對等的。

所有使用電驢的機器不僅僅是一個發起請求下載數據的客戶端, 他們同時也是一個能夠接受請求,向外發送數據的服務器。

這樣一來, 當下載大文件的時候, 你就可以從很多安裝了電驢的機器上分塊下載, 而不是僅僅從一個服務器上下載, 速度快了很多。

人人為我, 我為人人啊。

可是TP-Link7954 很快就發現, 當它試圖做服務器的時候, 其他電驢根本就連不上它, 為什麼?

因為IP地址是我分配的啊, 是個內網地址 192.168.1.2, 外網的人根本就不知道, 怎麼連?

TP-Link 7954 給我發了一封措辭嚴厲的信件,質問我為什麼他沒法作為一個服務器接受外邊的連接, 這強烈的阻礙了他們下載各種電影的需求。

我估摸著是瞞不住了, 只好把所有的網卡都召集起來,開個會大家商量一下。

我解釋說: “現在IP地址很稀缺, 我用這種NAT的方法也是不得已而為之,要不然大家怎麼上網啊, 你們之前不是過的也挺好嗎? 我聽說電驢會佔用很大的流量, 我們公司很快就會禁止的。”

D-Link 3925 說 : "公司的政策根本不是你應該考慮的事, 你考慮的是怎麼才能讓外網的電驢連上我們!"

可是我實在是沒有辦法, 就這一個外網的IP地址啊。

TP-Link 7954倒是很聰明, 他立刻就意識到了問題所在,想出瞭解決辦法:

“這樣吧, 路由器,你不是擅長搞玩小把戲嗎, 可以繼續玩下去, 但是得允許我們這些網卡參與進來玩, 比如說我(ip地址192.168.1.2)會主動的要求你建立一個NAT映射 (192.168.1.2 : 4096) (61.52.247.112: 3001)。

“你還可以保存在你的NAT表中, 然後我就會對外通告了, 我是一個電驢服務器, 誰要是想連接我的話,請到這裡來:61.52.247.112: 3001,當外網的連接來的時候, 你必須把連接請求轉發到我這裡來”

大家一致認為這個方法很簡單, 很實用, 就這麼決定了。

“碼農翻身”公眾號注:這其實就是UPnP , 你打開你的無線路由器,就能看到 :


我是一個路由器



事情就這麼解決了,生活又恢復了平靜,當然,我作為一個路由器,這些NAT, UPnP都是我的附加功能, 我最重要的事情還是建立路由表, 做路由選擇,轉發IP數據包,下次再說吧。

-----------------------------------------------------------------------------------------------


分享到:


相關文章: