tcpdump实用方法总结

要用tcpdump 抓包,一定要切换到root账户,只有root才有权限将网卡变更为混杂模式

tcpdump可以分为三大部分内容,第一是选项,第二是过滤表达式,第三是输出信息

基本格式为 tcpdump 选项 '过滤表达式'

实用选项参数说明

参数名 说明
-i 即interface,指定要监听的网卡名,默认为eth0,内核版本>2.2时可用any指定所有网卡
-w 指定dump出的内容(原始网络包)存储的文件
-nn tcpdump遇到协议号或端口号时,不要将这些号码转换成对应的协议名称或端口名称。如,众所周知21端口是FTP端口,我们希望显示21,而非tcpdump自作聪明的将它显示成FTP
-X 需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
-c 设置要抓的包的个数
-e 增加以太网帧头部信息输出
-l 使得输出变为行缓冲,只要发现行符号就输出,否则只能等缓冲区满才输出
-t 输出时不打印时间戳
-v 输出更详细的信息,增加tos值、ttl值、ID值、总长度、校验值等
-F 指定过滤表达式所在的文件
-r 读取-w生成的原始网络包文件
-B 缓冲区空间大小,单位KB, 出现packets dropped by kernel 时修改此参数

表达式说明

tcpdump 的表达式是 pcap-filter 的过滤表达式,可通过 man 7 pcap-filter 查看细节

过滤器表达式由一个或多个原语组成。原语通常是由前面有一个或多个限定词id(名称或数字)组成。
限定词有以下三种不同的类型:

类型 说明 常用类型 默认值 示例
type type限定词说明id(名称或数字)的类型 host, net , port , portrange host ‘host foo’
‘net 128.3’
‘port 20’
‘portrange 6000-6008’
dir dir 限定词指定id 特定传输方向 src, dst, src or dst, src and dst,
ra, ta, addr1, addr2, addr3, and addr4.
src or dst ‘src foo’
‘dst net 128.3’,
‘src or dst port ftp-data’
proto proto 限定词将匹配限制为特定协议 ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp. 和type一致的所有可用协议
‘src foo’ means ‘(ip or arp or rarp) src foo’
‘port 53’ means ‘(tcp or udp) port 53’
‘net bar’ means ‘(ip or arp or rarp) net bar’
‘ether src foo’
‘arp net 128.3’
‘tcp port 21’
‘udp portrange 7000-7009’
‘wlan addr2 0:2:3:4:5:6’
1
2
3
4
5
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

ether fddi tr wlan ppp slip link 均为 链路层协议

示例

抓包

抓特定来源的包

1
2
# 只抓发向10.101.101.101且端口号为53的包,并将抓到的包写入到bind.cap文件中
tcpdump 'dst 10.101.101.101 and port 53' -w bind.cap

抓取192.168.1.123收到和发送的所有的icmp的包

1
tcpdump -i eth1 'host 192.168.1.123 and icmp ' -w /tmp/xxx.cap

抓取helios 与 hot 或者与 ace 之间通信的数据包

1
tcpdump 'host helios and (hot or ace)'

抓取主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

1
tcpdump 'host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )'

抓取ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.

1
tcpdump 'ip host ace and not helios'

抓取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

1
tcpdump 'ip host 210.27.48.1 and ! 210.27.48.2'

获取使用ftp端口和ftp数据端口的网络包

1
tcpdump 'port ftp or ftp-data'

/etc/services存储着所有知名服务和传输层端口的对应关系。这个对应关系是由IANA组织来全权负责管理,http://www.iana.org/assignments/port-numbers 通过Web方式查到。

抓取网卡上特定端口上的http数据包

1
2
3
4
tcpdump -i <interface> port <port> and tcp and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' -s 0 -A -w <output_file.pcap>

tcpdump -i any port 80 and tcp and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' -s 0 -A -w output.pcap

‘tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420’ 是一个 BPF 过滤器,用于匹配 HTTP 数据包。
0x47455420 是 ‘GET ‘ 的十六进制表示。该过滤器将匹配所有包含以 ‘GET’ 开头的 HTTP 请求的数据包

获取roclinux.cn和baidu.com之间建立TCP三次握手中第一个网络包,即带有SYN标记位的网络包,另外,目的主机不能是qiyi.com

1
tcpdump 'tcp[tcpflags] & tcp-syn != 0 and not dst host qiyi.com'

打印IP包长超过576字节的网络包

1
tcpdump 'ip[2:2] < 576'

打印广播包或多播包,同时数据链路层不是通过以太网媒介进行的。

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

回放

1
tcpdump -r xxx.cap

异常处理

使用-i any 抓取所有网卡数据包时有下图中的 Frame length is less than captured length 错误

因为tcpdump抓包时,如果-i选项指定为一个网卡地址,那么抓取的数据包数据链路层是以太网头部;如果指定any,则以太网头部将被替换为linux cooked capture头部,见上图。

tcpdump抓包时可以通过 -y 选项来指定data link type,不过测试发现 -i 选项指定 any 时,不支持抓获的包的data link type 为以太网 :

1
2
3
4
5
6
[root@whb~]#  tcpdump -i any -w test.pcap -y EN10MB
tcpdump: EN10MB is not one of the DLTs supported by this device
[root@whb~]# tcpdump -i eth1 -w test.pcap -y EN10MB
tcpdump: data link type EN10MB
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

出现这个错误也将导致tcprewrite等改包工具失效,因为包的格式有错误。需要转换
转换方式待确定

参考

https://www.cnblogs.com/aios/p/9545378.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!