引用

1. A tcpdump Tutorial with Examples — 50 Ways to Isolate Traffic
https://danielmiessler.com/study/tcpdump/


一. 简介

    用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

二. 常用命令

1. 默认启动
    tcpdump
    普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。


2. 监听指定网口的数据包
    tcpdump -i ens33
    如果不指定网卡,默认tcpdump只会监视第一个网络接口。


3. 监听指定主机(vec)的数据包
    3.1 监听进入或离开vec主机的所有packet
        tcpdump host vec

    3.2 监听主机特定ip的packet
        tcpdump host 192.168.202.130

    3.3 监听主机192.168.202.130和主机192.168.202.135或者192.168.202.140的packet
        tcpdump host 192.168.202.130 and \( 192.168.202.135 or 192.168.202.140 \)

    3.4 监听主机192.168.202.130和除了主机 192.168.202.160以外的packet
        tcpdump ip host 192.168.202.130 and ! 192.168.202.160

    3.5 监听主机vec所有发送的packet
        tcpdump -i ens30 src host vec

    3.6 监听主机vec所有接收的packet
        tcpdump -i ens30 dst host vec



4. 监视指定主机和端口的数据包
    4.1 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令
        tcpdump tcp port 23 and host 210.27.48.1
    
    4.2 对本机的udp 123 端口进行监视 123 为ntp的服务端口
        tcpdump udp port 123 


5. tcpdump 与 wireshark
    Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。
    还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.pcap

    (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.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

注: 
-C  file-size (nt: 此选项用于配合-w file 选项使用)
    该选项使得tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果
超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一
致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节
(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得,
 即1M=1024 * 1024 = 1,048,576)

-W filecount
      此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依
次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名
的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序.

-s  snaplen
    设置tcpdump的数据包抓取长度为snaplen, 如果不设置,默认将会是68字节(而支持网络接口分接头(nt: 
NIT, 上文已有描述,可搜索'网络接口分接头'关键字找到那里)的SunOS系列操作系统中默认的也是最小值是
96).68字节对于IP, ICMP(nt: Internet Control Message Protocol,因特网控制报文协议), TCP 以及 
UDP 协议的报文已足够, 但对于名称服务(nt: 可理解为dns, nis等服务), NFS服务相关的数据包会产生包截
短. 如果产生包截短这种情况, tcpdump的相应打印输出行中会出现''[|proto]''的标志(proto 实际会显示
为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处
理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要
的包的前提下, 抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包.
-s 0 表示抓取packet的所有数据,即不截断。

-i  interface
    指定tcpdump 需要监听的接口.  如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好
的接口(不包括 loopback 接口).一但找到第一个符合条件的接口, 搜寻马上结束.
    在采用2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接
口上的数据包(nt: 这会包括目的是该网络接口的, 也包括目的不是该网络接口的). 需要注意的是如果真实网
络接口不能工作在'混杂'模式(promiscuous)下,则无法在'any'这个虚拟的网络接口上抓取其数据包.

-w  把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析
和打印.

6.
  为何链路层名称为linux cooked capture?因为包是在linux中使用tcpdump,且指定参数-i any来捕获设
备上所有网卡上的包。它会把所有包的以太网头都换成linux cooked capture,wireshark对此解释为虚假的
协议。