絡(luò)排查實戰(zhàn))
寫這篇總結(jié)之前我先隨手翻了翻之前的幾篇筆記?;A(chǔ)概念系列連起來看前面已經(jīng)把分層模型、以太網(wǎng)、交換機轉(zhuǎn)發(fā)這些底子打過了這一篇正好接上IP地址是怎么在網(wǎng)絡(luò)里被用起來的。說白了就是回答一個很實際的問題——當你點開一個網(wǎng)頁、連上一個服務(wù)數(shù)據(jù)包是怎么靠IP地址一步步找到目標的。適合剛學(xué)網(wǎng)絡(luò)的在校同學(xué)也適合工作里經(jīng)常跟網(wǎng)絡(luò)打交道但有些細節(jié)始終沒捋清楚的從業(yè)者。這一篇盡量把關(guān)鍵機制講透后面排查問題的時候能直接派上用場。1. 先把IP地址放在整個網(wǎng)絡(luò)體系里的位置搞清楚1.1 IP地址解決的本質(zhì)問題端到端尋址我們把網(wǎng)絡(luò)通信想象成寄快遞。你寄包裹的時候快遞單上要有收件人的地址。這個地址必須足夠全局可讀郵局系統(tǒng)才能一級一級把包裹送過去。IP地址扮演的就是這個角色它是網(wǎng)絡(luò)層為每一臺設(shè)備分配的邏輯地址解決的核心問題是這個數(shù)據(jù)包應(yīng)該送到哪里。這里有兩個字要特別注意邏輯。與MAC地址燒錄在網(wǎng)卡上不同IP地址不是硬件自帶的而是由管理員或DHCP服務(wù)器分配后寫入操作系統(tǒng)的網(wǎng)絡(luò)配置里的。這意味著它可以隨時變更、重新規(guī)劃不受物理位置限制。你在公司里換一個工位網(wǎng)線一插可能就換了一個IP但你網(wǎng)卡的MAC地址從來沒有變過。所以網(wǎng)絡(luò)層的尋址是邏輯尋址鏈路層的尋址是物理尋址二者配合才構(gòu)成了完整的通信鏈路。有了這個邏輯地址網(wǎng)絡(luò)設(shè)備主要是路由器才能做一件關(guān)鍵的事情路由決策。路由器維護一張路由表里面記錄著哪個IP段走哪個接口、下一跳是誰。當一個數(shù)據(jù)包到達路由器時它會提取目的IP地址查表然后把包轉(zhuǎn)發(fā)到正確的出口。這個過程在網(wǎng)絡(luò)世界里每時每刻都在發(fā)生而IP地址正是路由查找的關(guān)鍵索引。1.2 從組網(wǎng)角度看IP地址的靜態(tài)配置與動態(tài)分配實際組網(wǎng)時IP地址怎么落到設(shè)備上主要有兩種方式靜態(tài)配置和動態(tài)獲取。靜態(tài)配置就是管理員手動在設(shè)備的網(wǎng)絡(luò)設(shè)置里填I(lǐng)P、掩碼、網(wǎng)關(guān)。適用于服務(wù)器、網(wǎng)絡(luò)打印機、路由器互聯(lián)接口這類地址需要保持固定的場景。好處是可控性強壞處是規(guī)模一大就非常費手而且容易因為手誤造成沖突。動態(tài)獲取靠的是DHCP動態(tài)主機配置協(xié)議。設(shè)備開機后發(fā)一個DHCP Discover廣播DHCP服務(wù)器收到后從地址池里挑一個空閑IP連同掩碼、網(wǎng)關(guān)、DNS一起發(fā)給設(shè)備這就是所謂的DHCP Offer。整個流程走的是四次握手Discover、Offer、Request、Ack。租約默認一般是24小時到了續(xù)租時間設(shè)備會再發(fā)Request去更新。對終端用戶來說完全無感知但對排障來說DHCP這條線是非常關(guān)鍵的排查對象。家用的無線路由器之所以能插上就能上網(wǎng)就是因為它在出廠時默認開啟了DHCP服務(wù)給你的手機電腦自動下發(fā)了一個192.168.x.x的地址。你手動改成靜態(tài)IP反而容易出問題這個后面在第5章會專門提。2. IP地址的分類邏輯與地址空間劃分2.1 早期分類編址Classful Addressing時代的A/B/C類在比較早的互聯(lián)網(wǎng)設(shè)計階段IP地址被分成了固定幾類最常用的就是A、B、C三類。劃分依據(jù)是地址的最前面幾位二進制A類首位為0網(wǎng)絡(luò)號占8位主機號占24位。范圍從1.0.0.0到126.255.255.255適合超大型網(wǎng)絡(luò)每個A類網(wǎng)絡(luò)理論上可以容納約1677萬臺主機。B類前兩位為10網(wǎng)絡(luò)號占16位主機號占16位。范圍從128.0.0.0到191.255.255.255適合中型網(wǎng)絡(luò)每個網(wǎng)絡(luò)最多約6.5萬臺主機。C類前三位為110網(wǎng)絡(luò)號占24位主機號占8位。范圍從192.0.0.0到223.255.255.255適合小型網(wǎng)絡(luò)每個網(wǎng)絡(luò)最多254臺主機。這套分類在教科書里講得非常清楚但實際用起來問題特別明顯。最典型的就是一刀切導(dǎo)致的空間浪費一個公司可能只需要500個IP地址但你得申請一個B類地址段一給就是6萬多剩下的大半都閑置了。反過來如果只有幾百臺設(shè)備卻拿到一個C類地址段那又根本不夠用。為了解決這個供需錯配90年代業(yè)界轉(zhuǎn)向了CIDR。2.2 CIDR與VLSM不再按類別劃分按前綴長度劃分CIDR無類域間路由徹底打破了A/B/C的框框。它的表示法很直接IP地址后面加一個斜杠斜杠后面是前綴長度即網(wǎng)絡(luò)部分占多少位。比如172.16.4.0/22表示前22位是網(wǎng)絡(luò)號后10位是主機號。這個寫法的好處是你可以按需“切分”地址空間。比如你向某機構(gòu)申請到一段203.0.113.0/24的地址內(nèi)部就可以自行切成多個子網(wǎng)/25切出2個子網(wǎng)每個126臺可用主機/26切出4個子網(wǎng)每個62臺可用主機。這就是VLSM可變長子網(wǎng)掩碼的核心思想不搞固定大小的桶按實際需求靈活分配。在路由器層面CIDR也帶來了一個額外福利路由聚合。以前要通告相鄰的幾個C類段得寫好幾條路由現(xiàn)在如果有連續(xù)的地址塊比如192.168.4.0/24、192.168.5.0/24、192.168.6.0/24、192.168.7.0/24只要這四段的上游路由行為一致就可以聚合通告為192.168.4.0/22。這樣核心路由器的路由表數(shù)量大幅減少轉(zhuǎn)發(fā)效率明顯提升。這也是我排障時喜歡把路由表show ip route summary看一眼的原因之一聚合得好不好直接影響網(wǎng)絡(luò)的收斂速度。2.3 公網(wǎng)地址與私網(wǎng)地址的劃分邏輯聊到IP地址就不能不提公網(wǎng)和私網(wǎng)。RFC 1918規(guī)定了三段始終不會被公網(wǎng)路由的私有地址范圍地址段前綴范圍默認標準掩碼10.0.0.0/810.0.0.0 - 10.255.255.255大企業(yè)內(nèi)網(wǎng)常用255.0.0.0172.16.0.0/12172.16.0.0 - 172.31.255.255中型企業(yè)常用255.240.0.0192.168.0.0/16192.168.0.0 - 192.168.255.255家庭/小型辦公最常用255.255.0.0這些地址可以在任何人的內(nèi)網(wǎng)里重復(fù)使用。你家路由器用192.168.1.1別人家路由器也可以互相不影響因為它們在各自的局域網(wǎng)里私有運轉(zhuǎn)。問題是訪問互聯(lián)網(wǎng)時私網(wǎng)地址不能直接使用必須經(jīng)過NAT網(wǎng)絡(luò)地址轉(zhuǎn)換映射成公網(wǎng)地址。最典型的就是家用路由器做的端口多路復(fù)用——局域網(wǎng)里幾十臺設(shè)備共用一個公網(wǎng)IP路由器靠端口號區(qū)分是哪個內(nèi)網(wǎng)設(shè)備的流量。理解這層關(guān)系有助于以后排查很多內(nèi)網(wǎng)能通、外網(wǎng)不通的問題先看地址是不是私網(wǎng)段再看NAT是否生效最后查公網(wǎng)側(cè)的出入方向基本就能定位到問題點。3. 子網(wǎng)掩碼與網(wǎng)段計算3.1 掩碼的二進制本質(zhì)它其實是一把尺子很多人對子網(wǎng)掩碼的理解停留在255.255.255.0就代表一個網(wǎng)段這沒錯但不夠。掩碼真正的意義在于它定義了IP地址中哪些位屬于網(wǎng)絡(luò)號、哪些位屬于主機號。掩碼寫成二進制高位全是連續(xù)的1低位全是連續(xù)的0。比如255.255.255.0寫成二進制就是24個1后面跟8個0。要判斷兩個IP是否在同一個網(wǎng)段方法很簡單把IP地址和掩碼做逐位的與運算得到網(wǎng)絡(luò)號如果兩個IP的網(wǎng)絡(luò)號相同它們就在同一個二層范圍內(nèi)直接通信不需要經(jīng)過路由器。舉個例子。IP是192.168.1.100掩碼是255.255.255.0。192.168.1.100的二進制是兩組八位拼接起來與掩碼做與運算后主機號部分清零結(jié)果就是192.168.1.0也就是網(wǎng)絡(luò)號。而192.168.1.255是子網(wǎng)廣播地址。一臺主機可以用的地址范圍是192.168.1.1到192.168.1.254共254個。這里有一個值得記住的公式一個前綴長度為n的子網(wǎng)里可用主機數(shù)等于2的(32-n)次方減去2。減去的兩個地址一個是網(wǎng)絡(luò)號一個是廣播地址。這是配置地址和規(guī)劃地址池時最基礎(chǔ)的計算。3.2 按需劃分子網(wǎng)的實例從/24切出兩個子網(wǎng)我們拿最常見的192.168.1.0/24來演示。假設(shè)你公司有行政和研發(fā)兩個部門想讓他們各自獨立、互不干擾就需要把這個網(wǎng)段切成兩個子網(wǎng)。從/24往后借一位變成/25得到兩個子網(wǎng)子網(wǎng)A192.168.1.0/25掩碼255.255.255.128可用地址1.1~1.126廣播地址1.127。子網(wǎng)B192.168.1.128/25掩碼255.255.255.128可用地址1.129~1.254廣播地址1.255。每段可用主機數(shù)從254變成126。如果你的設(shè)備數(shù)不到120臺這樣切完全夠用。如果還不夠就繼續(xù)往后借位/26可以切4段每段62臺主機/27切8段每段30臺主機/28切16段每段14臺主機。切割過程中最需要小心的是不要把廣播地址和網(wǎng)絡(luò)號當成可用IP分配給設(shè)備。很多人配置靜態(tài)IP時隨手填了192.168.1.255或192.168.1.0結(jié)果一部分設(shè)備通信異常還一直找不到原因。這種問題在做地址規(guī)劃時就要提前避開。3.3 掩碼寫錯導(dǎo)致的假通掩碼不匹配導(dǎo)致的癥狀非常典型兩臺設(shè)備IP同段但掩碼不同其中一臺認為對方不在同一個網(wǎng)絡(luò)里于是把發(fā)往對方的數(shù)據(jù)交給網(wǎng)關(guān)處理如果網(wǎng)關(guān)又沒有對應(yīng)的轉(zhuǎn)發(fā)規(guī)則通信就直接失敗。舉個實例。電腦A配置192.168.1.10/24電腦B配置192.168.1.20/16掩碼255.255.0.0。A認為B就在本網(wǎng)段直接發(fā)ARP請求去找B的MAC地址B收到了會回但B用/16掩碼計算后認為A在同一個大網(wǎng)段192.168.0.0/16覆蓋了1.10也能直接回。這種情況下兩邊反而能通。真出問題的往往是更復(fù)雜的多網(wǎng)段環(huán)境B認為目的IP 192.168.2.30另一網(wǎng)段的設(shè)備也在自己的/16范圍內(nèi)于是直接發(fā)ARP而實際上目的設(shè)備在路由器后面ARP永遠得不到響應(yīng)流量就卡在B這里。這種局域網(wǎng)內(nèi)有一臺大掩碼設(shè)備造成的路由黑洞在外派支持時遇到過不止一次。查這種問題其實很快在兩臺設(shè)備上分別看ip route或者route print比對它們對目的地址的判定是直連還是經(jīng)由網(wǎng)關(guān)就能看出掩碼是否出了偏差。4. 地址解析與報文的實際流轉(zhuǎn)4.1 ARPIP地址怎么找到MAC地址IP地址是網(wǎng)絡(luò)層的標識但數(shù)據(jù)真正在以太網(wǎng)上傳輸時靠的是MAC地址。這就需要一個翻譯的過程由ARP地址解析協(xié)議完成。當一臺主機要向同一網(wǎng)段的另一臺主機發(fā)包時它先查看自己的ARP緩存表。如果緩存里沒有目的IP對應(yīng)的MAC地址就向整個網(wǎng)段發(fā)一個廣播幀誰的IP是192.168.1.20請把你的MAC地址告訴我。對應(yīng)設(shè)備收到后發(fā)現(xiàn)自己的IP被點名就單播回復(fù)一個ARP應(yīng)答告知自己的MAC地址。之后發(fā)送方把這個映射關(guān)系緩存下來后續(xù)報文直接封裝目的MAC發(fā)出。這個機制平時工作得很安靜但有幾個排查要點值得記牢。第一ARP表是會過期的Windows默認緩存時間也就幾十秒到幾分鐘不等所以ping不通但緩存里卻有對方MAC這類矛盾時常出現(xiàn)需要手動清緩存。第二如果有人偽造ARP應(yīng)答就可能實現(xiàn)ARP欺騙把流量引到錯誤的設(shè)備上。所以在不可信的網(wǎng)絡(luò)環(huán)境里對關(guān)鍵設(shè)備做靜態(tài)ARP綁定是有必要的。第三跨網(wǎng)段通信時數(shù)據(jù)包里的目的MAC地址是網(wǎng)關(guān)的MAC而不是最終目的主機的MAC。這一點初學(xué)容易混淆。4.2 數(shù)據(jù)包跨網(wǎng)段時到底發(fā)生了什么兩臺設(shè)備不在同一個網(wǎng)段時源主機會怎么處理它把自己的IP和掩碼做與運算得出自己的網(wǎng)絡(luò)號再用目的IP和掩碼做與運算得出目的網(wǎng)絡(luò)號兩者不一致于是判定目標在遠端。此時源主機把數(shù)據(jù)包的三層目的IP寫為最終目標IP但二層幀的目的MAC寫為默認網(wǎng)關(guān)的MAC然后把幀發(fā)到網(wǎng)關(guān)。網(wǎng)關(guān)路由器解開二層幀看到三層目的IP查路由表確定下一跳或出接口再做一次二層封裝發(fā)給下一跳設(shè)備。這個解封裝、查表、再封裝的過程在沿途每一跳路由器上重復(fù)執(zhí)行直到到達目標網(wǎng)段。到達目標網(wǎng)段后路由器把數(shù)據(jù)包發(fā)給最終目標主機前還是要靠ARP解析出目標主機的MAC地址完成最后一跳交付。排查跨網(wǎng)段不通時我一般會分三段來看源主機到網(wǎng)關(guān)通不通、沿途路由器每一跳通不通、最后一跳到目標主機通不通。用tracertWindows或tracerouteLinux就能把這些跳點逐層摸出來卡在哪一跳問題基本就集中在哪一跳。4.3 域名解析與IP地址的配合流程平時我們幾乎不會直接輸入IP地址上網(wǎng)輸入的是域名。這里有一個容易被忽視卻非常重要的配合關(guān)系DNS把域名解析成IP應(yīng)用層拿著IP去建立連接網(wǎng)絡(luò)層再按IP尋址轉(zhuǎn)發(fā)。如果DNS掛了瀏覽器會報無法解析服務(wù)器的DNS地址這時候即使IP網(wǎng)絡(luò)完全正常你也上不了網(wǎng)。排障時有一個很基礎(chǔ)但很實用的技巧當域名解析有問題時先ping域名看看解析出的IP是什么再用nslookup或dig去獨立驗證。如果nslookup能返回正確IP但瀏覽器就是打不開那問題往往在本地DNS緩存或應(yīng)用層而不在網(wǎng)絡(luò)本身。Windows下可以用ipconfig /flushdns清空本地緩存Linux下一般是重啟systemd-resolved或nscd服務(wù)。DNS屬于應(yīng)用層范疇但它直接決定了IP地址工作方式這整條鏈路能不能跑起來。所以做網(wǎng)絡(luò)排查時把DNS解析放進檢查清單能省掉很多彎路。5. 實戰(zhàn)排查IP地址相關(guān)的典型問題與速查方案5.1 IP地址沖突最經(jīng)典的翻車現(xiàn)場IP沖突幾乎是內(nèi)網(wǎng)靜態(tài)IP環(huán)境里最容易碰到的問題。兩臺設(shè)備用了同一個IP表現(xiàn)非常有趣時通時斷或者一臺能上另一臺完全上不了。原因在于ARP緩存——網(wǎng)絡(luò)里的交換機或其它主機的ARP表一會兒指向這臺設(shè)備一會兒指向那臺設(shè)備數(shù)據(jù)包自然就跟著飄忽不定。排查沖突的快捷辦法是在出問題的設(shè)備上執(zhí)行arp -a找到?jīng)_突IP對應(yīng)的MAC地址再逐一比對實際設(shè)備。更徹底的辦法是上交換機查看接入端口的MAC地址表找到這個IP對應(yīng)的所有MAC逐端口去定位。Windows系統(tǒng)碰到IP沖突時會在右下角彈窗提示但很多精簡版系統(tǒng)或Linux環(huán)境沒有這個提示所以還是得靠主動排查。5.2 配置了靜態(tài)IP但上不了網(wǎng)先查這三項很多人把IP從自動獲取改成手動填寫之后發(fā)現(xiàn)上不了網(wǎng)而后臺又看不出什么明顯報錯。這種場景下優(yōu)先檢查三個點掩碼、網(wǎng)關(guān)、DNS。第一掩碼對不對。如果掩碼和網(wǎng)關(guān)的掩碼不一致系統(tǒng)可能判定網(wǎng)關(guān)在“遠端”直接把包發(fā)給一個不存在的下一跳。第二網(wǎng)關(guān)地址對不對。家用路由器一般是192.168.1.1或192.168.0.1但也可能是別的段比如有些定制固件是192.168.31.1。填錯網(wǎng)關(guān)時系統(tǒng)能獲取到IP但出不去。第三DNS寫沒寫。很多手工配置只填了IP和掩碼DNS留空或者填錯結(jié)果QQ這類直連IP的軟件能上瀏覽器就是打不開網(wǎng)頁。每次看到這類問題我的第一建議都是如果不能明確知道自己要配什么內(nèi)容就先用回DHCP自動獲取讓設(shè)備自己拿地址。這樣往往能瞬間消除一多半的人為配置錯誤。5.3 DHCP獲取不到地址從哪里看起設(shè)備連上網(wǎng)絡(luò)后拿不到IP可能的原因很多由淺入深排下來基本是網(wǎng)線或無線信號問題、交換機端口VLAN配置問題、DHCP服務(wù)器故障、地址池耗盡、中繼配置錯誤。優(yōu)先查看系統(tǒng)日志和DHCP客戶端狀態(tài)。Windows下用ipconfig /release再ipconfig /renew注意觀察返回信息如果一直停留在無法聯(lián)系DHCP服務(wù)器大概率是二層鏈路或DHCP服務(wù)本身有問題。Linux下可以查看dhclient或NetworkManager的日志。另一個常見坑是網(wǎng)絡(luò)中如果有多個DHCP服務(wù)器且分配策略沖突會出現(xiàn)IP拿到了但時好時壞的詭異現(xiàn)象。排查時可以用抓包工具過濾dhcp或bootp協(xié)議看看設(shè)備發(fā)出的Discover有沒有收到Offer就能快速定位是哪一側(cè)的問題。5.4 快速自查命令速查表場景命令Windows / Linux看什么查看本機地址與掩碼ipconfig /all ; ip addr showIP、掩碼、網(wǎng)關(guān)是否按預(yù)期配置測試基本連通性ping 目標IP是否收到回包丟包和延遲情況查DNS解析nslookup 域名 ; dig 域名解析出的IP是否正常查看ARP映射arp -a ; ip neigh show目標IP對應(yīng)的MAC是否異常追蹤路徑tracert 目標 ; traceroute 目標卡在哪一跳鏈路中哪些節(jié)點延遲高看路由表route print ; ip route show默認路由和直連路由是否齊全把這張表貼在工位附近遇到日常網(wǎng)絡(luò)問題可以先按表自查一遍很多故障其實都是配置層面的小問題。真正要抓包的場景再上Wireshark去過濾arp、icmp、dhcp這些協(xié)議也不遲。在最后多提一嘴IP地址本身只是一個標識真正讓網(wǎng)絡(luò)跑起來的是圍繞它的整套解析、尋址、轉(zhuǎn)發(fā)機制。很多看似玄學(xué)的網(wǎng)絡(luò)故障歸根結(jié)底都是掩碼算錯、路由缺失、ARP混亂或者地址沖突這老幾樣。把這篇里的細節(jié)吃透再配合命令行去驗證遇到問題至少心里會有一個清晰的排查順序。我覺得對剛接觸網(wǎng)絡(luò)的同學(xué)來說與其死背概念不如自己在家里用兩臺設(shè)備搭一個最小網(wǎng)絡(luò)親手配一次靜態(tài)IP、看一次ARP緩存的變化比看十遍書都印象深。