Tcpdump----学习笔记

Tcpdump----使用学习
一、tcpdump是什么
  tcpdump可以将网络中传送的数据包完全截获下来提供分析。支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。

二、安装tcpdump
  linux系统一般默认安装tcpdump
  redhat安装tcpdump
    yum install -y tcpdump

三、使用tcpdump
  a、查看帮助
    1、简洁查询使用方法
      tcpdump -h

    2、详细查询使用方法
      man tcpdump

  b、数据包的写入与读取
    一般情况下,进行网络故障排除时有效奥的方法就是抓包分析网络状况,从而找到网络故障。数据包需要保存起来用于多次分析或取证。
    1、数据包的写入
      tcpdump -i ens33 -c 4 -w data.pcap
      参数:
        -i:指定网卡;未指定的情况下,将从系统接口中搜寻编号最小的已配置好的接口(不包括loopback接口)
        -c:指定抓包的个数
        -w:指定抓包信息写入的文件名

    2、数据包的读取
      tcpdump -r data.pcap
      参数:
        -r:指定tcpdump读取的文件名

  c、tcpdump显示解析
    1、* packets captured
      抓取数据包的数量
    2、* packets received by filter
      系统接收到数据包的数量
    3、* packets dropped by kernel
      丢弃的数据包数量
      #由于tcpdump不能识别某些系统数据包,所以received by filter(系统接收的数量)大于抓取的数量(captured)!

  d、指定网卡抓取
    1、查看系统的网卡
      tcpdump -D

    2、指定网卡抓取
      tcpdump -i eth0
        #抓取eth0的数据包
      tcpdump -i any
        #抓取所有网卡的数据包

  e、tcpdump输出格式
    1、输出远端对应的IP地址和端口
      tcpdump -i eth0 -nnn

    2、指定抓取源IP或者目的IP的包
      tcpdump -i eth0 host 172.10.1.16

    3、指定数据包方向
      流入in
      tcpdump -i eth0 host 172.10.1.16 -n -Q in

      流出out
      tcpdump -i eth0 host 172.10.1.16 -n -Q out

      流入流出inout
      tcpdump -i eth0 host 172.10.1.16 -n -Q inout #默认情况下,抓取inout流入流出的流量

    4、输出数据链路层头部信息
      tcpdump -i eth0 host 172.10.1.16 -n -e

    5、输出抓包的简易信息
      tcpdump -i eth0 host 172.10.1.16 -nnn -e -q -Q in

    6、输出包的头部信息
      tcpdump -i eth0 host 172.10.1.16 -XX
        #-X:打印头部数据
        #-XX:打印头部数据,包括数据链路层的头部

    7、输出详细信息
      tcpdump -i eth0 host 172.10.1.16 -vvv
        #-v:输出包的生存时间、标识、总长度、IP包的一些选项,以及包完整性检测。
        #-vv:输出NFS回应包中额附加域、SMB数据包完全被解码
        #-vvv:更加详细的信息。

      tcpdump -i eth0 host 172.10.1.16 -xxx

  f、tcpdump表达式
    1、表达式是什么
      表达式用于刷选输出哪些类型的数据包,没有表达式将输出所有包。

    2、表达式语法结构
      tcpdump [options] [not] protocol dir type
      参数:
      [options]:选项,见e中选项,如:-nnn\-vvv\-XX\-i\-c\e\Q等
      [not]
      protocol:协议,如tcp/udp/ip/icmp/arp等
      dir:数据包抓取的方向,如src(源)、dst(目的)、src and dst和src or dst(默认)
      type:抓取类型:如:host/net/port/portrange等

      协议(protocol):
        通过给定协议限定匹配的数据包类型
        #tcpdump -i eth0 -nnn -vvv -c 2 icmp 抓取eth0上2个icmp包

      源目(dir):
        源目:src、dst
        逻辑符:and、or
        例如:src、dst、src and dst、src or dst
        #tcpdump -v -n -i eth0 -c 4 dst 172.10.1.16 and icmp 抓取目的为172.10.1.16的icmp包
        #tcpdump -v -n -i eth0 -c 4 src 172.10.1.16 and tcp 抓取源为172.10.1.16的tcp包
        #tcpdump -v -n -i eth0 -c 4 src and dst 172.10.1.16 and icmp 抓取源和目的都为172.10.1.16的icmp包
        #tcpdump -v -n -i eth0 -c 4 src or dst 172.10.1.16 and tcp 抓取源或目的为172.19.1.16的tcp包

      类型(type):
        host(主机IP地址)
          #tcpdump -n -v -i eth0 -c 4 host 172.10.1.16 抓取主机为172.10.1.16的数据包4个

        port(端口)
          #tcpdump -nn -i eth0 -c 4 host 172.10.1.16 and port 80 抓取主机为172.10.1.16的80端口的数据包

        portrange(端口范围)
          #tcpdump -nn -i eth0 -c 4 host 172.10.1.16 and portrange 1-1014 抓取主机为172.10.1.16的1-1014端口的数据包

        net(网络范围)
           #tcpdump -nn -i eth0 -c net 172.10.0 抓取网段172.10.0/24范围的包
四、实例
监视指定主机的数据包
打印所有进入或离开master-2(主机名)的数据包。
tcpdump host master-2

也可以指定ip,例如截获所有192.168.139.98 的主机收到的和发出的所有的数据包。
tcpdump host 192.168.139.98

打印master-1与 master-2或者与master-3之间通信的数据包。
tcpdump host master-1 and \( master-2 or master-3 \)

截获主机192.168.139.99 和主机192.168.139.98 或192.168.139.97的通信
tcpdump host 192.168.139.99 and \ (192.168.139.98 or 192.168.139.97 \)

打印master-1与任何其他主机之间通信的IP 数据包,但不包括与master-3之间的数据包。
tcpdump ip host master-1 and not master-3

如果想要获取主机192.168.139.99除了和主机192.168.139.97之外所有主机通信的ip包,使用命令:
tcpdump ip host 192.168.139.99 and ! 192.168.139.97

打印截获主机master-1发送的所有数据
tcpdump -i eth0 src host master-1

打印监视所有送到主机master-1的数据包
tcpdump -i eth0 dst host master-1

监视指定主机和端口的数据包
打印获取主机192.168.139.99接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 and host 192.168.139.99

对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump udp port 123

监视指定网络的数据包
打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)
tcpdump net ucb-ether

打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)
tcpdump 'gateway snup and (port ftp or ftp-data)'

打印所有源地址或目标地址是本地主机的IP数据包(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络。(nt: 此句翻译曲折,需补充)。localnet 实际使用时要真正替换成本地网络的名字)
tcpdump ip and not net localnet

监视指定协议的数据包
打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
(nt: 可理解为, ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2,
即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 并且其中表达方式'ip[]'需换成'ip6[]'.)

打印长度超过576字节, 并且网关地址是snup的IP数据包
tcpdump 'gateway snup and ip[2:2] > 576'

打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

打印除'echo request'或者'echo reply'类型以外的ICMP数据包( 比如,需要打印所有非ping 程序产生的数据包时可用到此表达式.(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包通常由ping程序产生))

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

posted @ 2020-04-07 22:18  zyxywy  阅读(1285)  评论(0编辑  收藏  举报