tcpdump 是linux系统下的抓包工具,它支持针对网络层,协议,主机,端口的过滤,并提供and,or,not等逻辑语句筛选信息。

常用的参数

-n   将ip地址,端口号以数字形式表示
-t   不打印时间戳
-i  后面接选用的网卡(连外网一般是eth0,自身相连一般是lo)
-S  将tcp报文中的序号以绝对值形式显示,tcp建立连接三次握手的时候,发送syn报文段中会含有一个isn(initial sequence number),此后发送的字节都是在此序号基础上的偏  移,如果没有-S,报文字节会以偏移形式显示
-s snaplen 从每个报文中截取snaplen字节的数据,而不是缺省的65535,如果snaplen过小,则原始数据报将会被截断,在输出行中会有类似[|proto]这样的输出,这里的proto是截断发生处的协议层名称,注意,采用更大的捕捉范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢失。你应该把snaplen设的尽量小,只要能够容纳你需要的协议信息就可以了。设置snaplen参数值为0,即是设置为默认值65535(  -s0 和 -s 0效果一样的,都表示不截断包)  -s 10 会显示在以太网处截断,-s 20会显示在ip处截断
-w  将数据写入文件
这些是常用的参数 ,更具体的可以通过man tcpdump查

基本语法
默认启动
tcpdump
 不指定网卡的话,默认会监视第一个网卡eth0
过滤主机
-------------
抓取所有经过eth0,源地址或目的地址是115.123.141.1的数据包
#sudo tcpdump -nt -i eth0 host 192.168.1.1
源主机
#sudo tcpdump -nt -i eth0  src host 192.168.1.1
目的主机
#sudo tcpdump -nt -i eth0  dst  host 192.168.1.1
过滤端口
-----------
抓取所有经过eth0,源端口或目标端口是51的数据包
#tcpdump -i eth0  port 51
源端口
#tcpdump -i eth0 src port 51
目的端口
#tcpdump -i eth0 dst port 51
网络过滤
------------
#tcpdump -i eth0 net 192.168
#tcpdump -i eth0 src net 192.168
#tcpdump -i eth0 dst net 192.168
协议过滤
-----------
#tcpdump -i eth0 arp
#tcpdump -i eth0 ip

常用表达式
非: !or "not"(去掉双引号)
与: && or "and"
或:|| or "or"
抓取所有经过eth0,目的地址是192.168.1.254 或 192.168.1.200,端口是80的tcp 数据
#tcpdump -i eth0 '((tcp)  and ((dst host 192.168.1.254) ||( dst host 192.168.1.200)) and (port 80))'
抓取所有经过 eth0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
#tcpdump -i eth0 '((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)))'
抓取helios与hot 或者与ace 之间通信的数据包
#tcpdump -i eth1 host helios and \( hot or ace \)
抓取ace 与任何其他主机之间通信的ip数据包,但不包括与helios之间通信的数据包
#tcpdump  ip host ace and not helios
抓取所有通过网关snup的ftp数据包(表达式被单引号括起来了,可以防止shell对其中的括号错误解析)
#tcpdump 'gateway snup and (port ftp or ftp-data)'
 

只抓syn包
#tcpdump -i eth0 'tcp[tcpflags] = tcp-syn'
抓syn,ack包
#tcpdump -i eth0 'tcp[tcpflags] & tcp-syn!=0  and  tcp[tcpflags] & tcp-ack!=0'