正文

tcpdump是一个命令行实用程序linux操作系统界面,可用于捕获和检测进出系统的网路流量。它是网路管理员中用于排除网路问题和安全测试的最常用工具。

虽然名称这般,使用tcpdump,您也可以捕获非TCP流量linux tc命令,比如UDP,ARP或ICMP。捕获的数据包可以写入文件或标准输出。tcpdump命令最强悍的功能之一是它还能使用过滤器并仅捕获要剖析的数据。

在本文中,我们将介绍怎样在Linux中使用tcpdump命令的基础知识。

安装tcpdump

在大多数Linux发行版和macOS上默认安装了tcpdump。要检测tcpdump命令在您的系统上是否可用:

[linuxidc@linux:~/]$tcpdump--version

输出应如下所示:

tcpdumpversion4.9.2

libpcapversion1.8.1

OpenSSL1.1.111Sep2018

倘若您的系统上没有tcpdump,则里面的命令将显示“没有哪个文件或目录”。您可以使用发行版的软件包管理器轻松安装tcpdump。

[linuxidc@linux:~/]$tcpdump--version

bash:/usr/sbin/tcpdump:没有哪个文件或目录

在Ubuntu和Debian上安装tcpdump

$sudoaptupdate&&sudoaptinstalltcpdump

CentOS和Fedora上安装tcpdump

$sudoyuminstalltcpdump

在ArchLinux上安装tcpdump

$sudopacman-Stcpdump

使用tcpdump捕获数据包

tcpdump命令的常规句型如下:

tcpdump[选项][过滤器表达式]

只有root或具有sudo特权的用户能够运行tcpdump。倘若您尝试以非特权用户身分运行该命令,则会收到一条错误消息:“您无权在该设备上进行捕获”。

tcpdump:ens33:Youdon’thavepermissiontocaptureonthatdevice

linux中at命令重启命令_linux下tc命令误码_linux tc命令

(socket:Operationnotpermitted)

最简单的用例是不带任何选项和过滤器的情况下调用tcpdump:

[linuxidc@linux:~/]$sudotcpdump

输出如下:

[sudo]linuxidc的密码:

tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode

listeningonens33,link-typeEN10MB(Ethernet),capturesize262144bytes

tcpdump将继续捕获数据包并写入标准输出,直至接收到中断讯号为止。使用Ctrl+C组合键发送中断讯号并停止命令。

要获得更详尽的输出,请传递-v选项,或传递-vv以获得更详尽的输出:

[linuxidc@linux:~/]$sudotcpdump-vv

您可以使用-c选项指定要捕获的数据包数目。比如,要仅捕获5个数据包,请输入:

[linuxidc@linux:~/]$sudotcpdump-c5

tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode

listeningonens33,link-typeEN10MB(Ethernet),capturesize262144bytes

21:08:14.575216IPlinux.42082>180.101.49.12.https:Flags[.],ack470550152,win30016,length0

21:08:14.577139IP180.101.49.12.https>linux.42082:Flags[.],ack1,win64240,length0

21:08:14.578127IPlinux.37565>_gateway.domain:52885+[1au]PTR?12.49.101.180.in-addr.arpa.(55)

21:08:14.583548IP_gateway.domain>linux.37565:52885NXDomain0/1/1(114)

21:08:14.585411IPlinux.37565>_gateway.domain:52885+PTR?12.49.101.180.in-addr.arpa.(44)

5packetscaptured

14packetsreceivedbyfilter

5packetsdroppedbykernel

捕获数据包后,tcpdump将停止。

若果未指定任何插口,则tcpdump使用它找到的第一个插口并存贮通过该插口的所有数据包。

使用-D选项可以复印tcpdump可以从中搜集数据包的所有可用网路插口的列表:

[linuxidc@linux:~/]$sudotcpdump-D

对于每位插口,该命令将复印插口名称,简略描述以及关联的索引(数字):

输出:

1.ens33[Up,Running]

2.any(Pseudo-devicethatcapturesonallinterfaces)[Up,Running]

3.lo[Up,Running,Loopback]

4.bluetooth0(Bluetoothadapternumber0)

5.nflog(Linuxnetfilterlog(NFLOG)interface)

6.nfqueue(Linuxnetfilterqueue(NFQUEUE)interface)

7.usbmon1(USBbusnumber1)

8.usbmon2(USBbusnumber2)

里面的输出显示ens3是tcpdump找到的第一个插口,但是在没有为该命令提供插口时使用。第二个插口any是一种特殊的设备,可让您捕获所有活动的插口。

要指定要在其上捕获流量的插口,请使用-i选项调用命令,后跟插口名称或关联的索引。比如,要捕获来自所有插口的所有数据包,可以指定any插口:

[linuxidc@linux:~/]$sudotcpdump-iany

默认情况下,tcpdump对IP地址执行反向DNS解析,并将端标语转换为名称。使用-n选项禁用转换:

[linuxidc@linux:~/]$sudotcpdump-n

跳过DNS查询可以防止生成DNS流量并使输出更具可读性。建议在调用tcpdump时使用此选项。

与在屏幕上显示输出不同,您可以使用重定向操作符>和>>将其重定向到一个文件:

[linuxidc@linux:~/]$sudotcpdump-n-iany>linuxidc.txt

tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode

linux中at命令重启命令_linux tc命令_linux下tc命令误码

listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes

^C3470packetscaptured

3616packetsreceivedbyfilter

0packetsdroppedbykernel

您还可以使用tee命令在保存到文件的同时查看数据:

[linuxidc@linux:~/]$sudotcpdump-n-l|teelinuxidc.txt

里面命令中的-l选项告诉tcpdump缓冲输出行。不使用此选项时,生成新行时,输出不会写在屏幕上。

了解tcpdump输出

tcpdump在新行上输出每位捕获的数据包的信息。每行包括一个时间戳和有关该数据包的信息,具体取决于合同。

TCP合同行的典型格式如下:

[Timestamp][Protocol][SrcIP].[SrcPort]>[DstIP].[DstPort]:[Flags],[Seq],[Ack],[WinSize],[Options],[DataLength]

让我们挨个数组进行说明,并解释以下内容:

21:53:20.460144IP192.168.182.166.57494>35.222.85.5.80:Flags[P.],seq1:88,ack1,win29200,options[nop,nop,TSval1067794587ecr2600218930],length87

TCP标志数组。在此示例中,[P.]表示推送确认数据包,用于确认前一个数据包并发送数据。其他典型标志数组值如下:

tcpdump过滤器

在不使用过滤器的情况下调用tcpdump时,它将捕获所有流量并形成大量输出,这促使查找和剖析目标数据包显得十分困难。

过滤器是tcpdump命令最强悍的功能之一。由于它们容许您仅捕获与表达式匹配的这些数据包。比如,在对与Web服务器有关的问题进行故障排除时,可以使用过滤器仅获取HTTP通讯。

tcpdump使用Berkeley数据包筛选器(BPF)句型使用各类加工参数(比如合同,源IP地址和目标IP地址以及端口等)过滤捕获的数据包。

在本文中,我们将介绍一些最常见的过滤器。有关所有可用过滤器的列表,请查看pcap-filter联机帮助页。

按合同过滤

要将捕获限制为特定合同,请将该合同指定为过滤器。比如,要仅捕获UDP流量,可以使用:

$sudotcpdump-nudp

定义合同的另一种方式是使用原型限定符,后跟合同编号。以下命令将过滤合同编号17,并形成与上述相同的结果:

$sudotcpdump-nproto17

有关编号的更多信息,请复查IP合同编号列表。

主机过滤

要仅捕获与特定主机有关的数据包linux tc命令,请使用主机限定符:

$sudotcpdump-nhost192.168.1.185

主机可以是IP地址或名称。

您还可以使用网路限定符将输出过滤到给定的IP范围。比如,要仅存贮与10.10.0.0/16相关的数据包,可以使用:

$sudotcpdump-nnet10.10

按端口过滤

若要仅将捕获限制为来自特定端口或特定端口的数据包,请使用端口限定符。以下命令使用以下命令捕获与SSH(端口22)服务相关的数据包:

$sudotcpdump-nport23

portrange限定符使您就能捕获一系列端口中的流量:

$sudotcpdump-nportrange110-150

按来源和目的地过滤

您还可以使用aresrc,dst,src和dst以及src或dst限定符基于源或目标端口或主机筛选数据包。

以下命令捕获来自IP为192.168.1.185的主机的传入数据包:

$sudotcpdump-nsrchost192.168.1.185

要查找从任何来源到端口80的流量,请使用:

$sudotcpdump-ndstport80

复合过滤器

可以使用和(&&)或则(||),而不是(!)运算符组合过滤器。

比如,要捕获来自源IP地址192.168.1.185的所有HTTP通讯,可以使用以下命令:

$sudotcpdump-nsrc192.168.1.185andtcpport80

您还可以使用括弧来分组和创建更复杂的过滤器:

$sudotcpdump-n’host192.168.1.185and(tcpport80ortcpport443)’

为防止在使用特殊字符时解析错误,请将过滤器括在单冒号内。

这是另一个示例命令,用于从源IP地址192.168.1.185捕获除SSH以外的所有流量:

linux tc命令_linux下tc命令误码_linux中at命令重启命令

$sudotcpdump-nsrc192.168.1.185andnotdstport22

检测数据包

默认情况下,tcpdump仅捕获数据榆林。并且,有时您可能须要检测数据包的内容。

tcpdump容许您以ASCII和十六补码格式复印数据包的内容。

-A选项告诉tcpdump以ASCII格式输出每位数据包,以十六补码格式-x输出每位数据包:

$sudotcpdump-n-A

要以十六补码和ASCII码显示数据包的内容,请使用-X选项:

$sudotcpdump-n-X

读取和写入捕获到文件

tcpdump的另一个有用功能是将数据包写入文件。当您捕获大量数据包或要捕获数据包以供之后剖析时,这十分便捷。

要开始写入文件,请使用-w选项,后跟输出捕获文件:

$sudotcpdump-n-wdata.pcap

里面的命令将捕获的内容保存到名为data.pcap的文件中。您可以按照须要命名文件,并且使用.pcap扩充名(数据包捕获)是一种常见的约定。

使用-w选项时,输出不会显示在屏幕上。tcpdump写入原始数据包并创建一个二补码文件,而常规文本编辑器难以读取该文件。

要检测文件的内容,请使用-r选项调用tcpdump:

$sudotcpdump-rdata.pcap

假如要在后台运行tcpdump,请在命令末尾添加与号(&)。

也可以使用其他数据包剖析器工具(比如Wireshark)检测捕获文件。

长时间捕获数据包时,可以启用文件轮换。tcpdump容许您创建的新文件或以指定的时间间隔或固定大小旋转轮询文件。以下命令将创建多达十个200MB文件,分别称为file.pcap0,file.pcap1,依这种推:在覆盖旧文件之前。

$sudotcpdump-n-W5-C200-w/tmp/file.pcap

生成5个文件后,较旧的文件将被覆盖。

请注意,您仅应在排除故障期间运行tcpdump。

假如要在特定时间启动tcpdump,则可以使用cronjob。tcpdump没有在指定时间后退出的选项。您可以在一段时间后使用timeout命令停止tcpdump。比如,要在1分钟后退出linux修改文件名,您可以使用:

$sudotimeout60tcpdump-n-wdata.pcap

总结

tcpdump是用于剖析和解决网路相关问题的命令行工具。

本文向您介绍了tcpdump用法和句型的基础。有关更深入的文档,请访问tcpdump网站。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复