tcpdump 命令(資源)

TCPDUMP簡介

tcpdump 是一個很經常使用的網絡包分析工具,能夠用來顯示經過網絡傳輸到本系統的 TCP/IP 以及其餘網絡的數據包。tcpdump 使用 libpcap 庫來抓取網絡報,這個庫在幾乎在全部的 Linux/Unix 中都有。mysql

tcpdump 能夠從網卡或以前建立的數據包文件中讀取內容,也能夠將包寫入文件中以供後續使用。必須是 root 用戶或者使用 sudo 特權來運行 tcpdumplinux

參數 : ios

  • -A 以ASCII格式打印出全部分組,並將鏈路層的頭最小化。 sql

  • -c 在收到指定的數量的分組後,tcpdump就會中止。 shell

  • -C 在將一個原始分組寫入文件以前,檢查文件當前的大小是否超過了參數file_size 中指定的大小。若是超過了指定大小,則關閉當前文件,而後在打開一個新的文件。參數 file_size 的單位是兆字節(是1,000,000字節,而不是1,048,576字節)。 centos

  • -d 將匹配信息包的代碼以人們可以理解的彙編格式給出。 緩存

  • -dd 將匹配信息包的代碼以C語言程序段的格式給出。 安全

  • -ddd 將匹配信息包的代碼以十進制的形式給出。 bash

  • -D 打印出系統中全部能夠用tcpdump截包的網絡接口。 服務器

  • -e 在輸出行打印出數據鏈路層的頭部信息。 

  • -E 用spi@ipaddr algo:secret解密那些以addr做爲地址,而且包含了安全參數索引值spi的IPsec ESP分組。 

  • -f 將外部的Internet地址以數字的形式打印出來。 

  • -F 從指定的文件中讀取表達式,忽略命令行中給出的表達式。 

  • -i 指定監聽的網絡接口。 

  • -l 使標準輸出變爲緩衝行形式,能夠把數據導出到文件。 

  • -L 列出網絡接口的已知數據鏈路。 

  • -m 從文件module中導入SMI MIB模塊定義。該參數能夠被使用屢次,以導入多個MIB模塊。 

  • -M 若是tcp報文中存在TCP-MD5選項,則須要用secret做爲共享的驗證碼用於驗證TCP-MD5選選項摘要(詳情可參考RFC 2385)。 

  • -b 在數據-鏈路層上選擇協議,包括ip、arp、rarp、ipx都是這一層的。 

  • -n 不把網絡地址轉換成名字。 

  • -nn 不進行端口名稱的轉換。 

  • -N 不輸出主機名中的域名部分。例如,‘nic.ddn.mil‘只輸出’nic‘。 

  • -t 在輸出的每一行不打印時間戳。 

  • -O 不運行分組分組匹配(packet-matching)代碼優化程序。 

  • -P 不將網絡接口設置成混雜模式。 

  • -q 快速輸出。只輸出較少的協議信息。 

  • -r 從指定的文件中讀取包(這些包通常經過-w選項產生)。 

  • -S 將tcp的序列號以絕對值形式輸出,而不是相對值。 

  • -s 從每一個分組中讀取最開始的snaplen個字節,而不是默認的68個字節。 

  • -T 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc遠程過程調用)和snmp(簡單網絡管理協議;)。 

  • -t 不在每一行中輸出時間戳。 

  • -tt 在每一行中輸出非格式化的時間戳。 

  • -ttt 輸出本行和前面一行之間的時間差。 

  • -tttt 在每一行中輸出由date處理的默認格式的時間戳。 

  • -u 輸出未解碼的NFS句柄。 

  • -v 輸出一個稍微詳細的信息,例如在ip包中能夠包括ttl和服務類型的信息。 

  • -vv 輸出詳細的報文信息。 

  • -w 直接將分組寫入文件中,而不是不分析並打印出來。

注意 : 

一、若是使用tcpdump -n, 能夠清晰看到以太網以及ip地址而不是名字標識

二、若是咱們使用tcpdump -e, 則能夠清晰的看到第一個數據包是全網廣播的, 而第二個數據包是點對點的

 

各比特的含義以下:

  • URG:緊急指針(urgent pointer)有效。
  • ACK:確認序號有效。
  • PSH:接收方應該儘快將這個報文段交給應用層。
  • RST:重建鏈接。
  • SYN:發起一個鏈接。
  • FIN:釋放一個鏈接。

使用下面命令在 CentOS 和 RHEL 上安裝 tcpdump

$ yum install tcpdump*

不帶任何選項的tcpdump,默認會抓取第一個網絡接口,且只有將tcpdump進程終止纔會中止抓包。

例如:

shell> tcpdump -nn -i eth0 icmp

 

抓包選項:

-c:指定要抓取的包數量。注意,是最終要獲取這麼多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是知足條件的包。

-i interface:指定tcpdump須要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),

            :一旦找到第一個符合條件的接口,搜尋立刻開始。可使用'any'關鍵字表示全部網絡接口。

-n:對地址以數字方式顯式,不然顯式爲主機名,也就是說-n選項不作主機名解析。

-nn:除了-n的做用外,還把端口顯示爲數值,不然顯示端口服務名。

-N:不打印出host的域名部分。例如tcpdump將會打印'nic'而不是'nic.ddn.mil'。

-P:指定要抓取的包是流入仍是流出的包。能夠給定的值爲"in"、"out"和"inout",默認爲"inout"。

-s len:設置tcpdump的數據包抓取長度爲len,若是不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,

      :輸出行中會出現"[|proto]"的標誌(proto實際會顯示爲協議名)。可是抓取len越長,包的處理時間越長,而且會減小tcpdump可緩存的數據包的數量,

      :從而會致使數據包的丟失,因此在能抓取咱們想要的包的前提下,抓取長度越小越好。

 

因此經常使用的選項也就這幾個:

  • tcpdump -D                            #命令列出能夠抓包的網絡接口

  • tcpdump -c num -i int -nn -XX -vvv

tcpdump表達式

tcpdump的表達式由一個或多個"單元"組成,每一個單元通常包含ID的修飾符和一個ID(數字或名稱)。有三種修飾符:

(1).type:指定ID的類型。

能夠給定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默認的type爲host。

(2).dir:指定ID的方向。

能夠給定的值包括src/dst/src or dst/src and dst,默認爲src or dst。例如,"src foo"表示源主機爲foo的數據包,"dst net 128.3"表示目標網絡爲128.3的數據包,"src or dst port 22"表示源或目的端口爲22的數據包。

(3).proto:經過給定協議限定匹配的數據包類型。

經常使用的協議有tcp/udp/arp/ip/ether/icmp等,若未給定協議類型,則匹配全部可能的類型。例如"tcp port 21","udp portrange 7000-7009"。

因此,一個基本的表達式單元格式爲"proto dir type ID"

除了使用修飾符和ID組成的表達式單元,還有關鍵字表達式單元:gateway,broadcast,less,greater以及算術表達式。

表達式單元之間可使用操做符" and / && / or / || / not / ! "進行鏈接,從而組成複雜的條件表達式。如"host foo and not port ftp and not port ftp-data",這表示篩選的數據包要知足"主機爲foo且端口不是ftp(端口21)和ftp-data(端口20)的包",經常使用端口和名字的對應關係可在linux系統中的/etc/service文件中找到。

另外,一樣的修飾符可省略,如"tcp dst port ftp or ftp-data or domain"與"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意義相同,都表示包的協議爲tcp且目的端口爲ftp或ftp-data或domain(端口53)。

使用括號"()"能夠改變表達式的優先級,但須要注意的是括號會被shell解釋,因此應該使用反斜線"\"轉義爲"\(\)",在須要的時候,還須要包圍在引號中。

 

使用案例

默認狀況下,直接啓動tcpdump將監視第一個網絡接口(非lo口)上全部流通的數據包。這樣抓取的結果會很是多,滾動很是快。

tcpdump

 

過濾主機

1

2

3

tcpdump -i eth1 host 192.168.1.1 -c 1000        #抓取主機192.168.1.1網絡接口上全部流過的1000個數據包

tcpdump -i eth1 src host 192.168.1.1 -c 1000        #指定源地址,192.168.1.1,抓取1000個數據包

tcpdump -i eth1 dst host 192.168.1.1 -c 1000        #指定目的地址,192.168.1.1,抓取1000個數據包

抓取全部通過eth1,目的或源地址是192.168.1.1的網絡數據

指定源地址,192.168.1.1

指定目的地址,192.168.1.1

 

過濾端口

1

2

3

tcpdump -i eth1 port 25 -c 1000       #抓取全部通過eth1,目的或源端口是25的網絡數據

tcpdump -i eth1 src port 25 -c 1000     #抓取全部通過eth1,目的端口是25的網絡數據

tcpdump -i eth1 dst port 25 -c 1000      #抓取全部通過eth1,源端口是25的網絡數據

抓取全部通過eth1,目的或源端口是25的網絡數據

指定源端口

指定目的端口

 

網絡過濾

1

2

3

tcpdump -i eth1 net 192.168 -c 1000

tcpdump -i eth1 src net 192.168 -c 1000

tcpdump -i eth1 dst net 192.168 -c 1000

 

協議過濾

1

2

3

4

5

tcpdump -i eth1 arp -c 1000

tcpdump -i eth1 ip -c 1000

tcpdump -i eth1 tcp -c 1000

tcpdump -i eth1 udp -c 1000

tcpdump -i eth1 icmp -c 1000

經常使用表達式

1

2

3

非 : ! or "not" (去掉雙引號) 

且 : && or "and" 

或 : || or "or"

Tcpdump + Wireshark 的完美組合實現:在 Linux 裏抓包,而後在Windows 裏分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap 

  • tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型

  • -i eth1 : 只抓通過接口eth1的包

  • -t : 不顯示時間戳

  • -s 0 : 抓取數據包時默認抓取長度爲68字節。加上-S 0 後能夠抓到完整的數據包

  • -c 100 : 只抓取100個數據包

  • dst port ! 22 : 不抓取目標端口是22的數據包

  • src net 192.168.1.0/24 : 數據包的源網絡地址爲192.168.1.0/24

  • -w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

 

抓取全部通過eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP數

1

tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'

 

抓取全部通過eth1,目標MAC地址是00:01:02:03:04:05的ICMP數據

1

tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

 

抓取全部通過eth1,目的網絡是192.168,但目的主機不是192.168.1.200的TCP數據

1

tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

 

高級過濾方式

首先了解如何從包頭過濾信息

1

2

3

4

5

proto[x:y]          : 過濾從x字節開始的y字節數。好比ip[2:2]過濾出三、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

 

  • 抓取源端口大於1024的TCP數據包

1

tcpdump -i eth1 'tcp[0:2] > 1024'

  • 大於600字節

1

tcpdump -i eth1 'ip[2:2] > 600'

  • 在網關能夠用下面的命令看看網絡中誰在使用traceroute

1

tcpdump -i eth1 'ip[8] < 5'

 

  • 只抓SYN包,第十四字節是二進制的00000010,也就是十進制的2

1

tcpdump -i eth1 'tcp[13] = 2'

  • 抓SYN, ACK (00010010 or 18)

1

tcpdump -i eth1 'tcp[13] = 18'

  • 抓SYN或者SYN-ACK

1

tcpdump -i eth1 'tcp[13] & 2 = 2'

  • 抓PSH-ACK

1

tcpdump -i eth1 'tcp[13] = 24'

  • 抓全部包含FIN標記的包(FIN一般和ACK一塊兒,表示幽會完了,回見)

1

tcpdump -i eth1 'tcp[13] & 1 = 1'

  • 抓RST

1

tcpdump -i eth1 'tcp[13] & 4 = 4'

  • 只抓SYN包

1

tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'

  • 抓SYN, ACK

1

tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

抓SMTP數據

1

tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'

抓SSH返回

1

tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'

  • 抓DNS請求數據

1

tcpdump -i eth1 udp dst port 53

系統測試

-c參數對於運維人員來講也比較經常使用,由於流量比較大的服務器,靠人工CTRL+C仍是抓的太多,甚至致使服務器宕機,因而能夠用-c參數指定抓多少個包。

1

time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null

上面的命令計算抓10000個SYN包花費多少時間,能夠判斷訪問量大概是多少。 

 

抓取主機10.37.63.255和主機10.37.63.61或10.37.63.9

tcpdump host 10.37.63.255 and (10.37.63.61 or 10.37.63.95)

抓取主機192.168.13.210除了和主機10.37.63.61以外全部主機通訊的數據包:

tcpdump -n host 10.37.63.255 and ! 10.37.63.61

抓取主機10.37.63.255除了和主機10.37.63.61以外全部主機通訊的ip包

tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61

 

抓取主機10.37.63.3發送的全部數據:

tcpdump -i en0 src host 10.37.63.3 (注意數據流向)

抓取主機10.37.63.3接收的全部數據:

tcpdump -i en0 dst host 10.37.63.3 (注意數據流向)

監視主機master一、與master二、master3之間通訊的數據包

tcpdump host master1 and \( master2 or master3 \)

抓取主機10.37.63.3全部在TCP 80端口的數據包:

tcpdump -i en0 host 10.37.63.3 and tcpp port 80

抓取HTTP主機10.37.63.3在80端口接收到的數據包:

tcpdump -i en0 host 10.37.63.3 and dst port 80

打印master4與任何其餘主機之間通訊的IP 數據包, 但不包括與master5之間的數據包.

tcpdump ip host master4 and not master5

抓取全部通過 en0,目的或源端口是 25 的網絡數據

tcpdump -i en0 port 25

#源端口
tcpdump -i en0 src port 25

#目的端口
tcpdump -i en0 dst port 25 網絡過濾

 

抓取全部通過 en0,網絡是 192.168上的數據包

tcpdump -i en0 net 192.168

tcpdump -i en0 src net 192.168
tcpdump -i en0 dst 192.168

tcpdump -i en0 net 192.168
tcpdump -i en0 net 192.168../24

 

協議過濾

tcpdump -i en0 arp

tcpdump -i en0 ip
tcpdump -i en0 tcp
tcpdump -i en0 udp

tcpdump -i en0 icmp

 

抓取全部通過 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 數據

技术分享

 

抓取全部通過 en0,目標 MAC 地址是 00:01:02:03:04:05 的 ICMP 數據

技术分享

抓取全部通過 en0,目的網絡是 192.168,但目的主機不是 192.168.1.200 的 TCP 數據

技术分享

 

只抓 SYN 包

技术分享

抓 SYN, ACK

技术分享

高級包頭過濾如前兩個的包頭過濾,首先了解如何從包頭過濾信息:

技术分享

  • 只抓SYN包

1

tcpdump -i eth1 'tcp[tcpflags] = tcp-s

  • 抓RST

1

tcpdump -i eth1 'tcp[13] & 4 = 4'

  • 抓SYN, ACK (00010010 or 18)

1

tcpdump -i eth1 'tcp[13] = 18'

  • 抓SYN或者SYN-ACK

1

tcpdump -i eth1 'tcp[13] & 2 = 2'

抓SMTP數據

1

tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'

SSH返回

1

tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'

 

獲取10.1.85.2110.1.85.19之間的通訊,使用命令注意轉義符號。

[root@centos daocoder]# tcpdump host 10.1.85.21 and \( 10.1.85.19\) -i ens5f0 -nn -c 10

抓 DNS 請求數據

技术分享

其餘-c 參數對於運維人員來講也比較經常使用,由於流量比較大的服務器,靠人工 CTRL+C 仍是抓的太多,因而能夠用-c 參數指定抓多少個包。

技术分享

經過tcpdump截獲主機www.baidu.com發送與接收全部的數據包

技術分享

 

獲取從10.1.85.21發來的10個數據包。

[root@localhost ~]# tcpdump src host 10.1.85.21 -c 10 -i ens5f1

 

監聽tcp(udp)端口。

[root@centos daocoder]# tcpdump tcp port 22 -c 10

 

獲取主機10.1.85.21和除10.1.85.19以外全部主機的通訊。

[root@centos daocoder]# tcpdump ip host 10.1.85.21 and ! 10.1.85.19 -c 10 -i any

若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

 

獲取從10.1.85.19且端口主機到10.1.85.21主機的通訊。

[root@centos daocoder]# tcpdump src host 10.1.85.19 and src port 48565 and dst host 10.1.85.

 

抓取包含10.10.10.122的數據包

  • tcpdump -i ens33 -vnn host 10.10.10.122

 

抓取包含10.10.10.0/24網段的數據包

  • tcpdump -i ens33 -vnn net 10.10.10.0/24
  • tcpdump -i ens33 -vnn net 10.10.10.0 mask 255.255.255.0

 

抓取包含端口22的數據包

  • tcpdump -i ens33 -vnn port 22

 

抓取udp協議的數據包

  • tcpdump -i ens33 -vnn udp

 

抓取icmp協議的數據包

  • tcpdump -i ens33 -vnn icmp

 

抓取arp協議的數據包

  • tcpdump -i ens33 -vnn arp

 

抓取ip協議的數據包

  • tcpdump -i ens33 -vnn ip proto ip
  • tcpdump -i ens33 -vnn ip

 

抓取源ip是10.10.10.122的數據包

  • tcpdump -i ens33 -vnn src host 10.10.10.122

 

抓取目標ip是10.10.10.122的數據包

  • tcpdump -i ens33 -vnn dst host 10.10.10.122

 

抓取源端口是22的數據包

  • tcpdump -i ens33 -vnn src port 22

 

抓取源ip是10.10.10.253且目的端口是22的數據包

  • tcpdump -i ens33 -vnn src host 10.10.10.122 and dst port 22

 

抓取源ip是10.10.10.122或者端口是22的數據包

  • tcpdump -i ens33 -vnn src host 10.10.10.122 or port 22

 

抓取源ip是10.10.10.122且端口不是22的數據包

  • tcpdump -i ens33 -vnn src host 10.10.10.122 and not port 22

 

想要截獲主機210.27.48.1 和主機210.27.48.2或210.27.48.3的通訊,使用命令(注意:括號前的反斜槓是必須的):

#tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

 

抓取源ip是10.10.10.2且端口是22,或源ip是10.10.10.65且目的端口是80的數據包。
tcpdump -i ens33 -vnn \(src host 10.10.10.2 and port 22 \) or \(src ip host 10.10.10.65 and prot 80\)
 

抓取源ip是10.10.10.59且目的端口是22,或者源ip是10.10.10.68且目的端口是80的數據包
tcpdump -i ens33 -vnn '\(src host 10.10.10.59 and dst port 22\) 'or '\(src host 10.10.10.68 and dst prot 80\)'
 

把抓取的數據包記錄存到/tmp/fill文件中,當抓取100個數據包後就退出程序

  • tcpdump -i ens33 -c 100 -w /tmp/fill

 

從/tmp/fill記錄中讀取tcp協議的數據包。

  • tcpdump -i ens33 -r /tmp/fill tcp

 

從/tmp/fill記錄中讀取包含10.10.10.58的數據包。

  • tcpdump -i ens33 -r /tmp/fill host 10.10.10.58

 

過濾數據包類型是多播而且端口不是2二、不是icmp協議的數據包。

  • tcpdump -i ens33 ether multicast and not port 22 and 'not icmp'

 

過濾協議類型是ip而且目標端口是22的數據包

  • tcpdump -i ens33 -n ip and dst prot 22
  • tcpdump可識別的關鍵字包括ip、igmp、tcp、udp、icmp、arp等

 

過濾抓取mac地址是某個具體的mac地址、協議類型是arp的數據包

  • tcpdump -i ens33 ether src host 00:0c:29:2f:a7:50 and arp

 

過濾抓取協議類型是ospf的數據包

  • tcpdump -i ens33 ip proto ospf
  • 直接在tcpdump中使用的協議關鍵字只有ip、igmp、tcp、udp、icmp、arp等,其餘的傳輸層協議沒有可直接識別的關鍵字
  • 可使用關鍵字proto或者ip proto加上在/etc/protocols中可以找到的協議或者相應的協議編號進行過濾。
  • 更加高層的協議,例如http協議須要用端口號來過濾

 

過濾長度大於200字節的報文

  • tcpdump -i ens33 greater 200

 

過濾協議類型爲tcp的數據包

  • tcpdump tcp

 

過濾出廣播包和多播包

tcpdump -i ens33 -c 1 ip multicast and ip broadcast
tcpdump -i ens33 -c 1 -vnn 'ether[0] & 1 != 0'


保證目標地址最後一位不爲0,只有目標地址最後一位爲0,與運算以後纔會爲0,不然目標地址是低位爲0高位不爲0的狀況,也就是廣播包或者多播包。
[root@localhost ~]# tcpdump -i ens33 -c 1 -vnn 'ether[0] & 1 != 0'
 

查找端口號大於23的全部tcp數據流

  • tcpdump -i ens33 -c 1 -vnn 'tcp[0:2] & 0xffff > 0x0017 '

 

監視指定網絡接口的數據包

tcpdump -i eth1

若是不指定網卡,默認tcpdump只會監視第一個網絡接口,如eth0。

 

監視指定主機的數據包,例如全部進入或離開longshuai的數據包

tcpdump host longshuai

想要截獲全部210.27.48.1 的主機收到的和發出的全部的分組:

#tcpdump host 210.27.48.1

 

打印helios<-->hot或helios<-->ace之間通訊的數據包

tcpdump host helios and \( hot or ace \)

 

打印ace與任何其餘主機之間通訊的IP數據包,但不包括與helios之間的數據包

tcpdump ip host ace and not helios

 

截獲主機hostname發送的全部數據

tcpdump src host hostname

 

監視全部發送到主機hostname的數據包

tcpdump dst host hostname

 

監視指定主機和端口的數據包

tcpdump tcp port 22 and host hostname

對本機的udp 123端口進行監視(123爲ntp的服務端口)

tcpdump udp port 123

監視指定網絡的數據包,如本機與192.168網段通訊的數據包,"-c 10"表示只抓取10個包

tcpdump -c 10 net 192.168

 

打印全部經過網關snup的ftp數據包(注意,表達式被單引號括起來了,這能夠防止shell對其中的括號進行錯誤解析)

shell> tcpdump 'gateway snup and (port ftp or ftp-data)'

抓取ping包

[root@server2 ~]# tcpdump -c 5 -nn -i eth0 icmp 

抓取到本機22端口包

[root@server2 ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

 

從全部網卡中捕獲數據包

運行下面命令來從全部網卡中捕獲數據包:

$ tcpdump -i any

 

從指定網卡中捕獲數據包

要從指定網卡中捕獲數據包,運行:

$ tcpdump -i eth0

 

將捕獲的包寫入文件

使用 -w 選項將全部捕獲的包寫入文件:

$ tcpdump -i eth1 -w packets_file

 

讀取以前產生的 tcpdump 文件

使用下面命令從以前建立的 tcpdump 文件中讀取內容:

$ tcpdump -r packets_file

 

獲取更多的包信息,而且以可讀的形式顯示時間戳

要獲取更多的包信息同時以可讀的形式顯示時間戳,使用:

$ tcpdump -ttttnnvvS

 

查看整個網絡的數據包

要獲取整個網絡的數據包,在終端執行下面命令:

$ tcpdump net 192.168.1.0/24

 

根據 IP 地址查看報文

要獲取指定 IP 的數據包,無論是做爲源地址仍是目的地址,使用下面命令:

$ tcpdump host 192.168.1.100

 

要指定 IP 地址是源地址或是目的地址則使用:

$ tcpdump src 192.168.1.100

$ tcpdump dst 192.168.1.100

 

查看某個協議或端口號的數據包

要查看某個協議的數據包,運行下面命令:

$ tcpdump ssh

 

要捕獲某個端口或一個範圍的數據包,使用:

$ tcpdump port 22

$ tcpdump portrange 22-125

 

咱們也能夠與 src 和 dst 選項連用來捕獲指定源端口或指定目的端口的報文。

咱們還可使用「與」 (and&&)、「或」 (or|| ) 和「非」(not!) 來將兩個條件組合起來。當咱們須要基於某些條件來分析網絡報文是很是有用。

使用「與」

可使用 and 或者符號 && 來將兩個或多個條件組合起來。好比:

$ tcpdump src 192.168.1.100 && port 22 -w ssh_packets

 

使用「或」

「或」會檢查是否匹配命令所列條件中的其中一條,像這樣:

$ tcpdump src 192.168.1.100 or dst 192.168.1.50 && port 22 -w ssh_packets

$ tcpdump port 443 or 80 -w http_packets

 

使用「非」

當咱們想表達不匹配某項條件時可使用「非」,像這樣:

$ tcpdump -i eth0 src port not 22

這會捕獲 eth0 上除了 22 號端口的全部通信。

 

實例:

一、截獲全部210.27.48.1 的主機收到的和發出的全部的分組:

#tcpdump host 210.27.48.1

 

二、截獲主機210.27.48.1 和主機210.27.48.2或210.27.48.3的通訊,使用命令(注意:括號前的反斜槓是必須的):

#tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

 

三、獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

 

四、獲取主機192.168.228.246接收或發出的ssh包,而且不轉換主機名使用以下命令:

#tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp

 

五、獲取主機192.168.228.246接收或發出的ssh包,並把mac地址也一同顯示:

# tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn

 

六、過濾的是源主機爲192.168.0.1與目的網絡爲192.168.0.0的報頭:

tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

 

七、過濾源主機物理地址爲XXX的報頭:

tcpdump ether src 00:50:04:BA:9B and dst……

 

八、過濾源主機192.168.0.1和目的端口不是telnet的報頭,並導入到tes.t.txt文件中:

Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt

 

九、打印全部進入或離開主機 sundown 的數據包.

tcpdump host sundown

 

十、打印主機 helios 與主機 hot 或者與主機 ace 之間通訊的數據包

tcpdump host helios and \( hot or ace \)

 

十一、打印主機 ace 與 任何其餘主機之間通訊的IP 數據包, 但不包括與 helios之間的數據包.

tcpdump ip host ace and not helios

 

十二、打印本地主機與Berkeley網絡上的主機之間的全部通訊數據包.

tcpdump net ucb-ether

 

1三、打印全部源地址或目標地址是本地主機的 IP 數據包(若是本地網絡經過網關連到了另外一網絡, 則另外一網絡並不能算做本地網絡. localnet 在實際使用時要真正替換成本地網絡的名字.

tcpdump ip and not net localnet

 

1四、打印長度超過576字節, 而且網關地址是 snup 的 IP 數據包

tcpdump 'gateway snup and ip[2:2] > 576'

 

1五、參數分析 :-i eth3 在eth3上抓包; -s 84每一個包最多記錄84字節; -G 60 每60秒就在打開一個文件記錄;

-z  ./tcp-add.sh配合-G使用,每次記錄完一個文件後執行./tcp-add.sh腳本(後面講這個腳本)

-w %F,%T.pcap 輸出,文件名有時間組成%F表示年月日,%T表示時分秒,如2012-07-16,12:54:54.pcap

再來看這個tcp-add.sh,這個腳本十分簡單,實際就是將剛纔的記錄完的pcap文件名寫到ready.txt文件中。

tcpdump -i eth3 -s 84 -G 60 -z ./tcp-add.sh -w %F,%T.pcap
#!/bin/bash
 # 做爲tcpdump的-z參數使用
 # 將已經存儲完的pcap文件名加入ready.txt等待處理</code>
echo $* &gt;&gt; ready.txt

 

1六、一個TCP包中包含多個mysql協議包,一個協議包就是一條mysql記錄。

使用抓包工具開打tcpdump_mysql.ret 文件

# tcpdump -n -nn -tttt -i eth1 -s 65535 'port 3306' -w tcpdump_mysql.ret -C 100

 

1七、使用tcpdump來抓取執行的sql語句。

# tcpdump -i eth1 -s 0 -l -w - dst  port 3306 | strings

 

1八、ARP包的tcpdump輸出信息

使用命令:

#tcpdump arp

獲得的輸出結果是:

22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)

 

22:32:42是時間戳 802509是ID號, eth0 >代表從主機發出該分組,arp代表是ARP請求包, who-has route tell ICE代表是主機ICE請求主機route的MAC地址。 0:90:27:58:af:1a 是主機 ICE的MAC地址。

 

1九、對網卡eth0進行抓包,而且只抓全部進入和離開網絡地址59.111.243.17的包,且源端口號爲80。

tcpdump –i eth0 net 59.111.243.17 and srcport 80

 

20、對網卡eth0進行抓包,而且只抓全部進入和離開網絡地址59.111.243.17的包,抓包個數指定爲10000個,並寫入temp.pcap。

tcpdump -i eth0 net 59.111.243.17 -c 10000 -w temp.pcap

 

2一、Sql語句是經過網絡以文本方式傳輸到mysql服務器端的。所以咱們徹底也能夠經過tcpdump這個工具把全部的sql語句捕獲到。

tcpdump -i eth0 -A -s 3000 port 3306 -w sql.log

 

2二、若是想要獲取主機210.27.48.1接收或發出的telnet包,使用命令。

tcpdump tcp port 23 host 210.27.48.1

 

2三、後臺抓包, 控制檯退出也不會影響,使用命令。

nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & 

讓這個進程在後臺運行

tcpdump tcp port 5432 -w ./postgres.cap &

 

2四、

 

2五、

 

2六、

 

2七、網卡eth0進行抓包,而且只抓全部進入和離開網絡地址59.111.243.17的包。

tcpdump -i eth0 net 59.111.243.17

 

解析 

一、tcpdump對 arp/rarp包的輸出信息中會包含請求類型及該請求對應的參數. 顯示格式簡潔明瞭. 如下是從主機rtsg到主機csam的 rlogin(遠程登陸)過程開始階段的數據包樣例:

arp who-has csam tell rtsg
arp reply csam is-at CSAM

第一行表示: rtsg發送了一個 arp數據包(nt:向全網段發送, arp數據包)以詢問 csam的以太網地址,csam以她本身的以太網地址作了迴應(在這個例子中, 以太網地址以大寫的名字標識, 而internet地址(即ip地址)以所有的小寫名字標識).

 

二、若是使用 tcpdump -n, 能夠清晰看到以太網以及 ip地址而不是名字標識:

arp who-has 128.3.254.6 tell 128.3.254.68
arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

 

三、若是咱們使用 tcpdump -e, 則能夠清晰的看到第一個數據包是全網廣播的, 而第二個數據包是點對點的:

RTSG Broadcast 0806  64: arp who-has csam tell rtsg
CSAM RTSG 0806  64: arp reply csam is-at CSAM

第一個數據包代表:以 arp包的源以太地址是RTSG, 目標地址是全以太網段, type域的值爲16進制0806(表示ETHER_ARP即arp包的類型標識).包的總長度爲64字節.

 

四、TCP 數據包

一般tcpdump對tcp數據包的顯示格式以下:

src > dst: flags data-seqno ack window urgent options

src 和 dst 是源和目的 IP地址以及相應的端口. flags 標誌由S(SYN), F(FIN), P(PUSH, R(RST)等組成,

單獨一個.表示沒有flags標識. 數據段順序號(Data-seqno)描述了此包中數據所對應序列號空間中的一個位置.

ack描述的是同一個鏈接,同一個方向,下一個本端應該接收的(對方應該發送的)數據片斷的順序號.

window是本端可用的數據接收緩衝區的大小(也是對方發送數據時需根據這個大小來組織數據).

urg(urgent) 表示數據包中有緊急的數據. options 描述了tcp的一些選項, 這些選項都用尖括號來表示(如 <mss 1024>).

src, dst 和 flags 這三個域老是會被顯示. 其餘域的顯示與否依賴於tcp協議頭裏的信息.

 

五、下面是一個從主機trsg到csam的一個rlogin應用登陸的開始階段.

rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
rtsg.1023 > csam.login: . ack 1 win 4096
rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
csam.login > rtsg.1023: . ack 2 win 4096
rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

第一行表示有一個數據包從rtsg主機的tcp端口1023發送到了csam主機的 tcp端口login上. S表示設置了 SYN標誌. 包的順序號是768512, 而且沒有包含數據.

若是包含有數據,那麼數據的表示格式爲: first:last(nbytes), 其含義是此包中數據的順序號從first開始直到last結束,不包括last. 而且總共包含nbytes的用戶數據.

沒有捎帶應答即ack, 可用的接受窗口的大小爲4096bytes, 而且請求端(rtsg)的最大可接受的數據段大小是1024字節.

主機csam 向主機rtsg 回覆了基本相同的 SYN數據包, 其區別只是多了一個 piggy-backed ack(nt:捎帶回的ack應答, 針對rtsg的SYN數據包).

rtsg 一樣針對csam的 SYN數據包回覆了一 ACK數據包做爲應答. .的含義就是此包中沒有標誌被設置. 因爲此應答包中不含有數據, 因此包中也沒有數據段序列號.

提醒! 此ACK數據包的順序號只是一個小整數1. 有以下解釋:tcpdump對於一個tcp鏈接上的會話, 只打印會話兩端的初始數據包的序列號,其後相應數據包只打印出與初始包序列號的差別.即初始序列號以後的序列號, 可被看做此會話上當前所傳數據片斷在整個要傳輸的數據中的’相對字節’位置(nt:雙方的第一個位置都是1, 即’相對字節’的開始編號). -S將覆蓋這個功能,使數據包的原始順序號被打印出來.

第六行的含義爲:主機rtsg 向 主機csam發送了19字節的數據(字節的編號爲2到20,傳送方向爲rtsg到csam). 包中設置了 PUSH標誌.

在第7行,主機csam迴應道, 她已經從主機rtsg中收到了21如下的字節, 但不包括21編號的字節. 這些字節存放在主機csam的socket的接收緩衝中, 相應地,csam的接收緩衝窗口大小會減小19字節(nt:能夠從第5行和第7行win屬性值的變化看出來). csam在第7行這個包中也向rtsg發送了一個字節. 在第8行和第9行, csam 繼續向rtsg 分別發送了兩個只包含一個字節的數據包, 而且這個數據包帶PUSH標誌.

若是頭部含有虛假的屬性信息(好比其長度屬性其實比頭部實際長度長或短), tcpdump會爲該頭部顯示[bad opt].

若是頭部的長度告訴咱們某些選項(nt | rt:從下文來看, 指tcp包的頭部中針對ip包的一些選項, 回頭再翻)會在此包中,而真正的IP(數據包的長度又不夠容納這些選項, tcpdump會顯示[bad hdr length].

 

六、安裝tshark抓包命令:

[root@hao-01 ~]# yum install -y wireshark

tshark 查看指定網卡,80端口的訪問狀況:

tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

 

七、解決tcpdump "drop by kernel" 問題

tcpdump出現丟包 (網卡上drop計數沒有

增長,網卡沒有丟包),退出tcpdump時顯示一下信息:


579204 packets captured

579346 packets received by filter

142 packets dropped by kernel

        其中「captured」的計數指的是應用層捕獲到的數據,「received by filter」和「dropped by kernel」的計數由內核維護,應用層經過getsockopt來獲取。收到一個包,「received by filter」會加1,若是sock的接收buffer被填滿時,則把這個數據包丟棄,將「dropped by kernel」加1。

丟包緣由:
通過google以及分析,形成這種丟包的緣由是因爲libcap抓到包後,tcpdump上層沒有及時的取出,致使libcap緩衝區溢出,從而覆蓋了未處理包,此處即顯示爲dropped by kernel,注意,這裏的kernel並非說是被linux內核拋棄的,而是被tcpdump的內核,即libcap拋棄掉的

緣由:Tcpdump 經過網絡接口捕獲原始數據包,數據包必須解析和執行過濾條件,執行過濾條件需

要耗費一些時間,所以傳入數據包必須排隊(數據緩存)進行處理,當數據包過多時(處理速度跟不

上緩存速度),緩存區就會被撐爆(緩存區大小默認是2M),此時就會丟棄新近的數據包,直到緩存

區有空間保存新到數據。

例如服務器給客戶端發大量數據,Send的頻率很高,
那麼就有可能在Send時發生錯誤(緣由多是又多種,多是程序處理邏輯問題,多線程同步問題,緩衝區溢出問題等等)
若是沒有對Send失敗作處理重發數據,那麼客戶端收到的數據就會比理論應該收到的少,就會形成丟數據,丟包的現象。
這種現象,其實本質上來講不是丟包,也不是丟數據,只是由於程序處理有錯誤,致使有些數據沒有成功地被socket發送出去

 

解決方案:增大緩存區的大小。

1)tcpdump命令可使用 -B 參數來修改,單位是KiB。

2)libpap庫中提供函數pcap_set_buffer_size() 。

解決方法:
 根據以上分析,能夠經過改善tcpdump上層的處理效率來減小丟包率,下面的幾步根據須要選用,每一步都能減小必定的丟包率
 1. 最小化抓取過濾範圍,即經過指定網卡,端口,包流向,包大小減小包數量
 2. 添加-n參數,禁止反向域名解析
 3. 添加-B參數,加大OS capture buffer size
 4. 指定-s參數, 最好小於1000
 5. 將數據包輸出到cap文件
 6. 用sysctl修改SO_REVBUF參數,增長libcap緩衝區長 度(會增長延遲) : /proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_ma

七、查看鏈接數

# 查看nf_conntrack表最大鏈接數

$ cat /proc/sys/net/netfilter/nf_conntrack_max

65536

# 查看nf_conntrack表當前鏈接數

$ cat /proc/sys/net/netfilter/nf_conntrack_count

7611

當前鏈接數遠沒有達到跟蹤表最大值,排除這個因素。

 

八、若是確認服務器因鏈接跟蹤表溢出而開始丟包,首先須要查看具體鏈接判斷是否正遭受DOS攻擊,若是是正常的業務流量形成,能夠考慮調整nf_conntrack的參數:

nf_conntrack_max決定鏈接跟蹤表的大小,默認值是65535,能夠根據系統內存大小計算一個合理值:CONNTRACK_MAX = RAMSIZE(in bytes)/16384/(ARCH/32),如32G內存能夠設置1048576;

nf_conntrack_buckets決定存儲conntrack條目的哈希表大小,默認值是nf_conntrack_max的1/4,延續這種計算方式:BUCKETS = CONNTRACK_MAX/4,如32G內存能夠設置262144;

nf_conntrack_tcp_timeout_established決定ESTABLISHED狀態鏈接的超時時間,默認值是5天,能夠縮短到1小時,即3600。

修改鏈接數大小 :

$ sysctl -w net.netfilter.nf_conntrack_max=1048576
$ sysctl -w net.netfilter.nf_conntrack_buckets=262144
$ sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600

 

九、

 

十、

 

 

參考  : 

經過實例學習 tcpdump 命令   : https://mp.weixin.qq.com/s/VtUWwXYUg96EmFKiHTkrIA

一文搞定tcpdump基本用法 : https://blog.csdn.net/chinaltx/article/details/87469933

 

tcpdump抓包分析,快速完成接口調試 : https://blog.51cto.com/14010723/2300392

相關文章
相關標籤/搜索