議到網(wǎng)絡(luò)故障排查實戰(zhàn))
1. 項目概述從一次網(wǎng)絡(luò)故障排查說起前幾天一個剛?cè)胄械耐略诓渴鹦路?wù)時遇到了一個經(jīng)典問題他配置的服務(wù)器無法訪問外網(wǎng)但能訪問內(nèi)網(wǎng)其他機(jī)器。他急得團(tuán)團(tuán)轉(zhuǎn)我過去看了一眼只敲了一行命令ping 8.8.8.8。屏幕上立刻返回了Request timed out。我告訴他“問題出在網(wǎng)關(guān)或者防火墻策略上先檢查網(wǎng)關(guān)路由和出站規(guī)則?!?他一臉驚訝“一個ping命令就能看出來” 這讓我意識到雖然ping是網(wǎng)絡(luò)工程師和運維人員每天敲無數(shù)遍的命令但很多人對它背后的故事知之甚少僅僅把它當(dāng)作一個“通不通”的指示燈。ping命令這個源于聲納探測回聲的命名實際上是互聯(lián)網(wǎng)世界最基礎(chǔ)、最強(qiáng)大的診斷工具之一。它絕不僅僅是告訴你目標(biāo)主機(jī)是否“活著”。通過分析它的往返時間RTT、丟包率、TTL值你可以診斷出網(wǎng)絡(luò)延遲、路由路徑、中間節(jié)點狀態(tài)乃至防火墻配置等一系列深層問題。比如當(dāng)你遇到“虛擬機(jī)ping不通百度”或者“宿主機(jī) ping 不通虛擬機(jī)”時盲目地重啟網(wǎng)絡(luò)服務(wù)往往徒勞無功理解ping的工作過程才能像偵探一樣從Request timed out、Destination Host Unreachable或TTL expired in transit這些不同的錯誤信息中精準(zhǔn)定位故障環(huán)節(jié)——是本地配置錯誤、網(wǎng)關(guān)路由缺失、中間路由器丟棄還是目標(biāo)主機(jī)防火墻阻攔本次詳解將徹底拆解ping命令的完整生命周期。我們將從你按下回車鍵的那一刻開始跟蹤一個ICMP回顯請求報文如何穿越協(xié)議棧、網(wǎng)卡、交換機(jī)、路由器最終到達(dá)目標(biāo)并帶著應(yīng)答返回的完整旅程。我們會結(jié)合諸如“[gxyctf2019]ping ping ping”這類CTF題目中出現(xiàn)的命令注入場景分析其安全邊界也會解釋為什么“開啟代理后cmd里的ping還是不通”因為代理通常工作在應(yīng)用層而ping基于網(wǎng)絡(luò)層的ICMP。無論你是正在備考“計算機(jī)網(wǎng)絡(luò)期末復(fù)習(xí)”的學(xué)生還是被“網(wǎng)絡(luò)可能有問題”提示困擾的運維新手或是好奇“icmp unreachable attack”原理的安全愛好者這篇深入原理的詳解都將為你提供一張清晰的網(wǎng)絡(luò)診斷地圖。2. 核心原理ICMP協(xié)議與報文格式深度解析要理解ping必須先理解它賴以生存的土壤——ICMPInternet Control Message Protocol互聯(lián)網(wǎng)控制報文協(xié)議。很多人誤以為ping使用的是TCP或UDP其實不然。ICMP是TCP/IP協(xié)議簇中網(wǎng)絡(luò)層第三層的一個核心組成部分它的主要職責(zé)是傳遞控制信息和錯誤報告而不是傳輸用戶數(shù)據(jù)。你可以把它想象成網(wǎng)絡(luò)世界的“交通廣播”和“故障報警系統(tǒng)”。當(dāng)IP數(shù)據(jù)報在傳輸過程中遇到問題比如目標(biāo)不可達(dá)、生存時間超時或者網(wǎng)絡(luò)擁堵需要源站放慢發(fā)送速度時路由器或主機(jī)會生成ICMP報文發(fā)送回源設(shè)備報告這些情況。2.1 ICMP報文格式簡潔而高效的設(shè)計ICMP報文被封裝在IP數(shù)據(jù)報的數(shù)據(jù)部分進(jìn)行傳輸。這意味著一個ICMP報文外面會套著一個IP頭。這是理解很多網(wǎng)絡(luò)現(xiàn)象的關(guān)鍵。一個完整的ICMP報文格式如下0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -------------------------------- | 類型(Type) | 代碼(Code) | 校驗和(Checksum) | -------------------------------- | 標(biāo)識符(Identifier) | 序列號(Sequence) | -------------------------------- | 數(shù)據(jù)(Data) | --------------------------------類型 (Type, 8位) 和 代碼 (Code, 8位)這兩個字段共同定義了ICMP報文的種類和子類。這是ICMP報文的“身份證”。例如Type8, Code0表示Echo Request回顯請求這就是ping命令發(fā)送的報文。Type0, Code0表示Echo Reply回顯應(yīng)答這是目標(biāo)主機(jī)對ping的回復(fù)。Type3表示Destination Unreachable目標(biāo)不可達(dá)下面有多個代碼值如Code0網(wǎng)絡(luò)不可達(dá)、Code1主機(jī)不可達(dá)、Code3端口不可達(dá)注意這是UDP或TCP的問題由主機(jī)用ICMP反饋。Type11, Code0表示Time Exceeded超時即TTL減到0這正是traceroute命令利用的原理。校驗和 (Checksum, 16位)用于檢驗ICMP報文從類型字段開始到數(shù)據(jù)結(jié)束在傳輸過程中是否出錯。這是一個簡單的錯誤檢測機(jī)制。標(biāo)識符 (Identifier, 16位) 和 序列號 (Sequence, 16位)這兩個字段主要用于匹配請求和應(yīng)答。ping命令在發(fā)送請求時會設(shè)置一個標(biāo)識符通常是進(jìn)程ID并為每個發(fā)出的請求包分配一個遞增的序列號。當(dāng)收到應(yīng)答時通過比對標(biāo)識符和序列號就能確定這個應(yīng)答對應(yīng)的是哪一個請求。這對于計算精確的RTT和統(tǒng)計丟包至關(guān)重要。數(shù)據(jù) (Data, 可變長)在Echo Request/Reply報文中這部分包含的是要回顯的數(shù)據(jù)。ping命令默認(rèn)會發(fā)送一個包含時間戳的數(shù)據(jù)包數(shù)據(jù)長度可以指定如-l參數(shù)。應(yīng)答方會原封不動地將這部分?jǐn)?shù)據(jù)拷貝到Echo Reply報文中返回。注意ICMP報文是封裝在IP數(shù)據(jù)報中的。因此當(dāng)你用tcpdump或 Wireshark 抓包分析ping流量時你會看到兩層封裝外層是IP頭包含源IP、目標(biāo)IP、TTL等內(nèi)層才是ICMP頭和數(shù)據(jù)。理解這種封裝關(guān)系對于分析“帶源地址ping”或防火墻規(guī)則配置非常關(guān)鍵。2.2 Ping 如何利用ICMP一問一答的對話ping命令的核心邏輯就是利用ICMP的Echo Request和Echo Reply類型實現(xiàn)一個簡單的“詢問-應(yīng)答”模型源主機(jī)構(gòu)造一個ICMP Echo Request報文類型為8代碼為0填充標(biāo)識符、序列號和可選數(shù)據(jù)。將該ICMP報文封裝進(jìn)一個IP數(shù)據(jù)報設(shè)置目標(biāo)IP地址然后發(fā)送出去。目標(biāo)主機(jī)收到這個IP數(shù)據(jù)報后網(wǎng)絡(luò)層解析出其中的ICMP報文。如果主機(jī)愿意響應(yīng)且沒有被防火墻阻止它會構(gòu)造一個ICMP Echo Reply報文類型為0代碼為0。這個Reply報文會將Request報文中的標(biāo)識符、序列號和全部數(shù)據(jù)原樣拷貝過來。目標(biāo)主機(jī)將這個Reply報文封裝進(jìn)一個新的IP數(shù)據(jù)報源IP和目標(biāo)IP對調(diào)發(fā)回給源主機(jī)。源主機(jī)收到Reply根據(jù)標(biāo)識符和序列號匹配到之前發(fā)出的Request從而計算出發(fā)送和接收的時間差即往返時間RTT。這個過程清晰解釋了為什么ping不依賴于TCP/UDP端口。它工作在更底層的網(wǎng)絡(luò)層只要IP路由可達(dá)且中間設(shè)備和目標(biāo)主機(jī)不阻止ICMP Echo報文通信就能完成。這也解釋了“開啟代理后cmd里的ping還是不通”的現(xiàn)象HTTP/SOCKS代理通常攔截的是應(yīng)用層如HTTP、HTTPS的流量對于網(wǎng)絡(luò)層的ICMP報文是“看不見”也“管不著”的ping走的是直接的路由路徑不經(jīng)過代理服務(wù)器。3. Ping 命令執(zhí)行過程的逐層拆解現(xiàn)在讓我們扮演一個ICMP Echo Request報文親身體驗一次從源主機(jī)到目標(biāo)主機(jī)的完整冒險。這個過程涉及操作系統(tǒng)協(xié)議棧、網(wǎng)卡驅(qū)動、ARP協(xié)議、路由表、多個網(wǎng)絡(luò)設(shè)備等。3.1 階段一用戶輸入與協(xié)議棧處理當(dāng)你在命令行輸入ping www.baidu.com并按下回車后域名解析操作系統(tǒng)首先檢查目標(biāo)是否為域名。如果是它會調(diào)用解析器Resolver進(jìn)行DNS查詢將www.baidu.com轉(zhuǎn)換為一個或多個IP地址例如110.242.68.4。如果DNS解析失敗你會立刻看到ping: cannot resolve www.baidu.com: Unknown host的錯誤。這也是排查“ping不通”時的第一步先ping IP地址如果能通但ping 域名不通問題大概率出在DNS。創(chuàng)建原始套接字ping程序會創(chuàng)建一個原始套接字 (Raw Socket)。與TCP/UDP套接字不同原始套接字允許程序直接讀寫內(nèi)核網(wǎng)絡(luò)層的數(shù)據(jù)包這里是IP數(shù)據(jù)報并自行構(gòu)造IP頭之后的協(xié)議頭這里是ICMP頭。這賦予了ping直接操作網(wǎng)絡(luò)層協(xié)議的能力。構(gòu)造ICMP Echo Request程序在用戶空間填充一個ICMP報文結(jié)構(gòu)體設(shè)置類型為8代碼為0計算校驗和生成一個標(biāo)識符通常是進(jìn)程ID初始化序列號比如從0開始并填充數(shù)據(jù)區(qū)默認(rèn)通常包含發(fā)送時間戳。下發(fā)至內(nèi)核程序通過sendto()系統(tǒng)調(diào)用將這個構(gòu)造好的ICMP報文緩沖區(qū)傳遞給內(nèi)核的網(wǎng)絡(luò)協(xié)議棧。3.2 階段二內(nèi)核網(wǎng)絡(luò)層處理與路由抉擇報文進(jìn)入內(nèi)核后真正的網(wǎng)絡(luò)之旅開始IP封裝內(nèi)核的網(wǎng)絡(luò)層IP層收到這個ICMP報文作為載荷會為其添加一個IP頭部。這個IP頭包含了源IP地址本機(jī)出口網(wǎng)卡的IP地址。目的IP地址DNS解析得到的IP地址。協(xié)議字段 (Protocol)設(shè)置為1代表載荷是ICMP協(xié)議。生存時間 (TTL)一個關(guān)鍵字段。初始值通常為64Windows或255Linux/Unix。每經(jīng)過一個路由器TTL值減1。當(dāng)TTL減為0時路由器會丟棄該數(shù)據(jù)包并向源頭發(fā)送一個ICMP Time Exceeded報文。traceroute命令就是利用這個機(jī)制來探測路徑。路由查詢內(nèi)核需要決定這個IP包從哪個網(wǎng)卡發(fā)出去。它查詢路由表 (Routing Table)。執(zhí)行route printWindows或ip route showLinux可以查看。路由表查詢遵循最長前綴匹配原則。簡單來說內(nèi)核會問目標(biāo)IP是否在同一子網(wǎng)根據(jù)本機(jī)IP和子網(wǎng)掩碼計算如果是則直接通過ARP獲取目標(biāo)MAC地址從對應(yīng)網(wǎng)卡發(fā)出二層轉(zhuǎn)發(fā)。如果不是則查找路由表中是否有匹配目標(biāo)網(wǎng)絡(luò)的路由條目。通常會有一條默認(rèn)網(wǎng)關(guān) (Default Gateway)路由目標(biāo)為0.0.0.0/0。內(nèi)核會將數(shù)據(jù)包發(fā)往網(wǎng)關(guān)的IP地址。如果路由表中沒有匹配項也沒有默認(rèn)網(wǎng)關(guān)內(nèi)核會生成一個ICMP Destination Unreachable (Network Unreachable)錯誤。ARP解析確定了下一跳的IP地址要么是目標(biāo)主機(jī)本身要么是網(wǎng)關(guān)后內(nèi)核需要知道其對應(yīng)的MAC物理地址因為數(shù)據(jù)鏈路層如以太網(wǎng)通信依賴MAC地址。內(nèi)核會檢查本機(jī)的ARP緩存表。如果找到了對應(yīng)的IP-MAC映射則進(jìn)入下一步。如果沒找到內(nèi)核會廣播一個ARP請求報文詢問“誰的IP是X.X.X.X請告訴我的MAC地址”。收到ARP應(yīng)答后內(nèi)核會更新ARP緩存并將MAC地址填入即將發(fā)送的幀中。3.3 階段三數(shù)據(jù)鏈路層封裝與物理傳輸幀封裝網(wǎng)絡(luò)層將IP數(shù)據(jù)包包含IP頭和ICMP載荷交給數(shù)據(jù)鏈路層如以太網(wǎng)驅(qū)動。數(shù)據(jù)鏈路層為其加上幀頭和幀尾幀頭包含目標(biāo)MAC地址從ARP獲得、源MAC地址本機(jī)網(wǎng)卡地址和類型字段對于IPv4通常是0x0800。幀尾通常是幀校驗序列FCS用于檢測傳輸錯誤。物理發(fā)送驅(qū)動程序?qū)⑦@個完整的以太網(wǎng)幀提交給網(wǎng)卡。網(wǎng)卡將其轉(zhuǎn)換為電信號或光信號通過網(wǎng)線或無線電磁波發(fā)送出去。3.4 階段四網(wǎng)絡(luò)路徑中的躍點與轉(zhuǎn)發(fā)數(shù)據(jù)包離開源主機(jī)后可能經(jīng)過多個網(wǎng)絡(luò)設(shè)備交換機(jī) (Switch)工作在數(shù)據(jù)鏈路層二層。它根據(jù)目標(biāo)MAC地址進(jìn)行轉(zhuǎn)發(fā)。如果目標(biāo)MAC是廣播地址或它學(xué)習(xí)到的某個端口對應(yīng)的MAC地址它會將幀從相應(yīng)端口轉(zhuǎn)發(fā)出去如果MAC地址未知則泛洪到所有端口除了接收端口。交換機(jī)不修改IP頭和TTL。路由器 (Router)工作在網(wǎng)絡(luò)層三層。它是ping過程的關(guān)鍵參與者。路由器收到幀后檢查幀校驗和無誤則剝離幀頭和幀尾得到IP數(shù)據(jù)包。檢查IP頭校驗和并將TTL值減1。如果TTL減1后為0路由器丟棄該包并向源IP發(fā)送一個ICMP Time Exceeded (Type 11)報文。這就是traceroute的工作原理。如果TTL大于0路由器查詢自己的路由表決定這個包應(yīng)該從哪個接口發(fā)往下一個躍點Next Hop。對新的出口接口執(zhí)行類似源主機(jī)的過程通過ARP獲取下一跳IP的MAC地址重新進(jìn)行數(shù)據(jù)鏈路層封裝新的源/目標(biāo)MAC地址然后發(fā)送出去。這個“解封裝-路由決策-再封裝”的過程在每個路由器上重復(fù)直到數(shù)據(jù)包到達(dá)目標(biāo)網(wǎng)絡(luò)。3.5 階段五目標(biāo)主機(jī)的接收與響應(yīng)當(dāng)數(shù)據(jù)包最終到達(dá)目標(biāo)主機(jī)所在的局域網(wǎng)網(wǎng)卡接收與校驗?zāi)繕?biāo)主機(jī)的網(wǎng)卡接收到物理信號將其轉(zhuǎn)換回數(shù)據(jù)幀檢查幀校驗和FCS。如果錯誤幀被靜默丟棄。MAC地址過濾網(wǎng)卡驅(qū)動檢查幀的目標(biāo)MAC地址。如果是廣播地址、組播地址或與本機(jī)MAC地址匹配則接收該幀否則丟棄。協(xié)議分發(fā)驅(qū)動剝離幀頭和幀尾將IP數(shù)據(jù)包傳遞給內(nèi)核的網(wǎng)絡(luò)層。IP層處理網(wǎng)絡(luò)層檢查IP頭校驗和是否正確。目標(biāo)IP地址是否匹配本機(jī)的某個IP地址。如果不匹配且本機(jī)未開啟IP轉(zhuǎn)發(fā)則丟棄。如果匹配則根據(jù)IP頭的“協(xié)議”字段值為1將載荷ICMP報文傳遞給ICMP協(xié)議處理模塊。ICMP模塊處理ICMP模塊檢查報文校驗和是否正確。類型是否為Echo Request (8)。如果本機(jī)配置了防火墻會檢查是否允許ICMP Echo Request進(jìn)入。如果被拒絕報文會被靜默丟棄無響應(yīng)或者根據(jù)防火墻規(guī)則返回一個管理性禁止的ICMP報文較少見。構(gòu)造并發(fā)送 Echo Reply如果允許響應(yīng)ICMP模塊會交換IP頭中的源IP和目標(biāo)IP。將ICMP類型從8(Request) 改為0(Reply)。關(guān)鍵一步將收到的ICMP Request報文中的標(biāo)識符、序列號和所有數(shù)據(jù)原封不動地拷貝到Reply報文中。重新計算ICMP校驗和。然后將這個新的ICMP Reply報文遞交給IP層IP層為其添加新的IP頭源IP是目標(biāo)主機(jī)目的IP是請求來源主機(jī)TTL通常設(shè)置為一個默認(rèn)值如64然后查詢路由表開始一個反向的發(fā)送過程將應(yīng)答包送回源主機(jī)。3.6 階段六源主機(jī)接收應(yīng)答與結(jié)果展示應(yīng)答包沿著網(wǎng)絡(luò)路徑返回源主機(jī)過程與發(fā)送請求類似但方向相反。源主機(jī)的ping程序通過原始套接字接收到內(nèi)核上傳的ICMP Echo Reply報文后會匹配請求根據(jù)Reply中的標(biāo)識符和序列號找到之前發(fā)出的、尚未收到應(yīng)答的對應(yīng)請求。計算RTT用當(dāng)前時間減去該請求的發(fā)送時間戳得到往返時間RTT。這就是ping結(jié)果中timexx ms的由來。統(tǒng)計信息更新統(tǒng)計信息包括已發(fā)送包數(shù)、已接收包數(shù)、丟失包數(shù)、最小/平均/最大RTT。輸出結(jié)果在終端上顯示這一跳的詳細(xì)信息包括字節(jié)數(shù)、RTT和TTL值從Reply的IP頭中獲取。當(dāng)用戶中斷ping如按CtrlC或達(dá)到指定次數(shù)后程序會輸出最終的統(tǒng)計摘要包括丟包率。丟包率多少算正常在穩(wěn)定的內(nèi)網(wǎng)中丟包率應(yīng)為0%。在復(fù)雜的公網(wǎng)環(huán)境中偶爾1%-2%的丟包可能屬于正常波動但持續(xù)高于5%通常意味著網(wǎng)絡(luò)存在不穩(wěn)定因素需要結(jié)合traceroute進(jìn)一步排查。4. 高級用法、參數(shù)解讀與實戰(zhàn)場景掌握了基本原理我們來看看ping命令豐富的參數(shù)和它們在實戰(zhàn)中的應(yīng)用。不同操作系統(tǒng)Windows, Linux, macOS的ping參數(shù)略有差異但核心功能相通。4.1 常用參數(shù)詳解與場景-c/-n(指定次數(shù))Linux:ping -c 4 8.8.8.8發(fā)送4個包后停止。Windows:ping -n 4 8.8.8.8同上。場景自動化腳本中檢查連通性避免無限ping下去。-i/-t(間隔時間)Linux:ping -i 2 8.8.8.8每2秒發(fā)送一個包。Windows:ping -t 8.8.8.8持續(xù)ping直到手動停止CtrlBreak查看統(tǒng)計CtrlC停止。Windows沒有直接的間隔參數(shù)但可以通過批處理模擬。場景-t用于長時間監(jiān)控網(wǎng)絡(luò)穩(wěn)定性觀察RTT和丟包率的變化趨勢。-s/-l(指定數(shù)據(jù)包大小)Linux:ping -s 1472 8.8.8.8指定發(fā)送1472字節(jié)的ICMP數(shù)據(jù)加上8字節(jié)ICMP頭和20字節(jié)IP頭總大小為1500字節(jié)是以太網(wǎng)標(biāo)準(zhǔn)MTU。Windows:ping -l 1472 8.8.8.8同上。場景診斷MTU最大傳輸單元問題。如果你ping小包正常但ping大包如-l 1500出現(xiàn)“需要拆分但設(shè)置DF位”的錯誤或丟包說明路徑上存在MTU小于你數(shù)據(jù)包尺寸的鏈路需要調(diào)整MTU或啟用路徑MTU發(fā)現(xiàn)PMTUD。-W/-w(超時時間)Linux:ping -W 5 8.8.8.8等待每個回復(fù)的超時時間為5秒。Windows:ping -w 5000 8.8.8.8超時時間為5000毫秒5秒。場景在網(wǎng)絡(luò)延遲較大的環(huán)境如跨國鏈路增加超時時間以避免誤判為超時。-I/-S(指定源接口或源IP)Linux:ping -I eth0 8.8.8.8或ping -I 192.168.1.100 8.8.8.8。Windows: 較復(fù)雜通常用ping -S 192.168.1.100 8.8.8.8但需要權(quán)限且依賴路由。場景服務(wù)器有多個網(wǎng)卡多宿主時測試從特定網(wǎng)卡或IP地址出去的連通性。這也是“帶源地址ping”的典型用法用于測試策略路由或防火墻規(guī)則是否對特定源IP放行。-t(設(shè)置TTL)Linux:ping -t 1 8.8.8.8將發(fā)出的ICMP包的TTL設(shè)置為1。Windows:ping -i 1 8.8.8.8注意Windows用-i設(shè)置TTL而Linux的-i是間隔。場景手動模擬traceroute的第一跳驗證本地網(wǎng)關(guān)是否可達(dá)。4.2 實戰(zhàn)診斷案例集錦結(jié)合常見問題我們看看如何用ping及其變種進(jìn)行診斷案例一虛擬機(jī)ping不通百度但宿主機(jī)可以第一步在虛擬機(jī)內(nèi)ping 127.0.0.1。通說明虛擬機(jī)TCP/IP協(xié)議棧正常。第二步ping 虛擬機(jī)自身的IP如192.168.xx.xx。通說明虛擬網(wǎng)卡驅(qū)動和IP配置基本正常。第三步ping 虛擬網(wǎng)絡(luò)的網(wǎng)關(guān)IP在VMware/VirtualBox的網(wǎng)絡(luò)設(shè)置中查看通常是192.168.xx.1或192.168.xx.2。如果不通問題在虛擬機(jī)網(wǎng)絡(luò)連接模式NAT/橋接配置或宿主機(jī)的虛擬網(wǎng)絡(luò)服務(wù)上。檢查虛擬機(jī)網(wǎng)絡(luò)適配器設(shè)置是否為“橋接模式”或“NAT模式”并確保相關(guān)服務(wù)如VMware NAT Service已啟動。如果通繼續(xù)。第四步ping 宿主機(jī)物理網(wǎng)卡的IP。如果不通在橋接模式下常見可能是宿主機(jī)的防火墻阻止了虛擬機(jī)網(wǎng)段的訪問或者物理網(wǎng)絡(luò)交換機(jī)端口安全限制。暫時關(guān)閉宿主機(jī)防火墻測試。第五步ping 一個外網(wǎng)IP如8.8.8.8。如果不通但網(wǎng)關(guān)能通問題出在虛擬機(jī)的默認(rèn)網(wǎng)關(guān)或DNS設(shè)置錯誤或者宿主機(jī)本身就無法上網(wǎng)NAT模式下依賴宿主機(jī)網(wǎng)絡(luò)。檢查虛擬機(jī)內(nèi)的路由表 (route print或ip route) 和DNS設(shè)置。如果通但ping www.baidu.com不通問題就是DNS解析失敗。在虛擬機(jī)內(nèi)配置正確的DNS服務(wù)器地址如8.8.8.8。案例二ping顯示“請求超時 (Request timed out)”這是最常見的錯誤。意味著在指定的超時時間內(nèi)默認(rèn)Windows約4秒Linux約10秒沒有收到Echo Reply。可能的原因有目標(biāo)主機(jī)離線或關(guān)機(jī)。目標(biāo)主機(jī)防火墻阻止了ICMP Echo RequestWindows防火墻默認(rèn)有時會阻止入站Ping。中間路由器或防火墻丟棄了ICMP報文很多企業(yè)網(wǎng)絡(luò)或云服務(wù)商會過濾ICMP。路由問題沒有通往目標(biāo)網(wǎng)絡(luò)的路由或者有去無回非對稱路由。嚴(yán)重的網(wǎng)絡(luò)擁塞或鏈路故障導(dǎo)致包丟失。診斷思路結(jié)合tracerouteWindows是tracert命令。traceroute 目標(biāo)IP可以顯示包到達(dá)目標(biāo)所經(jīng)過的每一跳。如果traceroute在某一跳之后就沒有響應(yīng)了那么問題很可能就出在那臺設(shè)備或之后的鏈路上。案例三ping顯示“目標(biāo)主機(jī)無法訪問 (Destination Host Unreachable)這個錯誤通常來自你的本地主機(jī)或默認(rèn)網(wǎng)關(guān)而不是遠(yuǎn)端。它意味著你的主機(jī)知道無法將數(shù)據(jù)包送達(dá)目的地。“Destination Host Unreachable”通常表示本地ARP解析失敗。例如你ping同一個子網(wǎng)內(nèi)的主機(jī)但ARP請求沒有得到響應(yīng)。檢查目標(biāo)主機(jī)是否在線、是否在同一子網(wǎng)、本地ARP緩存 (arp -a)。“Destination Net Unreachable”表示本地路由表中沒有到達(dá)目標(biāo)網(wǎng)絡(luò)的路由條目。檢查路由表確認(rèn)默認(rèn)網(wǎng)關(guān)配置是否正確。案例四如何“加端口”ping這是一個常見的誤解。ping使用ICMP協(xié)議沒有端口的概念。端口是傳輸層TCP/UDP的尋址方式。當(dāng)你需要測試特定端口的連通性時應(yīng)該使用其他工具TCP端口使用telnet IP地址 端口號如telnet 192.168.1.1 80或更專業(yè)的nc -zv IP地址 端口號。UDP端口使用nc -uzv IP地址 端口號但UDP無連接測試不一定準(zhǔn)確。HTTP/HTTPS服務(wù)使用curl -I http://IP地址或瀏覽器直接訪問。5. 安全考量、常見陷阱與深度問答5.1 Ping的安全隱患與攻擊面ping雖然簡單但也曾引發(fā)安全事件如CVE-1999-0524與早期ping實現(xiàn)有關(guān)。主要風(fēng)險包括ICMP Flood攻擊攻擊者偽造大量源IP向目標(biāo)發(fā)送海量ICMP Echo Request耗盡目標(biāo)主機(jī)或網(wǎng)絡(luò)帶寬資源。這就是為什么很多服務(wù)器或網(wǎng)絡(luò)邊界會禁用ICMP Echo Request。信息泄露通過ping可以探測主機(jī)是否在線主機(jī)發(fā)現(xiàn)。nmap的-PE選項就是利用ICMP Echo進(jìn)行掃描。命令注入這就是類似“[gxyctf2019]ping ping ping”這類CTF題目的考點。如果Web應(yīng)用將用戶輸入直接拼接到ping命令中執(zhí)行例如ping -c 1 {user_input}攻擊者可以通過輸入8.8.8.8; cat /etc/passwd來注入系統(tǒng)命令。防御方法永遠(yuǎn)是對用戶輸入進(jìn)行嚴(yán)格的過濾和轉(zhuǎn)義避免直接拼接命令使用安全的API如subprocess模塊并設(shè)置shellFalse。注意在生產(chǎn)環(huán)境中是否對公網(wǎng)開放ICMP Echo需要權(quán)衡。完全關(guān)閉不利于監(jiān)控和調(diào)試完全開放有安全風(fēng)險。折中方案是在邊界防火墻上可以限制ICMP Echo的速率限速或者只允許來自可信管理網(wǎng)絡(luò)的ICMP流量。5.2 網(wǎng)絡(luò)診斷中的經(jīng)典組合拳ping很少單獨使用它通常與以下工具協(xié)同工作traceroute/tracert路徑追蹤發(fā)現(xiàn)網(wǎng)絡(luò)路徑和每一跳的延遲。原理是發(fā)送TTL遞增的UDP包或ICMP Echo Request利用ICMP Time Exceeded報文來定位路徑上的路由器。arp -a/ip neigh查看本地ARP緩存診斷二層連通性問題。netstat -rn/route print/ip route查看路由表診斷三層路由問題。nslookup/digDNS解析診斷區(qū)分是網(wǎng)絡(luò)不通還是域名解析失敗。tcpdump/Wireshark終極武器抓取網(wǎng)絡(luò)包進(jìn)行協(xié)議級分析。當(dāng)你對ping的行為有疑問時抓包看一眼就全明白了。例如用tcpdump -i any icmp可以捕獲所有ICMP流量。5.3 深度問答那些令人困惑的問題Q: RTT是否包含發(fā)送端的發(fā)送時延A: 不包含。RTTRound-Trip Time的定義是從發(fā)送方發(fā)出數(shù)據(jù)包的第一個比特開始到發(fā)送方收到接收方確認(rèn)對于ping就是Echo Reply的最后一個比特為止所經(jīng)歷的時間。它主要包括數(shù)據(jù)包在鏈路上的傳播時延主要、在各路由器和主機(jī)上的處理時延排隊、轉(zhuǎn)發(fā)以及接收方的處理時延。發(fā)送時延數(shù)據(jù)長度/發(fā)送速率發(fā)生在數(shù)據(jù)包離開網(wǎng)卡之前是RTT開始計時之前的過程因此不計入RTT。Q: 為什么有時候能ping通但網(wǎng)頁打不開A: 這是典型的“網(wǎng)絡(luò)層通應(yīng)用層不通”。ping通只說明到目標(biāo)IP地址的網(wǎng)絡(luò)層連通性和ICMP協(xié)議未被過濾。網(wǎng)頁打不開假設(shè)是HTTP/HTTPS可能的原因有目標(biāo)服務(wù)器的80/443端口被防火墻關(guān)閉。目標(biāo)Web服務(wù)進(jìn)程未運行或崩潰。本地或中間的代理設(shè)置錯誤瀏覽器設(shè)置了代理但代理不可用。DNS解析出的IP地址錯誤雖然能ping通那個IP但那不是真正的Web服務(wù)器。HTTPS證書錯誤或HTTP應(yīng)用層問題如服務(wù)器返回500錯誤。 診斷時應(yīng)用telnet 目標(biāo)IP 80或curl -v http://目標(biāo)IP來測試TCP連接和應(yīng)用層響應(yīng)。Q: 如何理解“TTL expired in transit”和“icmp unreachable attack”A: “TTL expired in transit”是traceroute工具的“正?!狈答伇硎緮?shù)據(jù)包在到達(dá)目的地前TTL值已歸零路徑上的路由器將其丟棄并返回ICMP超時消息?!癐CMP Unreachable Attack”是一種攻擊手法。攻擊者可以偽造ICMP Destination Unreachable報文特別是“Fragmentation Needed but DF set”類型即需要分片但設(shè)置了不分片標(biāo)志發(fā)送給正在進(jìn)行TCP通信的雙方。接收方可能會誤以為路徑MTU變小或?qū)Ψ讲豢蛇_(dá)從而降低傳輸效率或中斷連接。防御這種攻擊需要在防火墻上對入站的ICMP Unreachable報文進(jìn)行過濾和驗證。在我多年的網(wǎng)絡(luò)運維和排障經(jīng)歷中ping永遠(yuǎn)是工具箱里最順手、最可靠的第一件工具。它的價值不在于復(fù)雜性而在于其基于網(wǎng)絡(luò)層協(xié)議帶來的純粹性和直達(dá)性。理解它的每一個步驟、每一個參數(shù)、每一條返回信息背后的含義就如同一位老練的醫(yī)生掌握了聽診器的精髓能從最簡單的“心跳”聲中聽出網(wǎng)絡(luò)這個復(fù)雜有機(jī)體深處的健康與疾病。下次再遇到網(wǎng)絡(luò)問題時不要急于重啟或重裝靜下心來從一次細(xì)致的ping開始沿著協(xié)議棧和網(wǎng)絡(luò)路徑一步步追問下去答案往往就藏在那些timeout、unreachable或波動的ms數(shù)之中。