1. 设置网卡的工作模式为混杂模式PROMISC
混杂模式下网卡能够接收一切通过它的数据,而不管该数据的目的地址是否为该网卡;
命令:ifconfig 网卡设备 promisc
然后可以通过ifconfig命令查看网络配置开启了混杂模式:
root@ubuntu:/home/zhu# ifconfig ens33 promisc
root@ubuntu:/home/zhu# ifconfig
ens33: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 192.168.198.133 netmask 255.255.255.0 broadcast 192.168.198.255
inet6 fe80::a56e:981d:d530:7d19 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6e:8f:7c txqueuelen 1000 (Ethernet)
RX packets 232860 bytes 327392014 (327.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23757 bytes 1790289 (1.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2. 实用命令详解
tcpdump命令:
tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX] [ -B buffer_size ]
[ -c count ] [ -C file_size ]
[ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ]
[ -P in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -z command ]
[ -Z user ] [ expression ]
- -c count
在收到指定数量的分组后,tcpdump就会停止。
- -C file_size (此选项用于配合-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)
- -D
打印系统中所有tcpdump可以在其上进行抓包的网络接口. 每一个接口会打印出数字编号, 相应的接口名字, 以及可能的一个网络接口描述;
- -e
每行的打印输出中将包括数据包的数据链路层头部信息;
23:39:45.513367 00:50:56:c0:00:08 (oui Unknown) > 01:00:5e:7f:ff:fa (oui Unknown), ethertype IPv4 (0x0800), length 219: 192.168.198.1.59810 > 239.255.255.250.1900: UDP, length 177
//可以看出数据链路层头部信息:6个字节的目的MAC地址、6字节的源MAC地址、2字节的表示网络层所用的协议类型:IPv4、
-
-F file
使用 file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略;
- -i interface
指定tcpdump 需要监听的接口
- -l
对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就马上把这行的内容打印出来).在需要同时观察抓包打印以及保存抓包记录的时候很有用. 比如, 可通过以下命令组合来达到此目的:
``tcpdump -l | tee dat'' 或者 ``tcpdump -l > dat & tail -f dat''.(nt: 前者使用tee来把tcpdump 的输出同时放到文件dat和标准输出中, 而后者通过重定向操作'>', 把tcpdump的输出放到dat 文件中, 同时通过tail把dat文件中的内容放到标准输出中)
- -L
列出指定网络接口所支持的数据链路层的类型后退出.(nt: 指定接口通过-i 来指定)
- -q
快速(也许用'安静'更好?)打印输出. 即打印很少的协议相关信息, 从而输出行都比较简短;
- -r file
从文件file 中读取包数据. 如果file 字段为 '-' 符号, 则tcpdump 会从标准输入中读取包数据;
- -S
打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比如, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和 2. 而如果此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号:232324, 232325).
- -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自动选择合适的长度来抓取数据包;
- -t
每行输出中不打印时间戳;
- -v
当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和.
- -vv
产生比-v更详细的输出;
- -vvv
产生比-vv更详细的输出;
- -w
把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印;
- -x
当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括链路层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必须要注意的是, 如果高层协议数据没有snaplen 这么长,并且数据链路层(比如, Ethernet层)有填充数据, 则这些填充数据也会被打印.
- -xx
tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部;
- -X
当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括链路层的头部).这对于分析一些新协议的数据包很方便;
- -XX
当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便.
3. 其他命令
学会使用and、or、not、dst、src、host、
捕获指定主机收到的或者发出的数据包 | tcpdump host 主机名(也可以为主机的IP地址) |
捕获指定两个主机之间的数据包 | tcpdump host 主机名 and \ 另一个主机名 |
捕获某一主机与其他多个主机之间的数据包 | tcpdump host 主机名 and \ (主机名1 or 主机名2 or ...) |
捕获某一主机与除了某一主机之外的其他主机之间的数据包 | tcpdump host 主机名 and not 主机名 |
捕获主机hostname发送的所有数据 | tcpdump src host hostname |
捕获所有送到主机hostname的数据包 | tcpdump -i eth0 dst host hostname |
监视指定端口的数据包 | tcpdump tcp port 23 |