CSDN|肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁( 二 )

  • proto 类过滤器:根据协议进行过滤 , 可识别的关键词有:upd, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
  • type 类过滤器:可识别的关键词有:host, net, port, portrange , 这些词后边需要再接参数 。
  • direction 类过滤器:根据数据流向进行过滤 , 可识别的关键字有:src, dst , 同时你可以使用逻辑运算符进行组合 , 比如 src or dst
  • proto、type、direction 这三类过滤器的内容比较简单 , 也最常用 , 因此我将其放在最前面 , 也就是 第三节:常规过滤规则一起介绍 。 而 option 可选的参数非常多 , 有的甚至也不经常用到 , 因此我将其放到后面一点 , 也就是 第四节:可选参数解析当你看完前面六节 , 你对 tcpdump 的认识会上了一个台阶 , 至少能够满足你 80% 的使用需求 。 你一定会问了 , 还有 20% 呢?其实 tcpdump 还有一些过滤关键词 , 它不符合以上四种过滤规则 , 可能需要你单独记忆 。 关于这部分我会在 第六节:特殊过滤规则 里进行介绍 。 理解 tcpdump 的输出2.1 输出内容结构tcpdump 输出的内容虽然多 , 却很规律 。 这里以我随便抓取的一个 tcp 包为例来看一下21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48从上面的输出来看 , 可以总结出:
    1. 第一列:时分秒毫秒 21:26:49.013621
    2. 第二列:网络协议 IP
    3. 第三列:发送方的ip地址+端口号 , 其中172.20.20.1是 ip , 而15605 是端口号
    4. 第四列:箭头 > ,表示数据流向
    5. 第五列:接收方的ip地址+端口号 , 其中 172.20.20.2 是 ip , 而5920 是端口号
    6. 第六列:冒号
    7. 第七列:数据包内容 , 包括Flags 标识符 , seq 号 , ack 号 , win 窗口 , 数据长度 length , 其中 [P.] 表示 PUSH 标志位为 1 , 更多标识符见下面
    2.2 Flags 标识符使用 tcpdump 抓包后 , 会遇到的 TCP 报文 Flags , 有以下几种:
    • [S] : SYN(开始连接)
    • [P] : PSH(推送数据)
    • [F] : FIN (结束连接)
    • [R] : RST(重置连接)
    • [.] : 没有 Flag , 由于除了 SYN 包外所有的数据包都有ACK , 所以一般这个标志也可表示 ACK
    常规过滤规则3.1 基于IP地址过滤:host使用 host 就可以指定 host ip 进行过滤数据包的 ip 可以再细分为源ip和目标ip两种# 根据源ip进行过滤$ tcpdump -i eth2 src 192.168.10.100# 根据目标ip进行过滤$ tcpdump -i eth2 dst 192.168.10.2003.2 基于网段进行过滤:net若你的ip范围是一个网段 , 可以直接这样指定$ tcpdump net 192.168.10.0/24网段同样可以再细分为源网段和目标网段# 根据源网段进行过滤$ tcpdump src net 192.168# 根据目标网段进行过滤$ tcpdump dst net 192.1683.3 基于端口进行过滤:port使用 port 就可以指定特定端口进行过滤$ tcpdump port 8088端口同样可以再细分为源端口 , 目标端口# 根据源端口进行过滤$ tcpdump src port 8088# 根据目标端口进行过滤$ tcpdump dst port 8088如果你想要同时指定两个端口你可以这样写$ tcpdump port 80 or port 8088但也可以简写成这样$ tcpdump port 80 or 8088如果你的想抓取的不再是一两个端口 , 而是一个范围 , 一个一个指定就非常麻烦了 , 此时你可以这样指定一个端口段 。 $ tcpdump portrange 8000-8080$ tcpdump src portrange 8000-8080$ tcpdump dst portrange 8000-8080对于一些常见协议的默认端口 , 我们还可以直接使用协议名 , 而不用具体的端口号比如 http == 80 , https == 443 等$ tcpdump tcp port http3.4 基于协议进行过滤:proto常见的网络协议有:tcp, udp, icmp, http, ip,ipv6 等若你只想查看 icmp 的包 , 可以直接这样写$ tcpdump icmpprotocol 可选值:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui3.5 基本IP协议的版本进行过滤当你想查看 tcp 的包 , 你也许会这样子写$ tcpdump tcp这样子写也没问题 , 就是不够精准 , 为什么这么说呢?ip 根据版本的不同 , 可以再细分为 IPv4 和 IPv6 两种 , 如果你只指定了 tcp , 这两种其实都会包含在内 。 那有什么办法 , 能够将 IPv4 和 IPv6 区分开来呢?很简单 , 如果是 IPv4 的 tcp 包, 就这样写(友情提示:数字 6 表示的是 tcp 在ip报文中的编号 。 )$ tcpdump 'ip proto tcp'# or$ tcpdump ip proto 6# or$ tcpdump 'ip protochain tcp'# or $ tcpdump ip protochain 6而如果是 IPv6 的 tcp 包, 就这样写$ tcpdump 'ip6 proto tcp'# or$ tcpdump ip6 proto 6# or$ tcpdump 'ip6 protochain tcp'# or $ tcpdump ip6 protochain 6关于上面这几个命令示例 , 有两点需要注意:


    推荐阅读