免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15634 | 回复: 4
打印 上一主题 下一主题

[新手入门] tcpdump命令详解(整理) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-04 09:24 |只看该作者 |倒序浏览
今天门户遇到了超量的链接,整理了一个tcpdump的命令说明,留作备用
簡易使用法: (為了抓到隱藏在 Code 裡的語法, 直接看port有傳什麼資料進來)
  • sudo tcpdump -nnnX  -s 1500  port 3306
  • sudo tcpdump -aXXX port 3306 | grep denied

-s : 抓比較長的 data 做一筆記錄
tcpdump採用命令行方式,它的命令格式為:
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 檔案名 ]
[ -i 網路介面 ] [ -r 檔案名] [ -s snaplen ]
[ -T 類型 ] [ -w 檔案名 ] [運算式 ]
1. tcpdump的選項介紹
  • -a     將網路位址和廣播地址轉變成名字;
  • -d     將匹配資訊包的代碼以人們能夠理解的彙編格式給出;
  • -dd   將匹配資訊包的代碼以c語言程式段的格式給出;
  • -ddd 將匹配資訊包的代碼以十進位的形式給出;
  • -e     在輸出行列印出資料連結層的頭部資訊;
  • -f       將外部的Internet位址以數位的形式列印出來;
  • -l       使標準輸出變為緩衝行形式;
  • -n      不把網路位址轉換成名字;
  • -t       在輸出的每一行不列印時間戳;
  • -v       輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務類型的資訊;
  • -vv     輸出詳細的報文資訊;
  • -c      在收到指定的包的數目後,tcpdump就會停止;
  • -F      從指定的文件中讀取運算式,忽略其他的運算式;
  • -i       指定監聽的網路介面;
  • -r       從指定的檔中讀取包(這些包一般通過-w選項產生);
  • -w      直接將包寫入檔中,並不分析和列印出來;
  • -T      將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網路管理協定;)

2. tcpdump的運算式介紹
運算式是一個正則運算式,tcpdump利用它作為過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網路上所有的資訊包將會被截獲。
在運算式中一般如下幾種類型的關鍵字,一種是關於類型的關鍵字,主要包括host,net,port, 例如 host 210.27.48.2,指明
210.27.48.2是一台主機,net 202.0.0.0 指明202.0.0.0是一個網路位址,port 23
指明埠號是23。如果沒有指定類型,缺省的類型是host。
第二種是確定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src,
這些關鍵字指明了傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net
202.0.0.0 指明目的網路位址是202.0.0.0 。如果沒有指明方向關鍵字,則缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括fddi,ip
,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分散式光纖資料介面網路)上的特定的網路協定,實際上它是"ether"的別
名,fddi和ether具有類似的源位址和目的地址,所以可以將fddi協議包當作ether的包進行處理和分析。其他的幾個關鍵字就是指明了監聽的包
的協定內容。如果沒有指定任何協議,則tcpdump將會監聽所有協定的資訊包。
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||';
這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要,下面舉幾個例子來說明。
(1) 想要截獲所有210.27.48.1 的主機收到的和發出的所有的資料包:
        #tcpdump host 210.27.48.1
(2) 想要截獲主機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)
(3) 如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
        #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
(4)如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令:
        #tcpdump tcp port 23 and host 210.27.48.1
3. tcpdump 的輸出結果介紹
下面我們介紹幾種典型的tcpdump命令的輸出資訊
(1) 資料連結層頭信息
使用命令#tcpdump --e host ice
ice 是一台裝有linux的主機,她的MAC位址是0:90:27:58:AF:1A
H219是一台裝有SOLARIC的SUN工作站,它的MAC位址是8:0:20:79:5B:46;上一條命令的輸出結果如下所示:
                21:50:12.847509 eth0  ice.
        telnet 0:0(0) ack 22535 win 8760 (DF)
       
分析:21:50:12是顯示的時間, 847509是ID號,eth0 表示從網路周邊設備發送資料包, 8:0:20:79:5b:46是主機H219的MAC位址,它表明是從源位址H219發來的資料包.
0:90:27:58:af:1a是主機ICE的MAC位址,表示該資料包的目的地址是ICE . ip 是表明該資料包是IP資料包,60
是數據包的長度, h219.33357 > ice.telnet
表明該資料包是從主機H219的33357埠發往主機ICE的TELNET(23)埠. ack 22535表明對序列號是222535的包進行回應.
win 8760表明發送窗口的大小是8760.

(2) 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
分析: 22:32:42是時間戳, 802509是ID號, eth0 >表明從主機發出該資料包, arp表明是ARP請求包,
who-has route tell ice表明是主機ICE請求主機ROUTE的MAC位址。
0:90:27:58:af:1a是主機ICE的MAC位址。

(3) TCP包的輸出資訊
用TCPDUMP捕獲的TCP包的一般輸出資訊是:
                src > dst: flags data-seqno ack window urgent options
        src > dst:表明從源位址到目的地址,
        flags是TCP包中的標誌資訊,
        S 是SYN標誌,
        F (FIN),
        P (PUSH),
        R (RST) "." (沒有標記);
        data-seqno是資料包中的資料的順序號,
        ack是下次期望的順序號,
        window是接收緩存的視窗大小,
        urgent表明資料包中是否有緊急指針.
        Options是選項.
       

(4) UDP包的輸出資訊
用TCPDUMP捕獲的UDP包的一般輸出資訊是:
        route.port1 > ice.port2: udp lenth
UDP十分簡單,上面的輸出行表明從主機ROUTE的port1埠發出的一個UDP資料包到主機ICE的port2埠,類型是UDP, 包的長度是lenth
简体版:
tcpdump采用命令行方式,它的命令格式为:
  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
          [ -T 类型 ] [ -w 文件名 ] [表达式 ]
  1. tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程
调用)和snmp(简单       网络管理协议;)
  2. tcpdump的表达式介绍
   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
被截获。
   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,
net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是
host.
   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
缺省是src or dst关键字。
   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e
ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
监听所有协议的信息包。
   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
说明。
   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1
   (2) 想要截获主机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 \)
   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 and host 210.27.48.1
  3. tcpdump 的输出结果介绍
   下面我们介绍几种典型的tcpdump命令的输出信息
   (1) 数据链路层头信息
   使用命令#tcpdump --e host ice
   ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
   H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条
命令的输出结果如下所示:
21:50:12.847509 eth0 ; ice.
telne
t 0:0(0) ack 22535 win 8760 (DF)
  分析:21:50:12是显示的时间, 847509是ID号,eth0 ;表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它
表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的
目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 >; ice.
telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535
表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
  (2) 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表明是
ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5
8:af:1a是主机ICE的MAC地址。
  (3) TCP包的输出信息
   用TCPDUMP捕获的TCP包的一般输出信息是:
  src >; dst: flags data-seqno ack window urgent options
  src >; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F
IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options是选项.
  (4) UDP包的输出信息
   用TCPDUMP捕获的UDP包的一般输出信息是:
  route.port1 >; ice.port2: udp lenth
  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP, 包的长度是lenth
号称最详细的说明
第一种是关于类型的关键字,主要包括host,net,port, 例如 host
210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port
23 指明端口号是23。如果没有指定类型,缺省的类型是host.
第二种是确定传输方向的关键字,主要包括src , dst ,dst
or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2
,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0
。如果没有指明方向关键字,则缺省是src or dst关键字。
第三种是协议的关键字,主要包括
fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定
的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和
分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是
'not ' '! ', 与运算是'and','&&';或运算 是'or'
,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
                       0000 0000 0080 0000 1007 cf08 0900 0000
                       0e80 0000 902b 4695 0980 8701 0014 0002
                       000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
                       ffff 0060 0004 ffff ffff ffff ffff ffff
                       0452 ffff ffff 0000 e85b 6d85 4008 0002
                       0640 4d41 5354 4552 5f57 4542 0000 0000
                       0000 00
使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
使用-c参数指定要监听的数据包数量,
使用-w参数指定将监听到的数据包写入文件中保存
A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
B想要截获主机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 \)
C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
# tcpdump udp port 123
F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname
G 下面的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname
H  我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0 gateway Gatewayname
I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
#tcpdump -i eth0 host hostname and port 80
J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截获主机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 \)
L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
 #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
 #tcpdump tcp port 23 host 210.27.48.1
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
#tcpdump –i eth0 host hostname and dst port 80  目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80  源端口是80  一般是提供http的服务的主机
如果条件很多的话  要在条件之前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
如果在ethernet 使用混杂模式 系统的日志将会记录
May  7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May  7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May  7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump
对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参
数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
这些已经够用的了。
学习的话有中文手册:
名称(NAME)
tcpdump-转储网络上的数据流
总览(SYNOPSIS)
tcpdump[-adeflnNOpqStvx][-ccount][-Ffile]
[-iinterface][-rfile][-ssnaplen]
[-Ttype][-wfile][expression]
描述(DESCRIPTION)
Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.
对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限.
对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限.
对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.
对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.
对于BSD:你必须有/dev/bpf*的读访问权限.
选项(OPTIONS)
-a
试着把网络和广播地址转换成名称.
-c
当收到count报文后退出.
-d
把编译好的报文匹配模板(packet-matchingcode)翻译成可读形式,传往标准输出,然后退出.
-dd
把报文匹配模板(packet-matchingcode)以C程序片断的形式输出.
-ddd
把报文匹配模板(packet-matchingcode)以十进制数形式输出(前面加上总数).
-e
每行都显示链路层报头.
-f
用数字形式显示'外部的'互联网地址,而不是字符形式(这个选项用来绕开脑壳坏光的SUN黄页服务器的问题---一般说来它翻译外部网络数字地址的时候会长期挂起).
-F
把file的内容用作过滤表达式.忽略命令行上的表达式.
-i
监听interface.如果不指定接口,tcpdump在系统的接口清单中,寻找号码最小,已经配置好的接口(loopback除外).选中的时候会中断连接.
-l
行缓冲标准输出.可用于捕捉数据的同时查看数据.例如,
``tcpdump-l|teedat''or``tcpdump-l>dat&tail-fdat''.
-n
别把地址转换成名字(就是说,主机地址,端口号等)
-N
不显示主机名字中的域名部分.例如,如果使用这个选项,tcpdump只显示``nic'',而不是``nic.ddn.mil''.
-O
禁止运行报文匹配模板的优化器.只有当你怀疑优化器有bug时才有用.
-p
禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而处于promiscuous模式;因此,'-p'不能作为`etherhost{local-hw-addr}或etherbroadcast'的简写.
-q
快速输出.显示较少的
协议
信息,输出行会短一点点.
-r
从file中读入数据报(文件是用-w选项创建的).如果file是``-'',就读标准输入.
-s
从每个报文中截取snaplen字节的数据,而不是缺省的68(如果是SunOS的NIT,最小值是96).68个字节适用于IP,ICMP,TCP和UDP,但是有可能截掉名字服务器和NFS报文的
协议
信息(见下面).输出时如果指定``[|proto]'',tcpdump可以指出那些捕捉量过小的数据报,这里的proto是截断发生处的
协议
层名称.注意,采用更大的捕捉范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢失.你应该把snaplen设的尽量小,只要能够容纳你需要的
协议
信息就可以了.
-T
把通过"expression"挑选出来的报文解释成指定的type.目前已知的类型有:rpc(远程过程调用RemoteProcedureCall),rtp(实时应用
协议
Real-TimeApplicationsprotocol),rtcp(实时应用控制
协议
Real-TimeApplicationscontrolprotocol),vat(可视音频工具VisualAudioTool),和wb(分布式白板distributedWhiteBoard).
-S
显示绝对的,而不是相对的TCP序列号.
-t
禁止显示时戳标志.
-tt
显示未格式化的时戳标志.
-v
(稍微多一点)繁琐的输出.例如,显示IP数据报中的生存周期和服务类型.
-vv
更繁琐的输出.例如,显示NFS应答报文的附加域.
-w
把原始报文存进file,而不是分析和显示.它们可以以后用-r选项显示.如果file是``-'',就写往标准输出.
-x
以16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.
expression
用来选择要转储的数据报.如果没有指定expression,就转储网络的全部报文.否则,只转储相对expression为`true'的数据报.
expression一个或多个原语(primitive)组成.原语通常由一个标识(id,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:
type
类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,`hostfoo',`net128.3',`port20'.如果不指定类型修饰子,就使用缺省的host.
dir

向修饰子指出相对于标识的传输方向(数据是传入还是传出标识).可以使用的方向有src,dst,srcordst和srcanddst.例
如,`srcfoo',`dstnet128.3',`srcordstportftp-data'.如果不指定方向修饰子,就使用缺省的
srcordst.对于`null'链路层(就是说象slip之类的点到点
协议
),用inbound和outbound修饰子指定所需的传输方向.
proto
协议
修饰子要求匹配指定的
协议
.可以使用的
协议
有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp和udp.例如,`ethersrcfoo',`arpnet128.3',`tcpport21'.如果不指定
协议
修饰子,就使用所有符合类型的
协议
.例如,`srcfoo'指`(ip或arp或rarp)srcfoo'(注意后者不符合语法),`netbar'指`(ip或arp或rarp)netbar',`port53'指`(tcp或udp)port53'.
[`fddi'实际上是`ether'的别名;分析器把它们视为``用在指定网络接口上的数据链路层.''FDDI报头包含类似于以太
协议
的源目地址,而且通常包含类似于以太
协议
的报文类型,因此你可以过滤FDDI域,就象分析以太
协议
一样.FDDI报头也包含其他域,但是你不能在过滤器表达式里显式描述.]
作为上述的补充,有一些特殊的`原语'关键字,它们不同于上面的模式:gateway,broadcast,less,greater和数学表达式.这些在后面有叙述.

复杂的过滤器表达式可以通过and,or和not连接原语来组建.例如,`hostfooandnotportftpandnotportftp-
data'.为了少敲点键,可以忽略相同的修饰子.例如,`tcpdstportftporftp-dataordomain'实际上就是
`tcpdstportftportcpdstportftp-dataortcpdstportdomain'.
允许的原语有:
dsthosthost
如果报文中IP的目的地址域是host,则逻辑为真.host既可以是地址,也可以是主机名.
srchosthost
如果报文中IP的源地址域是host,则逻辑为真.
hosthost
如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:
iphosthost
它等价于:
etherproto\ipandhosthost
如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.
etherdstehost
如果报文的以太目的地址是ehost,则逻辑为真.Ehost既可以是名字(/etc/ethers里有),也可以是数字(有关数字格式另见ethers(3N)).
ethersrcehost
如果报文的以太源地址是ehost,则逻辑为真.
etherhostehost
如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.
gatewayhost
如果报文把host当做网关,则逻辑为真.也就是说,报文的以太源或目的地址是host,但是IP的源目地址都不是host.host必须是个主机名,而且必须存在/etc/hosts和/etc/ethers中.(一个等价的表达式是
etherhostehostandnothosthost
对于host/ehost,它既可以是名字,也可以是数字.)
dstnetnet
如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存在/etc/networks中),也可以是网络号.(详见networks(4)).
srcnetnet
如果报文的IP源地址属于网络号net,则逻辑为真.
netnet
如果报文的IP源地址或目的地址属于网络号net,则逻辑为真.
netnetmaskmask
如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.
netnet/len
如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len.本原语可以用src或dst修饰.
dstportport
如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一个数字,也可以是/etc/services中说明过的名字(参看tcp(4P)和udp(4P)).如果使用名字,则检查端口号和
协议
.如果使用数字,或者有二义的名字,则只检查端口号(例如,dstport513将显示tcp/login的数据和udp/who的数据,而portdomain将显示tcp/domain和udp/domain的数据).
srcportport
如果报文的源端口号是port,则逻辑为真.
portport
如果报文的源端口或目的端口是port,则逻辑为真.上述的任意一个端口表达式都可以用关键字tcp或udp做前缀,就象:
tcpsrcportport
它只匹配源端口是port的TCP报文.
lesslength
如果报文的长度小于等于length,则逻辑为真.它等同于:
len=length.
ipprotoprotocol
如果报文是IP数据报(参见ip(4P)),其内容的
协议
类型是protocol,则逻辑为真.Protocol可以是数字,也可以是下列名称中的一个:icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键字,所以必须用反斜杠(\)转义,在C-shell中应该是\\.
etherbroadcast
如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.
ipbroadcast
如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.
ethermulticast
如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可选的.这实际上是`ether[0]&1!=0'的简写.
ipmulticast
如果报文是IP多目传送报文,则逻辑为真.
etherprotoprotocol
如果报文
协议
属于以太类型的protocol,则逻辑为真.Protocol可以是数字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是关键字,所以必须用反斜杠(\)转义.[如果是FDDI(例如,`fddiprotocolarp'),
协议
标识来自802.2逻辑链路控制(LLC)报头,它通常位于FDDI报头的顶层.当根据
协议
标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头用的是SNAP格式.]
decnetsrchost
如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是``10.123'',或者是DECNET主机名.[只有配置成运行DECNET的Ultrix系统支持DECNET主机名.]
decnetdsthost
如果DECNET的目的地址是host,则逻辑为真.
decnethosthost
如果DECNET的源地址或目的地址是host,则逻辑为真.
ip,arp,rarp,decnet
是:
etherprotop
的简写形式,其中p为上述
协议
的一种.
lat,moprc,mopdl
是:
etherprotop
的简写形式,其中p为上述
协议
的一种.注意tcpdump目前不知道如何分析这些
协议
.
tcp,udp,icmp
是:
ipprotop
的简写形式,其中p为上述
协议
的一种.
exprrelopexpr

果这个关系成立,则逻辑为真,其中relop是>,=,576'
显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播或多目传送形式传送的:
tcpdump'ether[0]&1=0andip[16]>=224'
显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):
tcpdump'icmp[0]!=8andicmp[0]!=0"
输出格式(OUTPUTFORMAT)
tcpdump的输出格式取决于
协议
.下面的描述给出大多数格式的简要说明和范例.
链路层报头(LinkLevelHeaders)
如果给出'-e'选项就显示链路层报头.在以太网上,显示报文的源目地址,
协议
和报文长度.

FDDI网络上,'-e'选项导致tcpdump显示出`帧控制(framecontrol)'域,源目地址和报文长度.(`帧控制'域负责解释其余的报
文.普通报文(比如说载有IP数据报)是`异步'报文,优先级介于0到7;例如,`async4'.这些被认为载有802.2逻辑链路控制(LLC)报
文;如果它们不是ISO数据报或者所谓的SNAP报文,就显示出LLC报头.
(注意:以下描述中假设你熟悉RFC-1144中说明的SLIP压缩算法.)

SLIP链路上,tcpdump显示出方向指示(``I''指inbound,``O''指outbound),报文类型和压缩信息.首先显示的是报文类
型.有三种类型ip,utcp和ctcp.对于ip报文不再显示更多的链路信息.对于TCP报文,在类型后面显示连接标识.如果报文是压缩过的,就显示出
编码的报头.特殊情形以*S+n和*SA+n的形式显示,这里的n是顺序号(或顺序号及其确认)发生的改变总和.如果不是特殊情形,就显示0或多少个改
变.改变由U(urgentpointer),W(window),A(ack),S(sequencenumber)和I(packetID)指明,后
跟一个变化量(+nor-n),或另一个值(=n).最后显示报文中的数据总和,以及压缩报头的长度.
例如,下面一行显示了一个传出的压缩的TCP报文,有一个隐含的连接标识;确认(ack)的变化量是6,顺序号是49,报文ID是6;有三个字节的数据和六个字节的压缩报头:
Octcp*A+6S+49I+63(6)
ARP/RARP报文
Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里是一个简单的例子,来自主机rtsg到主机csam的'rlogin'开始部分:
arpwho-hascsamtellrtsg
arpreplycsamis-atCSAM
第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写).
如果用tcpdump-n看上去要清楚一些:
arpwho-has128.3.254.6tell128.3.254.68
arpreply128.3.254.6is-at02:07:01:00:01:c4
如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的:
RTSGBroadcast080664:arpwho-hascsamtellrtsg
CSAMRTSG080664:arpreplycsamis-atCSAM
这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为16进制数0806(类型ETHER_ARP),报文全长64字节.
TCP报文
(注意:以下的描述中假设你熟悉RFC-793中说明的TCP
协议
,如果你不了解这个
协议
,无论是本文还是tcpdump都对你用处不大)
一般说来tcp
协议
的输出格式是:
src>dst:flagsdata-seqnoackwindowurgentoptions
Src
和dst是源目IP地址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或单独的`.'(无标志),或者是它们的组
合.Data-seqno说明了本报文中的数据在流序号中的位置(见下例).Ack是在这条连接上信源机希望下一个接收的字节的流序号
(sequencenumber).Window是在这条连接上信源机接收缓冲区的字节大小.Urg表明报文内是`紧急(urgent)'数
据.Options是tcp可选报头,用尖括号括起(例如,).
Src,dst和flags肯定存在.其他域依据报文的tcp报头内容,只输出有必要的部分.
下面是从主机rtsgrlogin到主机csam的开始部分.
rtsg.1023>csam.login:S768512:768512(0)win4096
csam.login>rtsg.1023:S947648:947648(0)ack768513win4096
rtsg.1023>csam.login:.ack1win4096
rtsg.1023>csam.login:P1:2(1)ack1win4096
csam.login>rtsg.1023:.ack2win4096
rtsg.1023>csam.login:P2:21(19)ack1win4096
csam.login>rtsg.1023:P1:2(1)ack21win4077
csam.login>rtsg.1023:P2:3(1)ack21win4077urg1
csam.login>rtsg.1023:P3:4(1)ack21win4077urg1

一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了SYN标志.报文的流序号是768512,没有数据.(这
个写成`first:last(nbytes)',意思是`从流序号first到last,不包括last,有nbytes字节的用户数据'.)此时没有
捎带确认(piggy-backedack),有效的接收窗口是4096字节,有一个最大段大小(max-segment-size)的选项,请求设置
mss为1024字节.
Csam用类似的形式应答,只是增加了一个对rtsgSYN的捎带确认.然后Rtsg确认csam的SYN.`.'意味着
没有设置标志.这个报文不包含数据,因此也就没有数据的流序号.注意这个确认流序号是一个小整数(1).当tcpdump第一次发现一个tcp会话时,它
显示报文携带的流序号.在随后收到的报文里,它显示当前报文和最初那个报文的流序号之差.这意味着从第一个报文开始,以后的流序号可以理解成数据流中的相
对位移
asrelativebytepositionsintheconversation'sdatastream(withthefirstdatabyteeachdirectionbeing`1').`-
S'选项能够改变这个特性,直接显示原始的流序号.
在第六行,rtsg传给csam19个字节的数据(字节2到20).报文中设置了
PUSH标志.第七行csam表明它收到了rtsg的数据,字节序号是21,但不包括第21个字节.显然大多数数据在socket的缓冲区内,因为
csam的接收窗口收到的数据小于19个字节.同时csam向rtsg发送了一个字节的数据.第八和第九行显示csam发送了两个字节的紧急数据到
rtsg.
如果捕捉区设置的过小,以至于tcpdump不能捕捉到完整的TCP报头,tcpdump会尽可能的翻译已捕获的部分,然后显
示``[|tcp]'',表明无法翻译其余部分.如果报头包含一个伪造的选项
(onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump显示
``[badopt]''并且不再翻译其他选项部分(因为它不可能判断出从哪儿开始).如果报头长度表明存在选项,但是IP数据报长度不够,不可能真的保
存选项,tcpdump就显示``[badhdrlength]''.
UDP报文
UDP格式就象这个rwho报文显示的:
actinide.who>broadcast.who:udp84
就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广播地址的who端口.报文包含84字节的用户数据.
某些UDP服务能够识别出来(从源目端口号上),因而显示出更高层的
协议
信息.特别是域名服务请求(RFC-1034/1035)和NFS的RPC调用(RFC-1050).
UDP域名服务请求(NameServerRequests)
(注意:以下的描述中假设你熟悉RFC-1035说明的域名服务
协议
.如果你不熟悉这个
协议
,下面的内容就象是天书.)
域名服务请求的格式是
src>dst:idop?flagsqtypeqclassname(len)
h2opolo.1538>helios.domain:3+A?ucbvax.berkeley.edu.(37)

机h2opolo访问helios上的域名服务,询问和ucbvax.berkeley.edu.关联的地址记录(qtype=A).查询号是
`3'.`+'表明设置了递归请求标志.查询长度是37字节,不包括UDP和IP头.查询操作是普通的Query操作,因此op域可以忽略.如果op设置
成其他什么东西,它应该显示在`3'和`+'之间.类似的,qclass是普通的C_IN类型,也被忽略了.其他类型的qclass应该在`A'后面显
示.
Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个查询包含回答,名字服务或管理机构部分,就把
ancount,nscount,或arcount显示成`[na]',`[nn]'或`[nau]',这里的n代表相应的数量.如果在第二和第三字节
中,任何一个回答位(AA,RA或rcode)或任何一个`必须为零'的位被置位,就显示`[b2&3=x]',这里的x是报头第二和第三字节的
16进制数.
UDP名字服务回答
名字服务回答的格式是
src>dst:idoprcodeflagsa/n/autypeclassdata(len)
helios.domain>h2opolo.1538:33/3/7A128.32.137.3(273)
helios.domain>h2opolo.1537:2NXDomain*0/1/0(97)

一个例子里,helios回答了h2opolo发出的标识为3的询问,一共是3个回答记录,3个名字服务记录和7个管理结构记录.第一个回答纪录的类型是
A(地址),数据是internet地址128.32.137.3.回答的全长为273字节,不包括UDP和IP报头.作为A记录的
class(C_IN)可以忽略op(询问)和rcode(NoError).
在第二个例子里,helios对标识为2的询问作出域名不存在(NXDomain)的回答,没有回答记录,一个名字服务记录,而且没有管理结构.
`*'表明设置了权威回答(authoritativeanswer).由于没有回答记录,这里就不显示type,class和data.
其他标志字符可以显示为`-'(没有设置递归有效(RA))和`|'(设置消息截短(TC)).如果`问题'部分没有有效的内容,就显示`[nq]'.
注意名字服务的询问和回答一般说来比较大,68字节的snaplen可能无法捕捉到足够的报文内容.如果你的确在研究名字服务的情况,可以使用-s选项增大捕捉缓冲区.`-s128'应该效果不错了.
NFS请求和响应
SunNFS(网络文件系统)的请求和响应显示格式是:
src.xid>dst.nfs:lenopargs
src.nfs>dst.xid:replystatlenopresults
sushi.6709>wrl.nfs:112readlinkfh21,24/10.73165
wrl.nfs>sushi.6709:replyok40readlink"../var"
sushi.201b>wrl.nfs:
144lookupfh9,74/4096.6878"xcolors"
wrl.nfs>sushi.201b:
replyok128lookupfh9,74/4134.3150

第一行,主机sushi向wrl发送号码为6709的交易会话(注意源主机后面的数字是交易号,不是端口).这项请求长112字节,不包括UDP和IP报
头.在文件句柄(fh)21,24/10.731657119上执行readlink(读取符号连接)操作.(如果运气不错,就象这种情况,文件句柄可以
依次翻译成主次设备号,i节点号,和事件号(generationnumber).)Wrl回答`ok'和连接的内容.
在第三行,sushi请求wrl在目录文件9,74/4096.6878中查找`xcolors'.注意数据的打印格式取决于操作类型.格式应该是可以自我说明的.
给出-v(verbose)选项可以显示附加信息.例如:
sushi.1372a>wrl.nfs:
148readfh21,11/12.1958192bytes@24576
wrl.nfs>sushi.1372a:
replyok1472readREG100664ids417/0sz29388
(-v
同时使它显示IP报头的TTL,ID,和分片域,在这个例子里把它们省略了.)在第一行,sushi请求wrl从文件21,11/12.195的偏移位置
24576开始,读取8192字节.Wrl回答`ok';第二行显示的报文是应答的第一个分片,因此只有1472字节(其余数据在后续的分片中传过来,但
由于这些分片里没有NFS甚至UDP报头,因此根据所使用的过滤器表达式,有可能不显示).-v选项还会显示一些文件属性(它们作为文件数据的附带部分传
回来):文件类型(普通文件``REG''),存取模式(八进制数),uid和gid,以及文件大小.
如果再给一个-v选项(-vv),还能显示更多的细节.
注意NFS请求的数据量非常大,除非增加snaplen,否则很多细节无法显示.试一试`-s192'选项.
NFS应答报文没有明确标明RPC操作.因此tcpdump保留有``近来的''请求记录,根据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析.
KIPAppletalk(UDP上的DDP)
AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所有的UDP报头信息).文件/etc/atalk.names用来把appletalk网络和节点号翻译成名字.这个文件的行格式是
numbername
1.254ether
16.1icsd-net
1.254.110ace

两行给出了appletalk的网络名称.第三行给出某个主机的名字(主机和网络依据第三组数字区分-网络号一定是两组数字,主机号一定是三组数字.)号
码和名字用空白符(空格或tab)隔开./etc/atalk.names文件可以包含空行或注释行(以`#'开始的行).
Appletalk地址按这个格式显示
net.host.port
144.1.209.2>icsd-net.112.220
office.2>icsd-net.112.220
jssmag.149.235>icsd-net.2
(如
果不存在/etc/atalk.names,或者里面缺少有效项目,就以数字形式显示地址.)第一个例子里,网络144.1的209节点的NBP(DDP
端口2)向网络icsd的112节点的220端口发送数据.第二行和上面一样,只是知道了源节点的全称(`office').第三行是从网络jssmag
的149节点的235端口向icsd-net的NBP端口广播(注意广播地址(255)隐含在无主机号的网络名字中-所以在/etc
/atalk.names中区分节点名和网络名是个好主意).
Tcpdump可以翻译NBP(名字联结
协议
)和ATP(Appletalk交互
协议
)的报文内容.其他
协议
只转储
协议
名称(或号码,如果还没给这个
协议
注册名称)和报文大小.
NBP报文的输出格式就象下面的例子:
icsd-net.112.220>jssmag.2:nbp-lkup190:"=:LaserWriter@*"
jssmag.209.2>icsd-net.112.220:nbp-reply190:"RM1140:LaserWriter@*"250
techpit.2>icsd-net.112.220:nbp-reply190:"techpit:LaserWriter@*"186

一行是网络icsd的112主机在网络jssmag上的广播,对名字laserwriter做名字查询请求.名字查询请求的nbp标识号是190.第二行
显示的是对这个请求的回答(注意它们有同样的标识号),主机jssmag.209表示在它的250端口注册了一个laserwriter的资源,名字
是"RM1140".第三行是这个请求的其他回答,主机techpit的186端口有laserwriter注册的"techpit".
ATP报文格式如下例所示:
jssmag.209.165>helios.132:atp-req122660xae030001
helios.132>jssmag.209.165:atp-resp12266:0(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:1(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:2(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:4(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:6(512)0xae040000
helios.132>jssmag.209.165:atp-resp*12266:7(512)0xae040000
jssmag.209.165>helios.132:atp-req122660xae030001
helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000
jssmag.209.165>helios.132:atp-rel122660xae030001
jssmag.209.133>helios.132:atp-req*122670xae030002
Jssmag.209向主机helios发起12266号交易,请求8个报文(`').行尾的十六进制数是请求中`userdata'域的值.
这个应该是全了,自己用也够了,希望能够对大家有帮助
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16427/showart_1812100.html

论坛徽章:
0
2 [报告]
发表于 2010-09-15 15:48 |只看该作者
好东西啊

论坛徽章:
0
3 [报告]
发表于 2010-09-20 11:24 |只看该作者
确实很全

论坛徽章:
0
4 [报告]
发表于 2010-09-20 14:05 |只看该作者
那就顶一下,呵呵. 

论坛徽章:
0
5 [报告]
发表于 2011-03-03 09:53 |只看该作者
太详细了,向帖子原创者致敬!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP