IP地址數量限制
? ? ? ? 我們知道,IP地址(IPv4)是一個4字節32位的整數,那么一共只有2^32也就是接近43億個IP地址,而TCP/IP協議棧規定,每臺主機只能有一個IP地址,這就意味著,一共只有不到43億臺主機能接入互聯網嗎?
? ? ? ? 實際上,由于一些特殊的IP地址(主機號全0代表網絡號,主機號全1代表廣播地址,127.*用于本地環回測試)的存在,IP地址實際數量要比這個數更小一些,并且IP地址并不是按主機臺數分配的,每張網卡都需要配置一個或多個IP地址,這就導致了一個很尷尬的問題:IP地址不夠用了!這時候有三種方式來解決:
- 動態分配IP地址:只給接入網絡的設備分配IP地址,因此即使同一MAC地址的設備,每次接入網絡分配到的IP地址也不一定是相同的。
- NAT(Net Address Transimision):也就是網絡地址轉換,這是我們今天要重點學習的。
- IPv6:這并不是IPv4的簡單升級,兩者是互不兼容的協議,用16字節128位的整數表示一個IP地址,理論上能夠給沙漠中的每一粒沙子都分配一個IP地址,但目前尚未普及。
私有IP與公網IP
? ? ? ? 如果一個組織內部組建局域網,IP地址只用于局域網內通信,而不連接互聯網,那么理論上可以使用任意的IP地址,但如果想要接入Internet,就必須遵守RFC 1918對于組建局域網的私有IP地址的限制:
- 10.*:前8位是網絡號,共16,777,216個地址(大家在學校的時候,IP地址應該都是10開頭的)
- 172.16.*到172.31.*:前12位是網絡號,共1,048,576個地址
- 192.168.*:前16位是網絡號,共65,536個地址(大家在家里的時候,IP地址應該都是192.168開頭的)
- 包含在以上范圍的,都成為私有IP,其余的則是公網IP
大家可能覺得奇怪,不是要講解決IPv4地址數量不足的問題嗎,怎么扯到了私有IP和公網IP了,事實上,這是NAT技術能解決地址數量不足的一個很關鍵的要素:如果私有IP地址只在局域網內使用,那么不同局域網就可以出現重復的私有IP了,那么可用的IP數量就大大增加了!
? ? ? ? 那么問題來了,局域網中的主機怎么和公網進行通信呢?所以NAT技術實際上做的就是:在子網內的主機需要與外網進行通信時,路由器將IP報文首部的IP地址進行替換,經過一次次路由,最終數據包中的源IP地址成為一個公網IP,可以在公網中訪問目標公網IP了。
NAT技術
? ? ? ? 前面提到了路由器將IP報文首部的IP地址替換,那么這個替換過程長啥樣呢?讓我們接著往下學,首先了解一下關于路由器的一些相關知識:
- 一個路由器可以配置至少兩個IP地址,一個WAN口(廣域網接口)IP,一個或一個以上的LAN口(局域網接口)IP。
- 路由器LAN口連接的主機都從屬于這個路由器的某個子網中。
- 子網內的主機IP地址不能重復,但不同路由器的子網間可以出現重復的IP地址。
- 每個家用路由器實際上又作為運營商路由器子網中的一個節點,并且這樣的運營商路由器可能有很多級,最外層的出入口運營商路由器的WAN口IP就是一個公網IP了。
? ? ? ? 現在再回過頭表述一下什么是NAT技術:子網主機需要和外網通信時,家路由器將IP報頭首部的源IP地址替換為自己的WAN口IP,這樣主機替換,最終數據包中的源IP地址稱為一個公網IP。
????????所以現在我們也就大概能夠理解為什么我們的寬帶欠費后,運營商可以讓我們上不了網了,因為我們的每臺主機其實都是在內網中,要想訪問公網,那就必須先通過NAT轉化為公網IP,而運營商路由器識別出欠費,直接不幫我們進行NAT,也就自然斷網了。
? ? ? ? 通過前面的學習,我們解決了一個問題:局域網內的主機如何向公網的服務器發送請求。但是還有一個很重要的問題:服務器要怎么把響應返回給服務器呢?
????????按照我們前面的說法,局域網中有那么多的內網主機發送到服務器的請求的IP都是相同的(出入口運營商服務器的WAN口IP),服務器返回請求的目的IP都是運營商出入口NAT路由器,那NAT路由器怎么判定要把數據包交給哪個局域網的主機呢?
? ? ? ? 這個時候NAPT(網絡地址端口轉換)閃亮登場了,NAT路由器在進行源IP替換時,會將報文的源IP+port與自己替換的WAN口IP+port的映射關系存到一張轉化表里,這很重要,因為:內網IP在局域網中唯一,port在主機上唯一;公網IP在公網中唯一,port在路由器上唯一。兩個唯一值存在一張表里,就意味著兩者互為鍵值!建立起這張轉換表后,公網就可以訪問到內網了!
(這個關聯表是由NAT服務器自動維護的,對于TCP,在建立連接時生成表項,斷開連接后刪除表項)
內網穿透
? ? ? ? 在學習了NAT技術后,我們就可以開始學習內網穿透了。首先,什么是內網穿透?其實內網穿透就是:一臺局域網中的主機,通過一個在公網的主機,訪問另一個局域網中的主機。
? ? ? ? 那么內網穿透的原理是什么呢?其實我們學習了NAT和NAPT后,就非常容易理解了:
? ? ? ?當客戶機與服務器建立好轉換表后,只要服務器1能夠給服務器2提供這樣的服務:服務器2發來的某個端口的數據全部轉發到客戶機,就可以實現讓服務器2通過公網訪問客戶機了。
????????內網穿透的價值在于,可以通過它實現遠程辦公/跨區域、部門的協作。那么為了更好地理解內網穿透的過程,接下來我們一起來做一個實驗!部署實現一下內網穿透~
部署與測試內網穿透
????????首先,說一下我的實驗環境:
- 客戶機:Ubuntu 20.04虛擬機(VMware設置為NAT模式)
- 服務器1:阿里云服務器(因為我們需要公網IP)
- 服務器2:Windows上的xterminal(SSH客戶端軟件)
- 轉發功能:通過frp實現的,因為它用起來很簡單
frp下載:下載的是linux amd64
Release v0.58.1 · fatedier/frphttps://github.com/fatedier/frp/releases/tag/v0.58.1? ? ? ? 簡單講講實驗步驟:
- 在客戶機上部署、安裝、配置frpc(frp的客戶端),然后把本地ssh 22號端口映射到frps的xxx端口(如6000)
- 在云服務器1上部署配置frps(frp的服務器),設置讓xxx端口(如7000)與客戶機上的frpc進行通信
- 服務器2此時通過云服務器1的7000端口就能訪問到客戶機的ssh服務了!
我們下載好這個壓縮包之后,解壓就能得到:
其中frps和frpc分別是frp的服務器和客戶端,而.toml文件則是對服務器/客戶端的配置信息。
frpc.toml:
- serverAddr和serverPort分別是frps的IP和port
- localPort和remotePort表示將本機的22號端口(ssh專用)映射到frps主機的6000號端口(也可以自己設置)——其實就是frps服務器會將6000號端口收到的請求都轉發到frpc的22號端口,收到應答后再轉發回給請求方。
frps.toml:
- frps上的配置信息比較簡單,只要設置好要與frpc進行通信的端口即可
啟動frps:
啟動frpc:
值得一提的是,我們直接運行frpc并不會使用.toml文件中的配置,必須加-c選項顯式指定。
此時我們可以發現frps這邊顯示連接成功了(我還配置了nginx,不過步驟類似,所以只和大家說ssh的操作):
接下來我們通過Xterminal來訪問云服務器的6000端口,如果和我們設想一樣的話,應該就能ssh登錄客戶機:
可以看到,XTerminal啟動后,直接就是在客戶機的~下:
我們在這下面新建一個文件,可以看到確實多了個文本文件:
????????ok,本篇文章到這里也接近尾聲了,最后再給大家梳理下流程:服務器1是一臺云服務器,有自己的公網IP,服務器2是windows機器用的是內網IP,而客戶機是虛擬機用的也是內網IP。frp為我們做的事情是:啟動frps(服務器)后,啟動frpc(客戶端)與frps連接,此時由于內網主機主動通過NAT技術與公網主機建立了連接,那么通過NAPT技術我們就可以實現公網主機訪問內網主機了,并且frps會把發到6000號端口的數據都轉發到frpc的22號端口,接下來另一臺內網主機(ssh客戶端)就可以通過訪問云服務器的6000號端口來ssh登錄客戶機了!