作者:梁定安,騰訊織雲負責人,目前就職于騰訊社交網絡營運部,開放運維聯盟委員,騰訊雲布道師,複旦大學客座講師。
熟悉運維的兄弟姐妹都知道 tcpdump 是一款抓包分析利器,其靈活的過濾規則和對表達式的支援能夠讓我們在衆多的資料封包中抓取到理想的關鍵資訊。本文在介紹 tcpdump 的基本使用方式的同時,會向大家說明海量業務中tcpdump進階應用場景。在開始閱讀之前請兄弟姐妹們現在腦海中思考一下這幾個問題,看看讀完本文後會有些什麼收獲。
1、tcpdump怎麼使用?
2、海量業務系統中tcpdump又怎麼使用?
3、tcpdump除了抓包還能能做什麼?
tcpdump是一個對網絡資料包進行截獲的包分析工具。 tcpdump可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網絡層、協定、主機、端口等的過濾,并支援與、或、非邏輯語句協助過濾有效資訊。指令使用規則如下:

過濾方式有很多,可以依據所需設定過濾條件,較常用的三種:
1、可以按host過濾,例如:tcpdump -i eth1 -n -X src host 10.19.66.62
2、可以按port過濾,例如:tcpdump -i eth1 -n -X src host 10.19.66.62 and dst port 80
3、可以按protocol過濾,例如:tcpdump -i eth1 -n -X src host 10.19.66.62 and dst port 80 and tcp
下面來看一下tcpdump過濾規則的具體使用:我們在伺服器10.219.153.215上搭建了一個http服務用來作為服務端,10.19.66.62作為用戶端用戶端對其發起通路。我們使用前面提到的按host 10.19.66.62、port 80以及protocol tcp的組合條件來執行tcpdump。
tcpdump -i eth1 -n tcp port 80 and host 10.19.66.62
不同的協定類型有不同的資料包格式顯示,以tcp包為例,通常tcpdump對tcp資料包的顯示格式如下:
src > dst: flags data-seqno ack window urgent options
src > dst:表明從源位址到目的位址
flags:TCP包中的标志資訊,S 是SYN标志,,F (FIN),P (PUSH),R (RST),"." (沒有标記)
data-seqno:是資料包中的資料的順序号
ack:是下次期望的順序号
window:是接收緩存的視窗大小
urgent:表明資料包中是否有緊急指針
options:選項
我們執行抓包過程中輸出的這八行資料其實包含了tcp三次握手和四次揮手的互動過程,我們詳細分析下看看:
第一至三行為建立連結的三次握手過程,包狀态為:[S]、[S.]、[.],第四至五行為傳輸資料的過程,包狀态為[P.]、[.];第六至八行為關閉連結的四次揮手過程(ack延遲發送未禁用,是以這裡隻看到三個包),包狀态為[F.]、[F.]、[.]。
第一行:用戶端62向伺服器215發送了一個序号seq 2020752563給服務端;
第二行:服務端收到後将序号加一傳回ack 2020752564;
第三行:用戶端檢查傳回值正确,向服務端發ack 1,建立了連結;
第四行和第五行:具體的資料互動,tcpdump指令-x可以顯示出具體内容;
第六行:用戶端發一個序号seq 875說明要斷開連結;
第七行:服務端在收到後序号加一傳回ack 876,同意斷開連結;
第八行:用戶端檢查傳回值正确,向服務端發ack,連結斷開。
以上的分析是我們使用基本的過濾條件組合擷取的,如果想要擷取到限制條件更嚴格的封包資料應該怎麼寫指令呢?比如在資料互動時狀态為[P.]. 即PSH-ACK,如果我們要抓去flag為[P.]的包應該怎麼抓取呢?這裡先挂一下tcp標頭的桢格式(詳解可參考TCP/IP協定),以便我們進一步的使用tcpdump的過濾功能,頭部固定為20位元組,每行4位元組,根據協定規則可以看到各個位元組中存放的内容的含義。
圖中可以看到控制标志位在第13位元組(從0開始計數). 從右往左這些位被依次編号為0到7, 而PSH位在3号,ACK在第4位,是以我們想抓取狀态為[P.]的包表達式應寫為tcp[13]=18+8。
執行指令tcpdump -i eth1 -n -X src host 10.19.66.62 and dst port 80 and tcp[13]=24,此時我們加上-X參數可以以16進制和ASCII碼形式列印出包資料,便于觀察。抓取到的資料如下圖,可以看到我們很友善的抓到了特定狀态的包。
如果我們要抓取業務中的get請求包,怎麼做呢?首先查ASCII碼表得"GET+空"的十六進制是0x47455420,是以表達式應為tcp[20:4]=0x47455420。
執行指令tcpdump -i eth1 -n -A src host 10.19.66.62 and dst port 80 and tcp[20:4]=0x47455420,此時我們加上-A參數以ASCII碼方式顯示資料包。抓取到的輸出如下如,可以看到get請求的具體資訊了。以此推論,我們還可以把tcpdump用來統計get、post請求的通路次數等。
第一部分中講解了tcpdump的一些基本用法和過濾方式,但都還停留在指令行層面。那麼在海量運維系統中如何讓tcpdump發揮其作用呢?一個指令又是怎麼來建構通路關系的分析平台呢?建構平台後又是怎麼利用分析結果的呢?這裡要先說明一下我們業務中所使用的一款自動抓包工具的實作原理。抓包工具由兩部分腳本組成,排程腳本run.sh和工作腳本access.sh。排程腳本通過權衡伺服器的負載狀況來控制工作腳本的執行計劃;工作腳本實作tcpdump指令的基礎封裝。核心實作是根據伺服器監聽的TCP和UDP端口,對抓取的封包進行分析後,将分析結果上報到網管,其工作原理如下流程圖:
1、定時執行排程腳本
業務的通路是随機并持續的,我們采用抽樣抓包的方式來擷取通路關系資料。是以設定為每三十分鐘執行一次排程腳本,将腳本的執行寫入到crontab中:/30 *
2、負載判決
短持續的抓包指令會帶來一定的負載消耗,是以抓包的執行需要避開伺服器高負載狀态。是以排程腳本需要進行負載判決,每次執行前判斷負載是否在可執行抓包的門檻值内。此時我們計算cpu負載,代碼如下圖。
基本原理是采樣兩個足夠短的時間間隔的CPU快照來計算這段時間内的CPU平均使用率作為伺服器目前的CPU負載:
(1) cat /proc/stat | grep ^cpu得到cpu的資訊
(2) used1=user+nice+system+irq+softirq
(3) total1=user+nice+system+idle+iowait+irq+softirq
(4) sleep 5秒
(5) 再次cat /proc/stat | grep ^cpu得到cpu的資訊
(6) used2=user+nice+system+irq+softirq
(7) total2=user+nice+system+idle+iowait+irq+softirq
(8) 得到cpu在5秒内的平均使用率:(cpu_used2 - cpu_used1) / (cpu_total2 - cpu_total1) * 100%
得到CPU的使用率後就可以進行判決了,可以假定門檻值為90%,在負載門檻值内即可啟動抓包腳本access.sh,否則終止。示例代碼如下。
3、讀取伺服器的網絡接口和IP位址
此處用來擷取網卡和對應的IP位址,一般抓取内網IP即可。
4、擷取伺服器監聽的TCP/UDP端口
示例代碼如下:需要排除掉綁定IP為local的部分
5、執行抓包
此處就到了返璞歸真的時候了,運用我們第一部分講到的tcpdump過濾基礎設定好過濾條件,後面的工作就是按條件組合來擷取我們想要的封包資料了。此處設定了空包、端口出入包、入包、出包、所有包的幾個條件:
執行抓包後将資料結果按一定的結構組合上報到網管屬性。
以上就是自動抓包工具的工作原理和實作方式,将此工具嵌入在伺服器的初始化部署中,所有伺服器在工作的同時可以上報業務的通路關系資料。至此我們就完成了對所有伺服器通路封包的上報和收集,後續的進階應用都是在此基礎上發展起來的。
前文提到的自動抓包工具擷取分析的封包資料已經上報到了網管系統,對一個業務而言,有了通路關系資料基礎,我們就可以将子產品間伺服器的通路關系繪制圖譜,業務架構樹也就應運而生。以通路關系作為骨架,業務子產品作為肢體,通過圖形化模型來展示業務架構,一眼就能擷取更多的營運資訊資料。從通路關系中就可以看到業務請求的流轉方向,對不合理的調用架構比如環狀或者往複迂回的調用采取優化,可以降低關鍵子產品的請求壓力。
業務架構樹的繪制原理可以分為以下步驟:
1、IP次元彙聚為功能子產品次元
一個業務由若幹功能子產品組成,功能子產品由若幹伺服器提供業務支撐。前文提到的抓包資料是按IP次元上報的,是以首先需要按CMDB的資料彙聚出業務子產品的通路關系資料,這裡按IP次元取并集即可得到。彙聚之後以子產品樣式呈現在架構樹中。子產品的附加資訊包含了幾種運維管理平台的抽象資訊,除了各種跳轉接口以外,容量資訊以能量條的形式展現(綠色為低負載<30%,藍色為正常負載30%80%)。注:此處隻講解和tcpdump相關的部分,其他的功能組成等以後的文章再介紹吧。
2、确定主被調子產品以及通路關系
有了子產品的呈現後,平台就可以對子產品附加上通路關系的連線。前文提到抓包資料的分析結果是以這種形式“本機IP 源IP 目标IP 包大小 時間戳 源端口 目的端口 包量 協定 方向”上報到網管的。按子產品彙聚後,本機IP等于源IP時,目标IP彙聚的子產品即為“被調”;針對這次調用本機IP或源IP彙聚的子產品即為“主調”;主調到被調的方向即為主被調的“通路關系”。下圖就是一個連接配接關系的确立模型:A->B->C。對A->B調用來說,A為主調,B為被調,->為從A到B的通路關系;對B來說既是A->B關系中的被調又是B->C關系中的主調。是以通路關系連線上來看有入也有出。
3、選取業務自動繪制
經過1、2的原子說明後,就可以整體來看一個業務的架構樹形态了。在CMDB上選擇一個業務導入繪制架構樹,平台根據抓包關系彙聚出各主調->被調的節點和連線,然後通過排列算法将這些節點和連線組合,最終呈現出一份業務架構樹模型。如下圖所示。
以上就是這次想講到的主要内容,文章内容也基本回答了我對最初幾個問題的了解,我們可以使用各種組合過濾條件來使用tcpdump指令,在定位業務問題時事半功倍;我們也可以通過部署自動抓包工具來搭建業務通路關系的資料平台;我們還可以在資料平台的基礎上繪制出直覺的業務架構樹狀圖。在平時的工作中還有很多其他運用了tcpdump的進階場景,比如伺服器隔離回收、告警關聯分析等等,篇幅有限,這些内容就以後再講吧。
原創聲明,本文系作者授權雲+社群發表,未經許可,不得轉載。如有侵權,請聯系 [email protected] 删除。