百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Linux tcpdump抓包命令详解(含安装教程)

bigegpt 2024-08-05 11:47 8 浏览

请关注本头条号,每天坚持更新原创干货技术文章。

如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

1. 前言

对网络工程师和系统工程师而言,如何使用tcpdump命令分析网络流量是一个必须熟悉掌握的任务。tcpdump 是一个运行在命令行下的强大嗅探工具,我们一般俗称抓包工具或者软件。如果你对Windows上的wireshark软件熟悉,那么你可以很快对tcpdump上手,区别在于Windows wireshark使用的是图形界面,而tcpdump是命令行界面。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。

tcpdump 是一个在BSD许可证下发布的自由软件。tcpdump 适用于大多数的类Unix系统 操作系统:包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在这些系统中,tcpdump 需要使用libpcap这个捕捉数据的库。其在Windows下的版本称为WinDump;它需要WinPcap驱动,相当于在Linux平台下的libpcap.

2. Linux安装tcpdump

Ubuntu 安装tcpdump

oucanrong@zcwyou:~$ sudo apt install -y tcpdump

CentOS安装tcpdump

[root@centos7 ~]# yum -y install tcpdump

Running transaction

正在安装 : 14:libpcap-1.5.3-11.el7.x86_64 1/2

正在安装 : 14:tcpdump-4.9.2-3.el7.x86_64 2/2

验证中 : 14:tcpdump-4.9.2-3.el7.x86_64 1/2

验证中 : 14:libpcap-1.5.3-11.el7.x86_64 2/2

已安装:

tcpdump.x86_64 14:4.9.2-3.el7

作为依赖被安装:

libpcap.x86_64 14:1.5.3-11.el7

完毕!

CentOS安装tcpdump

tcpdump 依赖于 libpcap,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。

检查tcpdump运行的位置

[root@centos7 ~]# which tcpdump

/usr/sbin/tcpdump

现在已经可以正常使用tcpdump了。

3. 试试使用tcpdump抓包

如果你没有使用root身份登录系统,请使用sudo获取root权限。

比如Ubuntu系统,一般使用普通账号登录,需要加sudo

查看可以被tcpdump使用的网络接口:

oucanrong@zcwyou:~$ sudo tcpdump -D

[sudo] oucanrong 的密码:

1.vmnet1 [Up, Running]

2.vmnet8 [Up, Running]

3.enp0s25 [Up, Running]

4.any (Pseudo-device that captures on all interfaces) [Up, Running]

5.lo [Up, Running, Loopback]

6.wlp3s0 [Up]

7.bluetooth0 (Bluetooth adapter number 0)

8.nflog (Linux netfilter log (NFLOG) interface)

9.nfqueue (Linux netfilter queue (NFQUEUE) interface)

10.usbmon1 (USB bus number 1)

11.usbmon2 (USB bus number 2)

12.usbmon3 (USB bus number 3)

13.usbmon4 (USB bus number 4)

如果使用root身份登录,不需要加sudo

[root@centos7 ~]# tcpdump -D

1.bluetooth0 (Bluetooth adapter number 0)

2.nflog (Linux netfilter log (NFLOG) interface)

3.nfqueue (Linux netfilter queue (NFQUEUE) interface)

4.usbmon1 (USB bus number 1)

5.ens33

6.any (Pseudo-device that captures on all interfaces)

7.lo [Loopback]

查看可以被tcpdump使用的网络接口

tcpdump对任意接口进行抓包:

[root@centos7 ~]# tcpdump -i any

tcpdump对任意接口进行抓包

tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。

在上面的示例中,由于我是通过 ssh 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。

4. 使用-c选项限制 tcpdump 抓包的数量

抓取5个包后自动停止

[root@centos7 ~]# tcpdump -i any -c 5

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

18:07:53.506327 IP centos7.ssh > zcwyou.59564: Flags [P.], seq 2122710787:2122710983, ack 2546646634, win 314, options [nop,nop,TS val 990878 ecr 4069694757], length 196

18:07:53.506506 IP zcwyou.59564 > centos7.ssh: Flags [.], ack 196, win 1444, options [nop,nop,TS val 4069694779 ecr 990878], length 0

18:07:53.506974 ARP, Request who-has gateway tell centos7, length 28

18:07:53.507127 ARP, Reply gateway is-at 00:50:56:ed:46:5b (oui Unknown), length 46

18:07:53.507134 IP centos7.49437 > gateway.domain: 24983+ PTR? 1.87.16.172.in-addr.arpa. (42)

5 packets captured

12 packets received by filter

0 packets dropped by kernel

tcpdump 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用 —— 比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包时,-c 的作用就十分突出了。

5. 指定抓取特定IP和特定端口

只抓取端口为22的流量,抓取5个后停止

[root@centos7 ~]# tcpdump -i any -c5 port 22

抓取网络接口ens33,IP地址为172.16.87.137,端口22的流量。

[root@centos7 ~]# tcpdump -i ens33 host 172.16.87.137 and port 22

在源 IP 和目的 IP 之后,可以看到是 TCP 报文标记段 Flags [P.]。该字段通常取值如下:

值 标志类型 描述

S SYN Connection Start

F FIN Connection Finish

P PUSH Data push

R RST Connection reset

. ACK Acknowledgment

使用!符号排除特定条件,

比如:不抓取目标端口是22的数据包

dst port ! 22

比如:不抓取目标端口是80的数据包

src port ! 80

6. 根据协议过滤

在命令中指定协议便可以按照协议类型来筛选数据包。比方说用如下命令只要抓取 ICMP 报文:

[root@centos7 ~]# tcpdump -i any -c5 icmp

在某台电脑上ping这台Linux服务器

oucanrong@zcwyou:~$ ping centos7

使用TCPdump抓取 ICMP 报文

抓取任意接口,IP地址为172.16.87.137,抓取5个包后自动停止。

-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn host 172.16.87.137

使用TCPdump抓取特定IP流量

抓取特定端口的流量:

[root@centos7 ~]# tcpdump -i any -c5 -nn port 80

使用src选项指定源IP地址192.168.77.98:

-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.77.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

使用dst选项指定目标IP地址192.168.88.88:

[root@centos7 ~]# tcpdump -i any -c5 -nn dst 192.168.88.88

7. 根据多条件抓取待定数据包

你可以使用多条件组合来抓取指定的数据包,使用 and 以及 or 逻辑操作符来创建过滤规则。例如,筛选来自源 IP 地址 192.168.122.98 的 HTTP 数据包:

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

你也可以使用括号来创建更为复杂的过滤规则,但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式:

抓取端口为源IP为192.168.188.8或者123.123.123.123,抓取5个包后停止,

[root@centos7 ~]# tcpdump -i any -c5 -nn "port 80 and (src 192.168.188.8 or src 123.123.123.123)"

8. 显示数据包的详细信息

在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。tcpdump 提供了两个选项可以查看数据包内容,-X 以十六进制打印出数据报文内容,-A 打印数据报文的 ASCII 值。

[root@centos7 ~]# tcpdump -i any -c10 -nn -A port 80

9. 保存抓包内容

tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以结合Linux计划任务在指定时间抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。

使用 -w 选项来保存数据包而不是在屏幕上显示出抓取的数据包:

抓取任意接口的流量,端口为80,抓取10个包后自动停止,保存文件为sample.pcap。

[root@centos7 ~]# tcpdump -i any -c10 -nn -w sample.pcap port 80

为什么要保存后缀名为.pcap,是因为它于wireshark兼容,也就是说,你可以使用wireshark图形界面版的软件打开它。

10. 查看抓包文件的内容

tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r 选项参数来阅读该文件中的报文内容:

查看sample.pcap

[root@centos7 ~]# tcpdump -nn -r sample.pcap

这里不需要管理员权限 sudo 了,因为此刻并不是在网络接口处抓包。

根据特定条件查看抓包内容,比如只查看源IP为1.2.3.4的流量

[root@centos7 ~]# tcpdump -nn -r webserver.pcap src 1.2.3.4

当然,你可以在Windows上使用wireshark打开.pcap文件,也可以在Linux图形化界面上安装GUI版的wireshark

CentOS Gnome环境安装图形化的wireshark

[root@centos7 ~]# yum -y install wireshark-gnome

Ubuntu安装图形化的wireshark

oucanrong@zcwyou:~$ sudo apt install wireshark-gtk -y

11. 总结

相信以上教程已经可以帮助你使用强大的 tcpdump 抓包工具了。更多的内容请参考 tcpdump 网站以及它的帮助文件。

tcpdump 官网:

http://www.tcpdump.org/

tcpdump 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 Wireshark。

Wireshark官网地址:

https://www.wireshark.org/

你可以使用 tcpdump命令行在没有 GUI 界面的远程机器上抓包,然后下载到其他机器上使用 Wireshark 中分析数据包。

本文已同步至博客站:

https://www.linuxrumen.com/cyml/742.html

点击了解更多,快速查看更多的技术文章列表。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...