據(jù)通信網(wǎng)絡(luò)基礎(chǔ)入門(mén):從IP尋址到路由轉(zhuǎn)發(fā)與故障排查)
數(shù)據(jù)通信網(wǎng)絡(luò)基礎(chǔ)說(shuō)白了一件事讓數(shù)據(jù)從一臺(tái)設(shè)備準(zhǔn)確、高效地到達(dá)另一臺(tái)設(shè)備。聽(tīng)起來(lái)簡(jiǎn)單但里面的門(mén)道不少。我當(dāng)年學(xué)數(shù)通的時(shí)候就是被各種協(xié)議、分層模型、封裝解封裝搞得一頭霧水后來(lái)踩了無(wú)數(shù)坑才慢慢把這些概念串成了一條線。這篇筆記算是我對(duì)“基礎(chǔ)”兩個(gè)字的一個(gè)復(fù)盤(pán)想把那些教材里寫(xiě)得繞來(lái)繞去的概念用大白話講清楚順便把我踩過(guò)的坑也標(biāo)出來(lái)。如果你是剛?cè)腴T(mén)或者學(xué)了一段時(shí)間總覺(jué)得概念都是散的這篇內(nèi)容大概率對(duì)你有用。1. 數(shù)據(jù)通信網(wǎng)絡(luò)到底在解決什么問(wèn)題1.1 從通信需求到網(wǎng)絡(luò)架構(gòu)的演進(jìn)邏輯要理解數(shù)據(jù)通信網(wǎng)絡(luò)先得理解它要解決的問(wèn)題本質(zhì)。最原始的通信是兩個(gè)人面對(duì)面說(shuō)話那叫物理傳輸。再進(jìn)一步兩個(gè)人用電話線傳聲音那是模擬信號(hào)。到了計(jì)算機(jī)時(shí)代我們傳的是數(shù)字信號(hào)是二進(jìn)制數(shù)據(jù)流。但數(shù)據(jù)通信網(wǎng)絡(luò)和打電話有一個(gè)本質(zhì)區(qū)別打電話是電路交換一旦接通就獨(dú)占一條物理線路而數(shù)通網(wǎng)絡(luò)是分組交換數(shù)據(jù)被切成一個(gè)個(gè)小包各自尋找路徑到達(dá)目的地。這種分組交換的設(shè)計(jì)帶來(lái)一個(gè)核心問(wèn)題數(shù)據(jù)包在復(fù)雜的拓?fù)浣Y(jié)構(gòu)里怎么走走哪條路走錯(cuò)了怎么辦堵車了怎么辦這就是路由和交換要解決的事情。打個(gè)比方你寄快遞快遞公司不會(huì)給你專門(mén)修一條從你家到收件人家的路而是利用現(xiàn)有的四通八達(dá)的公路網(wǎng)你的包裹被放進(jìn)一個(gè)個(gè)小紙箱每個(gè)中轉(zhuǎn)站根據(jù)紙箱上的地址決定下一站往哪兒送。數(shù)據(jù)包就是那個(gè)紙箱路由器就是中轉(zhuǎn)站IP地址就是那個(gè)地址。這個(gè)類比基本能覆蓋整個(gè)數(shù)據(jù)通信網(wǎng)絡(luò)的核心邏輯。所以學(xué)數(shù)通你學(xué)的不是某一臺(tái)設(shè)備怎么配而是整個(gè)數(shù)據(jù)傳遞體系是怎么協(xié)同工作的。從物理層的網(wǎng)線、光纖到數(shù)據(jù)鏈路層的MAC地址、交換機(jī)轉(zhuǎn)發(fā)再到網(wǎng)絡(luò)層的IP尋址和路由選擇最后到傳輸層的端口管理和可靠傳輸每一層都在解決特定類型的問(wèn)題。1.2 分層模型為什么非要把網(wǎng)絡(luò)切成好幾層很多初學(xué)者覺(jué)得OSI七層模型是理論家拍腦袋想出來(lái)的背了就忘沒(méi)什么實(shí)際意義。這個(gè)想法我特別理解因?yàn)槲覄傞_(kāi)始也這么想。但我后來(lái)發(fā)現(xiàn)分層模型不是學(xué)術(shù)癖好它是網(wǎng)絡(luò)工程里最實(shí)用的思維工具。想象一下如果沒(méi)有分層你設(shè)計(jì)一個(gè)網(wǎng)絡(luò)通信系統(tǒng)就得把物理傳輸、地址標(biāo)識(shí)、路由計(jì)算、數(shù)據(jù)校驗(yàn)、應(yīng)用格式全部耦合在一起。網(wǎng)卡壞了要改應(yīng)用代碼換個(gè)傳輸介質(zhì)要重寫(xiě)協(xié)議那這網(wǎng)絡(luò)基本沒(méi)法維護(hù)升級(jí)。分層的核心思想是每一層只負(fù)責(zé)自己那一攤事層與層之間定義清晰的接口上層調(diào)用下層提供的服務(wù)不用關(guān)心下層是怎么實(shí)現(xiàn)的。用實(shí)際例子來(lái)看。你在瀏覽器里訪問(wèn)某個(gè)網(wǎng)站應(yīng)用層生成HTTP請(qǐng)求傳輸層加上TCP頭部源端口、目的端口網(wǎng)絡(luò)層加上IP頭部源IP、目的IP數(shù)據(jù)鏈路層加上MAC頭部物理層轉(zhuǎn)成比特流發(fā)送。接收端則是反向操作一層層拆掉頭部最終把數(shù)據(jù)交給應(yīng)用程序。這個(gè)過(guò)程叫封裝和解封裝。這里有一個(gè)概念特別容易搞混對(duì)等層通信。雖然數(shù)據(jù)是一層層往下封裝再?gòu)奈锢韺觽鬟^(guò)去的但在邏輯上每一層只“認(rèn)為”自己在和對(duì)端的同一層對(duì)話。比如傳輸層加了TCP頭部它期望的是對(duì)端的傳輸層來(lái)處理這個(gè)頭部中間的交換機(jī)、路由器只看到網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層的信息就夠了。我當(dāng)年初學(xué)時(shí)候犯過(guò)一個(gè)經(jīng)典錯(cuò)誤覺(jué)得數(shù)據(jù)包在每臺(tái)設(shè)備上都會(huì)被完整拆開(kāi)到應(yīng)用層。實(shí)際上只有在源端和目的端才會(huì)做完整的封裝解封裝中間的設(shè)備最多拆到網(wǎng)絡(luò)層甚至數(shù)據(jù)鏈路層就轉(zhuǎn)發(fā)走了。搞清楚這一點(diǎn)再去看網(wǎng)絡(luò)的轉(zhuǎn)發(fā)流程就不會(huì)亂了。2. 網(wǎng)絡(luò)基礎(chǔ)概念逐個(gè)拆解從IP地址到默認(rèn)網(wǎng)關(guān)2.1 IP地址與子網(wǎng)掩碼不僅僅是“配個(gè)地址”這么簡(jiǎn)單IP地址是整個(gè)網(wǎng)絡(luò)層最核心的概念。IPv4地址是32位二進(jìn)制數(shù)寫(xiě)成點(diǎn)分十進(jìn)制。但真正干活的時(shí)候光配一個(gè)IP地址是遠(yuǎn)遠(yuǎn)不夠的你還得配子網(wǎng)掩碼、網(wǎng)關(guān)這三者缺一不可不然網(wǎng)絡(luò)就不通。子網(wǎng)掩碼這個(gè)概念的引入背后是為了解決尋址效率問(wèn)題。IP地址分網(wǎng)絡(luò)位和主機(jī)位掩碼用來(lái)標(biāo)定“到哪一位是網(wǎng)絡(luò)位”。為什么必須這樣分因?yàn)榫W(wǎng)絡(luò)上的設(shè)備實(shí)在太多了如果所有設(shè)備都在同一個(gè)廣播域里每次通信都要廣播網(wǎng)絡(luò)早就被廣播風(fēng)暴淹沒(méi)了。子網(wǎng)劃分把一個(gè)大的廣播域拆成多個(gè)小的廣播域讓數(shù)據(jù)通信只在需要的范圍內(nèi)傳播。舉個(gè)例子設(shè)備A的IP是192.168.1.10掩碼是255.255.255.0設(shè)備B的IP是192.168.1.20掩碼相同。A要訪問(wèn)B時(shí)A先用自己的掩碼和目標(biāo)地址做與運(yùn)算算出來(lái)的網(wǎng)絡(luò)號(hào)都是192.168.1.0判定目標(biāo)和自己處于同一網(wǎng)段于是直接通過(guò)ARP詢問(wèn)B的MAC地址把數(shù)據(jù)幀二層轉(zhuǎn)發(fā)過(guò)去。那如果目標(biāo)地址是192.168.2.10呢A同樣做與運(yùn)算發(fā)現(xiàn)網(wǎng)絡(luò)號(hào)是192.168.2.0和自己不在同一網(wǎng)段。這時(shí)候A就不會(huì)直接去找B的MAC地址了而是把數(shù)據(jù)包交給網(wǎng)關(guān)也就是默認(rèn)網(wǎng)關(guān)這個(gè)三層設(shè)備由它來(lái)做下一步路由。這就是為什么網(wǎng)關(guān)配置錯(cuò)了跨網(wǎng)段通信一定失敗——數(shù)據(jù)包都不知道要交給誰(shuí)。這里有個(gè)我實(shí)際踩過(guò)的坑有一次我配置服務(wù)器IP和掩碼都沒(méi)問(wèn)題網(wǎng)關(guān)也能ping通但就是訪問(wèn)不了外網(wǎng)。最后排查才發(fā)現(xiàn)網(wǎng)關(guān)地址寫(xiě)成了.1但實(shí)際網(wǎng)關(guān)在.254。這個(gè)錯(cuò)誤非常隱蔽因?yàn)榕渲媒缑娌粫?huì)報(bào)錯(cuò)只有抓包才會(huì)發(fā)現(xiàn)ARP請(qǐng)求一直發(fā)給一個(gè)不存在的主機(jī)。所以網(wǎng)絡(luò)排錯(cuò)時(shí)先確認(rèn)“同網(wǎng)段通不通跨網(wǎng)段通不通”再確認(rèn)“網(wǎng)關(guān)地址對(duì)不對(duì)”順序不要反。2.2 網(wǎng)關(guān)與路由數(shù)據(jù)包怎么找到“出城的路口”把網(wǎng)關(guān)比作出城的路口是最好理解的。你在小區(qū)內(nèi)同一網(wǎng)段串門(mén)直接走樓棟之間就行二層通信。但你要去另一個(gè)城市不同網(wǎng)段就必須先出小區(qū)大門(mén)網(wǎng)關(guān)再上高速路由。網(wǎng)關(guān)地址本身就是一個(gè)IP地址它通常是路由器或者三層交換機(jī)上某個(gè)接口的IP這個(gè)IP和主機(jī)處于同一個(gè)網(wǎng)段。主機(jī)的數(shù)據(jù)包到達(dá)網(wǎng)關(guān)后網(wǎng)關(guān)查詢自己的路由表決定這個(gè)包裹下一站交給誰(shuí)。路由表怎么來(lái)的兩種來(lái)源。直連路由只要路由器接口配了IP并且接口狀態(tài)是up的路由器自動(dòng)就知道這個(gè)網(wǎng)段是直連的。靜態(tài)路由管理員手動(dòng)告訴路由器“去某某網(wǎng)段下一跳是某某IP”。動(dòng)態(tài)路由路由器之間通過(guò)路由協(xié)議互相同步信息自動(dòng)學(xué)習(xí)到各個(gè)網(wǎng)段的最優(yōu)路徑。對(duì)于學(xué)習(xí)數(shù)通基礎(chǔ)的人來(lái)說(shuō)靜態(tài)路由是必須要吃透的。它配置簡(jiǎn)單邏輯清晰而且能幫你建立最直觀的路由概念。我給你一個(gè)實(shí)際例子次企業(yè)網(wǎng)絡(luò)里有三個(gè)路由器串在一起A連著一個(gè)服務(wù)器網(wǎng)段192.168.10.0/24B在中間C連著一個(gè)客戶端網(wǎng)段192.168.30.0/24。要讓客戶端能訪問(wèn)到服務(wù)器不僅C上要配置到10.0網(wǎng)段的靜態(tài)路由下一跳指向BB上也要配置到10.0網(wǎng)段的路由下一跳指向A。很多人只配了兩端的路由中間的B沒(méi)有配結(jié)果就是數(shù)據(jù)包到了B就被丟棄。這就是“有去有回”的原則——不光要去程路由回程路由也要通。我輔導(dǎo)過(guò)的一個(gè)同學(xué)就犯過(guò)這類錯(cuò)誤他只在客戶端所在的C路由器上寫(xiě)了靜態(tài)路由發(fā)出去的包能到服務(wù)器但服務(wù)器的回包到了B后B查路由表發(fā)現(xiàn)沒(méi)有去往客戶端網(wǎng)段的路由直接丟棄。結(jié)果就是ping不通而且抓包只能看到請(qǐng)求包沒(méi)有回應(yīng)包很難排查。這種案例在真實(shí)生產(chǎn)環(huán)境里特別常見(jiàn)。2.3 MAC地址、ARP協(xié)議二層通信的“門(mén)牌號(hào)”機(jī)制談完三層再來(lái)說(shuō)說(shuō)二層。MAC地址是燒錄在網(wǎng)卡上的物理地址48位號(hào)稱全球唯一。交換機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)幀就是依據(jù)MAC地址表這張表記錄著哪個(gè)MAC地址出現(xiàn)在哪個(gè)端口上。問(wèn)題來(lái)了主機(jī)只知道目的IP地址卻不知道目的MAC地址怎么把幀發(fā)出去這就是ARP協(xié)議地址解析協(xié)議存在的意義。ARP的核心機(jī)制是廣播請(qǐng)求、單播回應(yīng)。主機(jī)A要訪問(wèn)B先看自己的ARP緩存表有沒(méi)有B的MAC地址沒(méi)有就發(fā)一個(gè)廣播幀誰(shuí)是192.168.1.20請(qǐng)告訴我你的MAC地址。網(wǎng)段內(nèi)所有主機(jī)都收到這個(gè)廣播但只有B會(huì)回應(yīng)。A拿到回應(yīng)后把B的MAC地址和IP的映射緩存一段時(shí)間然后正常通信。這個(gè)機(jī)制在基礎(chǔ)環(huán)境里運(yùn)行得很好但有幾個(gè)坑必須注意。第一個(gè)坑是ARP緩存導(dǎo)致的排錯(cuò)干擾。有一次我改了一臺(tái)設(shè)備的IP地址但其他主機(jī)還緩存著舊IP對(duì)應(yīng)舊MAC的映射通信一直失敗。我用arp -d清空緩存后立即恢復(fù)。生產(chǎn)環(huán)境里批量更換設(shè)備IP時(shí)建議提前規(guī)劃好或者等緩存老化不要頻繁變動(dòng)。第二個(gè)坑是ARP廣播只發(fā)生在同一個(gè)廣播域內(nèi)也就是同一個(gè)二層網(wǎng)絡(luò)里。不在同一網(wǎng)段的主機(jī)源主機(jī)根本不會(huì)發(fā)ARP詢問(wèn)目的主機(jī)而是把數(shù)據(jù)幀交給網(wǎng)關(guān)ARP詢問(wèn)的是網(wǎng)關(guān)的MAC不是最終目的主機(jī)的MAC。這個(gè)邏輯很多初學(xué)者容易搞錯(cuò)我見(jiàn)過(guò)有人在無(wú)法跨網(wǎng)段通信時(shí)跑去抓包想看目的主機(jī)的ARP回應(yīng)結(jié)果抓破頭都看不到原因是它壓根就不該出現(xiàn)。3. 實(shí)操入門(mén)搭建你的第一個(gè)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境3.1 模擬器選型與環(huán)境搭建學(xué)網(wǎng)絡(luò)最忌諱只看不練。在真實(shí)設(shè)備上練當(dāng)然最好但對(duì)沒(méi)設(shè)備的人來(lái)說(shuō)模擬器是目前最好的選擇。目前常用的模擬器有幾種我這里只說(shuō)最適合入門(mén)的一種組合EVE-NG配合Dynamips或者QEMU鏡像以及GNS3。簡(jiǎn)單說(shuō)EVE-NG能跑各種廠商的鏡像GNS3對(duì)新手更友好一些。如果想快速搭建一個(gè)練手環(huán)境我給一個(gè)建議配置筆記本至少8GB內(nèi)存16GB更舒服安裝VMware或者VirtualBox在虛擬機(jī)里跑EVE-NG然后用瀏覽器登錄管理界面添加路由器和交換機(jī)的鏡像。第一次配置的時(shí)候需要把虛擬機(jī)網(wǎng)絡(luò)設(shè)置成橋接模式不然宿主機(jī)訪問(wèn)不了EVE-NG的Web界面。我個(gè)人建議入門(mén)先不要折騰太復(fù)雜的拓?fù)?。一個(gè)簡(jiǎn)單的三路由器串接拓?fù)渚蛪蚰憔氺o態(tài)路由了。三個(gè)路由器R1、R2、R3串成一條線每臺(tái)路由器兩個(gè)接口配好IP地址然后在R1和R3上分別寫(xiě)去往對(duì)端網(wǎng)段的靜態(tài)路由在R2上寫(xiě)兩條靜態(tài)路由分別去往兩端網(wǎng)段。模擬器實(shí)驗(yàn)環(huán)境有個(gè)好處你可以隨便折騰不用交罰款。我當(dāng)年學(xué)靜態(tài)路由的時(shí)候把三臺(tái)路由器互聯(lián)接口的IP配錯(cuò)了好幾次每次都是ping不通然后自己一層層排查最后發(fā)現(xiàn)是子網(wǎng)掩碼寫(xiě)錯(cuò)了。這種錯(cuò)誤在真實(shí)設(shè)備上也會(huì)犯但在模擬器上練熟了到了生產(chǎn)環(huán)境就不慌。3.2 連通性測(cè)試三板斧ping、tracert、arp配置完網(wǎng)絡(luò)要驗(yàn)證能不能通最常用的就三個(gè)命令。第一個(gè)是ping。ping基于ICMP協(xié)議發(fā)送回顯請(qǐng)求目的端回應(yīng)答。能ping通說(shuō)明三層通也就是IP路由這塊兒已經(jīng)通了。但ping不通不代表鏈路完全斷了因?yàn)楹芏嘣O(shè)備默認(rèn)禁ping或者防火墻策略限制ICMP。第二個(gè)是tracert。tracert在Windows下是tracertLinux下是traceroute。它用來(lái)追蹤數(shù)據(jù)包經(jīng)過(guò)的每一跳路由。作用非常大如果兩端ping不通用tracert就能看出數(shù)據(jù)包在哪一跳被丟棄或者沒(méi)有回包基本能定位到問(wèn)題設(shè)備。第三個(gè)是arp -a。Windows下查看本機(jī)ARP緩存表。它能告訴你本機(jī)當(dāng)前已經(jīng)有了哪些IP到MAC的映射。如果和目標(biāo)IP通信過(guò)但ARP表里沒(méi)有對(duì)應(yīng)條目說(shuō)明二層沒(méi)有通信成功。這些命令單獨(dú)看起來(lái)很簡(jiǎn)單組合起來(lái)就是最有效的排錯(cuò)三板斧。我常用的一套排錯(cuò)順序先ping網(wǎng)關(guān)確認(rèn)本機(jī)到網(wǎng)關(guān)的三層連通。通了再ping遠(yuǎn)端IP確認(rèn)跨網(wǎng)段路由。如果不通在網(wǎng)關(guān)設(shè)備上tracert遠(yuǎn)端IP看路由走到哪一跳斷的。然后檢查斷掉那一跳的路由表確認(rèn)有沒(méi)有去往目標(biāo)網(wǎng)段的路由。最后檢查中間設(shè)備的接口狀態(tài)、ACL策略。這套流程能覆蓋80%的基礎(chǔ)網(wǎng)絡(luò)故障。3.3 抓包分析把看不見(jiàn)的數(shù)據(jù)流轉(zhuǎn)成看得見(jiàn)的證據(jù)學(xué)網(wǎng)絡(luò)有個(gè)痛點(diǎn)你配置完了但只看到結(jié)果通不通不知道數(shù)據(jù)是怎么走的。抓包分析能幫你把數(shù)據(jù)流轉(zhuǎn)變成看得見(jiàn)的證據(jù)。Wireshark是抓包工具里最通用的。選擇監(jiān)聽(tīng)的網(wǎng)卡設(shè)置過(guò)濾條件比如ip.addr 192.168.1.10就能看到所有與該IP相關(guān)的數(shù)據(jù)包。抓包能解決什么問(wèn)題舉一個(gè)典型場(chǎng)景arp -d清空緩存后ping一次目的IP在Wireshark里能看到完整的交互流程。先看到ARP廣播請(qǐng)求然后ARP單播回應(yīng)接著是ICMP請(qǐng)求包和回應(yīng)包。如果你發(fā)現(xiàn)只有ARP請(qǐng)求沒(méi)有ARP回應(yīng)說(shuō)明目的主機(jī)根本沒(méi)上線或者二層不通如果你發(fā)現(xiàn)ARP正常但I(xiàn)CMP沒(méi)回應(yīng)說(shuō)明目標(biāo)主機(jī)網(wǎng)絡(luò)層有問(wèn)題或者被防火墻攔了。我當(dāng)年學(xué)TCP三次握手的時(shí)候就是用Wireshark抓包看的。在客戶端訪問(wèn)某個(gè)網(wǎng)站然后在Wireshark里篩選tcp.port 443就能看到SYN、SYNACK、ACK三個(gè)包的完整交互過(guò)程??戳诉@個(gè)流程三次握手徹底理解了比背書(shū)背一百遍都管用。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 “能ping通網(wǎng)關(guān)但ping不通遠(yuǎn)端”——靜態(tài)路由漏配這個(gè)故障其實(shí)在真實(shí)環(huán)境里非常高頻。癥狀很簡(jiǎn)單本機(jī)和網(wǎng)關(guān)通信正常但訪問(wèn)不了其他網(wǎng)段。在排查前先搞清楚一件事數(shù)據(jù)包要到達(dá)遠(yuǎn)端網(wǎng)段每一跳路由器都必須有去往該網(wǎng)段的路由同時(shí)攜帶回程路由信息讓回包能原路返回。排查方法在源設(shè)備上tracert目標(biāo)IP看數(shù)據(jù)包能走到哪一跳。如果到網(wǎng)關(guān)就不動(dòng)了檢查網(wǎng)關(guān)路由表里有沒(méi)有目標(biāo)網(wǎng)段的路由條目如果有但是tracert還是不通檢查下一跳設(shè)備的接口是否up、接口IP是否可以通信。常見(jiàn)原因匯總一下原因表現(xiàn)處理方法中間路由器漏配靜態(tài)路由數(shù)據(jù)包到中間設(shè)備后被丟棄補(bǔ)上目標(biāo)網(wǎng)段的靜態(tài)路由同時(shí)檢查回程路由靜態(tài)路由下一跳寫(xiě)錯(cuò)IP數(shù)據(jù)包被發(fā)到錯(cuò)誤設(shè)備或黑洞核對(duì)直連網(wǎng)段的設(shè)備接口IPACL策略攔截ping請(qǐng)求和回應(yīng)在策略處被丟棄檢查接口inbound/outbound ACL回程路由缺失請(qǐng)求能到回應(yīng)回不來(lái)在對(duì)端設(shè)備上檢查到源網(wǎng)段的路由這里我想強(qiáng)調(diào)一句三個(gè)路由器串接的拓?fù)淅镏虚g路由器往往容易被忽略。因?yàn)樗恢苯舆B著源和目的網(wǎng)段所以你會(huì)下意識(shí)認(rèn)為它不需要路由配置。實(shí)際上從它的視角看它根本不知道該把數(shù)據(jù)包轉(zhuǎn)發(fā)到哪自然就是丟棄。這個(gè)邏輯想通了以后再做多點(diǎn)拓?fù)渚筒粫?huì)漏配置了。4.2 “同網(wǎng)段通信也不通”——二層層面的問(wèn)題排查如果目標(biāo)地址和你處于同一網(wǎng)段ping不通的話問(wèn)題就從三層轉(zhuǎn)移到了二層。排查思路要調(diào)整不再看路由表而是看ARP、看交換機(jī)MAC地址表、看物理接口狀態(tài)。排查步驟先arp -a看看有沒(méi)有目標(biāo)IP的ARP條目。如果沒(méi)有ping一下目標(biāo)主機(jī)然后立刻arp -a再次查看。還是沒(méi)有就需要在交換機(jī)上看MAC地址表了。show mac address-table這個(gè)命令在大多數(shù)交換機(jī)上都能用看目標(biāo)主機(jī)的MAC是否被學(xué)習(xí)到了對(duì)應(yīng)的端口。我遇到過(guò)的最離譜的一個(gè)二層故障是這樣的兩臺(tái)服務(wù)器在同一網(wǎng)段A能通B但B不能通A。查了ARP表B里面有A的條目交換機(jī)上兩個(gè)MAC都在表里端口也對(duì)。最后發(fā)現(xiàn)是B的網(wǎng)卡驅(qū)動(dòng)和交換機(jī)端口的協(xié)商異常導(dǎo)致的鏈路雖然up但是丟包極嚴(yán)重ping一下丟一下。這種故障的排查難點(diǎn)在于物理層看起來(lái)正常實(shí)際性能極差只有持續(xù)ping一段時(shí)候觀察丟包率才能定位。二層還有一個(gè)隱藏問(wèn)題是VLAN劃分。如果交換機(jī)上兩個(gè)端口劃分在不同VLAN即使它們?cè)谕慌_(tái)交換機(jī)上它們之間也無(wú)法二層通信。很多網(wǎng)絡(luò)排錯(cuò)最后發(fā)現(xiàn)只是某個(gè)端口被不小心劃進(jìn)了錯(cuò)誤的VLAN這種錯(cuò)誤在配置時(shí)最為隱蔽因?yàn)闆](méi)有任何報(bào)錯(cuò)。4.3 排除防火墻的干擾在我們開(kāi)始練習(xí)和排查的時(shí)候請(qǐng)先把所有設(shè)備上的防火墻關(guān)閉。這聽(tīng)起來(lái)像是逃避問(wèn)題但實(shí)際上這是一種驗(yàn)證策略。防火墻策略一定程度上的確會(huì)造成很多干擾先關(guān)掉防火墻完成網(wǎng)絡(luò)連通性驗(yàn)證再針對(duì)性地開(kāi)啟防火墻并配置策略比一開(kāi)始開(kāi)著防火墻邊通邊斷地排查要高效得多。具體做法在Windows上你可以用netsh advfirewall set allprofiles state off命令臨時(shí)關(guān)閉在Linux上systemctl stop firewalld。模擬器里的路由器如果需要設(shè)置防火墻就先暫時(shí)不啟用。等網(wǎng)絡(luò)通暢了再開(kāi)啟防火墻逐漸增加放行規(guī)則這樣定位故障范圍會(huì)更精確。我在給某公司的網(wǎng)絡(luò)排錯(cuò)時(shí)候發(fā)現(xiàn)應(yīng)用一直訪問(wèn)不了所有網(wǎng)絡(luò)配置檢查過(guò)都沒(méi)問(wèn)題最后檢查到主機(jī)防火墻有一條規(guī)則限制了某個(gè)端口的訪問(wèn)。當(dāng)時(shí)如果先關(guān)了防火墻測(cè)試也許幾分鐘就能定位問(wèn)題不至于折騰了大半天。4.4 一個(gè)完整的故障模擬過(guò)程我把一個(gè)經(jīng)典的C類網(wǎng)絡(luò)三層互通故障模擬過(guò)程完整寫(xiě)出來(lái)你可以照著做一遍流量分析的能力會(huì)大幅提升。拓?fù)浣Y(jié)構(gòu)PC1192.168.1.10/24網(wǎng)關(guān)192.168.1.1連接到交換機(jī)SW1SW1接到路由器R1的G0/0口192.168.1.1/24。R1的G0/1口10.0.12.1/24連接R2的G0/1口10.0.12.2/24。R2的G0/0口192.168.2.1/24連接SW2SW2連接PC2192.168.2.10/24網(wǎng)關(guān)192.168.2.1。預(yù)期結(jié)果PC1可以ping通PC2。步驟一PC1 ping PC2觀察結(jié)果。如果不同先ping網(wǎng)關(guān)192.168.1.1如果通說(shuō)明PC1到R1這一段沒(méi)問(wèn)題。步驟二在PC1上tracert 192.168.2.10。如果顯示第一跳是192.168.1.1但沒(méi)有第二跳說(shuō)明R1把數(shù)據(jù)包交給R2就有問(wèn)題。檢查R1的路由表看看有沒(méi)有去往192.168.2.0/24的路由。步驟三如果沒(méi)有路由在R1上配置ip route 192.168.2.0 255.255.255.0 10.0.12.2。再次ping此時(shí)應(yīng)該通了。如果還不通檢查R2的路由表看看有沒(méi)有去往192.168.1.0/24的回程路由。如果沒(méi)有R2收到來(lái)自PC1的數(shù)據(jù)包時(shí)可以直接回應(yīng)源IP所在網(wǎng)段但它沒(méi)有去往該網(wǎng)段的路由會(huì)把回包丟棄。步驟四在R2上配置ip route 192.168.1.0 255.255.255.0 10.0.12.1。再ping應(yīng)該通。如果還不通開(kāi)始抓包。在R2的G0/0接口上抓包看請(qǐng)求包是否到達(dá)R2回包是否從R2發(fā)出這樣能逐層確認(rèn)問(wèn)題范圍。這個(gè)模擬過(guò)程做完你會(huì)對(duì)“有去有回”這個(gè)原則有很深的體感。很多網(wǎng)絡(luò)問(wèn)題不是配置復(fù)雜而是回程路由被忽略或者中間的設(shè)備默認(rèn)丟棄了非直連的數(shù)據(jù)包。5. 數(shù)通后續(xù)學(xué)習(xí)路徑與實(shí)用建議5.1 基礎(chǔ)打好之后往哪個(gè)方向深入數(shù)據(jù)通信網(wǎng)絡(luò)基礎(chǔ)入門(mén)后一般有兩個(gè)大方向可以選。一個(gè)是傳統(tǒng)路由交換方向深入學(xué)OSPF、BGP、VLAN、STP這些協(xié)議走數(shù)通工程師路線另一個(gè)是往數(shù)據(jù)中心網(wǎng)絡(luò)、SDN方向發(fā)展學(xué)VXLAN、OpenFlow這些偏自動(dòng)化和虛擬化的技術(shù)。我個(gè)人覺(jué)得不管未來(lái)哪個(gè)方向路由交換的基礎(chǔ)都得扎實(shí)。OSPF和BGP這些動(dòng)態(tài)路由協(xié)議本質(zhì)上就是把前面我們說(shuō)的靜態(tài)路由這一套邏輯變成路由器之間自動(dòng)協(xié)商和學(xué)習(xí)。你如果連靜態(tài)路由時(shí)“有去有回”的原則都沒(méi)搞明白學(xué)OSPF就會(huì)遇到很多困擾。基礎(chǔ)階段我建議按這個(gè)順序?qū)WIP地址規(guī)劃包括VLSM和CIDR→ 交換基礎(chǔ)VLAN、STP→路由基礎(chǔ)靜態(tài)、默認(rèn)路由→動(dòng)態(tài)路由OSPF→廣域網(wǎng)技術(shù)NAT、ACL、DHCP→IPv6基礎(chǔ)。每一步都在前面基礎(chǔ)上疊房子不要跳。5.2 學(xué)習(xí)過(guò)程中容易被忽視的細(xì)節(jié)很多人在配置IP地址的時(shí)候只關(guān)心能不能通不關(guān)心IP地址規(guī)劃是否合理。在網(wǎng)絡(luò)規(guī)模小的時(shí)候沒(méi)問(wèn)題但到了生產(chǎn)環(huán)境IP地址亂規(guī)劃會(huì)導(dǎo)致路由表混亂、ACL難寫(xiě)、故障難排查。我見(jiàn)過(guò)一個(gè)項(xiàng)目IP地址規(guī)劃完全沒(méi)有規(guī)律同一業(yè)務(wù)分散在不同網(wǎng)段排查一次故障要從頭開(kāi)始梳理業(yè)務(wù)流。剛學(xué)習(xí)階段就養(yǎng)成“先規(guī)劃再配置”的習(xí)慣受益終身。還有一點(diǎn)是文檔記錄。我每次做實(shí)驗(yàn)都會(huì)記一張表設(shè)備名、接口IP、掩碼、網(wǎng)關(guān)、VLAN、所屬網(wǎng)段。這張表看著簡(jiǎn)單但在排錯(cuò)時(shí)特別重要。你有了這張表就知道哪個(gè)網(wǎng)段在哪臺(tái)設(shè)備上路由從哪里繞。沒(méi)有這張表排查問(wèn)題就像在迷宮里亂走。5.3 學(xué)習(xí)時(shí)的幾個(gè)有效策略我自己的一個(gè)親身經(jīng)歷現(xiàn)在回過(guò)頭來(lái)看學(xué)網(wǎng)絡(luò)最有效的策略是邊學(xué)邊練邊練邊記錄。單純看書(shū)上說(shuō)的路由是怎么轉(zhuǎn)發(fā)、VLAN是怎么隔離的很難形成真實(shí)的網(wǎng)絡(luò)感。但只要自己動(dòng)手配了一遍三臺(tái)路由器互通再模擬一次路由環(huán)路那些概念就會(huì)變成身體記憶。模擬器是成本最低的學(xué)習(xí)路徑。用EVE-NG或者GNS3模擬一套企業(yè)級(jí)網(wǎng)絡(luò)從接入交換機(jī)到核心路由器自己動(dòng)手搭、配、測(cè)、排錯(cuò)哪怕把網(wǎng)絡(luò)搞癱一百次也沒(méi)關(guān)系。我甚至建議初學(xué)者故意弄壞網(wǎng)絡(luò)比如把靜態(tài)路由的下一跳寫(xiě)錯(cuò)或者把OSPF的區(qū)域號(hào)寫(xiě)錯(cuò)然后嘗試自己診斷并修復(fù)。這個(gè)過(guò)程遠(yuǎn)比只做正確的實(shí)驗(yàn)更能鍛煉能力。最后再說(shuō)幾句數(shù)據(jù)通信網(wǎng)絡(luò)基礎(chǔ)不是什么高深莫測(cè)的學(xué)問(wèn)它的核心邏輯就幾條分層各司其職、IP尋址、路由轉(zhuǎn)發(fā)、二層交換。把這些底層邏輯串成一條線再去看具體的協(xié)議和設(shè)備配置就會(huì)自然很多。我踩過(guò)最多的坑集中在路由的回程路徑上。很多時(shí)候問(wèn)題不在入口而在出口。排查的時(shí)候先畫(huà)一張物理拓?fù)浜鸵粡堖壿嬐負(fù)浒衙總€(gè)網(wǎng)段、每臺(tái)設(shè)備、每條路由都標(biāo)出來(lái)思路會(huì)清醒很多。做這行的樂(lè)趣也正在這里數(shù)據(jù)是一個(gè)比特一個(gè)比特地被正確轉(zhuǎn)發(fā)的每一跳走對(duì)最終整個(gè)網(wǎng)絡(luò)才轉(zhuǎn)得起來(lái)。