你真的懂“抓包”嗎?
在平時和其他大佬交流時,總會出現這么些話,“抓個包看看就知道哪出問題了”,“抓流量啊,payload都在里面”,“這數據流怎么這么奇怪”。這里出現的名詞,都是差不多的意思嗎?packet,frame,flow,session區別是什么,你真的分的清楚嗎?
平時關系還不大,這幾個名詞隨便用,大家也都知道指什么,這段時間在分析協議類型的漏洞,終于意識到基礎知識的淺薄,才知道自己根本沒分清這幾個基礎概念,看國外一些技術文檔不明所以,于是查了大量資料,寫出了本文。
區分control plane和data plane
control plane, data plane是實現網絡設備所需要理解的兩個基本的概念。data plane一般用于快速轉發,而control plane是為快速轉發準備必要的信息。control plane包括路由協議,設備管理,命令行,ARP,IGMP等;而data plane一般是轉發包。這樣的劃分,目的是把系統的主要工作和次要工作分離開,避免不同類型的處理相互干擾。在一個網絡設備里面,轉發無疑是最主要的工作,它具有***的優先級,而路由協議,由于并不需要在短時間內處理大量的包,所以可以把它放到次一級的優先級里面。data plane可以借助asic或者NP等優化,可以達到很高的速度,而control plane,則可以借助于通用的庫,或者系統,以達到更好的保護。
control plane的os和data plane的os,作用完全不同。data plane的os需要實時響應,并且需要更快速,高效的內存管理,隊列管理,定時器管理等;而control plane的os則傾向于更好的保護,更簡便的編程方式,以及快速移植等。當然,哪些任務放到control plane,哪些任務放到data plane,是需要在實踐中去選擇。舉個例子,由于arp學習和應答的時間是不確定的,而mac learning則是立即生效的。所以arp學習和應答一般放在control plane;而mac learning則放在data plane。
就data plane來說,又可分control path和data path。control path同樣是為data path準備必要的信息。有時為了更快的速度,避免control plane和data plane過多的交互,把control plane的某些工作拿到data plane上來做,比如ICMP的應答等。
區分session和flow
flow是發送方和接收方之間的數據包中的data plane stream,其共享關鍵IP報頭信息。 例如,10.1.1.1端口12398處的客戶端與用于SSH的192.168.1.1端口22處的服務器通信是specific stream,可以在關鍵字段不更改時捕獲該特定stream。
session是發送方和接收方之間的control plane通信。TCP 3次握手創建會話,在發送方的源端口和接收方的目標偵聽端口之間建立連接。TCP窗口大小,初始序列和確認值以及keepalive是作為構建session的一部分進行協商的。
簡單地說,flow代表了data plane,而session代表了control plane。
區分datagram和stream
stream是我們通常認為的通信渠道。比如遠程登錄,文件傳輸,郵件傳遞 ,這個都是使用stream。 Strean就像管道一樣。它有兩個端點。數據從一端放入,另一端出來。沒有任何數據以任何方式被復制,丟棄或重組。兩個流可以組合在一起形成全雙工連接。
datagram(通常稱為packet)本質上更具原子性。它是一小段數據,通常要求小于***長度(通常在256到2000字節范圍內)。datagram是完全自包含的,有源和目的地,但不能被稱為connection。數據報與之前或之后的任何其他數據都沒有任何關系。
很難理解嗎?
我們再打個比方。
stream就像打電話- 一方撥打電話,另一方接聽,你們互相打招呼(TCP中的SYN / ACK),然后交換信息。一旦完成,你就說再見(TCP中的FIN / ACK)。 如果一方沒有聽到再見,他們通常會打電話給另一方,因為這是一個意想不到的事件; 也就是說通常客戶端將重新連接到服務器。這樣可以保證數據不會以與我們發送的順序不同的順序到達,并且可以保證數據不會被損壞。
datagram就像在班級里傳小紙條。如果你和想要拿到小紙條的人不坐在一起,這個小紙條將在其他人之間傳遞過去。小紙條可能無法到達目的地,并且可能會在到達目的地時被修改過。另一種兩款,如果將兩個小紙條傳遞給同一個人,兩個小紙條可能不會按照我們需要的順序到達,因為小紙條們通過教室的路線可能不一樣,一個人可能不會像另一個那樣快速傳遞小紙條,等等會有很多因素影響到小紙條的傳遞。
盡管大多數網絡通信都使用stream,但所有Internet傳輸都采用datagram的形式,實際上是通過TCP協議使用datagram來模擬Internet stream。而為了診斷因特網故障,可以使用諸如TCPdump這類packet decoder來查看各個packet。
區別Packet和frame
為了簡化問題,我們將frame和packet想象為將要從一個人發送到另一個人的信息的信封。 frame和packet之間的關鍵區別在于它們如何封裝信息,而這取決于信息在哪兒被發送。
想象一下,一家公司有跨部門郵件,一個人可以將文檔發送給其本地組織中的另一個人。內容放在內部信封中,發送者在“發件人”字段中寫下他們的姓名和部門,然后在“收件人”字段中寫下收件人的姓名和部門。發送信封時,郵件室識別內部使用信封,讀取目的地名稱和部門,使用目錄將該信息轉換為物理位置(辦公室)并將其傳遞給收件人。信封永遠不會離開本地組織,信封的所有傳遞行為都由本地處理。
部門間信封不能發送到公司外部,因為信封上沒有郵寄地址。要將內容發送到本地以外的辦公室,需要將辦公室間信封放在郵政信封內,并貼上適當的郵政地址標簽。
Frame以類似的方式工作。 它是具有源和目標地址的數據的容器,用于在同一網絡上的兩個位置之間傳遞稱為payload的信息。Frame的源和目標地址不是名稱和部門,而是計算機,平板電腦,IP電話,物聯網設備等的MAC地址,這是每個以太網設備在這個世界上唯一的ID號。
frame由網絡接口設備在TCP/IP協議棧的第2層生成,payload大小取決于傳輸的數據類型。frame被發送到網絡上,以太網交換機根據其存儲器中的MAC表檢查frame的目的地址。MAC表告訴交換機哪個物理端口(RJ45端口)與設備相關聯,該設備的MAC地址與幀的目的地址相匹配。
交換機將frame轉發到由MAC表確定的物理端口。如果電纜直接連接到目的設備,傳輸就完成了。如果電纜連接到另一臺交換機,下一臺交換機將重復查找和轉發過程,直到frame到達預期目的地。
這一切都發生在LAN中的第2層交換機上。與部門間郵件一樣,frame不能在本地/專用網絡之外發送到因特網上,因為它沒有正確的地址。要將數據發送到不同網絡或互聯網服務器上的設備,必須在packet中構建一個frame。
很像部門間信封需要放在郵政信封內發送到不同的辦公室的例子,Ethernet frame用附加信息封裝,以創建一個IPpacket。
雖然網絡設備的MAC地址是唯一,***的,但IP地址通常會臨時分配給網絡設備,并隨著設備連接到不同的網絡而改變。例如,平板電腦每次連接到不同的無線網絡時,其IP地址都會發生變化。packet在網絡的第3層創建,允許不同局域網之間交換信息,通常是通過路由器。路由器將小型網絡互連在一起,允許使用IP地址而不是MAC地址進行更大規模的信息交換。
第3層packet允許路由器使用標識網絡的IP地址和網絡上設備的臨時地址來提供網絡間的數據傳輸(互聯網)。一旦進入網絡,網絡內(局域網)數據轉發由二層交換機處理,它讀取frame的MAC地址,并將其轉發到目的設備,在那里以太網控制器提取payload,完成不同網絡上設備之間的信息傳輸過程。
區分packet capture和flow capture(抓包和抓流量)
Packet capture可以讓我們在網絡數據包通過網絡時拿到鏡像。而flow data通常包含在網絡上設置的連接的摘要。它們都是非常有用的故障排除技術,可以找出網絡上發生的故障。那么這兩種技術有什么區別呢?
Flow capture:在OSI模型的第3層運行的大多數路由器和交換機都具有flow導出選項。有許多flow標準,包括NetFlow,sFlow和IPFIX。 只需安裝一個flow連接器,它可以處理網絡設備使用的任何flow標準。基于flow的分析可以很好地找出網絡中某些部分的通信狀況。它的優點是:
- 易于在第3層設備上設置操作;
- 不需要布線;終端用戶系統不需要軟件客戶端或代理。
缺點是:
- 某些交換機上沒有flow選項;
- 想要解決問題時缺少詳細信息;
- 當應用程序依賴其他協議時,不適合在網絡邊緣進行監控
Packet capture: 抓包能夠捕獲在網絡中傳輸的網絡數據包的鏡像。大多數交換機允許在不影響網絡性能的情況下設置鏡像端口。通常,深度數據包檢測(DPI)應用程序連接到鏡像端口,并從數據包中提取某些信息,以便我們可以發現網絡上發生了什么。優點是:
- 更好地分析應用程序和用戶行為,非常適合監控重要應用程序,服務器或至關重要的Internet連接;
- 會得到更多的信息,如應用程序,文件,網站和主機名;
- 終端用戶系統上不需要軟件客戶端或代理。
缺點是:
- 需要在鏡像端口和DPI應用程序之間連接物理線路;
- 需要確保鏡像端口在繁忙的網絡上不會過載。
在不清楚區別之前,我們可能會將兩者混為一談,現在應該已經明確區別了。那我們應該使用哪種技術?在一般情況下,兩者都需要用到。如果有大量的WAN鏈接并且需要一種簡單的方法來獲得***程度的可見性,抓流量可能更好。而抓包可以為我們提供網絡上某些節點的更多詳細信息。兩者的結合意味著我們可以更輕松地檢測諸如帶寬占用,以及查看正在使用的應用程序等情況。
結語
需要區分的點都很多,我在文中已經比較好的安排,一步步引出來,從control plane,data plane的區別開始討論,因為這是區分0×03 flow和session的基礎,在0×03中提到了stream的概念,于是在0×04中討論stream和datagram的區別,在0×04***提到了用于解碼分析packet的tcpdump,引出了packet,于是自然在0×05中討論packet和frame。以上基礎概念和去都明確之后,***討論了抓包(packet capture)和抓流量(flow capture)的區別及各自優缺點。
大部分做安全的小伙伴應該都不是網絡工程出身,所以本文或多或少還是有些參考價值的。希望各位師傅能從中獲益。