tcpdump命令使用總結

命令說明

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命令用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章