强大的抓包工具, 博大精深内容太多, 所以这篇博客整理得只说常用, 具体的参考tcpdump用户手册,
tcpdump需要root权限, 所以记得加上sudo
常用参数
-nn选项:
意思是说当tcpdump遇到协议号或端口号时,不要将这些号码转换成对应的协议名称或端口名称。比如,大家都知道80是http端口,tcpdump就不会将它显示成http了-c选项:
是Count的含义,这设置了我们希望tcpdump帮我们抓几个包。-i : 指定哪一张网卡
-l : 使得输出变为行缓冲
-t : 输出时不打印时间戳
-v : 输出更详细的信息
-F : 指定过滤表达式所在的文件, 可以建立了一个filter.txt文本文件来存储过滤表达式,然后通过-F来指定filter.txt
-w : 将流量保存到文件中
-r : 读取raw packets文件
常用过滤规则
通过eth0网卡的,且来源是qq.com服务器或者目的机器是qq.com服务器的网络包
sudo tcpdump -i eth0 'host qq.com'
只看到目的机器dst(比如是qq.com)的网络包
sudo tcpdump -i eth0 'dst qq.com' 也可以写成 sudo tcpdump -i eth0 'dst host qq.com'
注 : 上述的那个host可以省略
tcpdump支持如下的类型:- host:指定主机名或IP地址,例如’host roclinux.cn’或’host 202.112.18.34′
- net :指定网络段,例如’arp net 128.3’或’dst net 128.3′
- portrange:指定端口区域,例如’src or dst portrange 6000-6008′
- port : 端口
如果我们没有设置过滤类型,那么默认是host。
只抓udp的包
sudo tcpdump -i eth0 'udp'
tcpdump具有根据网络包的协议来进行过滤的能力,我们还可以把udp改为ether、ip、ip6、arp、tcp、rarp等
只抓目的机器的某个端口的包(比如只抓baidu.com的53或者80端口的包)
sudo tcpdump -i eth0 'dst baidu.com and (dst port 53 or dst port 80)'
通过eth0网卡的,且qq.com和baidu.com之间通讯的网络包,或者qq.com和sina.cn之间通讯的网络包
tcpdump -i eth0 'host qq.com and (baidu.com or sina.cn)'
获取和baidu.com之间建立TCP三次握手中第一个网络包,即带有SYN标记位的网络包
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0 and dst host baidu.com'
注 :
因为用proto [ expr : size]语法在写过滤表达式时,你需要把协议格式完全背在脑子里,才能把表达式写对。可这对大多数人来说,可能有些困难。为了让tcpdump工具更人性化一些,有一些常用的偏移量,可以通过一些名称来代替,比如icmptype表示ICMP协议的类型域、icmpcode表示ICMP的code域,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-ack, tcp-urg。
输出内容解释
以下是在ubuntu上用火狐打开了一个百度时候抓到的
1 | b@b-VirtualBox:~$ sudo tcpdump -i eth0 'host baidu.com' |
可以参考tlpi的解释, 如下图 :