命令說明
tcpdump命令是linux系統中分析網絡問題的重要抓包工具,爲了方便分析問題,我們還需要藉助Wireshark工具進行分析;
命令安裝
yum install tcpdump
命令選項說明
抓包
-c 指定要抓取的包數量(滿足條件的)
-i interface 指定監聽的網卡
lo 環回口
any 所有接口
-n 不反解主機名
-nn 不反解主機名和端口號
-P 指定要抓取流入還是流出的包 in、out、inout 默認inout
輸出
-e 輸出的每行都將包括數據鏈路層頭部信息
-q 快速打印
-x 輸出包的頭部數據 16進制ASCII同時輸出
-xx 更詳細
-v 詳細的輸出 -vv -vvv
其他
-D 列出可用於抓包的接口
-F 從文件中讀取抓包的表達式
-w 將抓包數據輸出到文件中
-r 從指定的數據包中讀取數據
-s number
tcpdump默認只會截取前96字節的內容,要想截取所有的報文內容,就需要使用這個選項
其中number是需要截取的報文字節數,如果是0的話,表示截取報文全部內容
過濾器
在服務器上的網絡報文是異常的多,很多時候我們只關注和具體問題有關的數據報文,而這些有用的報文只佔到很小的一部分,爲了不讓我們在報文的海洋裏迷失自己,我們就非常有必要學習一下tcpdump
提供的靈活而且功能強大的過濾器。
過濾器也可以簡單地分爲三類:type,dir和proto。
- type
主要用來區分過濾報文源類型,主要由host主機報文,net網段報文和port指定端口的報文組成; - dir
只過濾報文的源地址和目的地址,主要包括src源地址和dst目的地址; - proto
只過濾報文的協議類型,支持tcp、udp、arp、ip、ether、icmp
;使用的時候可以省略proto關鍵字,例如:tcpdump -i eth1 icmp
組合條件
在茫茫網絡中,想要找到那個你想要的網絡包,還是有一定難度的。爲了抓住那個我們想要的網絡包,在我們抓包命令中,包含越多的限制條件,抓的無關包就會越少,所以在進行抓包時,可以使用以下操作:
- 與 and、&&
- 或 or、||
- 非 not、!
使用實例
-
命令:tcpdump -i eth0
說明:監視指定網絡接口的數據包 -
命令:tcpdump host 210.27.48.3
說明:截獲210.27.48.3主機收到的和發出的所有數據包 -
命令:tcpdump host 210.27.48.4 and (210.27.48.5 or 210.27.48.6)
說明:截獲210.27.48.3主機和210.27.48.5或者210.27.48.6主機進行通信的所有數據包 -
命令:tcpdump -i eth0 src host 210.27.48.3
說明:監視eth0網卡上源地址是210.27.48.3的所有網絡包 -
命令:tcpdump -i eth0 dst host 210.27.48.3
說明:監視eth0網卡上目的地址是210.27.48.3的所有網絡包 -
命令:tcpdump tcp port 23 and host 210.27.48.3
說明:獲取主機210.27.48.3上端口爲23的應用發出和接收的所有TCP協議包 -
命令:tcpdump udp port 123
說明:獲取本機123端口發出和接收的所有UDP協議包
爲了便於分析,我們需要將抓到的包保存到pcap文件,用Wireshark軟件進行進一步分析,保存到文件的參數爲-w,用法如下:
-
命令:tcpdump -i eth0 -s0 -G 60 -Z root -w %Y_%m%d_%H%M_%S.pcap
說明:抓取報文後按照指定時間間隔保存;-G選項後面接時間,單位爲秒;上述命令就是每隔60秒生存一個文件 -
命令:tcpdump -i eth0 -s0 -C 1 -Z root -w eth0Packet.pcap
說明:抓取報文後按照指定報文大小保存;-C選項後接文件大小,單位爲MB;上述命令就是每抓包文件達到1MB時就使用一個新的文件保存新抓的報文
man pcap-filter
高級過濾方式
瞭解如何從包頭過濾信息
proto[x:y] : 過濾從x字節開始的y字節數。比如ip[2:2]過濾出3、4字節(第一字節從0開始排)
proto[x:y] & z = 0 : proto[x:y]和z的與操作爲0
proto[x:y] & z !=0 : proto[x:y]和z的與操作不爲0
proto[x:y] & z = z : proto[x:y]和z的與操作爲z
proto[x:y] = z : proto[x:y]等於z
支持的操作符
>, <, >=, <=, =, !=
IP頭(IPV4)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | <-- optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATA ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/*IP頭定義,共20個字節*/
typedef struct _IP_HEADER
{
char m_cVersionAndHeaderLen; //版本信息(前4位),頭長度(後4位)
char m_cTypeOfService; // 服務類型8位
short m_sTotalLenOfPacket; //數據包長度
short m_sPacketID; //數據包標識
short m_sSliceinfo; //分片使用
char m_cTTL; //存活時間
char m_cTypeOfProtocol; //協議類型
short m_sCheckSum; //校驗和
unsigned int m_uiSourIp; //源ip
unsigned int m_uiDestIp; //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;
抓取特定包頭實例
-
抓取源端口大於1024的TCP數據包
tcpdump -i eth1 'tcp[0:2] > 1024'
-
只抓SYN包,第十四字節是二進制的00000010,也就是十進制的2
tcpdump -i eth1 'tcp[13] = 2'
-
抓SYN, ACK (00010010 or 18)
tcpdump -i eth1 'tcp[13] = 18'
-
抓所有包含FIN標記的包(FIN通常和ACK一起,表示幽會完了,回見)
tcpdump -i eth1 'tcp[13] & 1 = 1'
-
抓RST
tcpdump -i eth1 'tcp[13] & 4 = 4'
常用的字段偏移名字
tcpdump考慮了一些數字恐懼症者的需求,提供了部分常用的字段偏移名字:
-
icmptype (ICMP類型字段)
-
icmpcode (ICMP符號字段)
-
tcpflags (TCP標記字段)
TCP標記值:
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg
這樣上面按照TCP標記位抓包的就可以寫直觀的表達式了:
-
只抓SYN包
tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
-
使用tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 爲"GET"前兩個字母"GE",0x4854 爲"HTTP"前兩個字母"HT"。
更多用法請使用以下命令查閱:
man pcap-filter //查看過濾器相關資料
tcpdump --help //tcpdump命令用法