tcpdump 基本使用方法
基本使用
将捕获到的流量写入到某个文件
# -s 0 表示将完整数据包抓取下来,默认只抓取68字节 # -c 1000 表示抓1000个包, 避免抓取过多的包 # -w 表示写入 tcpdump -s 0 -c 1000 -w filename # 将监听到的输出写入到filename这个文件中
根据网卡来过滤流量
tcpdump -i eth1 # 监听eth1网卡的流量 tcpdump -i docker0 # 监听docker0网卡的流量
根据端口号来过滤
tcpdump tcp port 8080 # 监听本机8080端口TCP通讯 tcpdump udp port 567 # 查看本机某UDP端口567流量 tcpdump src port 25 # 来源端口为25的流量 tcpdump dst port 25 # 目的端口为25的流量 tcpdump -i eth1 src port 25 # 通过网卡eth1且来源端口为25的流量 tcpdump -i eth1 dst port 25 # 通过网卡eth1且目的端口为25的流量
根据源与目的地址过滤
tcpdump src host 192.168.1.1 # 为**192.168.1.1**的流量 tcpdump -i eth1 src host 192.168.1.1 # 通过网卡eth1且源地址为192.168.1.1 tcpdump dst host 192.168.1.1 # 目的地址为**192.168.1.1**的流量 tcpdump -i eth1 dst host 192.168.1.1 # 通过网卡eth1且目的地址为192.168.1.1
根据协议进行过滤
tcpdump arp # 过滤arp协议流量 tcpdump ip # 过滤ip协议流量 tcpdump tcp # 过滤tcp协议流量 tcpdump udp # 过滤udp协议流量 tcpdump icmp # 过滤icmp协议流量
增强用法
包头过滤
# 从包头过滤信息如下所示 proto[x:y] : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、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 # 操作符可以有: >, <, >=, <=, =, !=
抓取HTTP包
# 过滤 HTTP GET #tcpdump -s 0 -A 'tcp[(tcp[12]>>2):4] = 0x47455420' tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 抓取 HTTP POST tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
示例
抓取所有经过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)))'