只有當你不把努力當做努力時,你才能沉迷於一件事,才能埋頭苦干,這是才能的證明。
一、抓包過濾器的用法
二、使用Expert info排障
三、TCP的常見信息
四、TCP三次握手
五、在linux中使用tcpdump
一、抓包過濾器的用法
1、Wireshark主要提供兩種的過濾器
a、捕獲過濾器:當進行數據包捕獲時,只有那些滿足給定的包含/排除表達式的數據包才會被捕獲。
b、顯示過濾器:根據指定的表達式用於在一個已經捕獲的數據包集合中,只顯示需要的數據包。
注意:捕獲過濾器和顯示過濾器的配置語法並不相同。
2、Wireshark捕獲過濾器之BPF語法
BPF語法是廣泛應用與多種數據包嗅探軟件,掌握BPF語法對你在數據包層級更深入地探索網絡來說非常關鍵。
使用BPF語法創建的過濾器叫做表達式,每個表達式由一個或者多個原語組成,每個原語包含一個或多個限定詞,然后跟着一個ID名字或者數字。
Dst host 192.168.1.1 && tcp port 80
限定詞 ID 操作符 限定詞 ID
限定詞 |
說明 |
列子 |
Type |
指出名字或者數字所代表的意義 |
Host、net、port |
Dir |
指明目標還是源,名字或者數字 |
Src、dst |
Proto |
限定所要匹配的協議 |
Ip、tcp、udp、http、ftp |
3種邏輯運算符,對源語進行組合
- 連接運算符與(&&或and)
- 選擇運算符或(||或or)
- 否定運算符非(!或not)
如:src 192.168.1.1 && port 80 捕獲源地址為192.168.1.1 80端口的流量
Host 192.168.1.1
Host 2001:db1::6666
Host websever (主機名)
Ether host 0063-aaa1-bbb2
Src host 192.169.1.1
Dst host 192.168.1.1
Dst 192.168.1.1
Port 8080 (只捕獲源或者目標8080端口的流量)
! Port 8080 (捕獲除了8080以外的流量)
Dst port 80 (只捕獲目標端口是80的流量)
Udp portrange 2000-3000 (只捕獲源或目標端口是2000-3000的udp數據)
Tcp portrange 5000-6000
3、TCP頭部中幾種常用的標記位
SYN:用來表示打開連接
FIN:用來表示拆除連接
ACK:用來確認收到的數據
RST:用來表示立刻拆除連接
PSH:用來表示應將數據提交給末端應用程序處理
4、Wireshark顯示過濾器
(1)常用顯示過濾器表達式
操作符 說明
!tcp.port==3389 排除RDP流量
!arp 排除ARP流量
http 所有HTTP流量
Tcp.port==23 || tcp.port 21 文本管理流量(telnet或ftp)
(2)顯示過濾器的邏輯操作符
操作符 說明
And 兩個條件需同時滿足
Or 其中一個條件被滿足
Xor 有且僅有一個條件被滿足
Not 沒有條件被滿足
二、使用Expert info排障
對話(藍色)
有關通常工作流程的信息,例如帶有SYN標志集的TCP數據包。
注意(cyan)
值得注意的事件,例如,應用程序返回了一個常見的錯誤代碼,如HTTP 404。
警告(黃色)
警告,例如,應用程序返回了一個不尋常的錯誤代碼,如連接問題。
錯誤(紅色)
嚴重的問題,如數據包格式錯誤。
- Errors:所抓數據識別出的嚴重錯誤
- Warnings:所抓數據識別出的一般性問題
- Notes:所抓數據識別出的可能會引發故障的異常現象
- Chats:此標簽下的數據包都符合常規流量特征
Errors:所抓數據識別出的嚴重錯誤。比如,感知到畸形spoolss或gtp協議數據包,又或者識別到某些數據包的某種字段值跟預期不符(比如,ipv4數據包的ip包頭中效驗和字段值跟預期值不符合,即Ipv4數據包通不過效驗和檢查)。
對於一個網絡而言,穿梭於其中的數據包只要有百分之一,二具有Errors事件特征的數據包,就會導致事故頻發(比如TCP重傳),而且也會使網絡變得很慢。
Warning:所抓數據識別出來的一般性問題。比如感知了存在TCP零窗口,TCP window full、TCP報文段失序、TCP報文段丟失等現象,又或者識別出了相關網絡協議在運作時發出的數據包的內容與正常情況不一致。所謂一般性問題幾乎都是應用程序問題或通信問題。
認識Warnings事件:
1、含Reassembly字樣的幾種子事件:大多是指wireshark抓到了未能重組的數據包。一般而言,這都是wireshark協議解析器問題。
2、在Summary一欄里含window字樣的子事件:幾乎都是指wireshark感知到了網絡中存在TCP zero windown或window full問題,一般而言都是建立tcp連接的端到端設備忙不過來所致。
3、在Summary一欄里含Segmeng字樣的子事件:wireshark生成tcp報文段丟失事件信息,是因為末抓全隸屬於某股TCP數據流的所有TCP報文段;生成了TCP報文段失序事件信息,是因其感知到了TCP報文未按時發送主機發出的順序到達接受主機。
這三種子事件都屬於TCP故障,一般由網絡故障所引發。
總結:wireshark能感知數據包中的種種特征,比如窗口大小字段,TCP報文在傳輸中是否失序,TCP數據收到之后是否做出確認。但是請注意,wireshark事件只是wireshark自認為比較重要的事件,卻不能全信,比如wireshark未能抓取所有的數據包,則必會生成warnings事件,但未必就是網絡問題,可能只是抓包時間差問題導致。
Notes:所抓數據識別出的可能會引起故障的異常現象。比如,感知到了TCP重傳,重復確認,以及快速重傳等現象。雖然上述行為可能會對網絡產生嚴重影響,但屬於TCP的正常行為,所有被歸納在Notes,以提醒用戶這些數據可能會導致問題的嫌疑。
認識Notes事件:
Wireshark感知到的子類Error事件,主要分為以下三種情況:
1、在Summary一欄里含Retransmissions, Fast Retransmissions、Duplicate ACK字樣的子事件:通常預示着網速慢,丟包或者通過TCP傳輸數據的主機應用程序忙不過來。
2、在Summary一欄里含Keep-Alive字樣的子事件:通常預示着TCP或者基於TCP的應用程序問題。
3、在Summary一欄里含Time to live字樣的子事件:通常預示着路由問題。
總結:Notes事件的每一種子事件,並非是由固定的某一種類型的故障所導致,以TCP重傳現象為列,可能是因為丟包錯誤,網絡狀態差(帶寬低,延時高)、服務器或客戶端停止響應等。Wireshark只是提示存在TCP重傳現象,至於如何定位原因找到問題,需根據網絡現狀及業務綜合判斷。
Chats:可以統計各種數據包的個數,尤其是TCP的SYN的個數,可以判斷是否正在受到SYN flood的攻擊。
注意事項
wireshark感知的warnings事件有時無關緊要,但是識別出的Notes事件卻偏偏會影響網絡性能,所以排除故障時,需要關注內在,切勿只看表面。
三、TCP常見信息
1、對話信息(Chat)
窗口更新(window update):由接收着發送,用來通知發送者TCP接受窗口的大小已經發生更改。
2、注意信息(Note)
TCP重傳(retransmission):數據包丟失的結果。發生收到重傳的ACK,或者數據包的重傳計時器超時的時候。
重復ACK(Duplicate ACK):當一台主機沒有收到下一個期望序列號的數據包時,會生成最近一次收到的數據的重復ACK。
保活ACK(ACK to TCP Keep-alive):用來響應數據包
3、警告信息(Warn)
上一段丟失:指明數據包丟失。發生在當數據流中一個期望序列號被跳過時。
亂序:當數據包被亂序接受時,會利用序列號檢測。
四、TCP三次握手
1、第一次握手的數據包
客戶端發送一個TCP,標志位為SYN,序列號為0,代表客戶端請求建立連接。
2、第二次握手的數據包
服務器發回確認包,標志位為SYN,ACK。將確認序號(Acknowledgement Number)設置為1,syn加1,即0+1=1.
3、第三次握手的數據包
客戶端再次發送確認包(ACK)SYN標志位為0,ACK標志位為1並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方。
4、TCP頭部中幾種常用的標記位
SYN:用來表示打開連接
FIN:用來表示拆除連接
ACK:用來確認(通過TCP連接)收到的數據
RST:用來表示立刻拆除連接
PSH:用來表示將數據提交給末端應用程序(進程)處理
六、在liun中使用tcpdump
1、理解關鍵字
類型的關鍵字:
a. host(缺省類型):指明一台主機,如host 10.154.0.10
b. net:指明一個網絡地址,如net 10.154.0.0
c. port:指明端口號
確定方向的關鍵字
a.src:ip包源地址
b. dst:目標地址
c. src or dst 源地址或目標地址
d.dst && src 目標地址和源地址
協議的關鍵字:默認是監聽所有協議的信息包
a.ip
b.tcp
c.udp
d.arp
....
邏輯運算
a. 非運算not, !
b.與運算and, &&
c.或運算or, ||
2、使用范例
(1)常用參數
-i:指定tcpdump要監聽的網卡
-c:指定要監聽的數據包數量
-w:指定監聽的數據包保存在哪個文件中
(2)范例
# tcpdump -i eth0 src host 10.154.0.7 //截獲10.154.0.7發送的所有數據包
# tcpdump -i eth0 dst host 10.154.0.7 //截獲10.154.0.7接受的所有數據包
# tcpdump -i eth0 host 10.154.0.7 and tcp port 80 //截獲主機10.154.0.7所有在tcp 80的數據包
# tcpdump -i eth0 host 10.154.0.7 and dst port 80 -w /tmp/wzz.pcap //截獲主機10.154.0.7在80端口收到數據包並保存在/tmp目錄下wzz.pcap文件中。注:widonws下wireshake中可直接打開。
3、理解抓取的報文
如:10:30:38.806911 IP 10.154.0.8.22 > 10.154.0.7.49454: Flags [P.], seq 26272:26324, ack 53, win 238, options [nop,nop,TS val 1794729390 ecr 4282429292], length 52
第一個字段 10:30:38.806911是該數據報文被抓取的系統本地時間戳。
然后,IP 是網絡層協議類型,這里是 IPv4,如果是 IPv6 協議,該字段值是 IP6。
10.154.0.8.22 是源 ip 地址和端口號,緊跟其后的是目的 ip 地址和其端口號,這里是 192.168.64.1.41916。
在源 IP 和目的 IP 之后,可以看到是 TCP 報文標記段 Flags [P.]。該字段通常取值如下:
值標志類型描述
S SYN Connection Start
F FIN Connection Finish
P PUSH Data push
R RST Connection reset
. ACK Acknowledgment
該字段也可以是這些值的組合,例如 [S.] 代表 SYN-ACK 數據包。
接下來是該數據包中數據的序列號。對於抓取的第一個數據包,該字段值是一個絕對數字,后續包使用相對數值,以便更容易查詢跟蹤。例如此處 seq 26272:26324代表該數據包包含該數據流的第 26272 到 26324 字節。
接下來是 ack 值:ack 53。該數據包是數據發送方,ack 值為 53。在數據接收方,該字段代表數據流上的下一個預期字節數據。
接下來字段是接收窗口大小win 238,它表示接收緩沖區中可用的字節數,后跟 TCP 選項如 MSS(最大段大小)或者窗口比例值。最后, length 52代表數據包有效載荷字節長度。這個長度和 seq 序列號中字節數值長度是不一樣的。