你好,游客 登录 注册 搜索
背景:
阅读新闻

抓包分析工具—tcpdump

[日期:2018-01-02] 来源:Linux社区  作者:jim123 [字体: ]

tcpdump(dump the traffic on a network)是一款在Unix下一款比较实用的一款用于分析数据包的工具,它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句、布尔表达式对报文的报头匹配,在Linux系统下如果未安装可以通过yum来安装,不过要注意的是在使用需要相应的权限:

对于SunOS 的nit或bpf界面: 要运行tcpdump , 必须有/dev/nit/dev/bpf* 的读访问权限;
对于Solaris的dlpi: 必须有网络仿真设备 (network pseudo device), 如 /dev/le的读访问权限;
对于HP-UX的dlpi、IRIX的snoop、Linux: 必须是root, 或者把它安装成 root 的设置uid 程序;
对于 Ultrix和Digital UNIX: 一旦超级用户使用promiscuous 操作模式 (promiscuous-mode), 任何用户 都可以 运行 tcpdump;
对于BSD: 必须有/dev/bpf*的读访问权限。

而tcpdump的常用选项参数如下:

       -A     数据包内容以ASCII显示,通常用来抓取网页的数据包数据.
       -a     试着 把 网络和广播地址转换成名称.
       -c     监听数据包数,如果没有带这个参数tcpdump会不断的监听,当收到count报文后退出.
       -d     把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出.
       -dd    把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出.
       -ddd   把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出.
       -e     显示数据链路层的数据包.
       -f     用数字显示网际网络地址.
       -F     指定内含表达方式的文件.
       -i     监听的网络接口.
       -l     使用标准输出列的缓冲区.
       -n     不把主机的网络地址转换成ip
       -N     不列出域名.
       -O     不将数据包编码最佳化,这个选项只有当你怀疑优化器有bug时才有用.
       -p     不让网络界面进入混杂模式.
       -q     快速输出,仅列出少数的传输协议信息.
       -r     从指定的文件读取数据包数据.
       -s     设置每个数据包的大小.
       -T     强制将表达方式所指定的数据包转译成设置的数据包类型.目前已知的类型有: rpc (远程过程调用 Remote Procedure Call), rtp
              (实时应用协议 Real-Time Applications protocol), rtcp (实时应用控制协议 Real-Time Applications control  protocol),  vat  (可视音频工具
              Visual Audio Tool), 和 wb (分布式白板 distributed White Board).
       -S     用绝对而非相对数值列出TCP关联数.
       -t     禁止显示时戳标志.
       -tt    显示未格式化的时戳标志.
       -v     详细显示指令执行过程. 例如, 显示IP数据报中的生存周期和服务类型.
       -vv    更详细显示指令执行过程. 例如,显示NFS应答报文的附加域.
       -w     把数据包数据写入指定的文件.
       -x     以 16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.
       expression表达式:
              用来选择要转储的数据报.如果没有指定expression , 就转储网络的全部报文.否则, 只转储相对expression为逻辑为真的数据包报文.
  
              expression 由一个或多个原语(primitive)组成.原语通常由一个标识(id,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:
  
              type   类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,`host foo', `net128.3', `port 20'.如果不指定类型修饰子, 就使用缺省的host . 
              dir    方向修饰子 指出 相对于 标识 的 传输方向 (数据是 传入还是传出 标识).  可以使用的 方向 有 src, dst, src or dst 和 src  and  dst.
                     例如, `src foo', `dst net 128.3', `src or dst port ftp-data'.  如果 不指定 方向修饰子, 就使用 缺省的 src or dst .  对于 `null'
                     链路层 (就是说 象 slip 之类的 点到点 协议), 用 inbound 和 outbound 修饰子 指定 所需的 传输方向. 
              proto  协议修饰子 要求 匹配 指定的协议. 可以使用的 协议 有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp  和  udp.
                     例如, `ether src foo', `arp net 128.3', `tcp port 21'.  如果 不指定 协议修饰子, 就使用 所有 符合 类型 的 协议. 例如, `src foo'
                     指 `(ip 或 arp 或 rarp) src foo' (注意后者不符合语法), `net bar' 指 `(ip 或 arp 或 rarp) net bar',  `port 53' 指 `(tcp 或 udp)
                     port 53'. 
              更复杂的过滤器表达式可以通过 and, or 和 not 连接原语来组建. 例如, `host  foo  and  not  port  ftp  and  not  port  ftp-data'.
              允许的 原语 有:
              dst host host
                     如果报文中IP的目的地址域是host, 则逻辑为真.host既可以是地址,也可以是主机名.
  
              src host host
                     如果报文中IP的源地址域是host,则逻辑为真.
  
              host host
                     如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:ip host host
                     它等价于:
                          ether proto \ip and host host
                     如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.
  
              ether dst ehost
                     如果报文的以太目的地址是ehost,则逻辑为真. Ehost既可以是名字 (/etc/ethers 里有), 也可以是数字
  
              ether src ehost
                     如果报文的以太源地址是ehost,则逻辑为真.
  
              ether host ehost
                     如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.
  
              gateway host
                     如果报文把host当做网关, 则逻辑为真.
                      
              dst net net
                     如果报文的IP目的地址属于网络号net,则逻辑为真. 
  
              src net net
                     如果报文的IP源地址属于网络号net,则逻辑为真.
  
              net net
                     如果报文的IP源地址或目的地址属于网络号net, 则逻辑为真.
  
              net net mask mask
                     如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.
  
              net net/len
                     如果IP地址匹配指定网络掩码的net, 则逻辑为真.
  
              dst port port
                     如果报文是ip/tcp或ip/udp, 并且目的端口是port, 则逻辑为真.
  
              src port port
                     如果报文的源端口号是port,则逻辑为真.
  
              port port
                     如果报文的源端口或目的端口是port,则逻辑为真.
  
              less length
                     如果报文的长度小于等于length,则逻辑为真. 它等同于:len <= length.
  
              greater length
                     如果报文的长度大于等于length,则逻辑为真. 它等同于:len >= length.
  
              ip proto protocol
                     如果报文是IP数据报, 其内容的协议类型是protocol,则逻辑为真.
  
              ether broadcast
                     如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.
  
              ip broadcast
                     如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.
  
              ether multicast
                     如果报文是以太多目传送报文(multicast),则逻辑为真. 关键字ether是可选的.
  
              ip multicast
                     如果报文是IP多目传送报文,则逻辑为真.

总之tcpdump的使用还是可以满足日常的数据包分析使用的,如下以下一些例子:

监听来自eth0网卡且通信协议为ssh(缺省22端口)来源于192.168.2.100的数据包数据

[root@localhost ~]# tcpdump -i eth0 -nn 'port 22 and src host 192.168.2.100'

截获主机192.168.1.100和主机192.168.2.100或192.168.0.100的通信

[root@localhost ~]# tcpdump host 192.168.1.100 and \(192.168.1.100 or 192.168.0.100\)

截取本机的udp协议的ntp(缺省123端口)

[root@localhost ~]# tcpdump udp port 123

总之,在日常可以使用tcpdump来对各种数据包进行分析,在这里就不做过多的说明,需要更多tcpdump的使用可以看相关的man帮助手册,当然是用tcpdump对七层上数据没有做比较彻底的解码,所以平时也可把抓取的数据包写入文件后使用wireshark来进行进一步的分析

本文永久更新链接地址http://www.linuxidc.com/Linux/2018-01/150038.htm

linux
相关资讯       Tcpdump 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款