本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

这篇文章我总结得比较详尽,可以当字典查,建议收藏,不过别光顾着收藏,点赞什么的鼓励我一下,这能让我更有动力给大家输出更好的内容。

01 简介

tcpdump 是一款 Linux 平台的抓包工具。它可以抓取涵盖整个 TCP/IP 协议族的数据包,支持针对网络层、协议、主机、端口的过滤,并提供 and、or、not 等逻辑语句来过滤无用的信息。

tcpdump 是一个非常复杂的工具,掌握它的方方面面实属不易,也不推荐,能够用它来解决日常工作问题才是关系。

02 tcpdump 命令选项

tcpdump 有很多命令选项,想了解所有选项可以 Linux 命令行输入 tcpdump -hman tcpdump 查看每个选项的意思。

  1. [root@by ~]# tcpdump -h
  2. tcpdump version 4.9.2
  3. libpcap version 1.5.3
  4. OpenSSL 1.0.2k-fips 26 Jan 2017
  5. Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
  6. [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
  7. [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
  8. [ -Q|-P in|out|inout ]
  9. [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
  10. [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
  11. [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
  12. [ -Z user ] [ expression ]

下面列举一些常用选项:

  • -A 只使用 ASCII 打印报文的全部数据,不要和 -X 一起使用,获取 http 可以用 tcpdump -nSA port 80
  • -b 在数据链路层上选择协议,包括 ip, arp, rarp, ipx 等
  • -c 指定要抓取包的数量
  • -D 列出操作系统所有可以用于抓包的接口
  • -e 输出链路层报头
  • -i 指定监听的网卡,-i any 显示所有网卡
  • -n 表示不解析主机名,直接用 IP 显示,默认是用 hostname 显示
  • -nn 表示不解析主机名和端口,直接用端口号显示,默认显示是端口号对应的服务名
  • -p 关闭接口的混杂模式
  • -P 指定抓取的包是流入的包还是流出的,可以指定参数 in, out, inout 等,默认是 inout
  • -q 快速打印输出,即只输出少量的协议相关信息
  • -s len 设置要抓取数据包长度为 len,默认只会截取前 96bytes 的内容,-s 0 的话,会截取全部内容。
  • -S 将 TCP 的序列号以绝对值形式输出,而不是相对值
  • -t 不要打印时间戳
  • -vv 输出详细信息(比如 tos、ttl、checksum等)
  • -X 同时用 hex 和 ascii 显示报文内容
  • -XX 同 -X,但同时显示以太网头部

03 过滤器

网络报文是很多的,很多时候我们在主机上抓包,会抓到很多我们并不关心的无用包,然后要从这些包里面去找我们需要的信息,无疑是一件费时费力的事情,tcpdump 提供了灵活的语法可以精确获取我们关心的数据,这些语法说得专业点就是过滤器。

过滤器简单可分为三类:协议(proto)、传输方向(dir)和类型(type)。

一般的 表达式格式 为:

  • 关于 proto:可选有 ip, arp, rarp, tcp, udp, icmp, ether 等,默认是所有协议的包
  • 关于 dir:可选有 src, dst, src or dst, src and dst,默认为 src or dst
  • 关于 type:可选有 host, net, port, portrange(端口范围,比如 21-42),默认为 host

04 常用操作

测试环境 IP:172.18.82.173

4.1 抓取某主机的数据包

抓取主机 172.18.82.173 上所有收到(DST_IP)和发出(SRC_IP)的所有数据包

  1. tcpdump host 172.18.82.173

抓取经过指定网口 interface ,并且 DST_IP 或 SRC_IP 是 172.18.82.173 的数据包

  1. tcpdump -i eth0 host 172.18.82.173

筛选 SRC_IP,抓取经过 interface 且从 172.18.82.173 发出的包

  1. tcpdump -i eth0 src host 172.18.82.173

筛选 DST_IP,抓取经过 interface 且发送到 172.18.82.173 的包

  1. tcpdump -i eth0 dst host 172.18.82.173

抓取主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 通信的包

  1. tcpdump host 200.200.200.1 and \(200.200.200.2 or 200.200.200.3\)

抓取主机 200.200.200.1 和除了主机 200.200.200.2 之外所有主机通信的包

  1. tcpdump ip host 200.200.200.1 and ! 200.200.200.2

4.2 抓取某端口的数据包

抓取所有端口,显示 IP 地址

  1. tcpdump -nS

抓取某端口上的包

  1. tcpdump port 22

抓取经过指定 interface,并且 DST_PORT 或 SRC_PORT 是 22 的数据包

  1. tcpdump -i eth0 port 22

筛选 SRC_PORT

  1. tcpdump -i eth0 src port 22

筛选 DST_PORT

  1. tcpdump -i eth0 dst port 22

比如希望查看发送到 host 172.18.82.173 的网口 eth0 的 22 号端口的包

  1. [root@by ~]# tcpdump -i eth0 -nnt dst host 172.18.82.173 and port 22 -c 1 -vv
  2. tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
  3. IP (tos 0x14, ttl 114, id 27674, offset 0, flags [DF], proto TCP (6), length 40)
  4. 113.98.59.61.51830 > 172.18.82.173.22: Flags [.], cksum 0x7fe3 (correct), seq 19775964, ack 1564316089, win 2053, length 0

4.3 抓取某网络(网段)的数据包

抓取经过指定 interface,并且 DST_NET 或 SRC_NET 是 172.18.82 的包

  1. tcpdump -i eth0 net 172.18.82

筛选 SRC_NET

  1. tcpdump -i eth0 src net 172.18.82

筛选 DST_NET

  1. tcpdump -i eth0 dst net 172.18.82

4.4 抓取某协议的数据包

  1. tcpdump -i eth0 icmp
  2. tcpdump -i eth0 ip
  3. tcpdump -i eth0 tcp
  4. tcpdump -i eth0 udp
  5. tcpdump -i eth0 arp

4.5 复杂的逻辑表达式抓取过滤条件

抓取经过 interface eth0 发送到 host 200.200.200.1 或 200.200.200.2 的 TCP 协议 22 号端口的数据包

  1. tcpdump -i eth0 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 200.200.200.1) or (dst host 200.200.200.2)))'

PS:对于复杂的过滤器表达式,为了逻辑清晰,可以使用 (),不过默认情况下,tcpdump 会将 () 当做特殊字符,所以必须使用 '' 来消除歧义。

抓取经过 interface eth0, DST_MAC 或 SRC_MAC 地址是 00:16:3e:12:16:e7 的 ICMP 数据包

  1. tcpdump -i eth0 '((icmp) and ((ether host 00:16:3e:12:16:e7)))' -nnvv

抓取经过 interface eth0,目标网络是 172.18 但目标主机又不是 172.18.82.173 的 TCP 且非 22 号端口号的数据包

  1. tcpdump -i eth0 -nntvv '((dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'

抓取流入 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包

  1. tcpdump -i eth0 -nntvv -P in host 172.18.82.173 and icmp

抓取流出 interface eth0,host 为 172.18.82.173 且协议为 ICMP 的数据包

  1. tcpdump -i eth0 -nntvv -P out host 172.18.82.173 and icmp

05 与 wireshark、Snort 等工具的结合

tcpdump 抓包的时候,默认是打印到屏幕输出,如果是抓取包少还好,如果包很多,很多行数据,刷刷刷从眼前一闪而过,根本来不及看清内容。不过,tcpdump 提供了将抓取的数据保存到文件的功能,查看文件就方便分析多了,而且还能与其他图形工具一起配合分析,比如 wireshark、Snort 等。

  • -w 选项表示把数据报文输出到文件
  1. tcpdump -w capture_file.pcap port 80 # 把所有 80 端口的数据导出到文件
  • -r 选项表示读取文件里的数据报文,显示到屏幕上
  1. tcpdump -nXr capture_file.pcap host host1

PS:.pcap 格式的文件需要用 wireshark、Snort 等工具查看,使用 vimcat 会出现乱码。

06 tcpdump 的输出格式

tcpdump 的输出格式总体上为:

  1. 系统时间 源主机.端口 > 目标主机.端口 数据包参数

比如下面的例子,显示了 TCP 的三次握手过程:

  1. 21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
  2. 192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
  3. 21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
  4. 124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0
  5. 21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
  6. 192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0

第一条是 SYN 报文,通过 Flags[S] 看出。第二条是 [S.],表示 SYN-ACK 报文。常见的 TCP 报文的 Flags 如下:

  • [S]: SYN(开始连接)
  • [.]: 没有 Flag
  • [P]: PSH(推送数据)
  • [F]: FIN (结束连接)
  • [R]: RST(重置连接)

06 总结

本文可以当字典查阅,记住一些常用的 tcpdump 抓包案例,其他的用到再通过 man tcpdump 辅助编写。和 wireshark 等图形化工具配合使用,能更加深理解。


后台回复“加群”,带你进入高手如云交流群

参考

https://blog.csdn.net/Jmilk/article/details/86618205?tdsourcetag=s_pctim_aiomsg

https://danielmiessler.com/study/tcpdump/

http://bencane.com/2014/10/13/quick-and-practical-reference-for-tcpdump/


我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!的更多相关文章

  1. python网络爬虫,知识储备,简单爬虫的必知必会,【核心】

    知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...

  2. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  3. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  4. 读书笔记--SQL必知必会--建立练习环境

    书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...

  5. 关于TCP/IP,必知必会的十个经典问题[转]

    关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队   本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...

  6. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  7. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  8. TCP/IP 必知必会的十个问题

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protoc ...

  9. TCP/IP,必知必会的

    文章目录 前言 TCP/IP模型 数据链路层 网络层 ping Traceroute TCP/UDP DNS TCP连接的建立与终止 TCP流量控制 TCP拥塞控制 0 前言 本文整理了一些TCP/I ...

随机推荐

  1. 文件上传--基于Spring MVC框架+SmartUpload

    这篇文章是介绍文件上传的,由于在spring MVC上实现起来和直接在servlet中写有些不同,所以特地写了一下这篇文章,关于不同点,大家可以先阅读一下上一篇文章.好了,下面直接上代码. jab包是 ...

  2. Python Assert 为何不尽如人意

    Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. >>> assert 1 + 1 == 2 >>> ass ...

  3. [转]树莓派.设置自动重连WiFi

    由于不可知的原因,有可能会导致树莓派失去连接,这时候需要重新连接WiFi. 自动重连的原理是,定期查看是否断网,如果断网了重启WiFi,参考的文章是这篇,第一步略有修改. 1.Python 代码 au ...

  4. C++ 文件流的方式操作文件(一个简单的写入,读取)

    新手学习c++哈,归纳的写了一下以 C++ 的方式写入读取文件,读文件到控制台,并加了行号.博客记录主要为了备忘.当然 ^_^ 喜欢同学的话可以拿走代码直接用.转帖注明出处哈.欢迎讨论,我一直认为:知 ...

  5. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...

  6. 谈谈.NET架构师面试及如何设计面试题

    上星期:应老东家的要求,帮其面试.NET架构师. 于是:老东家进行了一星期的简历收集: 终于:在一堆简历里,精挑细选了四个: 约了:周末上午下午各两个. 面试者年龄:在30-35岁左右,差不多10年. ...

  7. 【SAP业务模式】之STO(二):系统配置

    本篇博文开始讲述STO业务模式的配置! 一.定义发货工厂的装运数据: 目录:SPRO-物料管理-采购-采购订单-设置库存调拨订单-定义工厂的装运数据 定义发货工厂的装运数据: 为收货工厂分配客户代码: ...

  8. Android进阶加密-第1章-Android系统架构-读书笔记

    第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...

  9. LVS的DR模型配置

    LVS的DR模型配置 介绍 下图为DR模型的通信过程,图中的IP不要被扑结构中的IP迷惑,图里只是为了说明DR的通信原理,应用到本例中的拓扑上其工作原理不变. 拓扑结构 服务器 IP地址 角色 Srv ...

  10. 从零开始学TensorFlow

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在学习TensorFlow的相关知识,了解了Te ...