目錄
- 1.IP地址
- (1)局域網和公網
- ①局域網
- a.網關地址
- b.局域網通信
- ②運營商子網
- ③公網
- (2)NAPT
- ①NAPT過程
- ②理解NAPT
- ③理解源IP和目的IP
- a.目的IP
- b.源IP
- ③最長前綴匹配
- ④NAT技術缺陷
- 2.代理服務
- (1)正向代理
- (2)反向代理
- (3)內網穿透
- (3)內網打洞和P2P
- (4)“科技”
1.IP地址
(1)局域網和公網
我們之前一直把IP地址簡單描述為起始地址和截止地址,就像重慶到北京,全程保持不變。但實際上網絡的結構更復雜,分為局域網的IP和公網IP。
①局域網
局域網IP僅適用于局域網內部的唯一性。
家里的路由器連接到交換機,交換機又連接每個聯網設備(家用交換機沒有IP,它只負責擴散和劃分碰撞域)。因此,在路由器之下的所有設備都在路由器劃分的局域網下。下面是常用的局域網地址塊,/8表示前8位定位網絡(網絡號),后24位定位主機(主機號),子網掩碼就是將網絡號占用的位數都設置為1,后續拿到IP后,用IP + 子網掩碼借助&操作就能清楚地知道網絡號和主機號。
專用IP地址塊 | 子網掩碼/前綴 | 地址范圍 | 使用范圍 |
---|---|---|---|
10.0.0.0/8 | 255.0.0.0 | 10.0.0.0 ~ 10.255.255.255 | 適合大型網絡,如大型企業、跨國機構、大型園區等(單網絡可容納超1600萬臺設備) |
172.16.0.0/12 | 255.240.0.0 | 172.16.0.0 ~ 172.31.255.255 | 適合中型網絡,如中型企業、高校、中型園區等(單網絡可容納約6.5萬臺設備) |
192.168.0.0/16 | 255.255.0.0 | 192.168.0.0 ~ 192.168.255.255 | 適合小型網絡,如家庭網絡、小公司、辦公室等(單子網最多容納254臺設備) |
后續都用其中一個地址塊舉例,其余地址塊都同理。
注意,192.168.0.0 ~ 192.168.255.255并不包含192.168.0.0和192.168.255.255本身,主機號全0表示這個網絡本身,全1表示廣播,該網絡下的所有主機都是目標。所以真正可用的、能正常用于定位主機的是192.168.0.1 ~ 192.168.255.254。另外兩個地址塊同理。
a.網關地址
路由器之下劃分一個子網,其中路由器自己也有一個子網地址(網關地址),這個地址一般是198.168.0.1或192.168.1.1等,當然也可自己設置網關地址。那么子網下的設備怎么知道路由器的子網IP呢?除了手動設定網關地址,一般都是DHCP協議自動獲取。
當有一個新設備連接到交換機后,它什么都不知道,只知道自己的mac地址。它不知道自己的網絡號、主機號,也不知道路由器在哪。這個時候它會發送符合DHCP的數據,其中IP為255.255.255.255(未知網絡號時也可廣播),目的mac為全F,這樣發出去的mac幀每個設備都能收到消息,其中DHCP服務器(一般也集成在路由器里)收到消息后會進行回應(新設備知道自己的mac,因此能單播回應)。其中就包含分配的網絡號、主機號、網關地址等消息。
因此,聯網的設備都知道自己的子網地址、子網掩碼、網絡號、主機號、網關地址等信息。
b.局域網通信
在局域網內有兩個主機A、B,如果A想要給局域網內的設備發消息,它可以采用廣播(類似DHCP)、查找服務器的方式獲取B的子網IP地址。之后A會ARP請求B的mac地址,B回應后A發送數據,由交換機轉發。全程IP地址都是子網IP,不管源IP還是目的IP。
同理,當A想要給不在局域網內的B發消息時,A會先發送給路由器,A知道路由器的LAN口IP(網關地址),ARP請求的目的IP就是路由器的網關地址。之后就將數據交給路由器轉發,但在交給路由器的途中也完完全全是一個局域網通信。
②運營商子網
路由器有兩個關鍵地址,一個是LAN口地址(網關地址),一個就是WAN口地址。其中在局域網通信中,路由器本身與其子網下的設備之間通信都是采用LAN口地址,而WAN口地址是面向局域網之外的。
在一般情況下,這個WAN口IP并不會直通公網IP(有的可以直通),而是會進入運營商子網。也就是說WAN口的IP地址可能是一個如100.64.20.1這樣的運營商子網地址。
100.64.0.0 ~ 100.127.255.255是運營商級NAT(CG-NAT)專用的私網網段。有的也會使用10.0.0.0/8來劃分。
不同家庭的WAN口IP都是運營商子網里的一個IP,我們的路由器就相當于運營商路由器劃分的子網下的主機,運營商路由器也有自己的LAN口IP和WAN口IP,這是一個層級結構。 也就是說我們出了家庭內部的子網后并不一定走到了公網,大概率是進入了另一個更大的子網,并且極端情況下子網能夠這樣搭建好幾層。
而運營商的WAN口IP才是一個真正的公網IP,這種設計方式極大的節約了公網IP地址。 一個運營商路由器WAN口只占一個公網IP,但其LAN口連接非常多個家庭的路由器的WAN口IP,每個家庭里面路由器又能單獨劃分子網,整個層級結構劃分清晰。
一般來說運營商的子網不止一層,也就是說和家庭路由器WAN口直接相連的運營商路由器的WAN口出去又進入了另一個子網。 一般來說運營商子網有3層,其原因后面會提及。
③公網
公網IP地址不能和子網IP地址塊、運營商子網地址塊重合,所以我們可以直接通過IP的值就判斷出這個IP到底是公網IP還是某一個私網的IP。 如看到192.168.1.5,我們能立刻能判斷是一個私網IP,并且還能知道這類地址塊分配的用戶數較少;看到220.181.38.10,不在任何私網段、運營商子網地址塊內,那么它就是公網IP。
公網IP具有全球唯一性,只要知道了IP并且判斷其為公網IP之后,那么我們一定能夠唯一地在全球某個地方找到它。
(2)NAPT
①NAPT過程
所有的路由器(家用、企業、運營商)都內置了NAT功能,用于IP地址的轉換。但實際生活中采用的都是IP + 端口號的轉換(NAPT,直接定位到一個主機里的進程),所以我們搞清楚NAPT即可,NAT同理。
NAPT是直接定位到某個具體的主機的某個具體的進程,IP定位主機,端口定位進程。
下面是NAPT核心流程圖:
核心就是轉換表:表左側為轉換前源IP + 源端口 + 目的IP + 目的端口(四元組),右側是轉換后的四元組,這兩個四元組構成一對map。
左側四元組在轉換前的網段唯一,右側四元組在另一個網段唯一。進程A、B離開局域網后,在外層的網段上看均來自同一個設備,就是路由器。
當服務器應答的時候,服務器只知道A、B均來自同一個地址,所以A、B的應答均會發給路由器,而路由器可以根據應答的目的端口號(對應轉換表中的“轉換后源端口號”)的不同,反向查表映射到子網下的具體設備,之后由交換機擴散轉發。
我們可以將NAT形象地看作一次身份轉換。出了子網就代表路由器的WAN口IP進行傳輸了。
真實的傳輸過程中,NAT可不止一次。當進程A發送數據時,在家庭路由器那里進行一次NAT,替換源IP和源端口號,其中源IP改成了路由器的WAN口IP;出了家庭路由器之后進入運營商子網,到達運營商路由器后再進行一次NAT,替換源IP和源端口號,其中源IP改成了運營商路由器的。之后在公網上傳輸,到此為止修改的全是源IP + 源Port,目的IP + 目的Port從來沒有被修改過。
到指定IP地址后,其實還沒完,萬一這個目的IP其實只是對方的運營商路由器呢,根據轉換表反向查表,替換目的IP和目的端口號,這就進入了運營商子網;找到對方的家庭路由器之后,根據對方家庭路由器的轉換表反向查表,替換目的IP和目的端口號進入家庭子網,最后通過交換機擴散轉發至目標主機上。
那么對于路由器來說,何時NAPT呢?什么情況下需要交給運營商路由器呢?萬一通信雙方都在運營商下的子網呢?
A要給B發消息,A首先要知道B的IP地址,同一局域網內的話這個地址就是子網IP,通過子網掩碼判斷網絡號一致后直接通過交換機轉發。如果不一致的話就交給路由器,路由器NAPT之后查看路由表,如果找到網絡號匹配的下一跳,就會直接轉發過去,找不到的話就交給默認路由(通常是運營商網關),繼續NAPT和轉發。
②理解NAPT
暫不考慮端口復用的情況。家庭路由器NAPT后出去的mac幀源IP都一樣,靠的是端口號區分不同進程。到達運營商路由器之后,又被替代源IP和端口號,并且所有從運營商路由器出去的mac幀的源IP都是這個路由器的WAN口IP。這種分級結構能夠極大的壓縮IP地址的使用,成百上千的家庭發出去的mac幀經過一級路由器的NAT之后源IP都是一樣的,這也是為什么運營商路由器一般會分成3級了。因此,我們能夠很好地理解NAT在緩解IPv4地址枯竭問題上扮演的重要作用。
但是又出現了一個問題,端口怎么壓縮呢?如果嚴格按照一一映射的方式,一個進程的mac幀被NAT映射之后雖然IP壓縮了,但還是需要單獨分配一個端口號來區分不同進程。端口復用是一個解決辦法,端口復用有不同的方案,其核心思想就是找到映射前的信息不同之處,使得就算打破了一一映射之后,反向查表能區分開。
如果兩個進程來自同一IP不同Port,但是兩者的目的IP和端口不一樣,這樣NAPT映射后兩個進程的源IP和Port可以一致。 因為對方應答的時候雖然通過轉換后的IP + Port反向查表到了兩條記錄,但看到目的IP和Port不一致,它們就會去匹配目的IP + Port = 發起回應的源IP + Port這一項,這才符合正常的通信流程,這樣就能找到正確的映射。
對于運營商來說,它們手上的公網IP都有成百上千個,加上有的采用五元組、七元組等方式設計端口復用。除此之外,還有很多方式盡量增加端口的利用,例如在TCP的情況下, 建立連接時, 就會生成轉換表項,而在斷開連接后,則會刪除這個表項。
所以端口號也是可以進行數量壓縮的,能夠承擔高并發的網絡訪問需求。
③理解源IP和目的IP
引入NAT之后,傳輸數據前半段源IP一直在變,后半段目的IP一直在變。那么如果我要給一個目的IP發數據,這個目的IP究竟是什么意思呢?如果我收到了一個消息,那個源IP又是什么意思呢?
我們忽略那些大型的直接接入公網的服務器,也認為所有家庭路由器都會接入運營商路由器的子網,即家庭路由器的WAN口IP是運營商子網下的一個私網IP。
a.目的IP
我要給目的IP發消息,首先思考我們拿到的目的IP為什么長這樣?能長成什么樣?
如果說通信雙方的路由器在同一運營商子網下,我拿到的目的IP其實是對方路由器的WAN口IP,這個WAN口IP是運營商子網下的私網IP,只不過這個私網IP的網絡號和我家里的網絡號一定匹配不上,因為運營商有專用的私網網段,并且運營商采用的地址塊會非常龐大,家里用的子網地址塊不可能跟運營商用的一樣。如果有的話那就歸入企業的考量范圍,直接接入公網而非運營商的子網了。這種情況下路由器一般在路由表上就能直接匹配上(都在同一運營商子網下,最長前綴匹配),轉發過去,找不到的話交給默認路由,由默認路由進行轉發。
如果我拿到一個公網IP,這個公網IP一定是對方主機本身嗎?
我們拿到的公網IP,實際上是對方最外層接入了公網的運營商路由器的WAN口IP,我們發的數據被對方路由器接收到后需要不停反向查表、轉發才能到達目標主機上。
b.源IP
同理,我收到消息了,如果這個源IP是一個子網IP,且網絡號無法和當前局域網的網絡號匹配的話,那么就一定是對方路由器的WAN口IP(運營商路由器下的子網IP);如果源IP是公網IP的話,這個IP一定是對方所在的接入公網的運營商路由器的WAN口IP。
當然,源IP和目的IP都有可能直接接入了對方的服務器(大型公司都有)或者路由器,我們上述是忽略了的,現實中都要進行考量。
③最長前綴匹配
路由器收到mac幀之后是如何轉發的在這里的理解也很關鍵。
1. 解封裝:從MAC幀中提取IP數據包
路由器接收MAC幀后,會先在數據鏈路層進行CRC校驗,校驗失敗的話整個mac幀直接丟棄,不再進一步處理和轉發。 之后就等待目標主機重組失敗,發送端的傳輸層或應用層控制重傳。
CRC校驗通過的話,會繼續解封裝IP數據包,最終提取出目的IP地址,這個IP地址按理說分為網絡號和主機號,但是由于IP報頭沒有子網掩碼字段,所以路由器并不知道網絡號占多少位。
2. 匹配:轉發表查找并最長匹配
路由器的轉發表每一項的條目都包含“網絡地址 + 子網掩碼 + 下一跳”,每一項都分別與提取的目的IP進行&運算,當路由表中/20、/24的網絡地址均和目的IP的前幾位匹配上時,就會選擇/24的作為下一跳。因為網絡號匹配得越長的離目標主機就越近。
如果路由表中的每一項都匹配不上,就會轉發至默認路由,默認路由一般是運營商路由器,NAPT后進一步轉發。
因此可以看出,路由器之間是一跳一跳的,收到數據報之后去最長匹配,然后發送過去。
對于一般的家庭路由器,其WAN口是運營商子網下的一個私網IP,那么這樣的話轉發表中的每一個待選項都不能是公網IP,否則直接轉發過去,結果對方發現源IP是個私網IP,怎么找回來呢? 所以WAN口是子網IP的路由器只能在運營商子網內轉發,但凡涉及到公網轉發的,只有交給默認路由,由運營商路由器NAPT后轉發。所以可以總結為WAN口IP是私網IP的路由器,其轉發表中的項也都會是私網IP。
我們可以通過route查看本地的路由表
Destination表示目的網絡的IP地址,default代表默認路由,當未被其他路由條目匹配的目的地址,都走這條路由;其它路由條目可以是一個網段(如 10.0.8.0),代表目標是這個網段內的所有主機;也可以是單個IP(如 183.60.82.98),目標是這臺特定主機。可以看出,如果一個目的IP和網段路由和主機路由都匹配上了,那肯定是選擇主機路由。
Gateway表示下一跳的IP地址。若為 0.0.0.0,無需再發給其他路由器了,已經到了最后一個路由器了,eth0網卡ARP解析目標IP的MAC地址,然后把數據包發給局域網內的交換機,交換機再直接轉發到目標設備。 若為 _gateway,實際對應當前子網的網關IP,如路由器的LAN口IP,當本地主機想要跨網段發數據,就必須先發送數據到LAN口,路由器NAPT后再轉發。
Genmask表示子網掩碼。結合Destination和收到的數據的目的IP做&運算,判斷目的IP是否屬于該路由對應的網段,多次匹配的話選最長匹配的項(網段路由選最長的)。最長匹配的當然是 255.255.255.255的主機路由。
④NAT技術缺陷
其限制主要來源于 NAT 依賴的轉換表:
1.無法從 NAT 外部向內部服務器建立連接
2.裝換表的生成和銷毀都需要額外開銷
3.通信過程中一旦 NAT 設備異常,即使存在熱備,所有的 TCP 連接也都會斷開
1.當公網設備想主動連接內網里的服務器(比如在家搭建的文件服務器),最開始 NAT 設備上根本沒有對應的映射表項,也沒有辦法向內建立映射,只有向外建立映射后反向查表,所以這種情況路由器不知道該把請求轉發到哪個內網設備,因此連接無法建立。
2.頻繁維護表項會提高性能需求。
3.如果當前 NAT 設備壞了,哪怕馬上切換到備用機并馬上開始工作,正在進行的網絡連接(比如網游、視頻通話)也會斷連,因為就算啟動備用機,但它的轉換表是空的。
2.代理服務
(1)正向代理
正向代理簡單來說就是正向代理服務器接收客戶端的請求,將請求轉發給目標服務器,最后將目標服務器的響應返回給客戶端。 在目標服務器眼里,一直都是正向代理服務器在請求服務,而實際上代理服務器只負責轉發請求和應答,這樣就可以隱藏客戶端的身份。
連接學校的校園內網,就是通過學校的正向代理服務器訪問資源。用戶請求通過正向代理服務器認證之后,由代理服務器負責出去訪問資源,“認證”也就意味著正向代理服務器有權力攔截訪問,這也是使用校園內網訪問一些資源會被攔截的原因。訪問的內網資源是交給代理服務器,由代理服務器轉發回來。正向代理服務器還可以緩存一些常被客戶端請求的資源。
正向代理服務器物理位置靠近客戶端。
一般來講,客戶端和要訪問目標服務器都有公網IP(這個公網IP是客戶端經由家庭路由器NAPT到運營商子網,再由運營商子網NAPT得到的公網IP,并且這個公網IP并不是固定的),在不加限制的情況下其實能夠直接通信。 加上正向代理服務器可以做到隱藏身份,并且像校園網那種雖然目標服務器有公網IP,但客戶端直接訪問的話目標服務器會直接拒絕,它只會回應正向代理服務器的請求。 這點和后面的反向代理有一定的區別。
(2)反向代理
當客戶端發起請求時,請求會到達反向代理服務器。反向代理服務器會根據配置的規則將請求轉發給后端眾多服務器中的一個,服務器的應答交給代理服務器,由代理服務器返回給客戶端。 在這個過程中,客戶端并不知道實際與哪個服務器進行了交互,它只覺得是在與反向代理服務器進行通信。
當我們訪問代理服務器時,代理服務器會把客戶端的源IP + Port交給某一臺內網服務器,然后這臺服務器就和我們的主機進行通信。但注意服務器拿到我們的IP和Port后并不能直接傳過來,一般而言,服務器只有內網IP而沒有公網IP,真正傳輸需要先從內網傳給代理服務器,由服務器通過公網傳到客戶端手上。同理,客戶端拿到的服務器地址是公網IP,其實是NAPT后的代理服務器的公網IP,和服務器通信時,只有先將數據交給代理服務器,由代理服務器再轉發給服務器的。所以無論服務器還是客戶端都繞不開代理服務器。 代理服務器可以緩存一些客戶端常常訪問的資源(包括靜態資源、圖片等)。
反向代理服務器更靠近服務器端。
不管正向代理還是反向代理,代理服務器的角色和NAT很像。但NAT是網絡基礎設備,是網絡層的設備,而代理服務器往往在應用層。NAT在局域網出口部署,而代理服務器在任何地方都能部署。
(3)內網穿透
現在有一臺中轉服務器,運行一個frps(服務端)程序。還有一臺主機,運行frpc(客戶端)程序。中轉服務器有自己獨立的公網IP,而主機雖然有公網IP,但那是NAPT后運營商提供的,這個公網IP完全不能唯一地定位到主機上。
雖然這臺主機沒有唯一的公網IP,但frpc(客戶端)可以借助運營商提供的公網IP連接到中轉服務器frps(服務端)上,建立長期連接,并且frpc的配置文件可以告訴這個中轉服務器自己在家庭路由器劃分的子網下面的私有IP地址是什么。
這個時候,我們可以粗略理解為主機獲得了“兩個公網IP”,其中一個就是運營商提供的公網IP,另一個就是中轉服務器的公網IP,并且中轉服務器直接知道了主機在家庭內網中的私有地址,這一點至關重要。
現在又有一臺筆記本電腦(不需要安裝frpc),它想要遠程控制主機。那么它就連接至中轉服務器,向中轉服務器發起請求,中轉服務器借助frpc - frps連接,向主機請求,主機回應后交給中轉服務器,再發回筆記本電腦。
具體來說,主機建立frpc - frps連接時,frpc配置文件中就告知frps “我的本地服務在192.168.1.100:22,別人可以通過中轉服務器公網IP:6000訪問它” 。這樣我們的筆記本電腦直接訪問中轉服務器公網IP:6000,中轉服務器會轉發需求和應答,實現控制。
整體上看,內網的主機就像是中轉服務器公網IP下的一個服務,或是中轉服務器劃分子網下的一臺主機。所以其他設備通過訪問中轉服務器就可訪問內網的主機。但實際上這是需要依靠主機的運營商公網IP連接中轉服務器實現的。
(3)內網打洞和P2P
一般內網打洞成功率高的都是家庭路由器(出入口路由器)的WAN口直接連接公網IP的,暫不考慮連接運營商子網的。
兩邊主機都通過出入口路由器連上中轉服務器,中轉服務器記錄兩邊主機的出入口路由器的IP + Port,中轉服務器交換兩者的IP和Port給對方后,就不需要通過服務器轉發了,兩邊可以直接借助互相的公網IP進行通信,這就是內網打洞。
“打洞”的含義就是直接通過一個中間服務器,交換雙方主機的對外的IP + port,之后讓雙方直接通信。 有的時候雙方打洞的IP也可以是同一運營商子網下的私網IP地址,也可能是運營商的公網IP,不過這些情況都有可能遇到拒絕轉發的情況,運營商會不同程度限制。
下載的時候也可能打洞,如雙方主機都在下載同一個資源時,資源提供商就直接交換雙方出入口路由器的IP + Port,實現內網打洞。之后兩邊既是下載者,也是上傳者,兩邊互相交換各自沒有的需要下載的數據,這就是P2P。
(4)“科技”
以下僅為技術分享,請各位遵紀守法!
前面說過運營商路由器連上廣域網,有公網IP。我們的如果要經由公網轉發,就會經過運營商路由器,進行NAPT并轉發。這也意味著我們的訪問報文會被看到,可能被運營商攔截,常說的“Q”就設置在攔截這里。 “FQ”的基本思想就是想辦法騙過運營商。
有些地區可以直接訪問外網,如香港。假設有一臺云服務器在香港,這個云服務器可以訪問外網,而我們又能直接訪問這個云服務器,那么我們就可以借助正向代理實現,這實際上借助了正向代理隱藏身份的特點。
某個客戶端軟件,這個軟件能劫持主機上所有的流量,修改本地的路由表讓它把下一跳改成軟件自己,這樣的話所有數據都會轉給軟件,這個軟件叫透明代理軟件(透明是因為我們用戶感知不到)。 假設我們要訪問google,軟件會把www.google.com等敏感信息加密,即把真實請求藏起來(運營商掃描不出來),表面覆蓋一個可以訪問外網的正向代理服務器的IP + Port。這個代理服務器能夠解密并提取信息,訪問外網并應答。返回時同樣進行加密,交給客戶端解密。
本質上它就是搭建在公網上的正向代理。