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 |
|
示例
抓包
抓特定来源的包
1 |
|
抓取192.168.1.123收到和发送的所有的icmp的包
1 |
|
抓取helios 与 hot 或者与 ace 之间通信的数据包
1 |
|
抓取主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
1 |
|
抓取ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
1 |
|
抓取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
1 |
|
获取使用ftp端口和ftp数据端口的网络包
1 |
|
/etc/services
存储着所有知名服务和传输层端口的对应关系。这个对应关系是由IANA组织来全权负责管理,http://www.iana.org/assignments/port-numbers 通过Web方式查到。
抓取网卡上特定端口上的http数据包
1 |
|
‘tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420’ 是一个 BPF 过滤器,用于匹配 HTTP 数据包。
0x47455420 是 ‘GET ‘ 的十六进制表示。该过滤器将匹配所有包含以 ‘GET’ 开头的 HTTP 请求的数据包
获取roclinux.cn和baidu.com之间建立TCP三次握手中第一个网络包,即带有SYN标记位的网络包,另外,目的主机不能是qiyi.com
1 |
|
打印IP包长超过576字节的网络包
1 |
|
打印广播包或多播包,同时数据链路层不是通过以太网媒介进行的。
1 |
|
回放
1 |
|
异常处理
使用-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 |
|
出现这个错误也将导致tcprewrite等改包工具失效,因为包的格式有错误。需要转换
转换方式待确定
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!