1, 概述
用简单的话来定义 tcpdump, 就是: dump the traffic on a network, 根据使用者的定义对网络上的数据包进行截获的包分析工具.?tcpdump 可以将网络中传送的数据包的 "头" 完全截获下来提供分析. 它支持针对网络层, 协议, 主机, 网络或端口的过滤, 并提供 and,or,not 等逻辑语句来帮助你去掉无用的信息.
tcpdump 是一个用于截取网络分组, 并输出分组内容的工具, 简单说就是数据包抓包工具. tcpdump 凭借强大的功能和灵活的截取策略, 使其成为 Linux 系统下用于网络分析和问题排查的首选工具.
tcpdump 提供了源代码, 公开了接口, 因此具备很强的可扩展性, 对于网络维护和 *** 者都是非常有用的工具. tcpdump 存在于基本的 Linux 系统中, 由于它需要将网络界面设置为混杂模式, 普通用户不能正常执行, 但具备 root 权限的用户可以直接执行它来获取网络上的信息. 因此系统中存在网络分析工具主要不是对本机安全的威胁, 而是对网络上的其他计算机的安全存在威胁.
顾名思义, tcpdump 可以将网络中传送的数据包的 "头" 完全截获下来提供分析. 它支持针对网络层, 协议, 主机, 网络或端口的过滤, 并提供 and,or,not 等逻辑语句来帮助你去掉无用的信息.
不带参数的 tcpdump 会收集网络中所有的信息包头, 数据量巨大, 必须过滤.
2, 选项
-A 以 ASCII 格式打印出所有分组, 并将链路层的头最小化.
-c 在收到指定的数量的分组后, tcpdump 就会停止.
-C 在将一个原始分组写入文件之前, 检查文件当前的大小是否超过了参数 file_size 中指定的大小. 如果超过了指定大小, 则关闭当前文件, 然后在打开一个新的文件. 参数 file_size 的单位是兆字节(是 1,000,000 字节, 而不是 1,048,576 字节).
-d 将匹配信息包的代码以人们能够理解的汇编格式给出.
-dd 将匹配信息包的代码以 c 语言程序段的格式给出.
-ddd 将匹配信息包的代码以十进制的形式给出.
-D 打印出系统中所有可以用 tcpdump 截包的网络接口.
-e 在输出行打印出数据链路层的头部信息.
-E 用 spi@ipaddr algo:secret 解密那些以 addr 作为地址, 并且包含了安全参数索引值 spi 的 IPsec?ESP 分组.
-f 将外部的 Internet 地址以数字的形式打印出来.
-F 从指定的文件中读取表达式, 忽略命令行中给出的表达式.
-i 指定监听的网络接口.
-l 使标准输出变为缓冲行形式, 可以把数据导出到文件.
-L 列出网络接口的已知数据链路.
-m 从文件 module 中导入 SMI MIB 模块定义. 该参数可以被使用多次, 以导入多个 MIB 模块.
-M 如果 tcp 报文中存在 TCP-MD5 选项, 则需要用 secret 作为共享的验证码用于验证 TCP-MD5 选选项摘要(详情可参考 RFC 2385).
-b 在数据 - 链路层上选择协议, 包括 ip,arp,rarp,ipx 都是这一层的.
-n 不把网络地址转换成名字.
-nn 不进行端口名称的转换.
-N 不输出主机名中的域名部分. 例如,'nic.ddn.mil'只输出'nic'.
-t 在输出的每一行不打印时间戳.
-O 不运行分组分组匹配 (packet-matching) 代码优化程序.
-P 不将网络接口设置成混杂模式.
-q 快速输出. 只输出较少的协议信息.
-r 从指定的文件中读取包(这些包一般通过 - w 选项产生).
-S 将 tcp 的序列号以绝对值形式输出, 而不是相对值.
-s 从每个分组中读取最开始的 snaplen 个字节, 而不是默认的 68 个字节.
-T 将监听到的包直接解释为指定的类型的报文, 常见的类型有 rpc 远程过程调用)和 snmp(简单网络管理协议;).
-t 不在每一行中输出时间戳.
-tt 在每一行中输出非格式化的时间戳.
-ttt 输出本行和前面一行之间的时间差.
-tttt 在每一行中输出由 date 处理的默认格式的时间戳.
-u 输出未解码的 NFS 句柄.
-v 输出一个稍微详细的信息, 例如在 ip 包中可以包括 ttl 和服务类型的信息.
-vv 输出详细的报文信息.
-w 直接将分组写入文件中, 而不是不分析并打印出来.
3,tcpdump 的表达式介绍
表达式是一个正则表达式, tcpdump 利用它作为过滤报文的条件, 如果一个报文满足表 达式的条件, 则这个报文将会被捕获. 如果没有给出任何条件, 则网络上所有的信息包 将会被截获.
在表达式中一般如下几种类型的关键字:
第一种是关于类型的关键字, 主要包括 host.NET,port, 例如 host 210.27.48.2, 指明 210.27.48.2 是一台主机, net 202.0.0.0 指明 202.0.0.0 是一个网络地址, port 23 指明端口号是 23. 如果没有指定类型, 缺省的类型是 host.
第二种是确定传输方向的关键字, 主要包括 src,dst,dst or src,dst and src, 这些关键字指明了传输的方向. 举例说明, src 210.27.48.2 , 指明 ip 包中源地址是 210.27.48.2 , dst.NET 202.0.0.0 指明目的网络地址是 202.0.0.0. 如果没有指明 方向关键字, 则缺省是 src or dst 关键字.
第三种是协议的关键字, 主要包括 fddi,ip,arp,rarp,tcp,udp 等类型. Fddi 指明是在 FDDI (分布式光纤数据接口网络)上的特定的网络协议, 实际上它是 "ether" 的别名, fddi 和 ether 具有类似的源地址和目的地址, 所以可以将 fddi 协议包当作 ether 的包进行处理和分析. 其他的几个关键字就是指明了监听的包的协议内容. 如果没有指定任何协议, 则 tcpdump 将会 监听所有协议的信息包.
除了这三种类型的关键字之外, 其他重要的关键字如下: gateway, broadcast,Less, greater, 还有三种逻辑运算, 取非运算是'not' '!', 与运算是'and','&&'; 或运算是'or' ,'||'; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要.
4, 输出结果介绍
下面我们介绍几种典型的 tcpdump 命令的输出信息
4.1, 数据链路层头信息
使用命令:
#tcpdump --e host ICE
ICE 是一台装有 Linux 的主机. 它的 Mac 地址是 0:90:27:58:AF:1A H219 是一台装有 Solaris 的 SUN 工作站. 它的 Mac 地址是 8:0:20:79:5B:46; 上一条命令的输出结果如下所示:
21:50:12.847509 eth0 <8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357> ICE. ?telne t 0:0(0) ack 22535 win 8760 (DF)
21:50:12 是显示的时间, 847509 是 ID 号, eth0 <表示从网络接口 eth0 接收该分组, eth0 > 表示从网络接口设备发送分组, 8:0:20:79:5b:46 是主机 H219 的 Mac 地址, 它表明是从源地址 H219 发来的分组. 0:90:27:58:af:1a 是主机 ICE 的 Mac 地址, 表示该分组的目的地址是 ICE. ip 是表明该分组是 IP 分组, 60 是分组的长度, h219.33357> ICE. telnet 表明该分组是从主机 H219 的 33357 端口发往主机 ICE 的 TELNET(23)端口. ack 22535 表明对序列号是 222535 的包进行响应. win 8760 表明发 送窗口的大小是 8760.
4.2,ARP 包的 tcpdump 输出信息
使用命令:
#tcpdump arp
得到的输出结果是:
- 22:32:42.802509 eth0> arp who-has route tell ICE (0:90:27:58:af:1a)
- 22:32:42.802902 eth0 <arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
22:32:42 是时间戳, 802509 是 ID 号, eth0 > 表明从主机发出该分组, arp 表明是 ARP 请求包, who-has route tell ICE 表明是主机 ICE 请求主机 route 的 Mac 地址. 0:90:27:58:af:1a 是主机 ICE 的 Mac 地址.
4.3,TCP 包的输出信息
用 tcpdump 捕获的 TCP 包的一般输出信息是:
src> dst: flags data-seqno ack Windows urgent options
src> dst: 表明从源地址到目的地址, flags 是 TCP 报文中的标志信息, S 是 SYN 标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno 是报文中的数据 的顺序号, ack 是下次期望的顺序号, Windows 是接收缓存的窗口大小, urgent 表明 报文中是否有紧急指针. Options 是选项.
4.4,UDP 包的输出信息
用 tcpdump 捕获的 UDP 包的一般输出信息是:
route.port1> ICE.port2: udp lenth
UDP 十分简单, 上面的输出行表明从主机 route 的 port1 端口发出的一个 UDP 报文 到主机 ICE 的 port2 端口, 类型是 UDP, 包的长度是 lenth.
5, 举例
(1) 想要截获所有 210.27.48.1 的主机收到的和发出的所有的分组:
tcpdump host 210.27.48.1
(2) 想要截获主机 210.27.48.1 和主机 210.27.48.2 或 210.27.48.3 的通信, 使用命令(注意: 括号前的反斜杠是必须的):
tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )
(3) 如果想要获取主机 210.27.48.1 除了和主机 210.27.48.2 之外所有主机通信的 ip 包, 使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
(4) 如果想要获取主机 192.168.228.246 接收或发出的 SSH 包, 并且不转换主机名使用如下命令:
tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp
(5) 获取主机 192.168.228.246 接收或发出的 SSH 包, 并把 Mac 地址也一同显示:
tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn
(6) 过滤的是源主机为 192.168.0.1 与目的网络为 192.168.0.0 的报头:
tcpdump src host 192.168.0.1 and dst.NET 192.168.0.0/24
(7) 过滤源主机物理地址为 XXX 的报头:
- tcpdump ether src 00:50:04:BA:9B and dst......
- (为什么 ether src 后面没有 host 或者 net? 物理地址当然不可能有网络喽).
(8) 过滤源主机 192.168.0.1 和目的端口不是 telnet 的报头, 并导入到 tes.t.txt 文件中:
Tcpdump src host 192.168.0.1 and dst port not telnet -l> test.txt
ip icmp arp rarp 和 tcp,udp,icmp 这些选项等都要放到第一个参数的位置, 用来过滤数据报的类型.
例题: 如何使用 tcpdump 监听来自 eth0 适配卡且通信协议为 port 22, 目标来源为 192.168.1.100 的数据包资料?
tcpdump -i eth0 -nn port 22 and src host 192.168.1.100
例题: 如何使用 tcpdump 抓取访问 eth0 适配卡且访问端口为 tcp 9080?
tcpdump -i eth0 dst 172.168.70.35 and tcp port 9080
例题: 如何使用 tcpdump 抓取与主机 192.168.43.23 或着与主机 192.168.43.24 通信报文, 并且显示在控制台上
tcpdump -X -s 1024 -i eth0 host (192.168.43.23 or 192.168.43.24) and? host 172.16.70.35
5.9 参数说明
tcpdump -i p6p1 -C 1000M -W 5 -s 1600 -w guizhou105date +%Y%m%d%H%M -Z root 获取网卡 p5p1 上
抓包工具:
- tcpdump -nn -vvv -s 1500 -w /tmp/1 host 192.168.18.254 and port 80
- tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src.NET 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp,udp,icmp 这些选项等都要放到第一个参数的位置, 用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口 eth1 的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为 68 字节. 加上 - S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取 100 个数据包
(6)dst port ! 22 : 不抓取目标端口是 22 的数据包
(7)src.NET 192.168.1.0/24 : 数据包的源网络地址为 192.168.1.0/24
(8)-w ./target.pcap : 保存成 pcap 文件, 方便用 ethereal(即 wireshark)分析
-i : 设备名
-s : 过滤包大小限制
-C :(M), 定义生成文件大小, 兆为单位, 取整数
-W : 可生成多少个文件
-w : 指定生成文件的路径
实例:
- tcpdump -i eth0 -C 10240M -W 300 -s 1600 -w /usr/local/pcap1/henan_104_`date +%Y%m%d`00 -Z root
- tcpdump -i eth4 -C 200M -s 1600 -w /usr/local/pcap1/henan`date +%Y%m%d`00001.pcap -Z root
- tcpdump -i eth4 -C 200M -W 1 -s 1600 -w /usr/local/pcap1/henan`date +%Y%m%d`00001.pcap -Z root
- tcpdump -i eth2 -s 1600 src host 192.168.0.127 -w ./192.168.0.127.pcap
来源: http://www.bubuko.com/infodetail-2971810.html