Tcpdump用法

1.监听全部非echo requests/replies的ICMP数据包 //ICMP ECHO(Type 8) 和ECHO Reply (Type 0)

#tcpdump "icmp[0] != 8 and icmp[0] != 0"

2.监听非本地网络的每次TCP会话开始和结束数据包

#tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet'

3.监听网关snup上长度大于576字节的IP数据包

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

4.监听不通过以太网的广播或多播数据包

#tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

5.监视经过指定网关的数据包

#tcpdump -i eth0 gateway Gatewayname

6.监听网卡eth0的TCP数据

#tcpdump –i eth0 tcp

7.监听网卡网卡eth0是否有IP地址为 192.168.0.1 端口为80的数据

#tcpdump –i eth0 host 192.168.0.1 port 80

8.监听网卡网卡eth0是否有源IP地址为192.168.0.1且源端口为80的数据

#tcpdump –i eth0 src 192.168.0.1 and src port 80

9.监听网卡网卡eno1,地址www.baidu.com, 目的端口为80的数据(http协议数据)
#sudo tcpdump -i eno1 dst www.baidu.com and dst port 80 -vvw pack.pcapphp

 


10.将网卡eth0的数据存入到文件aaaa.dmp中

#tcpdump –i eth0 –s 1600 –w aaaa.dmp

11.将获得的数据存入tcpcap.txt文件中

#tcpdump -l >tcpcap.txt

12.监听除192.168.30.69和192.168.30.69主机的ssh数据包之外的数据包

#tcpdump -c 5 -x host \(192.168.30.69 or 192.168.30.64 \) and port ! \(ssh or 22\)



 Tcpdump使用方法 (2011-06-10 15:05:15)
转载

标签: it     

1、简介

Linux做为网络服务器,特别是做为路由器和网关时,数据的采集和分析是必不可少的。因此,今天咱们就来看看Linux中强大的网络数据采集分析工具——TcpDump。

  用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。

  做为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每一个高级的系统管理员分析网络,排查问题等所必备的东东之一。

  顾名思义,TcpDump能够将网络中传送的数据包的“头”彻底截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

  tcpdump提供了源代码,公开了接口,所以具有很强的可扩展性,对于网络维护和入侵者都是很是有用的工具。tcpdump存在于基本的 FreeBSD系统中,因为它须要将网络界面设置为混杂模式,普通用户不能正常执行,但具有root权限的用户能够直接执行它来获取网络上的信息。所以系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其余计算机的安全存在威胁。

普通状况下,直接启动tcpdump将监视第一个网络界面上全部流过的数据包。

2、选项

-e在输出行打印出数据链路层的头部信息;  

-d将匹配信息包的代码以人们可以理解的汇编格式给出;

-dd将匹配信息包的代码以c语言程序段的格式给出;

-ddd将匹配信息包的代码以十进制的形式给出;

-t在输出的每一行不打印时间戳;

-v输出一个稍微详细的信息,例如在ip包中能够包括ttl和服务类型的信息;

-vv输出详细的报文信息;

-c在收到指定的包的数目后,tcpdump就会中止;

-i指定监听的网络接口;

-r从指定的文件中读取包(这些包通常经过-w选项产生);

-w直接将包写入文件中,并不分析和打印出来;(也能够使用 tcpdump  >+文件名进行保存,保存的信息不会为乱码)

-s 也就是数据包的截取长度

默认截取长度为60个字节,但通常ethernet MTU都是1500字节。因此,要抓取大于60字节的包时,使用默认参数就会致使包数据丢失!

3、表达式介绍

表达式是一个正则表达式,tcpdump利用它做为过滤报文的条件,若是一个报文知足表达式的条件,则这个报文将会被捕获。若是没有给出任何条件,则网络上全部的信息包将会被截获。在表达式中通常以下几种类型的关键字.

第一种是关于类型的关键字,主要包括host,net,port,例如host210.27.48.2,指明210.27.48.2是一台主机,net202.0.0.0指明202.0.0.0是一个网络地址,port23指明端口号是23。若是没有指定类型,缺省的类型是host.

dst port port 若是 报文 是 ip/tcp 或 ip/udp, 而且 目的端口 是 port, 则逻辑 为 真. port 是一个 数字, 也能够是 /etc/services 中 说明过的 名字。若是 使用 名字, 则检查端口号 和 协议. 若是 使用 数字, 或者 有二义的名字, 则 只检查 端口号。

第二种是肯定传输方向的关键字,主要包括src,dst,dst or src,dst and src,这些关键字指明了传输的方向。举例说明,src210.27.48.2,指明ip包中源地址是210.27.48.2,dstnet202.0.0.0指明目的网络地址是202.0.0.0。若是没有指明方向关键字,则缺省是src or dst关键字。

第三种是协议的关键字,能够使用的 协议 有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具备相似的源地址和目的地址,因此能够将fddi协议包看成ether的包进行处理和分析。其余的几个关键字就是指明了监听的包的协议内容。若是没有指定任何协议,则tcpdump将会监听全部协议的信息包。

更复杂的 过滤器表达式 能够 经过 and, or 和 not 链接,,取非运算是‘not‘‘!‘,与运算是‘and‘,‘&&‘;或运算是‘or‘,‘||‘;有一些特殊的 `原语' 关键字, 它们 不一样于 上面的模式: gateway, broadcast, less, greater 和 数学表达式。

gateway host ,若是 报文 把 host 当作 网关, 则 逻辑 为 真. 也就是说, 报文的以太源或目的地址 是 host, 可是 IP 的 源目地址 都不是 host. host 必须 是个 主机名, 并且 必须 存在 /etc/hosts 和 /etc/ethers 中

less length

若是 报文 的 长度 小于等于 length, 则 逻辑 为 真. 它等同于:

len <= length.

greater length

若是 报文 的 长度 大于等于 length, 则 逻辑 为 真. 它等同于:

len >= length.

原语 能够 用 下述 方法 结合使用:

园括弧 括起来的 原语 和 操做符 (园括弧 在 Shell 中 有专用, 因此必须转义).

取反操做 (`!' or `not').

连结操做 (`&&' or `and').

或操做 (`||' or `or').

取反操做 有 最高优先级. 或操做 和 连结操做 有 相同的 优先级, 运算时 从左到右 结合. 注意连结操做 须要 显式的 and 算符, 而不是并列放置.

 

4、几种典型的tcpdump命 令的输出信息

A, 数据链路层头信息

使 用命令
#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 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telne
t 0:0(0) ack 22535 win 8760 (DF)

    分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,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.

B,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地址。

C,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是选项.

D,UDP包的输出信息

    用TCPDUMP捕获的UDP包的通常输出信息是:
route.port1 > ice.port2: udp lenth
UDP 十分简单,上面的输出行代表从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP,包的长度是lenth。

5、实例:

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

N若是咱们只须要列出送到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的服务的主机

O若是条件不少的话  要在条件以前加and 或 or 或 not

#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

 

 

备注: -c 50  参数含义:只抓取50个数据包,便可结束抓包;(小写c)

       -C 1  参数含义:抓取的数据包1M为一个文件,抓N个文件;(大写C)

 

     tcpdump -i eth1  -C 1 >xie.txt

     以1M为一个文件,抓取eth1网卡的数据包,系统将自动执行记录;惟一须要注意的是硬盘的大小!

 

 





    TCPDump使用方法小结

    2011-11-11 16:56:17     我来讲两句       
    收藏    我要投稿

     

    在进行网络测试的时候,咱们常常须要进行抓包的工做,固然有许多测试工具能够使用,好比sniffer, ethreal等.但最为方便和简单得就非TCPDump莫属. Linux的发行版里基本都包括了这个工具. TCPDump将网络接口设置成混杂模式以便捕获到达的每个数据包.下面给出TCPDump的部分经常使用选项:

     

    -i <interface> 指定监听的网络接口

     

    -v指定详细模式输出详细的报文信息

     

    -vv指定更详细模式输出更详细的报文信息

     

    -x指定以16进制数格式显示数据包

     

    -X规定以ASCII码格式显示输出

     

    -n规定在捕获过程当中不需向DNS查询IP地址

     

    -F <file> 从指定文件中读取表达式

     

    -D显示可用网络接口

     

    -s <length> 设置捕获数据包的长度

     

    TCPDump的表达式:

     

    默认状况下TCPDump将捕获全部到达网络的数据包.这并非咱们想要的,所以就必须经过表达式来限制没必要要的流量,只输出咱们须要监听的数据包.

     

    1.类型限定词

     

    类型限定词有: host, port和net. host用来指定主机或目的地址,port指定端口,net能够用来指定某一子网. 如:

     

    tcpdump 'port 80' 监听80端口

     

    tcpdump 'net 192.168.1' 监听子网192.168.1.0

     

    tcpdump 'net 192.168.1.0/24'

     

    2.逻辑运算符

     

    逻辑运算符有AND,OR和NOT. ()可将多个表达式组合起来.

     

    tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)'

     

    监听主机192.168.1.10 或192.168.1.11的80端口.

     

    3.传输方向限定词

     

    关键词src指定源地址,dst指定目的地址

     

    tcpdump 'port 80 and (src 192.168.1.10 or src 192.168.1.11)'

     

    tcpdump 'dst port 25'

     

    4.协议限定词

     

    用来捕获特定协议的数据包有: ether(Ethernet), TCP,UDP,ICMP,IP,ip6(IPv6),ARP,rarp(reverse ARP)等.

     

    5.原语

     

    原语主要有: 算术运算符(+,-,*,/,>,<,>=,<=,!=等), broadcast, gateway, greater, less.

     

    broadcast捕获广播数据包, greater和less至关于>=和<=.

     

    小例子:

     

    //本机20000端口通信数据抓包

     

     tcpdump -s 0 -i lo port 20000 -w /tmp/20000.pcap

     

    //10.8.2.181:7001端口通信数据抓包

     

     tcpdump -i eth0 -s 0 host 10.8.2.181 and port 7001  -w /tmp/syrk.pcap




Tcpdump的详细用法

1. TCPDump介绍     

     TcpDump能够将网络中传送的数据包的“头”彻底截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种免费的网络分析工具,尤为其提供了源代码,公开了接口,所以具有很强的可扩展性,对于网络维护和入侵者都是很是有用的工具。tcpdump存在于基本的FreeBSD系统中,因为它须要将网络界面设置为混杂模式,普通用户不能正常执行,但具有root权限的用户能够直接执行它来获取网络上的信息。所以系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其余计算机的安全存在威胁。

      咱们用尽可能简单的话来定义tcpdump,就是:dump the traffice on anetwork.,根据使用者的定义对网络上的数据包进行截获的包分析工具。做为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每一个高级的系统管理员分析网络,排查问题等所必备的东西之一。tcpdump提供了源代码,公开了接口,所以具有很强的可扩展性,对于网络维护和入侵者都是很是有用的工具。tcpdump存在于基本的FreeBSD系统中,因为它须要将网络界面设置为混杂模式,普通用户不能正常执行,但具有root权限的用户能够直接执行它来获取网络上的信息。所以系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其余计算机的安全存在威胁。  

2. TcpDump的使用
    普通状况下,直接启动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
    tcpdump支持至关多的不一样参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具备多个网络界面时很是有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

    然而更复杂的tcpdump参数是用于过滤目的,这是由于网络中流量很大,若是不加分辨将全部的数据包都截留下来,数据量太大,反而不容易发现须要的数据包。使用这些参数定义的过滤规则能够截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

   显然为了安全起见,不用做网络管理用途的计算机上不该该运行这一类的网络分析软件,为了屏蔽它们,能够屏蔽内核中的bpfilter伪设备。通常状况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就须要内核支持伪设备bpfilter。所以,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

    而且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用做攻击同网络的其余计算机的跳板。

    May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

   虽然网络分析工具能将网络中传送的数据记录下来,可是网络中的数据流量至关大,如何对这些数据进行分析、分类统计、发现并报告错误倒是更关键的问题。网络中的数据包属于不一样的协议,而不一样协议数据包的格式也不一样。所以对捕获的数据进行解码,将包中的信息尽量的展现出来,对于协议分析工具来说更为重要。昂贵的商业分析工具的优点就在于它们能支持不少种类的应用层协议,而不只仅只支持tcp、udp等低层协议。

    从上面tcpdump的输出能够看出,tcpdump对截获的数据并无进行完全解码,数据包内的大部份内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,一般的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,而后再使用其余程序进行解码分析。固然也应该定义过滤规则,以免捕获的数据包填满整个硬盘。FreeBSD提供的一个有效的解码程序为tcpshow,它能够经过Packages Collection来安装。

# pkg_add /cdrom/packages/security/tcpshow*
# tcpdump -c 3 -w tcpdump.out
tcpdump: listening on fxp0
# tcpshow < tcpdump.out
---------------------------------------------------------------------------
Packet 1
TIME:12:00:59.984829
LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
<*** No decode support for encapsulated protocol ***>
---------------------------------------------------------------------------
Packet 2
TIME:12:01:01.074513 (1.089684)
LINK:00:A0:C9:AB:3C:DF -> FF:FF:FF:FF:FF:FF type=ARP
ARP:htype=Ethernet ptype=IP hlen=6 plen=4 op=request
sender-MAC-addr=00:A0:C9:AB:3C:DF sender-IP-address=202.102.245.3
target-MAC-addr=00:00:00:00:00:00 target-IP-address=202.102.245.3
---------------------------------------------------------------------------
Packet 3
TIME:12:01:01.985023 (0.910510)
LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
<*** No decode support for encapsulated protocol ***>

    tcpshow能以不一样方式对数据包进行解码,并以不一样的方式显示解码数据,使用者能够根据其手册来选择最合适的参数对截获的数据包进行分析。从上面的例子中能够看出,tcpshow支持的协议也并不丰富,对于它不支持的协议就没法进行解码。

    除了tcpdump以外,FreeBSD的PackagesCollecion中还提供了Ethereal和Sniffit两个网络分析工具,以及其余一些基于网络分析方式的安全工具。其中Ethereal运行在X Window 下,具备不错的图形界面,Sniffit使用字符窗口形式,一样也易于操做。然而因为tcpdump对过滤规则的支持能力更强大,所以系统管理员仍然更喜欢使用它。对于有经验的网络管理员,使用这些网络分析工具不但能用来了解网络究竟是如何运行的,故障出如今何处,还能进行有效的统计工做,如那种协议产生的通讯量占主要地位,那个主机最繁忙,网络瓶颈位于何处等等问题。所以网络分析工具是用于网络管理的宝贵系统工具。为了防止数据被滥用的网络分析工具截获,关键仍是要在网络的物理结构上解决。经常使用的方法是使用交换机或网桥将信任网络和不信任网络分隔开,能够防止外部网段窃听内部数据传输,但仍然不能解决内部网络与外部网络相互通讯时的数据安全问题。若是没有足够的经费将网络上的共享集线器升级为以太网交换机,能够使用FreeBSD系统执行网桥任务。这须要使用option BRIDGE编译选项从新定制内核,此后使用bridge命令启动网桥功能。

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的表达式介绍

http://anheng.com.cn/news/24/586.html    表达式是一个正则表达式,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. http://anheng.com.cn/news/24/586.html

    第二种是肯定传输方向的关键字,主要包括src , dst ,dst or src, dst and src,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net202.0.0.0 指明目的网络地址是202.0.0.0 。若是没有指明方向关键字,则缺省是src or dst关键字。

http://anheng.com.cn/news/24/586.html    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具备相似的源地址和目的地址,因此能够将fddi协议包看成ether的包进行处理和分析。其余的几个关键字就是指明了监听的包的协议内容。若是没有指定任何协议,则tcpdump将会监听全部协议的信息包。

     除了这三种类型的关键字以外,其余重要的关键字以下:gateway,broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ',与运算是'and','&&';或运算 是'or','││';这些关键字能够组合起来构成强大的组合条件来知足人们的须要,下面举几个例子来讲明。

      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

(3). tcpdump的输出结果介绍

http://anheng.com.cn/news/24/586.html    下面咱们介绍几种典型的tcpdump命令的输出信息

A,数据链路层头信息
使用命令: #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 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telne
t 0:0(0) ack 22535 win 8760 (DF)

    分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,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.

B,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地址。

C,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是选项.

D,UDP包的输出信息

    用TCPDUMP捕获的UDP包的通常输出信息是:

route.port1 > ice.port2: udp lenth
UDP十分简单,上面的输出行代表从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth

3. 辅助工具

(1) 想查看TCP或者UDP端口使用状况,使用 netstat -anp
     若是有些进程看不见,如只显示”-”,能够尝试
sudo netstat -anp
     若是想看某个端口的信息,使用lsof命令,如:
sudo lsof -i :631

-bash-3.00# netstat -tln

     netstat -tln 命令是用来查看linux的端口使用状况

/etc/init.d/vsftp start 是用来启动ftp端口~!

    看文件/etc/services

netstat

    查看已经链接的服务端口(ESTABLISHED)

netstat -a

    查看全部的服务端口(LISTEN,ESTABLISHED)

sudo netstat -ap

    查看全部 的服务端口并显示对应的服务程序名

nmap <扫描类型><扫描参数>

例如:

nmap localhost

nmap -p 1024-65535 localhost

nmap -PT 192.168.1.127-245

     当咱们使用 netstat -apn 查看网络链接的时候,会发现不少相似下面的内容:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 52 218.104.81.152:7710 211.100.39.250:29488 ESTABLISHED 6111/1

     显示这台服务器开放了7710端口,那么 这个端口属于哪一个程序呢?咱们能够使用 lsof -i :7710 命令来查询:

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

sshd 1990 root 3u IPv4 4836 TCP *:7710 (LISTEN)

     这样,咱们就知道了7710端口是属于sshd程序的。

(2) 运行tcpdump命令出现错误信息排除

tcpdump: no suitable device found
tcpdump: no devices found /dev/bpf4: A file or directory in the path name does not exist.
解决方案 2种缘由:
1.权限不够,通常不通过处理,只用root用户能使用tcpdump
2.缺省只能同时使用4个tcpdump,如用完,则报此类错。须要停掉多余的tcpdump





 tcpdump高级用法
分类: C/C++/linux 2007-12-14 16:27 5663人阅读 评论(0) 收藏 举报
primitivetcpdstoutputinterface网络

Tcpdump高级用法

做者:林海枫

http://blog.csdn.net/linyt

[*]转载请注明做者,请匆用于商业用途。


在linux下输入man tcpdump,在manual的开始会看到以下内容:

tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]

[ -C file_size ] [ -F file ]

[ -i interface ] [ -m module ] [ -M secret ]

[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]

[ -W filecount ]

[ -E spi@ipaddr algo:secret,... ]

[ -y datalinktype ] [ -Z user ]

[ expression ]

这是tcpdump的格式介绍,本文只分析[expression]的写法,如何写出 严格的匹配条件。由于在大型的网络中,数据包的目数是很是多的,若是不进行严格的匹配,可能对协议的分析形成很大影响。 在此不讨论expression前面的选项,所以它在手册有比较全面的介绍,下面就expression进行介绍。

[expression]的用法:

expression是tcpdump最为有用的高级用法,能够利用它来匹配一些特殊的包。下面介绍一下expression的用法,主要是如何写出符合要求最为严格expression。若是tcpdump中没有expression,那么tcpdump会把网卡上的全部数据包输出,不然会将被expression匹配的包输出。

expression 由一个或多个[primitives]组成,而[primitives]由一个或多个[qualitifer]加一个id(name)或数字组成,它们的结构如用正则表达式则可表示为:

expression = ([qualitifer]+(id|number))+

依次看来,expression是一个复杂的条件表达式,其中[qualitifer]+(id|number)就是一个比较基本条件,qualitifer就表达一些的名称(项,变量),id或number则表示一个值(或常量)。

qualitifer共有三种,分别是:

type 表示id name或number涉及到的类型,这些词有host, nest, port ,portrange等等。

例子:

host foo 此为一个简单的primitive,host为qualitifer, foo为id name

net 128.3 net为qualitifer, 128.3为number

port 20

等等

每一个privimtive必须有一个type词,若是表达式中没有,则默认是host.

dir    指定数据传输的方向,这些词有src, dst, src or dst, src and dst

例子:

dst net 128.3 ;此为一个相对复杂的primitive,结构为dir type number,表示目标网络为128.3的条件。

src or dst port ftp-data 此为比上一个相对简的结构,src or dst表示源或目标,ftp-data为id,表示ftp协议中数据传输端口,故总体表示源或目标端口ftp-data的数据包即匹配。

若是在一个primitive中没有dir词,此默认为src or dst. 如 host foo则表示源或目标主机为foo的数据包都匹配。

proto    此种词是用来匹配某种特定协议的,这些词包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet,tcp和udp。其实这些词常常用来匹配某种协议,是使用率最高的一组词了。

上面三种qualitifer和id name或number组成一个primitive一般是下面这种方式的:

proto dir type id(number) ,即primitive=proto dir type (id | number)

如:

tcp src port 80

ip dst host 192.168.1.1

若是出现type的话,必定会出现id或num

若是出现dir,那么也会出现type,若是不出现,默认为host

而proto可单独出现,如 tcpdump 'tcp'

经过上面介绍的三种qualitifer,咱们很快就能够写出一个primitive,下面我就只用一个primitive做为expression匹配数据包。

(1)匹配ether包

匹配特定mac地址的数据包。

tcpdump 'ether src 00:19:21:1D:75:E6'

匹配源mac为00:19:21:1D:75:E6的数据包其中src可改成dst, src or dst来匹改变条件

匹配ether广播包。ether广播包的特征是mac全1.故以下便可匹配:

tcpdump 'ether dst ff:ff:ff:ff:ff:ff'


ylin@ylin:~$ sudo tcpdump -c 1 'ether dst ff:ff:ff:ff:ff:ff'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

10:47:57.784099 arp who-has 192.168.240.77 tell 192.168.240.189

在此,只匹配1个包就退出了。第一个是arp请求包,arp请求包的是采用广播的方式发送的,被匹配那是当之无愧的。

匹配ether组播包,ether的组播包的特征是mac的最高位为1,其它位用来表示组播组编号,若是你想匹配其的多播组,知道它的组MAC地址便可。如

tcpdump 'ether dst <Mac_Adrress>' Mac_Address表示地址,填上适当的便可。若是想匹配全部的ether多播数据包,那么暂时请放下,下面会继续为你讲解更高级的应用。

(2)匹配arp包

arp包用于IP到Mac址转换的一种协议,包括arp请求和arp答应两种报文,arp请求报文是ether广播方式发送出去的,也即 arp请求报文的mac地址是全1,所以用ether dst FF;FF;FF;FF;FF;FF能够匹配arp请求报文,但不能匹配答应报文。所以要匹配arp的通讯过程,则只有使用arp来指定协议。

tcpdump 'arp' 便可匹配网络上arp报文。

ylin@ylin:~$ arping -c 4 192.168.240.1>/dev/null& sudo tcpdump -p 'arp'

[1] 9293

WARNING: interface is ignored: Operation not permitted

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

11:09:25.042479 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

11:09:25.042702 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

11:09:26.050452 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

11:09:26.050765 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

11:09:27.058459 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

11:09:27.058701 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

11:09:33.646514 arp who-has ylin.local tell 192.168.240.1

11:09:33.646532 arp reply ylin.local is-at 00:19:21:1d:75:e6 (oui Unknown)

本例中使用arping -c 4 192.168.240.1产生arp请求和接收答应报文,而tcpdump -p 'arp'匹配出来了。此处-p选项是使网络工做于正常模式(非混杂模式),这样是方便查看匹配结果。

(3)匹配IP包

众所周知,IP协议是TCP/IP协议中最重要的协议之一,正是由于它才能把Internet互联起来,它可谓功不可没,下面分析匹配IP包的表达式。

对IP进行匹配

tcpdump 'ip src 192.168.240.69'

ylin@ylin:~$ sudo tcpdump -c 3 'ip src 192.168.240.69'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

11:20:00.973605 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: S 2706301341:2706301341(0) win 5840 <mss 1460,sackOK,timestamp 1687608 0,nop,wscale 5>

11:20:00.974328 IP ylin.local.32849 > 192.168.200.150.domain: 5858+ PTR? 20.200.168.192.in-addr.arpa. (45)

11:20:01.243490 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: . ack 2762262674 win 183 <nop,nop,timestamp 1687676 4155416897>

IP广播组播数据包匹配:只需指明广播或组播地址便可

tcpdump 'ip dst 240.168.240.255'

ylin@ylin:~$ sudo tcpdump 'ip dst 192.168.240.255'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

11:25:29.690658 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 1, length 64

11:25:30.694989 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 2, length 64

11:25:31.697954 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 3, length 64

11:25:32.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 4, length 64

11:25:33.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 5, length 64

11:25:34.697982 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 6, length 64

此处匹配的是ICMP的广播包,要产生此包,只须要同一个局域网的另外一台主机运行ping -b 192.168.240.255便可,固然还可产生组播包,因为没有适合的软件进行模拟产生,在此不举例子。

(4)匹配TCP数据包

TCP一样是TCP/IP协议栈里面最为重要的协议之一,它提供了端到端的可靠数据流,同时不少应用层协议都是把TCP做为底层的通讯协议,由于TCP的匹配是很是重要的。

若是想匹配HTTP的通讯数据,那只需指定匹配端口为80的条件便可

tcpdump 'tcp dst port 80'

ylin@ylin:~$ wget http://www.baidu.com 2>1 1 >/dev/null & sudo tcpdump -c 5 'tcp port 80'

[1] 10762

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

12:02:47.549056 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: S 1202130469:1202130469(0) ack 1132882351 win 2896 <mss 1460,sackOK,timestamp 3497190920 2329221,nop,wscale 2>

12:02:47.549085 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: . ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>

12:02:47.549226 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: P 1:102(101) ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>

12:02:47.688978 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . ack 102 win 698 <nop,nop,timestamp 3497190956 2329258>

12:02:47.693897 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . 1:1409(1408) ack 102 win 724 <nop,nop,timestamp 3497190957 2329258>

(5)匹配udp数据包

udp是一种无链接的非可靠的用户数据报,所以udp的主要特征一样是端口,用以下方法能够匹配某一端口

tcpdump 'upd port 53' 查看DNS的数据包

ylin@ylin:~$ ping -c 1 www.baidu.com > /dev/null& sudo tcpdump -p udp port 53

[1] 11424

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

12:28:09.221950 IP ylin.local.32853 > 192.168.200.150.domain: 63228+ PTR? 43.22.108.202.in-addr.arpa. (44)

12:28:09.222607 IP ylin.local.32854 > 192.168.200.150.domain: 5114+ PTR? 150.200.168.192.in-addr.arpa. (46)

12:28:09.487017 IP 192.168.200.150.domain > ylin.local.32853: 63228 1/0/0 (80)

12:28:09.487232 IP 192.168.200.150.domain > ylin.local.32854: 5114 NXDomain* 0/1/0 (140)

12:28:14.488054 IP ylin.local.32854 > 192.168.200.150.domain: 60693+ PTR? 69.240.168.192.in-addr.arpa. (45)

12:28:14.755072 IP 192.168.200.150.domain > ylin.local.32854: 60693 NXDomain 0/1/0 (122)

使用ping www.baidu.com目标是产生DNS请求和答应,53是DNS的端口号。

此外还有不少qualitifer是尚未说起的,下面是其它合法的primitive,在tcpdump中是能够直接使用的。

gateway host

匹配使用host做为网关的数据包,即数据报中mac地址(源或目的)为host,但IP报的源和目的地址不是host的数据包。

dst net net

src net net

net net

net net mask netmask

net net/len

匹配IPv4/v6地址为net网络的数据报。

其中net能够为192.168.0.0或192.168这两种形式。如net 192.168 或net 192.168.0.0

net net mask netmask仅对IPv4数据包有效,如net 192.168.0.0 mask 255.255.0.0

net net/len一样只对IPv4数据包有效,如net 192.168.0.0/16

dst portrange port1-port2

src portrange port1-port2

portrange port1-port2

匹配端口在port1-port2范围内的ip/tcp,ip/upd,ip6/tcp和ip6/udp数据包。dst, src分别指明源或目的。没有则表示src or dst

less length 匹配长度少于等于length的报文。

greater length 匹配长度大于等于length的报文。

ip protochain protocol 匹配ip报文中protocol字段值为protocol的报文

ip6 protochain protocol 匹配ipv6报文中protocol字段值为protocol的报文

如tcpdump 'ip protochain 6 匹配ipv4网络中的TCP报文,与tcpdump 'ip && tcp'用法同样,这里的&&链接两个primitive。6是TCP协议在IP报文中的编号。

ether broadcast

匹配以太网广播报文

ether multicast

匹配以太网多播报文

ip broadcast

匹配IPv4的广播报文。也即IP地址中主机号为全0或全1的IPv4报文。

ip multicast

匹配IPv4多播报文,也就是IP地址为多播地址的报文。

ip6 multicast

匹配IPv6多播报文,即IP地址为多播地址的报文。

vlan vlan_id

匹配为vlan报文 ,且vlan号为vlan_id的报文

到些为此,咱们一直在介绍primitive是如何使用的,也即expression只有一个primitive。经过学会写好每一个primtive,咱们就很容易把多个primitive组成一个expression,方法很简单,经过逻辑运算符链接起来就能够了,逻辑运算符有如下三个:

“&&” 或”and”

“||” 或“or”

“!” 或“not”

而且可经过()进行复杂的链接运算。


如tcpdump ‘ip && tcp’

tcpdump ‘ host 192.168.240.3 &&( tcp port 80 || tcp port 443)’

经过上面的各类primitive,咱们能够写出很丰富的条件,如ip, tcp, udp,vlan等等。如IP,能够按址址进行匹,tcp/udp能够按端口匹配。可是,若是我想匹配更细的条件呢?如tcp中只含syn标志,fin标志的报文呢?上面的primitive恐怕无能为力了。不用怕,tcpdump为你提供最后一个功能最强大的primitive,记住是primitive,而不是expression。你能够用多个这个的primitive组成更复杂的 expression.

最后一个primitive形式为 expr relop expr

若把这个形式记为A,那么你可这样写tcpdump 'A1 && A2 && ip src 192.168.200.1',等等。

下面咱们就来分析A这个形式,看看这是如何强大,若是你以为很乱的话,建议你先用用上面的知识来实际操做几回,要否则就会很乱的,由于expression太复杂了。

形式:expr relop expr

relop表示关系操做符,能够为>, < ,>=,<=, =, !=之一,

expr是一个算术表达式,由整数组成和二元运算符(+,-,*,/,&,|, <<, >>),长度操做,报文数据访问子。同时全部的整数都是无符号的,即0x80000000 和 0xffffffff > 0。为了访问报文中的数据,可以使用以下方式:

proto [ expr : size ]

proto表示该问的报文,expr的结果表示该报文的偏移,size为可选的,表示从expr偏移量起的szie个字节,整个表达式为proto报文 中,expr起的szie字节的内容(无符号整数)

下面是expr relop expr这种形式primitive的例子:

'ether[0] & 1 !=0' ether报文中第0个bit为1,即以太网广播或组播的primtive。

经过这种方式,咱们能够对报文的任何一个字节进行匹配了,所以它的功能是十分强大的。

‘ip[0] = 4’ ip报文中的第一个字节为version,即匹配IPv4的报文,

若是咱们想匹配一个syn报文,能够使用:'tcp[13] = 2',由于tcp的标志位为TCP报文的第13个字节,而syn在这个字节的低1位,故匹配只有syn标志的报文,上述条件是可满要求的,而且比较严格。

若是想匹配ping命令的请求报文,能够使用'icmp[0]=8',由于icmp报文的第0字符表示类型,当类型值为8时表示为回显示请求。

对于TCP和ICMP中经常使用的字节,如TCP中的标志位,ICMP中的类型,这个些偏移量有时会忘记。不过tcpdump为你提供更方便的用法,你不用记位这些数字,用字符就能够代替了.

对于ICMP报文,类型字节能够icmptype来表示它的偏称量,上面的primitive可改成'icmp[icmptype] =8',若是8也记不住怎么办?tcpdump还为该字节的值也提供了字符表示,如'icmp[icmptype] = icmp-echo'。

下面是tcpdump提供的字符偏移量:

icmptype:表示icmp报文中类弄字节的偏移量

icmpcode:表示icmp报文中编码字节的偏移量

tcpflags:表示TCP报文中标志位字节的偏移量

此外,还提供了不少值来对应上面的偏移字节:

ICMP中类型字节的值能够是:

icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redi‐rect, icmp-echo, icmp-routeradvert, icmp-routersolicit,

icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstam‐preply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

TCP中标志位字节的值能够是:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg.

经过上面的字符表示,咱们能够写出下面的primitive

'tcp[tcpflags] = tcp-syn' 匹配只有syn标志设置为1的 tcp报文

'tcp[tcpflags] & (tcp-syn |tcp-ack |tcp-fin) !=0' 匹配含有syn,或ack或fin标志位的TCP报文

对于IP报文,没有提供字符支持,若是想匹配更细的条件,直接使用数字指字偏移量就能够了,不过要对IP报文有更深刻的了解才能够。

学会写primitive后,expression就是小菜一碟了,由一个或多个primitive组成,而且逻辑链接符组成便可:


tcpdump ‘host 192.168.240.91 && icmp[icmptype] = icmp-echo’

tcpdump ‘host 192.168.1.100 && vrrp’

tcpdump 'ether src 00:00:00:00:00:02 && ether[0] & 1 !=0'


让你为所欲为地使用tcpdump,将不用再从复杂的输出中去挑报文了!


如此,咱们能够写出更复杂的表达式来匹配报文,如IP或TCP中的报文id,IP是中的分段标志,ICMP中类型和代码等。

 

 

参考资料:

[1] Tcpdump manual.

 [2] http://www.tcpdump.org/






















Linux tcpdump 命令详细用法
简单介绍

用简单的话来定义tcpdump,就是:dump the traffic on a network,依据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”全然截获下来提供分析。它支持针对网络层、协议、主机、网络或port的过滤,并提供and、or、not等逻辑语句来帮助你去掉没用的信息。

 
有用命令实例

默认启动

tcpdump

通常状况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。

 

监视指定网络接口的数据包

tcpdump -i eth1

假设不指定网卡,默认tcpdump仅仅会监视第一个网络接口,通常是eth0,下面的样例都没有指定网络接口。 

 

监视指定主机的数据包

打印所有进入或离开sundown的数据包.

tcpdump host sundown

也可以指定ip,好比截获所有210.27.48.1 的主机收到的和发出的所有的数据包

tcpdump host 210.27.48.1

打印helios 与 hot 或者与 ace 之间通讯的数据包

tcpdump host helios and \( hot or ace \)

截获主机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 \)

打印ace与不论什么其余主机之间通讯的IP 数据包, 但不包含与helios之间的数据包.

tcpdump ip host ace and not helios

假设想要获取主机210.27.48.1除了和主机210.27.48.2以外所有主机通讯的ip包,使用命令:

tcpdump ip host 210.27.48.1 and ! 210.27.48.2

截获主机hostname发送的所有数据

tcpdump -i eth0 src host hostname

监视所有送到主机hostname的数据包

tcpdump -i eth0 dst host hostname

 

监视指定主机和port的数据包

假设想要获取主机210.27.48.1接收或发出的telnet包,使用例如如下命令

tcpdump tcp port 23 host 210.27.48.1

对本机的udp 123 port进行监视 123 为ntp的服务port

tcpdump udp port 123

 

监视指定网络的数据包

打印本地主机与Berkeley网络上的主机之间的所有通讯数据包(nt: ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)

tcpdump net ucb-ether

打印所有经过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对当中的括号进行错误解析)

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

打印所有源地址或目标地址是本地主机的IP数据包

(假设本地网络经过网关连到了还有一网络, 则还有一网络并不能算做本地网络.(nt: 此句翻译曲折,需补充).localnet 实际使用时要真正替换成本地网络的名字)

tcpdump ip and not net localnet

 

监视指定协议的数据包

打印TCP会话中的的开始和结束数据包, 而且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

打印所有源或目的port是80, 网络层协议为IPv4, 而且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本号的表达式可作练习)

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

(nt: 可理解为, ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf表明包中的IHL域, 而此域的单位为32bit, 要换算

成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2, 
即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去
tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本号仅仅需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 而且当中表达方式'ip[]'需换成'ip6[]'.)

打印长度超过576字节, 而且网关地址是snup的IP数据包

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

打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

打印除'echo request'或者'echo reply'类型之外的ICMP数据包( 比方,需要打印所有非ping 程序产生的数据包时可用到此表达式 .
(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包一般由ping程序产生))

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

 

tcpdump 与wireshark

Wireshark(曾经是ethereal)是Windows下很easy易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。
还好有Tcpdump。咱们可以用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

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 仅仅抓通过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 仅仅抓取100个数据包
(6)dst port ! 22 : 不抓取目标port是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

 

使用tcpdump抓取HTTP包

tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。

 

tcpdump 对截获的数据并无进行完全解码,数据包内的大部份内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,一般的解决方法是先使用带-w参数的tcpdump 截获数据并保存到文件中,而后再使用其余程序(如Wireshark)进行解码分析。固然也应该定义过滤规则,以免捕获的数据包填满整个硬盘。

 
输出信息含义

首先咱们注意一下,基本上tcpdump总的的输出格式为:系统时间 来源主机.port > 目标主机.port 数据包参数

tcpdump 的输出格式与协议有关.下面简要描述了大部分经常使用的格式及相关样例.
链路层头

对于FDDI网络, '-e' 使tcpdump打印出指定数据包的'frame control' 域, 源和目的地址, 以及包的长度.(frame control域
控制对包中其余域的解析). 通常的包(比方那些IP datagrams)都是带有'async'(异步标志)的数据包,而且有取值0到7的优先级;
比方 'async4'就表明此包为异步数据包,而且优先级别为4. 一般以为,这些包们会内含一个 LLC包(逻辑链路控制包); 这时,假设此包
不是一个ISO datagram或所谓的SNAP包,其LLC头部将会被打印(nt:应该是指此包内含的 LLC包的包头).

对于Token Ring网络(令牌环网络), '-e' 使tcpdump打印出指定数据包的'frame control'和'access control'域, 以及源和目的地址,
外加包的长度. 与FDDI网络类似, 此数据包一般内含LLC数据包. 不管 是否有'-e'选项.对于此网络上的'source-routed'类型数据包(nt:
意译为:源地址被追踪的数据包,详细含义未知,需补充), 其包的源路由信息总会被打印.


对于802.11网络(WLAN,即wireless local area network), '-e' 使tcpdump打印出指定数据包的'frame control域,
包头中包含的所有地址, 以及包的长度.与FDDI网络类似, 此数据包一般内含LLC数据包.

(注意: 下面的描述会假设你熟悉SLIP压缩算法 (nt:SLIP为Serial Line Internet Protocol.), 这个算法可以在
RFC-1144中找到相关的蛛丝马迹.)

对于SLIP网络(nt:SLIP links, 可理解为一个网络, 即经过串行线路创建的链接, 而一个简单的链接也可当作一个网络),
数据包的'direction indicator'('方向指示标志')("I"表示入, "O"表示出), 类型以及压缩信息将会被打印. 包类型会被首先打印.

类型分为ip, utcp以及ctcp(nt:未知, 需补充). 对于ip包,链接信息将不被打印(nt:SLIP链接上,ip包的链接信息可能无用或未定义.
reconfirm).对于TCP数据包, 链接标识紧接着类型表示被打印. 假设此包被压缩, 其被编码过的头部将被打印.
此时对于特殊的压缩包,会例如如下显示:
*S+n 或者 *SA+n, 当中n表明包的(顺序号或(顺序号和应答号))增长或下降的数目(nt | rt:S,SA拗口, 需再译).
对于非特殊的压缩包,0个或许多其余的'改变'将会被打印.'改变'被打印时格式例如如下:
'标志'+/-/=n 包数据的长度 压缩的头部长度.
当中'标志'可以取下面值:
U(表明紧急指针), W(指缓冲窗体), A(应答), S(序列号), I(包ID),而增量表达'=n'表示被赋予新的值, +/-表示增长或下降.

比方, 下面显示了对一个外发压缩TCP数据包的打印, 这个数据包隐含一个链接标识(connection identifier); 应答号增长了6,
顺序号增长了49, 包ID号增长了6; 包数据长度为3字节(octect), 压缩头部为6字节.(nt:如此看来这应该不是一个特殊的压缩数据包).

ARP/RARP 数据包

tcpdump对Arp/rarp包的输出信息中会包含请求类型及该请求对应的参数. 显示格式简洁明了. 下面是从主机rtsg到主机csam的'rlogin'
(远程登陆)过程开始阶段的数据包样例:
arp who-has csam tell rtsg
arp reply csam is-at CSAM
第一行表示:rtsg发送了一个arp数据包(nt:向全网段发送,arp数据包)以询问csam的以太网地址
Csam(nt:可从下文看出来, 是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(nt:arp包的类型标识)),
包的总长度为64字节.
TCP 数据包

(注意:下面将会假定你对 RFC-793所描述的TCP熟悉. 假设不熟, 下面描述以及tcpdump程序可能对你帮助不大.(nt:警告可忽略,
仅仅需继续看, 不熟悉的地方可回头再看.).


一般tcpdump对tcp数据包的显示格式例如如下:
src > dst: flags data-seqno ack window urgent options

src 和 dst 是源和目的IP地址以及对应的port. flags 标志由S(SYN), F(FIN), P(PUSH, R(RST),
W(ECN CWT(nt | rep:未知, 需补充))或者 E(ECN-Echo(nt | rep:未知, 需补充))组成,
单独一个'.'表示没有flags标识. 数据段顺序号(Data-seqno)描述了此包中数据所对应序列号空间中的一个位置(nt:整个数据被分段,
每段有一个顺序号, 所有的顺序号构成一个序列号空间)(可参考下面样例). 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主机的tcpport1023发送到了csam主机的tcpportlogin上(nt:udp协议的port和tcp协议的端
口是分别的两个空间, 尽管取值范围一致). S表示设置了SYN标志. 包的顺序号是768512, 而且没有包含数据.(表示格式
为:'first:last(nbytes)', 其含义是'此包中数据的顺序号从first开始直到last结束,不包含last. 而且总共包含nbytes的
用户数据'.) 没有捎带应答(nt:从下文来看,第二行才是有捎带应答的数据包), 可用的接受窗体的大小为4096bytes, 而且请求端(rtsg)
的最大可接受的数据段大小是1024字节(nt:这个信息做为请求发向应答端csam, 以便双方进一步的协商).

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标志.

假设所抓到的tcp包(nt:即这里的snapshot)过小了,以致tcpdump没法完整获得其头部数据, 这时, tcpdump会尽可能解析这个不完整的头,
并把剩下不能解析的部分显示为'[|tcp]'. 假设头部含有虚假的属性信息(比方其长度属性事实上比头部实际长度长或短), tcpdump会为该头部
显示'[bad opt]'. 假设头部的长度告诉咱们某些选项(nt | rt:从下文来看, 指tcp包的头部中针对ip包的一些选项, 回头再翻)会在此包中,
而真正的IP(数据包的长度又不够容纳这些选项, tcpdump会显示'[bad hdr length]'.


抓取带有特殊标志的的TCP包(如SYN-ACK标志, URG-ACK标志等).

在TCP的头部中, 有8比特(bit)用做控制位区域, 其取值为:
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
(nt | rt:从表达方式上可判断:这8个位是用或的方式来组合的, 可回头再翻)

现假设咱们想要监控创建一个TCP链接整个过程当中所产生的数据包. 可回顾例如如下:TCP使用3次握手协议来创建一个新的链接; 其与此三次握手
链接顺序对应,并带有对应TCP控制标志的数据包例如如下:
1) 链接发起方(nt:Caller)发送SYN标志的数据包
2) 接收方(nt:Recipient)用带有SYN和ACK标志的数据包进行回应
3) 发起方收到接收方回应后再发送带有ACK标志的数据包进行回应


0 15 31
-----------------------------------------------------------------
| source port | destination port |
-----------------------------------------------------------------
| sequence number |
-----------------------------------------------------------------
| acknowledgment number |
-----------------------------------------------------------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
-----------------------------------------------------------------
| TCP checksum | urgent pointer |
-----------------------------------------------------------------

一个TCP头部,在不包含选项数据的状况下一般占用20个字节(nt | rt:options 理解为选项数据,需回译). 第一行包含0到3编号的字节,
第二行包含编号4-7的字节.

假设编号从0开始算, TCP控制标志位于13字节(nt:第四行左半部分).

 

0 7| 15| 23| 31
----------------|---------------|---------------|----------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
----------------|---------------|---------------|----------------
| | 13th octet | | |

让咱们仔细看看编号13的字节:

| |
|---------------|
|C|E|U|A|P|R|S|F|
|---------------|
|7 5 3 0|


这里有咱们感兴趣的控制标志位. 从右往左这些位被依次编号为0到7, 从而 PSH位在3号, 而URG位在5号.

 

提醒一下本身, 咱们仅仅是要获得包含SYN标志的数据包. 让咱们看看在一个包的包头中, 假设SYN位被设置, 究竟
在13号字节发生了什么:

|C|E|U|A|P|R|S|F|
|---------------|
|0 0 0 0 0 0 1 0|
|---------------|
|7 6 5 4 3 2 1 0|


在控制段的数据中, 惟独比特1(bit number 1)被置位.

假设编号为13的字节是一个8位的无符号字符型,而且依照网络字节号排序(nt:对于一个字节来讲,网络字节序等同于主机字节序), 其二进制值
例如如下所看到的:
00000010

而且其10进制值为:

0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 2(nt: 1 * 2^6 表示1乘以2的6次方, 或许这样更
清楚些, 即把原来表达中的指数7 6 ... 0挪到了下面来表达)

接近目标了, 由于咱们已经知道, 假设数据包头部中的SYN被置位, 那么头部中的第13个字节的值为2(nt: 依照网络序, 即大头方式, 最重要的字节
在前面(在前面,即该字节实际内存地址比较小, 最重要的字节,指数学表示中数的高位, 如356中的3) ).

表达为tcpdump能理解的关系式就是:
tcp[13] 2

从而咱们可以把此关系式看成tcpdump的过滤条件, 目标就是监控仅仅含有SYN标志的数据包:
tcpdump -i xl0 tcp[13] 2 (nt: xl0 指网络接口, 如eth0)

这个表达式是说"让TCP数据包的第13个字节拥有值2吧", 这也是咱们想要的结果.


现在, 假设咱们需要抓取带SYN标志的数据包, 而忽略它是否包含其余标志.(nt:仅仅要带SYN就是咱们想要的). 让咱们来看看当一个含有
SYN-ACK的数据包(nt:SYN 和 ACK 标志都有), 来到时发生了什么:
|C|E|U|A|P|R|S|F|
|---------------|
|0 0 0 1 0 0 1 0|
|---------------|
|7 6 5 4 3 2 1 0|

13号字节的1号和4号位被置位, 其二进制的值为:
00010010

转换成十进制就是:

0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2 = 18(nt: 1 * 2^6 表示1乘以2的6次方, 或许这样更
清楚些, 即把原来表达中的指数7 6 ... 0挪到了下面来表达)

现在, 却不能仅仅用'tcp[13] 18'做为tcpdump的过滤表达式, 由于这将致使仅仅选择含有SYN-ACK标志的数据包, 其余的都被丢弃.
提醒一下本身, 咱们的目标是: 仅仅要包的SYN标志被设置就能够, 其余的标志咱们不理会.

为了达到咱们的目标, 咱们需要把13号字节的二进制值与其余的一个数作AND操做(nt:逻辑与)来获得SYN比特位的值. 目标是:仅仅要SYN 被设置
就能够, 因而咱们就把她与上13号字节的SYN值(nt: 00000010).

00010010 SYN-ACK 00000010 SYN
AND 00000010 (we want SYN) AND 00000010 (we want SYN)
-------- --------
= 00000010 = 00000010

咱们可以发现, 不管包的ACK或其余标志是否被设置, 以上的AND操做都会给咱们相同的值, 其10进制表达就是2(2进制表达就是00000010).
从而咱们知道, 对于带有SYN标志的数据包, 下面的表达式的结果老是真(true):

( ( value of octet 13 ) AND ( 2 ) ) ( 2 ) (nt: value of octet 13, 即13号字节的值)

灵感随之而来, 咱们因而获得了例如如下的tcpdump 的过滤表达式
tcpdump -i xl0 'tcp[13] & 2 2'

注意, 单引号或反斜杆(nt: 这里用的是单引号)不能省略, 这可以防止shell对&的解释或替换.

UDP 数据包

UDP 数据包的显示格式,可经过rwho这个详细应用所产生的数据包来讲明:
actinide.who > broadcast.who: udp 84

其含义为:actinide主机上的portwho向broadcast主机上的portwho发送了一个udp数据包(nt: actinide和broadcast都是指Internet地址).
这个数据包承载的用户数据为84个字节.

一些UDP服务可从数据包的源或目的port来识别,也可从所显示的更高层协议信息来识别. 比方, Domain Name service requests(DNS 请求,
在RFC-1034/1035中), 和Sun RPC calls to NFS(对NFSserver所发起的远程调用(nt: 即Sun RPC),在RFC-1050中有对远程调用的描述).

UDP 名称服务请求

(注意:下面的描述假设你对Domain Service protoco(nt:在RFC-103中有所描述), 不然你会发现下面描述就是天书(nt:希腊文天书,
没必要理会, 吓吓你的, 接着看就能够))

名称服务请求有例如如下的格式:
src > dst: id op? flags qtype qclass name (len)
(nt: 从下文来看, 格式应该是src > dst: id op flags qtype qclass? name (len))
比方有一个实际显示为:
h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

主机h2opolo 向helios 上运行的名称server查询ucbvax.berkeley.edu 的地址记录(nt: qtype等于A). 此查询自己的id号为'3'. 符号
'+'意味着递归查询标志被设置(nt: dnsserver可向更高层dnsserver查询本server不包含的地址记录). 这个终于经过IP包发送的查询请求
数据长度为37字节, 当中不包含UDP和IP协议的头数据. 由于此查询操做为默认值(nt | rt: normal one的理解), op字段被省略.
假设op字段没被省略, 会被显示在'3' 和'+'之间. 一样, qclass也是默认值, C_IN, 从而也没被显示, 假设没被忽略, 她会被显示在'A'以后.

异常检查会在方括中显示出附加的域: 假设一个查询同一时候包含一个回应(nt: 可理解为, 对以前其余一个请求的回应), 而且此回应包含权威或附加记录段, 
ancount, nscout, arcount(nt: 详细字段含义需补充) 将被显示为'[na]', '[nn]', '[nau]', 当中n表明合适的计数. 假设包中下面
回应位(比方AA位, RA位, rcode位), 或者字节2或3中不论什么一个'必须为0'的位被置位(nt: 设置为1), '[b2&3]=x' 将被显示, 当中x表示
头部字节2与字节3进行与操做后的值.

UDP 名称服务应答

对名称服务应答的数据包,tcpdump会有例如如下的显示格式
src > dst: id op rcode flags a/n/au type class data (len)
比方详细显示例如如下:
helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

第一行表示: helios 对h2opolo 所发送的3号查询请求回应了3条回答记录(nt | rt: answer records), 3条名称server记录,
以及7条附加的记录. 第一个回答记录(nt: 3个回答记录中的第一个)类型为A(nt: 表示地址), 其数据为internet地址128.32.137.3.
此回应UDP数据包, 包含273字节的数据(不包含UPD和IP的头部数据). op字段和rcode字段被忽略(nt: op的实际值为Query, rcode, 即
response code的实际值为NoError), 一样被忽略的字段还有class 字段(nt | rt: 其值为C_IN, 这也是A类型记录默认取值)

第二行表示: helios 对h2opolo 所发送的2号查询请求作了回应. 回应中, rcode编码为NXDomain(nt: 表示不存在的域)), 没有回答记录,
但包含一个名称server记录, 不包含权威server记录(nt | ck: 从上文来看, 此处的authority records 就是上文中对应的additional
records). '*'表示权威server回答标志被设置(nt: 从而additional records就表示的是authority records).
由于没有回答记录, type, class, data字段都被忽略.

flag字段还有可能出现其余一些字符, 比方'-'(nt: 表示可递归地查询, 即RA 标志没有被设置), '|'(nt: 表示被截断的消息, 即TC 标志
被置位). 假设应答(nt | ct: 可理解为, 包含名称服务应答的UDP数据包, tcpdump知道这类数据包该怎样解析其数据)的'question'段一个条
目(entry)都不包含(nt: 每一个条目的含义, 需补充),'[nq]' 会被打印出来.

要注意的是:名称server的请求和应答数据量比较大, 而默认的68字节的抓取长度(nt: snaplen, 可理解为tcpdump的一个设置选项)可能不足以抓取
数据包的所有内容. 假设你真的需要仔细查看名称server的负载, 可以经过tcpdump 的-s 选项来扩大snaplen值.
SMB/CIFS 解码

tcpdump 已可以对SMB/CIFS/NBT相关应用的数据包内容进行解码(nt: 分别为'Server Message Block Common', 'Internet File System'
'在TCP/IP上实现的网络协议NETBIOS的简称'. 这几个服务一般使用UDP的137/138以及TCP的139port). 原来的对IPX和NetBEUI SMB数据包的
解码能力依旧可以被使用(nt: NetBEUI为NETBIOS的加强版本号).


tcpdump默认仅仅依照最简约模式对对应数据包进行解码, 假设咱们想要详尽的解码信息可以使用其-v 启动选现. 要注意的是, -v 会产生很详细的信息,
比方对单一的一个SMB数据包, 将产生一屏幕或许多其余的信息, 因此此选项, 确有需要才使用.

关于SMB数据包格式的信息, 以及每一个域的含义可以参看www.cifs.org 或者samba.org 镜像网站的pub/samba/specs/ 目录. linux 上的SMB 补丁
(nt | rt: patch)由 Andrew Tridgell (tridge@samba.org)提供.


NFS 请求和回应

tcpdump对Sun NFS(网络文件系统)请求和回应的UDP数据包有例如如下格式的打印输出:
src.xid > dst.nfs: len op args
src.nfs > dst.xid: reply stat len op results

下面是一组详细的输出数据
sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165
wrl.nfs > sushi.6709: reply ok 40 readlink "../var"
sushi.201b > wrl.nfs:
144 lookup fh 9,74/4096.6878 "xcolors"
wrl.nfs > sushi.201b:
reply ok 128 lookup fh 9,74/4134.3150

第一行输出代表: 主机sushi向主机wrl发送了一个'交换请求'(nt: transaction), 此请求的id为6709(注意, 主机名字后是交换
请求id号, 而不是源port号). 此请求数据为112字节, 当中不包含UDP和IP头部的长度. 操做类型为readlink(nt: 即此操做为读符号连接操做),
操做参数为fh 21,24/10.73165(nt: 可按实际运行环境, 解析例如如下, fd 表示描述的为文件句柄, 21,24 表示此句柄所对应设
备的主/从设备号对, 10表示此句柄所对应的i节点编号(nt:每一个文件都会在操做系统中对应一个i节点, 限于unix类系统中),
73165是一个编号(nt: 可理解为标识此请求的一个随机数, 详细含义需补充)).

第二行中, wrl 作了'ok'的回应, 而且在results 字段中返回了sushi想要读的符号链接的真实目录(nt: 即sushi要求读的符号链接事实上是一个目录).

第三行代表: sushi 再次请求 wrl 在'fh 9,74/4096.6878'所描述的目录中查找'xcolors'文件. 需要注意的是, 每行所显示的数据含义依赖于当中op字段的
类型(nt: 不一样op 所对应args 含义不相同), 其格式遵循NFS 协议, 追求简洁明了.

 

假设tcpdump 的-v选项(详细打印选项) 被设置, 附加的信息将被显示. 比方:
sushi.1372a > wrl.nfs:
148 read fh 21,11/12.195 8192 bytes @ 24576
wrl.nfs > sushi.1372a:
reply ok 1472 read REG 100664 ids 417/0 sz 29388

(-v 选项通常还会打印出IP头部的TTL, ID, length, 以及fragmentation 域, 但在此例中, 都略过了(nt: 可理解为,简洁起见, 作了删减))
在第一行, sushi 请求wrl 从文件 21,11/12.195(nt: 格式在上面有描述)中, 自偏移24576字节处开始, 读取8192字节数据.
Wrl 回应读取成功; 由于第二行仅仅是回应请求的开头片断, 因此仅仅包含1472字节(其余的数据将在接着的reply片断中到来, 但这些数据包不会再有NFS
头, 甚至UDP头信息也为空(nt: 源和目的应该要有), 这将致使这些片断不能知足过滤条件, 从而没有被打印). -v 选项除了显示文件数据信息, 还会显示
附加显示文件属性信息: file type(文件类型, ''REG'' 表示普通文件), file mode(文件存取模式, 8进制表示的), uid 和gid(nt: 文件属主和
组属主), file size (文件大小).

假设-v 标志被屡次反复给出(nt: 如-vv), tcpdump会显示更加详细的信息.

必需要注意的是, NFS 请求包中数据比较多, 假设tcpdump 的snaplen(nt: 抓取长度) 取过短将不能显示其详细信息. 可以使用
'-s 192'来增长snaplen, 这可用以监测NFS应用的网络负载(nt: traffic).

NFS 的回应包并不严格的紧随以前对应的请求包(nt: RPC operation). 从而, tcpdump 会跟踪近期收到的一系列请求包, 再经过其
交换序号(nt: transaction ID)与对应请求包相匹配. 这可能产生一个问题, 假设回应包来得太迟, 超出tcpdump 对对应请求包的跟踪范围,
该回应包将不能被分析.

AFS 请求和回应

AFS(nt: Andrew 文件系统, Transarc , 未知, 需补充)请求和回应有例如如下的答应

src.sport > dst.dport: rx packet-type
src.sport > dst.dport: rx packet-type service call call-name args
src.sport > dst.dport: rx packet-type service reply call-name args

elvis.7001 > pike.afsfs:
rx data fs call rename old fid 536876964/1/1 ".newsrc.new"
new fid 536876964/1/1 ".newsrc"
pike.afsfs > elvis.7001: rx data fs reply rename

在第一行, 主机elvis 向pike 发送了一个RX数据包.
这是一个对于文件服务的请求数据包(nt: RX data packet, 发送数据包 , 可理解为发送包过去, 从而请求对方的服务), 这也是一个RPC
调用的开始(nt: RPC, remote procedure call). 此RPC 请求pike 运行rename(nt: 重命名) 操做, 并指定了相关的参数:
原目录描述符为536876964/1/1, 原文件名称为 '.newsrc.new', 新目录描述符为536876964/1/1, 新文件名称为 '.newsrc'.
主机pike 对此rename操做的RPC请求做了回应(回应表示rename操做成功, 由于回应的是包含数据内容的包而不是异常包).

通常来讲, 所有的'AFS RPC'请求被显示时, 会被冠以一个名字(nt: 即decode, 解码), 这个名字每每就是RPC请求的操做名.
而且, 这些RPC请求的部分参数在显示时, 也会被冠以一个名字(nt | rt: 即decode, 解码, 通常来讲也是取名也很直接, 比方,
一个interesting 参数, 显示的时候就会直接是'interesting', 含义拗口, 需再翻).

这种显示格式的设计初衷为'一看就懂', 但对于不熟悉AFS 和 RX 工做原理的人可能不是很
有用(nt: 仍是不用管, 书面吓吓你的, 往下看就能够).

假设 -v(详细)标志被反复给出(nt: 如-vv), tcpdump 会打印出确认包(nt: 可理解为, 与应答包有差异的包)以及附加头部信息
(nt: 可理解为, 所有包, 而不只仅是确认包的附加头部信息), 比方, RX call ID(请求包中'请求调用'的ID),
call number('请求调用'的编号), sequence number(nt: 包顺序号),
serial number(nt | rt: 可理解为与包中数据相关的还有一个顺信号, 详细含义需补充), 请求包的标识. (nt: 接下来一段为反复描述,
因此略去了), 此外确认包中的MTU协商信息也会被打印出来(nt: 确认包为相对于请求包的确认包, Maximum Transmission Unit, 最大传输单元).

假设 -v 选项被反复了三次(nt: 如-vvv), 那么AFS应用类型数据包的'安全索引'('security index')以及'服务索引'('service id')将会
被打印.

对于表示异常的数据包(nt: abort packet, 可理解为, 此包就是用来通知接受者某种异常已发生), tcpdump 会打印出错误号(error codes).
但对于Ubik beacon packets(nt: Ubik 灯塔指示包, Ubik可理解为特殊的通讯协议, beacon packets, 灯塔数据包, 可理解为指明通讯中
关键信息的一些数据包), 错误号不会被打印, 由于对于Ubik 协议, 异常数据包不是表示错误, 相反倒是表示一种确定应答(nt: 即, yes vote).

AFS 请求数据量大, 参数也多, 因此要求tcpdump的 snaplen 比较大, 通常可经过启动tcpdump时设置选项'-s 256' 来增大snaplen, 以
监测AFS 应用通讯负载.

AFS 回应包并不显示标识RPC 属于何种远程调用. 从而, tcpdump 会跟踪近期一段时间内的请求包, 并经过call number(调用编号), service ID
(服务索引) 来匹配收到的回应包. 假设回应包不是针对近期一段时间内的请求包, tcpdump将没法解析该包.

KIP AppleTalk协议

(nt | rt: DDP in UDP可理解为, DDP, The AppleTalk Data Delivery Protocol,
至关于支持KIP AppleTalk协议栈的网络层协议, 而DDP 自己又是经过UDP来传输的,
即在UDP 上实现的用于其余网络的网络层,KIP AppleTalk是苹果公司开发的整套网络协议栈).

AppleTalk DDP 数据包被封装在UDP数据包中, 其解封装(nt: 至关于解码)和对应信息的转储也遵循DDP 包规则.
(nt:encapsulate, 封装, 至关于编码, de-encapsulate, 解封装, 至关于解码, dump, 转储, 一般就是指对其信息进行打印).

/etc/atalk.names 文件中包含了AppleTalk 网络和节点的数字标识到名称的对应关系. 其文件格式一般例如如下所看到的:
number name

1.254 ether
16.1 icsd-net
1.254.110 ace

头两行表示有两个AppleTalk 网络. 第三行给出了特定网络上的主机(一个主机会用3个字节来标识,
而一个网络的标识一般惟独两个字节, 这也是二者标识的主要差异)(nt: 1.254.110 可理解为ether网络上的ace主机).
标识与其对应的名字之间必需要用空白分开. 除了以上内容, /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 文件不存在, 或者没有对应AppleTalk 主机/网络的条目, 数据包的网络地址将以数字形式显示).

在第一行中, 网络144.1上的节点209经过2port,向网络icsd-net上监听在220port的112节点发送了一个NBP应用数据包
(nt | rt: NBP, name binding protocol, 名称绑定协议, 从数据来看, NBPserver会在port2提供此服务.
'DDP port 2' 可理解为'DDP 对应传输层的port2', DDP自己没有port的概念, 这点未肯定, 需补充).

第二行与第一行类似, 仅仅是源的所有地址可用'office'进行标识.
第三行表示: jssmag网络上的149节点经过235向icsd-net网络上的所有节点的2port(NBPport)发送了数据包.(需要注意的是,
在AppleTalk 网络中假设地址中没有节点, 则表示广播地址, 从而节点标识和网络标识最好在/etc/atalk.names有所差异.
nt: 不然一个标识x.port 没法肯定x是指一个网络上所有主机的port口仍是指定主机x的port口).

tcpdump 可解析NBP (名称绑定协议) and ATP (AppleTalk传输协议)数据包, 对于其余应用层的协议, 仅仅会打印出对应协议名字(
假设此协议没有注册一个通用名字, 仅仅会打印其协议号)以及数据包的大小.


NBP 数据包会依照例如如下格式显示:
icsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*"
jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250
techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186

第一行表示: 网络icsd-net 中的节点112 经过220port向网络jssmag 中所有节点的port2发送了对'LaserWriter'的名称查询请求(nt:
此处名称可理解为一个资源的名称, 比方打印机). 此查询请求的序列号为190.

第二行表示: 网络jssmag 中的节点209 经过2port向icsd-net.112节点的port220进行了回应: 我有'LaserWriter'资源, 其资源名称
为'RM1140', 而且在port250上提供改资源的服务. 此回应的序列号为190, 对应以前查询的序列号.

第三行也是对第一行请求的回应: 节点techpit 经过2port向icsd-net.112节点的port220进行了回应:我有'LaserWriter'资源, 其资源名称
为'techpit', 而且在port186上提供改资源的服务. 此回应的序列号为190, 对应以前查询的序列号.


ATP 数据包的显示格式例如如下:
jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001
helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000
jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001
jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002

第一行表示节点 Jssmag.209 向节点helios 发送了一个会话编号为12266的请求包, 请求helios
回应8个数据包(这8个数据包的顺序号为0-7(nt: 顺序号与会话编号不一样, 后者为一次完整传输的编号,
前者为该传输中每一个数据包的编号. transaction, 会话, 一般也被叫作传输)). 行尾的16进制数字表示
该请求包中'userdata'域的值(nt: 从下文来看, 这并无把所有用户数据都打印出来 ).

Helios 回应了8个512字节的数据包. 跟在会话编号(nt: 12266)后的数字表示该数据包在该会话中的顺序号.
括号里的数字表示该数据包中数据的大小, 这不包含atp 的头部. 在顺序号为7数据包(第8行)外带了一个'*'号,
表示该数据包的EOM 标志被设置了.(nt: EOM, End Of Media, 可理解为, 表示一次会话的数据回应完成).

接下来的第9行表示, Jssmag.209 又向helios 提出了请求: 顺序号为3以及5的数据包请又一次传送. Helios 收到这个
请求后又一次发送了这个两个数据包, jssmag.209 再次收到这两个数据包以后, 主动结束(release)了此会话.

在最后一行, jssmag.209 向helios 发送了开始下一次会话的请求包. 请求包中的'*'表示该包的XO 标志没有被设置.
(nt: XO, exactly once, 可理解为在该会话中, 数据包在接受方仅仅被精确地处理一次, 就算对方反复传送了该数据包,
接收方也仅仅会处理一次, 这需要用到特别设计的数据包接收和处理机制).

IP 数据包破碎

(nt: 指把一个IP数据包分红多个IP数据包)

碎片IP数据包(nt: 即一个大的IP数据包破碎后生成的小IP数据包)有例如如下两种显示格式.
(frag id:size@offset+)
(frag id:size@offset)
(第一种格式表示, 此碎片以后还有兴许碎片. 另一种格式表示, 此碎片为最后一个碎片.)

id 表示破碎编号(nt: 从下文来看, 会为每一个要破碎的大IP包分配一个破碎编号, 以便区分每一个小碎片是否由同一数据包破碎而来).
size 表示此碎片的大小 , 不包含碎片头部数据. offset表示此碎片所含数据在原始整个IP包中的偏移((nt: 从下文来看,
一个IP数据包是做为一个整体被破碎的, 包含头和数据, 而不只仅是数据被切割).

每一个碎片都会使tcpdump产生对应的输出打印. 第一个碎片包含了高层协议的头数据(nt:从下文来看, 被破碎IP数据包中对应tcp头以及
IP头都放在了第一个碎片中 ), 从而tcpdump会针对第一个碎片显示这些信息, 并接着显示此碎片自己的信息. 其后的一些碎片并不包含
高层协议头信息, 从而仅仅会在显示源和目的以后显示碎片自己的信息. 下面有一个样例: 这是一个从arizona.edu 到lbl-rtsg.arpa
途经CSNET网络(nt: CSNET connection 可理解为创建在CSNET 网络上的链接)的ftp应用通讯片断:
arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
arizona > rtsg: (frag 595a:204@328)
rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

有几点值得注意:
第一, 第二行的打印中, 地址后面没有port号.
这是由于TCP协议信息都放到了第一个碎片中, 当显示第二个碎片时, 咱们没法知道此碎片所对应TCP包的顺序号.

第二, 从第一行的信息中, 可以发现arizona需要向rtsg发送308字节的用户数据, 而事实是, 对应IP包经破碎后会总共产生512字节
数据(第一个碎片包含308字节的数据, 第二个碎片包含204个字节的数据, 这超过了308字节). 假设你在查找数据包的顺序号空间中的
一些空洞(nt: hole,空洞, 指数据包之间的顺序号没有上下衔接上), 512这个数据就足够使你迷茫一阵(nt: 事实上仅仅要关注308就能够,
没必要关注破碎后的数据总量).

一个数据包(nt | rt: 指IP数据包)假设带有非IP破碎标志, 则显示时会在最后显示'(DF)'.(nt: 意味着此IP包没有被破碎过).

时间戳

tcpdump的所有输出打印行中都会默认包含时间戳信息.
时间戳信息的显示格式例如如下
hh:mm:ss.frac (nt: 小时:分钟:秒.(nt: frac未知, 需补充))
此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间(nt: saw, 便可对该数据包进行操做). 
而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来.

 
命令使用

tcpdump采用命令行方式,它的命令格式为:
复制代码
复制代码

tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
           [ -C file_size ] [ -F file ]
           [ -i interface ] [ -m module ] [ -M secret ]
           [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
           [ -W filecount ]
           [ -E spi@ipaddr algo:secret,...  ]
           [ -y datalinktype ] [ -Z user ]
           [ expression ]

复制代码
复制代码
tcpdump的简单选项介绍
复制代码
复制代码

-A  以ASCII码方式显示每个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages).

-c  count
    tcpdump将在接受到count个数据包后退出.

-C  file-size (nt: 此选项用于配合-w file 选项使用)
    该选项使得tcpdump 在把原始数据包直接保存到文件中以前, 检查此文件大小是否超过file-size. 假设超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新建立的文件名称与-w 选项指定的文件名称一致, 但文件名称后多了一个数字.该数字会从1开始随着新建立文件的增多而增长. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)

-d  以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump中止.(nt | rt: human readable, 容易阅读的,通常是指以ascii码来打印一些信息. compiled, 编排过的. packet-matching code, 包匹配码,含义未知, 需补充)

-dd 以C语言的形式打印出包匹配码.

-ddd 以十进制数的形式打印出包匹配码(会在包匹配码以前有一个附加的'count'前缀).

-D  打印系统中所有tcpdump可以在其上进行抓包的网络接口. 每个接口会打印出数字编号, 对应的接口名字, 以及可能的一个网络接口描述. 当中网络接口名字和数字编号可以用在tcpdump 的-i flag 选项(nt: 把名字或数字取代flag), 来指定要在其上抓包的网络接口.

    此选项在不支持接口列表命令的系统上颇有用(nt: 比方, Windows 系统, 或缺少 ifconfig -a 的UNIX系统); 接口的数字编号在windows 2000 或其后的系统中颇有用, 由于这些系统上的接口名字比较复杂, 而不易使用.

    假设tcpdump编译时所依赖的libpcap库太老,-D 选项不会被支持, 由于当中缺少 pcap_findalldevs()函数.

-e  每行的打印输出中将包含数据包的数据链路层头部信息

-E  spi@ipaddr algo:secret,...

    可经过spi@ipaddr algo:secret 来解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload,IPsec 封装安全负载, IPsec可理解为, 一整套对ip数据包的加密协议, ESP 为整个IP 数据包或当中上层协议部分被加密后的数据,前者的工做模式称为隧道模式; 后者的工做模式称为传输模式 . 工做原理, 另需补充).

    需要注意的是, 在终端启动tcpdump 时, 可以为IPv4 ESP packets 设置密钥(secret).

    可用于加密的算法包含des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者没有(none).默认的是des-cbc(nt: des, Data Encryption Standard, 数据加密标准, 加密算法未知, 另需补充).secret 为用于ESP 的密钥, 使用ASCII 字符串方式表达. 假设以 0x 开头, 该密钥将以16进制方式读入.

    该选项中ESP 的定义遵循RFC2406, 而不是 RFC1827. 而且, 此选项仅仅是用来调试的, 不推荐以真实密钥(secret)来使用该选项, 由于这样不安全: 在命令行中输入的secret 可以被其余人经过ps 等命令查看到.

    除了以上的语法格式(nt: 指spi@ipaddr algo:secret), 还可以在后面增长一个语法输入文件名称字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,... 中...换成一个语法文件名称). 此文件在接受到第一个ESP 包时会打开此文件, 因此最好此时把赋予tcpdump 的一些特权取消(nt: 可理解为, 这样防范以后, 当该文件为恶意编写时,不至于形成过大损害).

-f  显示外部的IPv4 地址时(nt: foreign IPv4 addresses, 可理解为, 非本机ip地址), 采用数字方式而不是名字.(此选项是用来对付Sun公司的NISserver的缺陷(nt: NIS, 网络信息服务, tcpdump 显示外部地址的名字时会用到她提供的名称服务): 此NISserver在查询非本地地址名字时,常常会陷入无尽的查询循环).

    由于对外部(foreign)IPv4地址的测试需要用到本地网络接口(nt: tcpdump 抓包时用到的接口)及其IPv4 地址和网络掩码. 假设此地址或网络掩码不可用, 或者此接口根本就没有设置对应网络地址和网络掩码(nt: linux 下的 'any' 网络接口就不需要设置地址和掩码, 只是此'any'接口可以收到系统中所有接口的数据包), 该选项不能正常工做.

-F  file
    使用file 文件做为过滤条件表达式的输入, 此时命令行上的输入将被忽略.

-i  interface

    指定tcpdump 需要监听的接口.  假设没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包含 loopback 接口).一但找到第一个符合条件的接口, 搜寻当即结束.

    在采用2.2版本号或以后版本号内核的Linux 操做系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接口上的数据包(nt: 这会包含目的是该网络接口的, 也包含目的不是该网络接口的). 需要注意的是假设真实网络接口不能工做在'混杂'模式(promiscuous)下,则没法在'any'这个虚拟的网络接口上抓取其数据包.

    假设 -D 标志被指定, tcpdump会打印系统中的接口编号,而该编号就可用于此处的interface 参数.

-l  对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就当即把这行的内容打印出来).在需要同一时候观察抓包打印以及保存抓包记录的时候颇有用. 比方, 可经过下面命令组合来达到此目的:
    ``tcpdump  -l  |  tee dat'' 或者 ``tcpdump  -l   > dat  &  tail  -f  dat''.(nt: 前者使用tee来把tcpdump 的输出同一时候放到文件dat和标准输出中, 然后者经过重定向操做'>', 把tcpdump的输出放到dat 文件中, 同一时候经过tail把dat文件中的内容放到标准输出中)

-L  列出指定网络接口所支持的数据链路层的类型后退出.(nt: 指定接口经过-i 来指定)

-m  module
    经过module 指定的file 装载SMI MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构MIB, Management Information Base, 管理信息库. 可理解为, 这二者用于SNMP(Simple Network Management Protoco)协议数据包的抓取. 详细SNMP 的工做原理未知, 另需补充).

    此选项可屡次使用, 从而为tcpdump 装载不一样的MIB 模块.

-M  secret  假设TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥secret.

-n  不正确地址(比方, 主机地址, port号)进行数字表示到名字表示的转换.

-N  不打印出host 的域名部分. 比方, 假设设置了此选现, tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'.

-O  不启用进行包匹配时所用的优化代码. 当怀疑某些bug是由优化代码引发的, 此选项将颇有用.

-p  通常状况下, 把网络接口设置为非'混杂'模式. 但必须注意 , 在特殊状况下此网络接口仍是会以'混杂'模式来工做; 从而, '-p' 的设与不设, 不能当作下面选现的代名词:'ether host {local-hw-add}' 或  'ether broadcast'(nt: 前者表示仅仅匹配以太网地址为host 的包, 后者表示匹配以太网地址为广播地址的数据包).

-q  高速(或许用'安静'更好?)打印输出. 即打印不多的协议相关信息, 从而输出行都比较简短.

-R  设定tcpdump 对 ESP/AH 数据包的解析依照 RFC1825而不是RFC1829(nt: AH, 认证头, ESP, 安全负载封装, 这二者会用在IP包的安全传输机制中). 假设此选项被设置, tcpdump 将不会打印出'禁止中继'域(nt: relay prevention field). 另外,由于ESP/AH规范中没有规定ESP/AH数据包必须拥有协议版本号号域,因此tcpdump不能从收到的ESP/AH数据包中推导出协议版本号号.

-r  file
    从文件file 中读取包数据. 假设file 字段为 '-' 符号, 则tcpdump 会从标准输入中读取包数据.

-S  打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比方, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和 2. 而假设此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号:232324, 232325).

-s  snaplen
    设置tcpdump的数据包抓取长度为snaplen, 假设不设置默认将会是68字节(而支持网络接口分接头(nt: NIT, 上文已有描述,可搜索'网络接口分接头'keyword找到那里)的SunOS系列操做系统中默认的也是最小值是96).68字节对于IP, ICMP(nt: Internet Control Message Protocol,因特网控制报文协议), TCP 以及 UDP 协议的报文已足够, 但对于名称服务(nt: 可理解为dns, nis等服务), NFS服务相关的数据包会产生包截短. 假设产生包截短这种状况, tcpdump的对应打印输出行中会出现''[|proto]''的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增长包的处理时间, 而且会下降tcpdump 可缓存的数据包的数量, 从而会致使数据包的丢失. 因此, 在能抓取咱们想要的包的前提下, 抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump本身主动选择合适的长度来抓取数据包.

-T  type
    强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包.  眼下已知的type 可取的协议为:
    aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)网络中使用),
    cnfp (Cisco  NetFlow  protocol),  rpc(Remote Procedure Call), rtp (Real-Time Applications protocol),
    rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol),
    tftp (Trivial File Transfer Protocol, 碎文件协议), vat (Visual Audio Tool, 可用于在internet 上进行电
    视电话会议的应用层协议), 以及wb (distributed White Board, 可用于网络会议的应用层协议).

-t     在每行输出中不打印时间戳

-tt    不正确每行输出的时间进行格式处理(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成1261798315)

-ttt   tcpdump 输出时, 每两行打印之间会延迟一个段时间(以毫秒为单位)

-tttt  在每行打印的时间戳以前增长日期的打印

-u     打印出未加密的NFS 句柄(nt: handle可理解为NFS 中使用的文件句柄, 这将包含目录和目录中的文件)

-U    使得当tcpdump在使用-w 选项时, 其文件写入与包的保存同步.(nt: 即, 当每一个数据包被保存时, 它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)

      -U 标志在老版本号的libcap库(nt: tcpdump 所依赖的报文捕获库)上不起做用, 由于当中缺少pcap_cump_flush()函数.

-v    当分析和打印的时候, 产生详细的输出. 比方, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比方对IP或ICMP包头部的校验和.

-vv   产生比-v更详细的输出. 比方, NFS回应包中的附加域将会被打印, SMB数据包也会被全然解码.

-vvv  产生比-vv更详细的输出. 比方, telent 时所使用的SB, SE 选项将会被打印, 假设telnet同一时候使用的是图形界面,
      其对应的图形选项将会以16进制的方式打印出来(nt: telnet 的SB,SE选项含义未知, 另需补充).

-w    把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后经过-r 选项来又一次读入并进行分析和打印.

-W    filecount
      此选项与-C 选项配合使用, 这将限制可打开的文件数目, 而且当文件数据超过这里设置的限制时, 依次循环替代以前的文件, 这至关于一个拥有filecount 个文件的文件缓冲池. 同一时候, 该选项会使得每一个文件名称的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序.

-x    当分析和打印时, tcpdump 会打印每一个包的头部数据, 同一时候会以16进制打印出每一个包的数据(但不包含链接层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必需要注意的是, 假设高层协议数据没有snaplen 这么长,而且数据链路层(比方, Ethernet层)有填充数据, 则这些填充数据也会被打印.(nt: so for link  layers  that pad, 未能衔接理解和翻译, 需补充 )

-xx   tcpdump 会打印每一个包的头部数据, 同一时候会以16进制打印出每一个包的数据, 当中包含数据链路层的头部.

-X    当分析和打印时, tcpdump 会打印每一个包的头部数据, 同一时候会以16进制和ASCII码形式打印出每一个包的数据(但不包含链接层的头部).这对于分析一些新协议的数据包很方便.

-XX   当分析和打印时, tcpdump 会打印每一个包的头部数据, 同一时候会以16进制和ASCII码形式打印出每一个包的数据, 当中包含数据链路层的头部.这对于分析一些新协议的数据包很方便.

-y    datalinktype
      设置tcpdump 仅仅捕获数据链路层协议类型是datalinktype的数据包

-Z    user
      使tcpdump 放弃本身的超级权限(假设以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID(nt: tcpdump 此处可理解为tcpdump 运行以后对应的进程)

      此选项也可在编译的时候被设置为默认打开.(nt: 此时user 的取值未知, 需补充)

复制代码
复制代码
tcpdump条件表达式

  该表达式用于决定哪些数据包将被打印. 假设不给定条件表达式, 网络上所有被捕获的包都会被打印,不然, 惟独知足条件表达式的数据包被打印.(nt: all packets, 可理解为, 所有被指定接口捕获的数据包).

  表达式由一个或多个'表达元'组成(nt: primitive, 表达元, 可理解为组成表达式的基本元素). 一个表达元一般由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的id组成(nt: 即, 'qualifiers id').有三种不一样类型的修饰符:type, dir以及 proto.
复制代码
复制代码

type 修饰符指定id 所表明的对象类型, id可以是名字也可以是数字. 可选的对象类型有: host, net, port 以及portrange(nt: host 代表id表示主机, net 代表id是网络, port 代表id是端而portrange 代表id 是一个port范围).  如, 'host foo', 'net 128.3', 'port 20', 'portrange 6000-6008'(nt: 分别表示主机 foo,网络 128.3, port 20, port范围 6000-6008). 假设不指定type 修饰符, id默认的修饰符为host.

dir 修饰符描述id 所对应的传输方向, 即发往id 仍是从id 接收(nt: 而id 究竟指什么需要看其前面的type 修饰符).可取的方向为: src, dst, src 或 dst, src而且dst.(nt:分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源而且是传输目的). 好比, 'src foo','dst net 128.3', 'src or dst port ftp-data'.(nt: 分别表示符合条件的数据包中, 源主机是foo, 目的网络是128.3, 源或目的port为 ftp-data).假设不指定dir修饰符, id 默认的修饰符为src 或 dst.对于链路层的协议,比方SLIP(nt: Serial Line InternetProtocol, 串联线路网际网络协议), 以及linux下指定'any' 设备, 并指定'cooked'(nt | rt: cooked 含义未知, 需补充) 抓取类型, 或其余设备类型,可以用'inbound' 和 'outbount' 修饰符来指定想要的传输方向.

proto 修饰符描述id 所属的协议. 可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及 upd.(nt | rt: ether, fddi, tr, 详细含义未知, 需补充. 可理解为物理以太网传输协议, 光纤分布数据网传输协议,以及用于路由跟踪的协议.  wlan, 无线局域网协议; ip,ip6 即一般的TCP/IP协议栈中所使用的ipv4以及ipv6网络层协议;arp, rarp 即地址解析协议,反向地址解析协议; decnet, Digital Equipment Corporation开发的, 最先用于PDP-11 机器互联的网络协议; tcp and udp, 即一般TCP/IP协议栈中的两个传输层协议).

    好比, `ether src foo', `arp net 128.3', `tcp port 21', `udp portrange 7000-7009'分别表示 '从以太网地址foo 来的数据包','发往或来自128.3网络的arp协议数据包', '发送或接收port为21的tcp协议数据包', '发送或接收port范围为7000-7009的udp协议数据包'.

    假设不指定proto 修饰符, 则默以为与对应type匹配的修饰符. 好比, 'src foo' 含义是 '(ip or arp or rarp) src foo' (nt: 即, 来自主机foo的ip/arp/rarp协议数据包, 默认type为host),`net bar' 含义是`(ip  or  arp  or rarp) net bar'(nt: 即, 来自或发往bar网络的ip/arp/rarp协议数据包),`port 53' 含义是 `(tcp or udp) port 53'(nt: 即, 发送或接收port为53的tcp/udp协议数据包).(nt: 由于tcpdump 直接经过数据链路层的 BSD 数据包过滤器或 DLPI(datalink provider interface, 数据链层提供者接口)来直接得到网络数据包, 其可抓取的数据包可涵盖上层的各类协议, 包含arp, rarp, icmp(因特网控制报文协议),ip, ip6, tcp, udp, sctp(流控制传输协议).

    对于修饰符后跟id 的格式,可理解为, type id 是对包最主要的过滤条件: 即对包相关的主机, 网络, port的限制;dir 表示对包的传送方向的限制; proto表示对包相关的协议限制)

    'fddi'(nt: Fiber Distributed Data Interface) 实际上与'ether' 含义同样: tcpdump 会把他们看成一种''指定网络接口上的数据链路层协议''. 如同ehter网(以太网), FDDI 的头部一般也会有源, 目的, 以及包类型, 从而可以像ether网数据包同样对这些域进行过滤. 此外, FDDI 头部还有其余的域, 但不能被放到表达式中用来过滤

    一样, 'tr' 和 'wlan' 也和 'ether' 含义一致, 上一段对fddi 的描述一样适用于tr(Token Ring) 和wlan(802.11 wireless LAN)的头部. 对于802.11 协议数据包的头部, 目的域称为DA, 源域称为 SA;而当中的 BSSID, RA, TA 域(nt | rt: 详细含义需补充)不会被检测(nt: 不能被用于包过虑表达式中).

复制代码
复制代码

  除以上所描述的表达元('primitive'), 还有其余形式的表达元, 而且与上述表达元格式不一样. 比方: gateway, broadcast, less, greater以及算术表达式(nt: 当中每个都算一种新的表达元). 下面将会对这些表达元进行说明.

  表达元之间还可以经过keywordand, or 以及 not 进行链接, 从而可组成比较复杂的条件表达式. 比方,`host foo and not port ftp and not port ftp-data'(nt: 其过滤条件可理解为, 数据包的主机为foo,而且port不是ftp(port21) 和ftp-data(port20, 经常使用port和名字的对应可在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'.(nt: 其过滤条件可理解为,包的协议为tcp, 目的port为ftp 或 ftp-data 或 domain(port53) ).

  借助括号以及对应操做符,可把表达元组合在一块儿使用(由于括号是shell的特殊字符, 因此在shell脚本或终端中使用时必须对括号进行转义, 即'(' 与')'需要分别表达成'\(' 与 '\)').

  有效的操做符有:

 否认操做 (`!' 或 `not')
 与操做(`&&' 或 `and')
 或操做(`||' 或 `or')

  否认操做符的优先级别最高. 与操做和或操做优先级别相同, 而且两者的结合顺序是从左到右. 要注意的是, 表达'与操做'时,

  需要显式写出'and'操做符, 而不只仅是把先后表达元并列放置(nt: 两者中间的'and' 操做符不可省略).

  假设一个标识符前没有keyword, 则表达式的解析过程当中近期用过的keyword(每每也是从左往右距离标识符近期的keyword)将被使用.比方,
    not host vs and ace
  是下面表达的精简:
    not host vs and host ace
  而不是not (host vs or ace).(nt: 前二者表示, 所需数据包不是来自或发往host vs, 而是来自或发往ace.然后者表示数据包仅仅要不是来自或发往vs或ac都符合要求)

  整个条件表达式可以被看成一个单独的字符串参数也可以被看成空格切割的多个参数传入tcpdump, 后者更方便些. 一般, 假设表达式中包含元字符(nt: 如正则表达式中的'*', '.'以及shell中的'('等字符), 不妨使用单独字符串的方式传入. 这时,整个表达式需要被单引号括起来. 多参数的传入方式中, 所有参数终于仍是被空格串联在一块儿, 做为一个字符串被解析.

 
附录:tcpdump的表达元

(nt: True 在下面的描述中含义为: 对应条件表达式中仅仅含有下面所列的一个特定表达元, 此时表达式为真, 即条件获得知足)

dst host host
假设IPv4/v6 数据包的目的域是host, 则与此对应的条件表达式为真.host 可以是一个ip地址, 也可以是一个主机名.
src host host
假设IPv4/v6 数据包的源域是host, 则与此对应的条件表达式为真.
host 可以是一个ip地址, 也可以是一个主机名.
host host

假设IPv4/v6数据包的源或目的地址是 host, 则与此对应的条件表达式为真.以上的几个host 表达式以前可以增长下面keyword:ip, arp, rarp, 以及 ip6.比方:
ip host host
也可以表达为:
ether proto \ip and host host(nt: 这种表达方式在下面有说明, 当中ip以前需要有\来转义,由于ip 对tcpdump 来讲已是一个keyword了.)

假设host 是一个拥有多个IP 的主机, 那么不论什么一个地址都会用于包的匹配(nt: 即发向host 的数据包的目的地址可以是这几个IP中的不论什么一个, 从host 接收的数据包的源地址也可以是这几个IP中的不论什么一个).

ether dst ehost
假设数据包(nt: 指tcpdump 可抓取的数据包, 包含ip 数据包, tcp数据包)的以太网目标地址是ehost,则与此对应的条件表达式为真. Ehost 可以是/etc/ethers 文件中的名字或一个数字地址(nt: 可经过 man ethers 看到对/etc/ethers 文件的描述, 样例中用的是数字地址)

ether src ehost
假设数据包的以太网源地址是ehost, 则与此对应的条件表达式为真.

ether host ehost
假设数据包的以太网源地址或目标地址是ehost, 则与此对应的条件表达式为真.

gateway host
假设数据包的网关地址是host, 则与此对应的条件表达式为真. 需要注意的是, 这里的网关地址是指以太网地址, 而不是IP 地址(nt | rt: I.e., 好比, 可理解为'注意'.the Ethernet source or destination address, 以太网源和目标地址, 可理解为, 指代上句中的'网关地址' ).host 必须是名字而不是数字, 而且必须在机器的'主机名-ip地址'以及'主机名-以太地址'两大映射关系中 有其条目(前一映射关系可经过/etc/hosts文件, DNS 或 NIS获得, 然后一映射关系可经过/etc/ethers 文件获得. nt: /etc/ethers并不必定存在 , 可经过man ethers 看到其数据格式, 怎样建立该文件, 未知,需补充).也就是说host 的含义是 ether host ehost 而不是 host host, 而且ehost必须是名字而不是数字.
眼下, 该选项在支持IPv6地址格式的配置环境中不起做用(nt: configuration, 配置环境, 可理解为,通讯双方的网络配置).

dst net net
假设数据包的目标地址(IPv4或IPv6格式)的网络号字段为 net, 则与此对应的条件表达式为真.
net 可以是从网络数据库文件/etc/networks 中的名字, 也可以是一个数字形式的网络编号.

一个数字IPv4 网络编号将以点分四元组(比方, 192.168.1.0), 或点分三元组(比方, 192.168.1 ), 或点分二元组(比方, 172.16), 或单一单元组(比方, 10)来表达;

对应于这四种状况的网络掩码分别是:四元组:255.255.255.255(这也意味着对net 的匹配如同对主机地址(host)的匹配:地址的四个部分都用到了),三元组:255.255.255.0, 二元组: 255.255.0.0, 一元组:255.0.0.0.

对于IPv6 的地址格式, 网络编号必须所有写出来(8个部分必须所有写出来); 对应网络掩码为:
ff:ff:ff:ff:ff:ff:ff:ff, 因此IPv6 的网络匹配是真正的'host'方式的匹配(nt | rt | rc:地址的8个部分都会用到,是否不属于网络的字节填写0, 需接下来补充), 但同一时候需要一个网络掩码长度参数来详细指定前面多少字节为网络掩码(nt: 可经过下面的net net/len 来指定)

src net net
假设数据包的源地址(IPv4或IPv6格式)的网络号字段为 net, 则与此对应的条件表达式为真.

net net
假设数据包的源或目的地址(IPv4或IPv6格式)的网络号字段为 net, 则与此对应的条件表达式为真.

net net mask netmask
假设数据包的源或目的地址(IPv4或IPv6格式)的网络掩码与netmask 匹配, 则与此对应的条件表达式为真.此选项以前还可以配合src和dst来匹配源网络地址或目标网络地址(nt: 比方 src net net mask 255.255.255.0).该选项对于ipv6 网络地址无效.

net net/len
假设数据包的源或目的地址(IPv4或IPv6格式)的网络编号字段的比特数与len相同, 则与此对应的条件表达式为真.此选项以前还可以配合src和dst来匹配源网络地址或目标网络地址(nt | rt | tt: src net net/24, 表示需要匹配源地址的网络编号有24位的数据包).

dst port port
假设数据包(包含ip/tcp, ip/udp, ip6/tcp or ip6/udp协议)的目的port为port, 则与此对应的条件表达式为真.port 可以是一个数字也可以是一个名字(对应名字可以在/etc/services 中找到该名字, 也可以经过man tcp 和man udp来获得相关描述信息 ). 假设使用名字, 则该名字对应的port号和对应使用的协议都会被检查. 假设仅仅是使用一个数字port号,则惟独对应port号被检查(比方, dst port 513 将会使tcpdump抓取tcp协议的login 服务和udp协议的who 服务数据包, 而port domain 将会使tcpdump 抓取tcp协议的domain 服务数据包, 以及udp 协议的domain 数据包)(nt | rt: ambiguous name is used 不可理解, 需补充).

src port port
假设数据包的源port为port, 则与此对应的条件表达式为真.

port port
假设数据包的源或目的port为port, 则与此对应的条件表达式为真.

dst portrange port1-port2
假设数据包(包含ip/tcp, ip/udp, ip6/tcp or ip6/udp协议)的目的port属于port1到port2这个port范围(包含port1, port2), 则与此对应的条件表达式为真. tcpdump 对port1 和port2 解析与对port 的解析一致(nt:在dst port port 选项的描述中有说明).

src portrange port1-port2
假设数据包的源port属于port1到port2这个port范围(包含 port1, port2), 则与此对应的条件表达式为真.

portrange port1-port2
假设数据包的源port或目的port属于port1到port2这个port范围(包含 port1, port2), 则与此对应的条件表达式为真.

以上关于port 的选项都可以在其前面增长keyword:tcp 或者udp, 比方:
tcp src port port
这将使tcpdump 仅仅抓取源port是port 的tcp数据包.

less length
假设数据包的长度比length 小或等于length, 则与此对应的条件表达式为真. 这与'len <= length' 的含义一致.

greater length
假设数据包的长度比length 大或等于length, 则与此对应的条件表达式为真. 这与'len >= length' 的含义一致.

ip proto protocol
假设数据包为ipv4数据包而且其协议类型为protocol, 则与此对应的条件表达式为真.
Protocol 可以是一个数字也可以是名字, 比方:icmp6, igmp, igrp(nt: Interior Gateway Routing Protocol,内部网关路由协议), pim(Protocol Independent Multicast, 独立组播协议, 应用于组播路由器),ah, esp(nt: ah, 认证头, esp 安全负载封装, 这二者会用在IP包的安全传输机制中 ), vrrp(Virtual Router Redundancy Protocol, 虚拟路由器冗余协议), udp, or tcp. 由于tcp , udp 以及icmp是tcpdump 的keyword,因此在这些协议名字以前必需要用\来进行转义(假设在C-shell 中需要用\\来进行转义). 注意此表达元不会把数据包中协议头链中所有协议头内容所有打印出来(nt: 实际上仅仅会打印指定协议的一些头部信息, 比方可以用tcpdump -i eth0 'ip proto \tcp and host 192.168.3.144', 则仅仅打印主机192.168.3.144 发出或接收的数据包中tcp 协议头所包含的信息)

ip6 proto protocol
假设数据包为ipv6数据包而且其协议类型为protocol, 则与此对应的条件表达式为真.
注意此表达元不会把数据包中协议头链中所有协议头内容所有打印出来

ip6 protochain protocol
假设数据包为ipv6数据包而且其协议链中包含类型为protocol协议头, 则与此对应的条件表达式为真. 比方,
ip6 protochain 6

将匹配其协议头链中拥有TCP 协议头的IPv6数据包.此数据包的IPv6头和TCP头之间可能还会包含验证头, 路由头, 或者逐跳寻径选项头.
由此所触发的对应BPF(Berkeley Packets Filter, 可理解为, 在数据链路层提供数据包过滤的一种机制)代码比较繁琐,
而且BPF优化代码也未能照应到此部分, 从而此选项所触发的包匹配可能会比较慢.

ip protochain protocol
与ip6 protochain protocol 含义相同, 但这用在IPv4数据包.

ether broadcast
假设数据包是以太网广播数据包, 则与此对应的条件表达式为真. ether keyword是可选的.

ip broadcast
假设数据包是IPv4广播数据包, 则与此对应的条件表达式为真. 这将使tcpdump 检查广播地址是否符合全0和全1的一些约定,并查找网络接口的网络掩码(网络接口为当时在其上抓包的网络接口).

假设抓包所在网络接口的网络掩码不合法, 或者此接口根本就没有设置对应网络地址和网络, 亦或是在linux下的'any'网络接口上抓包(此'any'接口可以收到系统中不止一个接口的数据包(nt: 实际上, 可理解为系统中所有可用的接口)),网络掩码的检查不能正常进行.


ether multicast
假设数据包是一个以太网多点广播数据包(nt: 多点广播, 可理解为把消息同一时候传递给一组目的地址, 而不是网络中所有地址,后者为可称为广播(broadcast)), 则与此对应的条件表达式为真. keywordether 可以省略. 此选项的含义与下面条件表达式含义一致:`ether[0] & 1 != 0'(nt: 可理解为, 以太网数据包中第0个字节的最低位是1, 这意味这是一个多点广播数据包).

ip multicast
假设数据包是ipv4多点广播数据包, 则与此对应的条件表达式为真.

ip6 multicast
假设数据包是ipv6多点广播数据包, 则与此对应的条件表达式为真.

ether proto protocol
假设数据包属于下面以太协议类型, 则与此对应的条件表达式为真.
协议(protocol)字段, 可以是数字或下面所列出了名字: ip, ip6, arp, rarp, atalk(AppleTalk网络协议),
aarp(nt: AppleTalk Address Resolution Protocol, AppleTalk网络的地址解析协议),
decnet(nt: 一个由DEC公司所提供的网络协议栈), sca(nt: 未知, 需补充),
lat(Local Area Transport, 区域传输协议, 由DEC公司开发的以太网主机互联协议),
mopdl, moprc, iso(nt: 未知, 需补充), stp(Spanning tree protocol, 生成树协议, 可用于防止网络中产生连接循环),
ipx(nt: Internetwork Packet Exchange, Novell 网络中使用的网络层协议), 或者
netbeui(nt: NetBIOS Extended User Interface,可理解为, 网络基本输入输出系统接口扩展).

protocol字段可以是一个数字或下面协议名之中的一个:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat,
mopdl, moprc, iso, stp, ipx, 或者netbeui.
必需要注意的是标识符也是keyword, 从而必须经过'\'来进行转义.

(SNAP:子网接入协议 (SubNetwork Access Protocol))

在光纤分布式数据网络接口(其表达元形式可以是'fddi protocol arp'), 令牌环网(其表达元形式可以是'tr protocol arp'),
以及IEEE 802.11 无线局域网(其表达元形式可以是'wlan protocol arp')中, protocol
标识符来自802.2 逻辑链路控制层头,
在FDDI, Token Ring 或 802.1头中会包含此逻辑链路控制层头.

当以这些网络上的对应的协议标识为过滤条件时, tcpdump仅仅是检查LLC头部中以0x000000为组成单元标识符(OUI, 0x000000
标识一个内部以太网)的一段'SNAP格式结构'中的protocol ID 域, 而不会管包中是否有一段OUI为0x000000的'SNAP格式
结构'(nt: SNAP, SubNetwork Access Protocol,子网接入协议 ). 下面例外:

iso tcpdump 会检查LLC头部中的DSAP域(Destination service Access Point, 目标服务接入点)和
SSAP域(源服务接入点).(nt: iso 协议未知, 需补充)

stp 以及 netbeui
tcpdump 将会检查LLC 头部中的目标服务接入点(Destination service Access Point);

atalk
tcpdump 将会检查LLC 头部中以0x080007 为OUI标识的'SNAP格式结构', 并会检查AppleTalk etype域.
(nt: AppleTalk etype 是否位于SNAP格式结构中, 未知, 需补充).

此外, 在以太网中, 对于ether proto protocol 选项, tcpdump 会为 protocol 所指定的协议检查
以太网类型域(the Ethernet type field), 但下面这些协议除外:

iso, stp, and netbeui
tcpdump 将会检查802.3 物理帧以及LLC 头(这两种检查与FDDI, TR, 802.11网络中的对应检查一致);
(nt: 802.3, 理解为IEEE 802.3, 其为一系列IEEE 标准的集合. 此集合定义了有线以太网络中的物理层以及数据
链路层的媒体接入控制子层. stp 在上文已有描述)

atalk
tcpdump 将会检查以太网物理帧中的AppleTalk etype 域 , 同一时候也会检查数据包中LLC头部中的'SNAP格式结构'
(这两种检查与FDDI, TR, 802.11网络中的对应检查一致)

aarp tcpdump 将会检查AppleTalk ARP etype 域, 此域或存在于以太网物理帧中, 或存在于LLC(由802.2 所定义)的
'SNAP格式结构'中, 当为后者时, 该'SNAP格式结构'的OUI标识为0x000000;
(nt: 802.2, 可理解为, IEEE802.2, 当中定义了逻辑链路控制层(LLC), 该层对应于OSI 网络模型中数据链路层的上层部分.
LLC 层为使用数据链路层的用户提供了一个统一的接口(一般常使用户是网络层). LLC层下面是媒体接入控制层(nt: MAC层,
对应于数据链路层的下层部分).该层的实现以及工做方式会依据不一样物理传输媒介的不一样而有所差异(比方, 以太网, 令牌环网,
光纤分布数据接口(nt: 实际可理解为一种光纤网络), 无线局域网(802.11), 等等.)

ipx tcpdump 将会检查物理以太帧中的IPX etype域, LLC头中的IPX DSAP域,无LLC头并对IPX进行了封装的802.3帧,
以及LLC 头部'SNAP格式结构'中的IPX etype 域(nt | rt: SNAP frame, 可理解为, LLC 头中的'SNAP格式结构'.
该含义属初步理解阶段, 需补充).

decnet src host
假设数据包中DECNET源地址为host, 则与此对应的条件表达式为真.
(nt:decnet, 由Digital Equipment Corporation 开发, 最先用于PDP-11 机器互联的网络协议)

decnet dst host
假设数据包中DECNET目的地址为host, 则与此对应的条件表达式为真.
(nt: decnet 在上文已有说明)

decnet host host
假设数据包中DECNET目的地址或DECNET源地址为host, 则与此对应的条件表达式为真.
(nt: decnet 在上文已有说明)

ifname interface
假设数据包已被标记为从指定的网络接口中接收的, 则与此对应的条件表达式为真.
(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为OpenBSD中的防火墙程序))

on interface
与 ifname interface 含义一致.

rnr num
假设数据包已被标记为匹配PF的规则, 则与此对应的条件表达式为真.
(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为OpenBSD中的防火墙程序))

rulenum num
与 rulenum num 含义一致.

reason code
假设数据包已被标记为包含PF的匹配结果代码, 则与此对应的条件表达式为真.有效的结果代码有: match, bad-offset,
fragment, short, normalize, 以及memory.
(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为OpenBSD中的防火墙程序))

rset name
假设数据包已被标记为匹配指定的规则集, 则与此对应的条件表达式为真.
(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为OpenBSD中的防火墙程序))

ruleset name
与 rset name 含义一致.

srnr num
假设数据包已被标记为匹配指定的规则集中的特定规则(nt: specified PF rule number, 特定规则编号, 即特定规则),
则与此对应的条件表达式为真.(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为
OpenBSD中的防火墙程序))

subrulenum num
与 srnr 含义一致.

action act
假设包被记录时PF会运行act指定的动做, 则与此对应的条件表达式为真. 有效的动做有: pass, block.
(此选项仅仅适用于被OpenBSD中pf程序作过标记的包(nt: pf, packet filter, 可理解为OpenBSD中的防火墙程序))

ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
与下面表达元含义一致:
ether proto p
p是以上协议中的一个.

lat, moprc, mopdl
与下面表达元含义一致:
ether proto p
p是以上协议中的一个. 必需要注意的是tcpdump眼下还不能分析这些协议.

vlan [vlan_id]
假设数据包为IEEE802.1Q VLAN 数据包, 则与此对应的条件表达式为真.
(nt: IEEE802.1Q VLAN, 即IEEE802.1Q 虚拟网络协议, 此协议用于不一样网络的之间的互联).
假设[vlan_id] 被指定, 则惟独数据包含有指定的虚拟网络id(vlan_id), 则与此对应的条件表达式为真.
要注意的是, 对于VLAN数据包, 在表达式中遇到的第一个vlankeyword会改变表达式中接下来keyword所对应数据包中数据的
开始位置(即解码偏移). 在VLAN网络体系中过滤数据包时, vlan [vlan_id]表达式可以被屡次使用. keywordvlan每出现一次都会增长
4字节过滤偏移(nt: 过滤偏移, 可理解为上面的解码偏移).

好比:
vlan 100 && vlan 200
表示: 过滤封装在VLAN100中的VLAN200网络上的数据包
再好比:
vlan && vlan 300 && ip
表示: 过滤封装在VLAN300 网络中的IPv4数据包, 而VLAN300网络又被更外层的VLAN封装


mpls [label_num]
假设数据包为MPLS数据包, 则与此对应的条件表达式为真.
(nt: MPLS, Multi-Protocol Label Switch, 多协议标签交换, 一种在开放的通讯网上利用标签引导数据传输的技术).

假设[label_num] 被指定, 则惟独数据包含有指定的标签id(label_num), 则与此对应的条件表达式为真.
要注意的是, 对于内含MPLS信息的IP数据包(即MPLS数据包), 在表达式中遇到的第一个MPLSkeyword会改变表达式中接下来keyword所对应数据包中数据的
开始位置(即解码偏移). 在MPLS网络体系中过滤数据包时, mpls [label_num]表达式可以被屡次使用. keywordmpls每出现一次都会增长
4字节过滤偏移(nt: 过滤偏移, 可理解为上面的解码偏移).

好比:
mpls 100000 && mpls 1024
表示: 过滤外层标签为100000 而层标签为1024的数据包

再如:
mpls && mpls 1024 && host 192.9.200.1
表示: 过滤发往或来自192.9.200.1的数据包, 该数据包的内层标签为1024, 且拥有一个外层标签.

pppoed
假设数据包为PPP-over-Ethernet的server探寻数据包(nt: Discovery packet,
其ethernet type 为0x8863),则与此对应的条件表达式为真.
(nt: PPP-over-Ethernet, 点对点以太网承载协议, 其点对点的链接创建分为Discovery阶段(地址发现) 和
PPPoE 会话创建阶段 , discovery 数据包就是第一阶段发出来的包. ethernet type
是以太帧里的一个字段,用来指明应用于帧数据字段的协议)

pppoes
假设数据包为PPP-over-Ethernet会话数据包(nt: ethernet type 为0x8864, PPP-over-Ethernet在上文已有说明, 可搜索
keyword'PPP-over-Ethernet'找到其描述), 则与此对应的条件表达式为真.

要注意的是, 对于PPP-over-Ethernet会话数据包, 在表达式中遇到的第一个pppoeskeyword会改变表达式中接下来keyword所对应数据包中数据的
开始位置(即解码偏移).

好比:
pppoes && ip
表示: 过滤嵌入在PPPoE数据包中的ipv4数据包

tcp, udp, icmp
与下面表达元含义一致:
ip proto p or ip6 proto p
当中p 是以上协议之中的一个(含义分别为: 假设数据包为ipv4或ipv6数据包而且其协议类型为 tcp,udp, 或icmp则与此对
应的条件表达式为真)

iso proto protocol
假设数据包的协议类型为iso-osi协议栈中protocol协议, 则与此对应的条件表达式为真.(nt: [初解]iso-osi 网络模型中每
层的详细协议与tcp/ip对应层采用的协议不一样. iso-osi各层中的详细协议另需补充 )

protocol 可以是一个数字编号, 或下面名字中之中的一个:
clnp, esis, or isis.
(nt: clnp, Connectionless Network Protocol, 这是OSI网络模型中网络层协议 , esis, isis 未知, 需补充)

clnp, esis, isis
是下面表达的缩写
iso proto p
当中p 是以上协议之中的一个


l1, l2, iih, lsp, snp, csnp, psnp
为IS-IS PDU 类型 的缩写.
(nt: IS-IS PDU, Intermediate system to intermediate system Protocol Data Unit, 中间系统到
中间系统的协议数据单元. OSI(Open Systems Interconnection)网络由终端系统, 中间系统构成.
终端系统指路由器, 而终端系统指用户设备. 路由器造成的本地组称之为'区域'(Area)和多个区域组成一个'域'(Domain).
IS-IS 提供域内或区域内的路由. l1, l2, iih, lsp, snp, csnp, psnp 表示PDU的类型, 详细含义另需补充)

vpi n
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 ,
假设数据包为ATM数据包, 而且其虚拟路径标识为n, 则与此对应的条件表达式为真.
(nt: ATM, Asychronous Transfer Mode, 实际上可理解为由ITU-T(国际电信联盟电信标准化部门)提出的一个与
TCP/IP中IP层功能等同的一系列协议, 详细协议层次另需补充)

vci n
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 ,
假设数据包为ATM数据包, 而且其虚拟通道标识为n, 则与此对应的条件表达式为真.
(nt: ATM, 在上文已有描述)

lane
假设数据包为ATM LANE 数据包, 则与此对应的条件表达式为真. 要注意的是, 假设是模拟以太网的LANE数据包或者
LANE逻辑单元控制包, 表达式中第一个lanekeyword会改变表达式中随后条件的测试. 假设没有
指定lanekeyword, 条件测试将依照数据包中内含LLC(逻辑链路层)的ATM包来进行.

llc
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 ,
假设数据包为ATM数据包, 而且内含LLC则与此对应的条件表达式为真

oamf4s
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是Segment OAM F4 信元(VPI=0 而且 VCI=3), 则与此对应的条件表达式为真.

(nt: OAM, Operation Administration and Maintenance, 操做管理和维护,可理解为:ATM网络中用于网络
管理所产生的ATM信元的分类方式.

ATM网络中传输单位为信元, 要传输的数据终究会被切割成固定长度(53字节)的信元,
(初理解: 一条物理线路可被复用, 造成虚拟路径(virtual path). 而一条虚拟路径再次被复用, 造成虚拟信道(virtual channel)).
通讯双方的编址方式为:虚拟路径编号(VPI)/虚拟信道编号(VCI)).

OAM F4 flow 信元又可分为segment 类和end-to-end 类, 其差异未知, 需补充.)

oamf4e
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是 end-to-end OAM F4 信元(VPI=0 而且 VCI=4), 则与此对应的条件表达式为真.
(nt: OAM 与 end-to-end OAM F4 在上文已有描述, 可搜索'oamf4s'来定位)

oamf4
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是 end-to-end 或 segment OAM F4 信元(VPI=0 而且 VCI=3 或者 VCI=4), 则与此对应的条件表达式为真.
(nt: OAM 与 end-to-end OAM F4 在上文已有描述, 可搜索'oamf4s'来定位)

oam
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是 end-to-end 或 segment OAM F4 信元(VPI=0 而且 VCI=3 或者 VCI=4), 则与此对应的条件表达式为真.
(nt: 此选项与oamf4反复, 需确认)

metac
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'元信令线路'(nt: VPI=0 而且 VCI=1, '元信令线路', meta signaling circuit, 详细含义未知, 需补充),
则与此对应的条件表达式为真.

bcc
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'广播信令线路'(nt: VPI=0 而且 VCI=2, '广播信令线路', broadcast signaling circuit, 详细含义未知, 需补充),
则与此对应的条件表达式为真.

sc
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'信令线路'(nt: VPI=0 而且 VCI=5, '信令线路', signaling circuit, 详细含义未知, 需补充),
则与此对应的条件表达式为真.

ilmic
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'ILMI线路'(nt: VPI=0 而且 VCI=16, 'ILMI', Interim Local Management Interface , 可理解为
基于SNMP(简易网络管理协议)的用于网络管理的接口)
则与此对应的条件表达式为真.

connectmsg

假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'信令线路'而且是Q.2931协议中规定的下面几种消息: Setup, Calling Proceeding, Connect,
Connect Ack, Release, 或者Release Done. 则与此对应的条件表达式为真.
(nt: Q.2931 为ITU(国际电信联盟)制定的信令协议. 当中规定了在宽带综合业务数字网络的用户接口层创建, 维护, 取消
网络链接的相关步骤.)

metaconnect
假设数据包为ATM数据包, 则与此对应的条件表达式为真. 对于Solaris 操做系统上的SunATM设备 , 假设数据包为ATM数据包
而且是来自'元信令线路'而且是Q.2931协议中规定的下面几种消息: Setup, Calling Proceeding, Connect,
Connect Ack, Release, 或者Release Done. 则与此对应的条件表达式为真.

expr relop expr
假设relop 两侧的操做数(expr)知足relop 指定的关系, 则与此对应的条件表达式为真.
relop 可以是下面关系操做符之中的一个: >, <, <=, =, !=.
expr 是一个算术表达式. 此表达式中可以使用整型常量(表示方式与标准C中一致), 二进制操做符(+, -, *, /, &, |,
<<, >>), 长度操做符, 以及对特定数据包中数据的引用操做符. 要注意的是, 所有的比较操做都默认操做数是无符号的,
好比, 0x80000000 和 0xffffffff 都是大于0的(nt: 对于有符号的比较, 依照补码规则, 0xffffffff
会小于0). 假设要引用数据包中的数据, 可采用下面表达方式:
proto [expr : size]

proto 的取值可以是下面取值之中的一个:ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp,
tcp, udp, icmp, ip6 或者 radio. 这指明了该引用操做所对应的协议层.(ether, fddi, wlan,
tr, ppp, slip and link 对应于数据链路层, radio 对应于802.11(wlan,无线局域网)某些数据包中的附带的
"radio"头(nt: 当中描述了波特率, 数据加密等信息)).
要注意的是, tcp, udp 等上层协议眼下仅仅能应用于网络层采用为IPv4或IPv6协议的网络(此限制会在tcpdump将来版本号中
进行改动). 对于指定协议的所需数据, 其在包数据中的偏移字节由expr 来指定.

以上表达中size 是可选的, 用来指明咱们关注那部分数据段的长度(nt:一般这段数据
是数据包的一个域), 其长度可以是1, 2, 或4个字节. 假设不给定size, 默认是1个字节. 长度操做符的keyword为len,
这代码整个数据包的长度.

好比, 'ether[0] & 1 != 0' 将会使tcpdump 抓取所有多点广播数据包.(nt: ether[0]字节的最低位为1表示
数据包目的地址是多点广播地址). 'ip[0] & 0xf != 5' 对应抓取所有带有选项的
IPv4数据包. 'ip[6:2] & 0x1fff = 0'对应抓取没被破碎的IPv4数据包或者
其片断编号为0的已破碎的IPv4数据包. 这种数据检查方式也适用于tcp和udp数据的引用,
即, tcp[0]对应于TCP 头中第一个字节, 而不是对应不论什么一个中间的字节.

一些偏移以及域的取值除了可以用数字也可用名字来表达. 下面为可用的一些域(协议头中的域)的名字: icmptype (指ICMP 协议头
中type域), icmpcode (指ICMP 协议头code 域), 以及tcpflags(指TCP协议头的flags 域)

下面为ICMP 协议头中type 域的可用取值:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert,
icmp-routersolicit, icmp-timx-ceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply,
icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

下面为TCP 协议头中flags 域的可用取值:tcp-fin, tcp-syn, tcp-rst, tcp-push,
tcp-ack, tcp-urg.












技巧:超级详细Tcpdump 的用法
2011-12-08 20:33 51CTO Hulda
关键字:Tcpdump rarp 混杂模式

  第一种是关于类型的关键字,主要包括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 截获数据并保存到文件中,而后再使用其余程序进行解码分析。固然也应该定义过滤规则,以免捕获的数据包填满整个硬盘。






























 tcpdump高级过滤表达式
分类: 协议 2012-11-08 16:48 2990人阅读 评论(0) 收藏 举报

 

http://www.wains.be/pub/networking/tcpdump_advanced_filters.txt

 

tcpdump advanced filters
========================

Sebastien Wains <sebastien -the at sign- wains -dot- be>
http://www.wains.be

$Id: tcpdump_advanced_filters.txt 34 2010-08-21 13:50:49Z sw $


Notes :

I usually always specify the interface from which to listen.. that's the -i option you will always see in the examples.
Indeed, I have tested each rule on my laptop over the wireless adapter which is eth1.

Feel free to contact me for comments, suggestions or for reporting mistakes.
I know I'm usually terrible at explaining stuff, so let me know if something is not clear.

I'll try to keep this document updated with new useful rules.


Before I begin with advanced filters, let's review the basic syntax of tcpdump

Basic syntax :
==============

Filtering hosts :
-----------------

- Match any traffic involving 192.168.1.1 as destination or source
# tcpdump -i eth1 host 192.168.1.1
不区分源地址和目的地址,过滤IP
- As soure only
# tcpdump -i eth1 src host 192.168.1.1
过滤源地址
- As destination only
# tcpdump -i eth1 dst host 192.168.1.1
过滤目的地址

Filtering ports :
-----------------

- Match any traffic involving port 25 as source or destination
# tcpdump -i eth1 port 25
不区分源端口和目的端口,过滤端口
- Source
# tcpdump -i eth1 src port 25
过滤源端口
- Destination
# tcpdump -i eth1 dst port 25
过滤目的端口

Network filtering :
-------------------
过滤网络
# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168


Protocol filtering :
--------------------
过滤协议
# tcpdump -i eth1 arp
# tcpdump -i eth1 ip

# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp


Let's combine expressions :
---------------------------

Negation    : ! or "not" (without the quotes)
Concatanate : && or "and"
Alternate   : || or "or"

- This rule will match any TCP traffic on port 80 (web) with 192.168.1.254 or 192.168.1.200 as destination host
# tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
过滤80端口的TCP协议,目的地址是254或200
- Will match any ICMP traffic involving the destination with physical/MAC address 00:01:02:03:04:05
# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
过滤icmp协议,而且MAC地址为00:01:02:03:04:05
- Will match any traffic for the destination network 192.168 except destination host 192.168.1.200
# tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
过滤协议为TCP,目的网络为192.168的数据,这之中除去192.168.1.200的主机的数据

Advanced header filtering :
===========================

Before we continue, we need to know how to filter out info from headers

proto[x:y] : will start filtering from byte x for y bytes. ip[2:2] would filter bytes 3 and 4 (first byte begins by 0)
proto[x:y] & z = 0 : will match bits set to 0 when applying mask z to proto[x:y]
proto[x:y] & z !=0 : some bits are set when applying mask z to proto[x:y]
proto[x:y] & z = z : every bits are set to z when applying mask z to proto[x:y]
proto[x:y] = z : p[x:y] has exactly the bits set to z


Operators : >, <, >=, <=, =, !=
高级包头过滤
============
首先了解如何从包头过滤信息
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
操做符: >, <, >=, <=, =, !=
IP 头
This may not be clear in the first place but you'll find examples below involving these.


Of course, it is important to know what the protocol headers look like before diving into more advanced filters.


IP header
---------

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 ...                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



I'll consider we are only working with the IPv4 protocol suite for these examples.

In an ideal world, every field would fit inside one byte. This is not the case, of course.

Are IP options set ?
--------------------

Let's say we want to know if the IP header has options set. We can't just try to filter out the 21st byte
because if no options are set, data start at the 21st byte. We know a "normal" header is usually 20 bytes
(160 bits) long. With options set, the header is longer than that. The IP header has the header
length field which we will filter here to know if the header is longer than 20 bytes.

+-+-+-+-+-+-+-+-+
|Version|  IHL  |
+-+-+-+-+-+-+-+-+

Usually the first byte has a value of 01000101 in binary.
一般第一个字节的二进制为01000101
Anyhow, we need to divide the first byte in half...
先把第一个字节分红二半
0100 = 4 in decimal. This is the IP version.表明IP的版本
0101 = 5 in decimal. This is the number of blocks of 32 bits in the headers. 5 x 32 bits = 160 bits or 20 bytes.报头长度,160个小b(bit)或是20个大B(字节)

The second half of the first byte would be bigger than 5 if the header had IP options set.
若是报头有IP选项设置,IHL将比5大
We have two ways of dealing with that kind of filters.
咱们有两种方式处理过滤器
1. Either try to match a value bigger than 01000101. This would trigger matches for IPv4 traffic with IP options set,
   but ALSO any IPv6 traffic !
当是IPV6的状况时,版本信息确定是超过01000101,若是是带有IP选项设置的IPV4也有可能在版本信息中超过01000101
In decimal 01000101 equals 69.
01000101十进制为69
Let's recap how to calculate in decimal.
让咱们来复习下在十进制中如何计算
0 : 0 \
1 : 2^6 = 64 \ First field (IP version)
0 : 0 /
0 : 0 /
-
0 : 0 \
1 : 2^2 = 4 \ Second field (Header length)
0 : 0 /
1 : 2^0 = 1 /

64 + 4 + 1 = 69

The first field in the IP header would usually have a decimal value of 69.
If we had IP options set, we would probably have 01000110 (IPv4 = 4 + header = 6), which in decimal equals 70.
若是进行IP选项设置,二进制有多是01000110,十进制为70
This rule should do the job :这个规则应该这样设置
# tcpdump -i eth1 'ip[0] > 69'

Somehow, the proper way is to mask the first half/field of the first byte, because as mentionned earlier,
this filter would match any IPv6 traffic.
无论怎么样,这个方法来过滤第一字节的一半/所有,正像之前提到的那样,确定能够适用于匹配IPV6的状况
2. The proper way : masking the first half of the byte
适合的方法:过滤一个字节的前面一半
0100 0101 : 1st byte originally 第一字节原来的样子
0000 1111 : mask (0x0f in hex or 15 in decimal). 0 will mask the values while 1 will keep the values intact.   0用过滤,1用来保留
=========
0000 0101 : final result   与操做之后的结果

The correct filter :正确的过滤表达式

# tcpdump -i eth1 'ip[0] & 15 > 5'

or

# tcpdump -i eth1 'ip[0] & 0x0f > 5'


DF bit (don't fragment) set ?
-----------------------------
DF:Don't Fragment
IP协议的首部“标志”中标志(flag) 占 3 位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)。MF =1 表示后面“还有分片”。MF  0 表示最后一个分片。标志字段中间的一位是 DF (Don't Fragment) 只有当 DF =0 时才容许分片。

Let's now trying to know if we have fragmentation occuring, which is not desirable. Fragmentation occurs
when a the MTU of the sender is bigger than the path MTU on the path to destination.
如今看下如何让咱们知道是否有分片发生,当发送设备的MTU大于沿途设备的MTU时,就要分片
Fragmentation info can be found in the 7th and 8th byte of the IP header.
分片标志能够在IP头的第七和第八字节找到
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
标志    IP数据分割偏移
Bit 0: reserved, must be zero  保留,置0
Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.      0为可片,1为不可片
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.   0为最后一片,1为后面还有

The fragment offset field is only used when fragmentation occurs.
只有须要分片时分片标志才会设置
If we want to match the DF bit (don't fragment bit, to avoid IP fragmentation) :
若是咱们想匹配DF位(避免IP分片)
The 7th byte would have a value of :
01000000 or 64 in decimal
二进制01000000或十进制64
# tcpdump -i eth1 'ip[6] = 64'
过滤DF位为1的IP包

Matching fragmentation ?
------------------------
匹配分片
- Matching MF (more fragment set) ? This would match the fragmented datagrams but wouldn't match the last

  fragment (which has the 2nd bit set to 0).

匹配MF标志(还有后续分片设置)?这个设置是用来匹配不是最后一个分片的数据报
# tcpdump -i eth1 'ip[6] = 32'
过滤匹配MF标志的IP包,用以过滤第一个分片
The last fragment have the first 3 bits set to 0... but has data in the fragment offset field.
最后一个分片中,第六个字节的第3比特位设置为0,除非有分片偏移字段的数据(不是很明白)
- Matching the fragments and the last fragments

匹配分片和最后一片

# tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'
从第6个字节开始日后数2个字节大于0,而且第6个字节的十进制不等于64,这意味不是最后一个分片
A bit of explanations :一个比特位的解解释
"ip[6:2] > 0" would return anything with a value of at least 1 但愿返回值至少是个1
We don't want datagrams with the DF bit set though.. the reason of the "not ip[6] = 64" 咱们不但愿要DF位设置的数据包

If you want to test fragmentation use something like :若是你想测试下分片
ping -M want -s 3000 192.168.1.1


Matching datagrams with low TTL 匹配低TTL
-------------------------------

The TTL field is located in the 9th byte and fits perfectly into 1 byte.   TTL字段在第9个字节,均是1
The maximum decimal value of the TTL field is thus 255 (11111111 in binary). 最大值为255

This can be verified :
$ ping -M want -s 3000 -t 256 192.168.1.200
ping: ttl 256 out of range

+-+-+-+-+-+-+-+-+
|  Time to Live |
+-+-+-+-+-+-+-+-+

We can try to find if someone on our network is using traceroute by using something like this on the gateway :

在网关上,咱们能够发现是否有人用traceroute这种相似的命令进行测试,设置一个比较小的TTL值进行发包
# tcpdump -i eth1 'ip[8] < 5'


Matching packets longer than X bytes
------------------------------------
匹配大于某个长度字节的IP包
Where X is 600 bytes
好比是600个字节
# tcpdump -i eth1 'ip[2:2] > 600'
第3、第四个字节大于600

More IP filtering
-----------------
更多的IP过滤
We could imagine filtering source and destination addresses directly in decimal addressing.
We could also match the protocol by filtering the 10th byte.

咱们能够想像用十进制源和目的地址来进行过滤

咱们也能够经过匹配第十个字节来过滤指定协议
It would be pointless anyhow, because tcpdump makes it already easy to filter out that kind of info.
TCPDUMP能够简单完成这个匹配协议的工做

TCP header
----------

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |       |C|E|U|A|P|R|S|F|                               |
| Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             |
|       |       |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



- Matching any TCP traffic with a source port > 1024   过滤TCP协议源端口超过1024的数据
# tcpdump -i eth1 'tcp[0:2] > 1024'

- Matching TCP traffic with particular flag combinations
匹配TCP特定标志组合
The flags are defined in the 14th byte of the TCP header.
这些标志在TCP头的第十四个字节
+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+

In the TCP 3-way handshakes, the exchange between hosts goes like this :
TCP的三次握手过程
1. Source sends SYN 发起方发SYN
2. Destination answers with SYN, ACK  目的方回答SYN+ACK
3. Source sends ACK 发起方发ACK

- If we want to match packets with only the SYN flag set, the 14th byte would have a binary

  value of 00000010 which equals 2 in decimal.

当咱们只想过滤仅有SYN标志的包时,第14个字节的二进制是00000010,十进制是2
# tcpdump -i eth1 'tcp[13] = 2'

- Matching SYN, ACK (00010010 or 18 in decimal)匹配SYN+ACK包时(二进制是00010010或是十进制18)
# tcpdump -i eth1 'tcp[13] = 18'

- Matching either SYN only or SYN-ACK datagrams匹配SYN或是SYN+ACK的数据时
# tcpdump -i eth1 'tcp[13] & 2 = 2'

We used a mask here. It will returns anything with the ACK bit set (thus the SYN-ACK combination as well)
咱们这种与的方式,也可用在过滤ACK或SYN+ACK中
Let's assume the following examples (SYN-ACK)
假设要过滤SYN-ACK
00010010 : SYN-ACK packet
00000010 : mask (2 in decimal)
--------
00000010 : result (2 in decimal)

Every bits of the mask match !
这个去运算应该是用过滤包含SYN标志的数据报
- Matching PSH-ACK packets
# tcpdump -i eth1 'tcp[13] = 24'
过滤PSH+ACK标志
- Matching any combination containing FIN (FIN usually always comes with an ACK so we either
  need to use a mask or match the combination ACK-FIN)
# tcpdump -i eth1 'tcp[13] & 1 = 1'

- Matching RST flag
# tcpdump -i eth1 'tcp[13] & 4 = 4'


By looking at the TCP state machine diagram (http://www.wains.be/pub/networking/tcp_state_machine.jpg)
we can find the different flag combinations we may want to analyze.
咱们能够分析不一样的标组合
Ideally, a socket in ACK_WAIT mode should not have to send a RST. It means the 3 way handshake has not completed.
We may want to analyze that kind of traffic.
通常状况,一个sokcet在ACK_WAIT模式下不该该发送RST标志,这意味着三次握手没有完成,咱们能够分析这个类型的流程

Matching SMTP data :
--------------------

I will make a filter that will match any packet containing the "MAIL" command from SMTP exchanges.

I use something like http://www.easycalculation.com/ascii-hex.php to convert values from ASCII to hexadecimal.

"MAIL" in hex is 0x4d41494c
M=4d    A=41   I=49   L=4c
The rule would be :

# tcpdump -i eth1 '((port 25) and (tcp[20:4] = 0x4d41494c))'

It will check the bytes 21 to 24. "MAIL" is 4 bytes/32 bits long..
检查21到24字节,"MAIL"是4个字节,32个比特
This rule would not match packets with IP options set.
这个规则不用匹配IP选项设置
This is an example of packet (a spam, of course) :
一个例子,是个垃圾邮件
# tshark -V -i eth0 '((port 25) and (tcp[20:4] = 0x4d41494c))'
Capturing on eth0
Frame 1 (92 bytes on wire, 92 bytes captured)
    Arrival Time: Sep 25, 2007 00:06:10.875424000
    [Time delta from previous packet: 0.000000000 seconds]
    [Time since reference or first frame: 0.000000000 seconds]
    Frame Number: 1
    Packet Length: 92 bytes
    Capture Length: 92 bytes
    [Frame is marked: False]
    [Protocols in frame: eth:ip:tcp:smtp]
Ethernet II, Src: Cisco_X (00:11:5c:X), Dst: 3Com_X (00:04:75:X)
    Destination: 3Com_X (00:04:75:X)
        Address: 3Com_X (00:04:75:X)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    Source: Cisco_X (00:11:5c:X)
        Address: Cisco_X (00:11:5c:X)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    Type: IP (0x0800)
Internet Protocol, Src: 62.163.X (62.163.X), Dst: 192.168.X (192.168.X)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 78
    Identification: 0x4078 (16504)
    Flags: 0x04 (Don't Fragment)
        0... = Reserved bit: Not set
        .1.. = Don't fragment: Set
        ..0. = More fragments: Not set
    Fragment offset: 0
    Time to live: 118
    Protocol: TCP (0x06)
    Header checksum: 0x08cb [correct]
        [Good: True]
        [Bad : False]
    Source: 62.163.X (62.163.X)
    Destination: 192.168.X (192.168.XX)
Transmission Control Protocol, Src Port: 4760 (4760), Dst Port: smtp (25), Seq: 0, Ack: 0, Len: 38
    Source port: 4760 (4760)
    Destination port: smtp (25)
    Sequence number: 0    (relative sequence number)
    [Next sequence number: 38    (relative sequence number)]
    Acknowledgement number: 0    (relative ack number)
    Header length: 20 bytes
    Flags: 0x18 (PSH, ACK)
        0... .... = Congestion Window Reduced (CWR): Not set
        .0.. .... = ECN-Echo: Not set
        ..0. .... = Urgent: Not set
        ...1 .... = Acknowledgment: Set
        .... 1... = Push: Set
        .... .0.. = Reset: Not set
        .... ..0. = Syn: Not set
        .... ...0 = Fin: Not set
    Window size: 17375
    Checksum: 0x6320 [correct]
        [Good Checksum: True]
        [Bad Checksum: False]
Simple Mail Transfer Protocol
    Command: MAIL FROM:<wguthrie_at_mysickworld--dot--com>\r\n
        Command: MAIL
        Request parameter: FROM:<wguthrie_at_mysickworld--dot--com>


Matching HTTP data :
--------------------

Let's make a filter that will find any packets containing GET requests让咱们来设一过滤规则来发现含GET请包的数据
The HTTP request will begin by :
HTTP请求是这样开始的
GET / HTTP/1.1\r\n (16 bytes counting the carriage return but not the backslashes !)
16字节算回车不算反斜杠

If no IP options are set.. the GET command will use the byte 20, 21 and 22

如查没有IP选项设置,GET命令将用到20、21和22三个字节
Usually, options will take 12 bytes (12nd byte indicates the header length, which should report 32 bytes).
So we should match bytes 32, 33 and 34 (1st byte = byte 0).
一般,选项将占12个字节(第12个字节指头长度,which should report 32 bytes)
Tcpdump is only able to match data size of either 1, 2 or 4 bytes, we will take the following ASCII
character following the GET command (a space)
TCPDUMP仅仅可以匹配1个、2个或4个字节,因此是GET+空格
"GET " in hex : 47455420

# tcpdump -i eth1 'tcp[32:4] = 0x47455420'


Matching other interesting TCP things :
---------------------------------------

SSH connection (on any port) :
We will be looking for the reply given by the SSH server.
OpenSSH usually replies with something like "SSH-2.0-OpenSSH_3.6.1p2".
The first 4 bytes (SSH-) have an hex value of 0x5353482D.

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

If we want to find any connection made to older version of OpenSSH (version 1, which are insecure and subject to MITM attacks) :
The reply from the server would be something like "SSH-1.99.."

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



UDP header
----------

  0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source      |   Destination   |
|      Port       |      Port       |
+--------+--------+--------+--------+
|                 |                 |
|     Length      |    Checksum     |
+--------+--------+--------+--------+
|                                   |
|              DATA ...             |
+-----------------------------------+                

Nothing really interesting here.

If we want to filter ports we would use something like :
# tcpdump -i eth1 udp dst port 53


ICMP header
-----------

See different ICMP messages :
http://img292.imageshack.us/my.php?image=icmpmm6.gif

We will usually filter the type (1 byte) and code (1 byte) of the ICMP messages.

Here are common ICMP types :

  0 Echo Reply [RFC792]
  3 Destination Unreachable [RFC792]
  4 Source Quench [RFC792]
  5 Redirect [RFC792]
  8 Echo [RFC792]
11 Time Exceeded [RFC792]

We may want to filter ICMP messages type 4, these kind of messages are sent in case of congestion of the network.
# tcpdump -i eth1 'icmp[0] = 4'


If we want to find the ICMP echo replies only, having an ID of 500. By looking at the image with all the ICMP packet description
we see the ICMP echo reply have the ID spread across the 5th and 6th byte. For some reason, we have to filter out with the value in hex.

# tcpdump -i eth0 '(icmp[0] = 0) and (icmp[4:2] = 0x1f4)'

tcpdump 高级过滤技巧
===================
Sebastien Wains <sebastien -the at sign- wains -dot- be>
http://www.wains.be
$Id: tcpdump_advanced_filters.txt 33 2008-05-07 17:40:11Z sw $
http://www.wains.be/pub/networking/tcpdump_advanced_filters.txt
注意:
例子中都用-i 参数指定了抓取的网卡为eth1,实际使用时请自行变化。
翻译此文的目的是加深记忆,可能理解有误差,建议看原文或man 手册。
注:因为大部分是翻译的,因此只是高级技巧,并不是权威指南!
基本语法
========
过滤主机
--------
- 抓取全部通过eth1,目的或源地址是192.168.1.1 的网络数据
# tcpdump -i eth1 host 192.168.1.1
- 源地址
# tcpdump -i eth1 src host 192.168.1.1
- 目的地址
# tcpdump -i eth1 dst host 192.168.1.1
过滤端口
--------
- 抓取全部通过eth1,目的或源端口是25 的网络数据
# tcpdump -i eth1 port 25
- 源端口
# tcpdump -i eth1 src port 25
- 目的端口
# tcpdump -i eth1 dst port 25
网络过滤
--------
# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168
协议过滤
--------
# tcpdump -i eth1 arp
# tcpdump -i eth1 ip
# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp
经常使用表达式
----------
非: ! or "not" (去掉双引号)
且: && or "and"
或: || or "or"
- 抓取全部通过eth1,目的地址是192.168.1.254 或192.168.1.200 端口是80 的TCP 数据
# 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 数据
# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
- 抓取全部通过eth1,目的网络是192.168,但目的主机不是192.168.1.200 的TCP 数据
# tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
高级包头过滤
============
首先了解如何从包头过滤信息
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
操做符: >, <, >=, <=, =, !=
IP 头
----
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 ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
本文只针对IPv4。
IP 选项设置了吗?
----------------
“通常”的IP 头是20 字节,但IP 头有选项设置,不能直接从偏移21 字节处读取数据。IP

有个长度字段能够知道头长度是否大于20 字节。
+-+-+-+-+-+-+-+-+
|Version| IHL |
+-+-+-+-+-+-+-+-+
一般第一个字节的二进制值是:01000101,分红两个部分:
0100 = 4 表示IP 版本
0101 = 5 表示IP 头32 bit 的块数,5 x 32 bits = 160 bits or 20 bytes
若是第一字节第二部分的值大于5,那么表示头有IP 选项。
下面介绍两种过滤方法(第一种方法比较操蛋,可忽略):
1. 比较第一字节的值是否大于01000101,这能够判断IPv4 带IP 选项的数据和IPv6 的数
据。
01000101 十进制等于69,计算方法以下(小提示:用计算器更方便)
0 : 0 \
1 : 2^6 = 64 \ 第一部分(IP 版本)
0 : 0 /
0 : 0 /
-
0 : 0 \
1 : 2^2 = 4 \ 第二部分(头长度)
0 : 0 /
1 : 2^0 = 1 /
64 + 4 + 1 = 69
若是设置了IP 选项,那么第一本身是01000110(十进制70),过滤规则:
# tcpdump -i eth1 'ip[0] > 69'
IPv6 的数据也会匹配,看看第二种方法。
2. 位操做
0100 0101 : 第一字节的二进制
0000 1111 : 与操做
=========
0000 0101 : 结果
正确的过滤方法
# tcpdump -i eth1 'ip[0] & 15 > 5'
或者
# tcpdump -i eth1 'ip[0] & 0x0f > 5'
分片标记
--------
当发送端的MTU 大于到目的路径链路上的MTU 时就会被分片,这段话有点拗口,权威的
请参考《TCP/IP 详解》。唉,32 借个人书没还,只能凑合写,你们记得看书啊。
分片信息在IP 头的第七和第八字节:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bit 0: 保留,必须是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片.
Bit 2: (MF) 0 = 最后的分片, 1 = 还有分片.
Fragment Offset 字段只有在分片的时候才使用。
要抓带DF 位标记的不分片的包,第七字节的值应该是:
01000000 = 64
# tcpdump -i eth1 'ip[6] = 64'
抓分片包
--------
- 匹配MF,分片包
# tcpdump -i eth1 'ip[6] = 32'
最后分片包的开始3 位是0,可是有Fragment Offset 字段。
- 匹配分片和最后分片
# tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'
测试分片能够用下面的命令:
ping -M want -s 3000 192.168.1.1
匹配小TTL
---------
TTL 字段在第九字节,而且正好是完整的一个字节,TTL 最大值是255,二进制为11111111。
能够用下面的命令验证一下:
$ ping -M want -s 3000 -t 256 192.168.1.200
ping: ttl 256 out of range
+-+-+-+-+-+-+-+-+
| Time to Live |
+-+-+-+-+-+-+-+-+
- 在网关能够用下面的命令看看网络中谁在使用traceroute
# tcpdump -i eth1 'ip[8] < 5'
抓大于X 字节的包
---------------
- 大于600 字节
# tcpdump -i eth1 'ip[2:2] > 600'
更多的IP 过滤
------------
首先仍是须要知道TCP 基本结构,再次推荐《TCP/IP 详解》,卷一就够看的了,避免
走火入魔。
TCP 头
-----
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Res. |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 抓取源端口大于1024 的TCP 数据包
# tcpdump -i eth1 'tcp[0:2] > 1024'
- 匹配TCP 数据包的特殊标记
TCP 标记定义在TCP 头的第十四个字节
+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+
重复一下TCP 三次握手,两个主机是如何勾搭的:
1. 源发送SYN
2. 目标回答SYN, ACK
3. 源发送ACK
没女友的童鞋要学习一下:
1. MM,你的手有空吗?-_-
2. 有空,你呢?~_~
3. 我也有空*_*
失败的loser 是酱紫的:
1. MM,这是你掉的板砖吗?(SYN)
2. 不是,找拍啊?(RST-ACK)
- 只抓SYN 包,第十四字节是二进制的00000010,也就是十进制的2
# tcpdump -i eth1 'tcp[13] = 2'
- 抓SYN, ACK (00010010 or 18)
# tcpdump -i eth1 'tcp[13] = 18'
- 抓SYN 或者SYN-ACK
# tcpdump -i eth1 'tcp[13] & 2 = 2'
用到了位操做,就是无论ACK 位是啥。
- 抓PSH-ACK
# tcpdump -i eth1 'tcp[13] = 24'
- 抓全部包含FIN 标记的包(FIN 一般和ACK 一块儿,表示幽会完了,回见)
# tcpdump -i eth1 'tcp[13] & 1 = 1'
- 抓RST(勾搭没成功,伟大的greatwall 对她认为有敏感信息的链接发RST 包,典型的棒
打鸳鸯)
# tcpdump -i eth1 'tcp[13] & 4 = 4'
详细描述了TCP 各类状态的标记,方便分析。
吴吖哦注
--------
tcpdump 考虑了一些数字恐惧症者的需求,提供了部分经常使用的字段偏移名字:
icmptype (ICMP 类型字段)
icmpcode (ICMP 符号字段)
tcpflags (TCP 标记字段)
ICMP 类型值有:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo,
icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp,
icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply
TCP 标记值:
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg
这样上面按照TCP 标记位抓包的就能够写直观的表达式了:
- 只抓SYN 包
# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
- 抓SYN, ACK
# tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
抓SMTP 数据
----------
# tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。
抓HTTP GET 数据
--------------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
"GET "的十六进制是47455420
抓SSH 返回
---------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
"SSH-"的十六进制是0x5353482D
# tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2]
= 0x312E)'
抓老版本的SSH 返回信息,如"SSH-1.99.."
吴吖哦注
--------
若是是为了查看数据内容,建议用tcpdump -s 0 -w filename 把数据包都保存下来,
而后用wireshark 的Follow TCP Stream/Follow UDP Stream 来查看整个会话的内容。
"-s 0"是抓取完整数据包,不然默认只抓68 字节。
另外,用tcpflow 也能够方便的获取TCP 会话内容,支持tcpdump 的各类表达式。
UDP 头
-----
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
| |
| DATA ... |
+-----------------------------------+
- 抓DNS 请求数据
# tcpdump -i eth1 udp dst port 53
其余
----
-c 参数对于运维人员来讲也比较经常使用,由于流量比较大的服务器,靠人工CTRL+C 仍是
抓的太多,因而能够用-c 参数指定抓多少个包。
# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令计算抓10000 个SYN 包花费多少时间,能够判断访问量大概是多少。
















html

相关文章
相关标签/搜索