技术兄弟们，大家好，在这篇文章中我们将介绍如何在 Ubuntu 22.04 中安装和使用 Wireshark。Wireshark 是自由开源的、跨平台的、基于 GUI 的网络数据包分析器，可用于 Linux、Windows、MacOS、Solaris 等。它实时捕获网络数据包并以人类可读的格式呈现它们。它使我们能够监控微观层面的网络数据包。它还有一个名为 tshark 的命令行程序，它执行与 Wireshark 相同的功能，但通过终端而不是通过 GUI。Wireshark 可用于网络故障排除、分析、软件和通信协议开发，也可用于教育目的。Wireshark 使用名为 pcap 的库来捕获网络数据包。Wireshark 的功能支持检查数百种协议能够实时捕获数据包并保存它们以供以后离线分析一些用于分析数据的过滤器捕获的数据可以动态压缩和解压缩支持多种数据分析文件格式，输出也可以保存为 XML、CSV、纯文本格式可以从以太网、WiFi、蓝牙、USB、帧中继、令牌环等多种接口捕获数据先决条件预装 Ubuntu 22.04具有 sudo 权限的本地用户互联网连接Wireshark 安装步骤从 Ubuntu 仓库安装Wireshark 包可在默认的 Ubuntu 仓库中找到，并且可以使用以下命令简单地安装。但你可能无法获得最新版本的 wireshark。$ sudo apt update $ sudo apt install wireshark 选择 “Yes” 允许非超级用户使用 Wireshark 捕获数据包：安装成功后，访问 Wireshare UI。从“ 活动 Activities ”中搜索 “wireshark”，然后单击其图标。以上确认你的 Wireshark 安装已成功完成。安装最新的版本如果要安装最新版本的 Wireshark，我们必须使用以下 apt 命令启用官方 Wireshark 仓库：$ sudo add-apt-repository ppa:wireshark-dev/stable $ sudo apt update 现在，安装最新版本的 Wireshark，运行：$ sudo apt install wireshark -y 安装 Wireshark 后，验证其版本：$ wireshark --version 要允许普通用户使用 Wireshark 使用和捕获数据包，请运行以下命令：$ sudo dpkg-reconfigure wireshark-common 选择 “Yes” 并按回车键。使用 usermod 命令将本地用户添加到 wireshark 组:$ sudo usermod -aG wireshark $USER $ newgrp wireshark 要使上述更改生效，请重新启动系统。$ sudo reboot 使用 Wireshark 捕获数据包启动 Wireshark，从“活动”->搜索 “wireshark”。单击 Wireshark 图标，所有这些都是我们可以捕获网络数据包的接口。根据你系统上的界面，此页面可能会有所不同。我们选择 “enp0s3” 来捕获该接口的网络流量。选择接口后，我们网络上所有设备的网络数据包开始填充（请参阅下面的截图）：第一次看到此页面时，我们可能会被此屏幕中显示的数据淹没，并且可能会想到如何整理这些数据，但不用担心，Wireshark 的最佳功能之一就是它的过滤器。我们可以根据 IP 地址、端口号对数据进行排序/过滤，还可以使用源和目标过滤器、数据包大小等，还可以将 2 个或更多过滤器组合在一起以创建更全面的搜索。我们可以在“ 应用显示过滤器 Apply a Display Filter ”选项卡中编写过滤器，也可以选择已创建的规则之一。要选择预建过滤器，请单击“旗帜”图标，然后点击“应用显示过滤器”选项卡。我们还可以根据颜色代码来过滤数据，默认情况下，浅紫色是 TCP 流量，浅蓝色是 UDP 流量，黑色标识有错误的数据包，要查看这些代码的含义，请单击“ 查看 View ”->“ 颜色规则 Coloring Rules ”，我们也可以更改这些代码。获得所需的结果后，我们可以单击任何捕获的数据包以获取有关该数据包的更多详细信息，这将显示有关该网络数据包的所有数据。要停止捕获数据包，请单击红色停止按钮，然后将捕获的数据包保存到文件中。总结Wireshark 是一款非常强大的工具，需要一些时间来适应和掌握它，这篇文章将帮助你开始使用。请随时在下面的评论栏中提出你的疑问或建议。（题图：MJ/63c09e75-a3e7-4dbf-ac6f-0233bdd34ad8）via: https://www.linuxtechi.com/install-use-wireshark-ubuntu/作者：Pradeep Kumar 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
tcpdump 是一款灵活、功能强大的抓包工具，能有效地帮助排查网络故障问题。以我作为管理员的经验，在网络连接中经常遇到十分难以排查的故障问题。对于这类情况，tcpdump 便能派上用场。tcpdump 是一个命令行实用工具，允许你抓取和分析经过系统的流量数据包。它通常被用作于网络故障分析工具以及安全工具。tcpdump 是一款强大的工具，支持多种选项和过滤规则，适用场景十分广泛。由于它是命令行工具，因此适用于在远程服务器或者没有图形界面的设备中收集数据包以便于事后分析。它可以在后台启动，也可以用 cron 等定时工具创建定时任务启用它。本文中，我们将讨论 tcpdump 最常用的一些功能。1、在 Linux 中安装 tcpdumptcpdump 支持多种 Linux 发行版，所以你的系统中很有可能已经安装了它。用下面的命令检查一下是否已经安装了 tcpdump：$ which tcpdump /usr/sbin/tcpdump如果还没有安装 tcpdump，你可以用软件包管理器安装它。 例如，在 CentOS 或者 Red Hat Enterprise 系统中，用如下命令安装 tcpdump：$ sudo yum install -y tcpdumptcpdump 依赖于 libpcap，该库文件用于捕获网络数据包。如果该库文件也没有安装，系统会根据依赖关系自动安装它。现在你可以开始抓包了。2、用 tcpdump 抓包使用 tcpdump 抓包，需要管理员权限，因此下面的示例中绝大多数命令都是以 sudo 开头。首先，先用 tcpdump -D 命令列出可以抓包的网络接口：$ sudo tcpdump -D 1.eth0 2.virbr0 3.eth1 4.any (Pseudo-device that captures on all interfaces) 5.lo [Loopback]如上所示，可以看到我的机器中所有可以抓包的网络接口。其中特殊接口 any 可用于抓取所有活动的网络接口的数据包。我们就用如下命令先对 any 接口进行抓包：$ sudo tcpdump -i any 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 09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196 09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0 09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43) 09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102) 09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44) 09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103) 09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44) 09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388 09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0 09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103) 09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45) 09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65) 09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060 ---- SKIPPING LONG OUTPUT ----- 09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0 ^C 9003 packets captured 9010 packets received by filter 7 packets dropped by kernel $tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。正如上面示例所示，tcpdump 抓取了超过 9000 个数据包。在这个示例中，由于我是通过 ssh 连接到服务器，所以 tcpdump 也捕获了所有这类数据包。-c 选项可以用于限制 tcpdump 抓包的数量：$ sudo 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 11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196 11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0 11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43) 11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43) 11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44) 5 packets captured 12 packets received by filter 0 packets dropped by kernel $如上所示，tcpdump 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用 —— 比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包（如下所示）时，-c 的作用就十分突出了。在上面示例中，tcpdump 默认是将 IP 地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中，使用 IP 地址和端口号更便于分析问题；用 -n 选项显示 IP 地址，-nn 选项显示端口号：$ sudo tcpdump -i any -c5 -nn 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 23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196 23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0 23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372 23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0 23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340 5 packets captured 6 packets received by filter 0 packets dropped by kernel如上所示，抓取的数据包中显示 IP 地址和端口号。这样还可以阻止 tcpdump 发出 DNS 查找，有助于在网络故障排查中减少数据流量。现在你已经会抓包了，让我们来分析一下这些抓包输出的含义吧。3、理解抓取的报文tcpdump 能够抓取并解码多种协议类型的数据报文，如 TCP、UDP、ICMP 等等。虽然这里我们不可能介绍所有的数据报文类型，但可以分析下 TCP 类型的数据报文，来帮助你入门。更多有关 tcpdump 的详细介绍可以参考其 帮助手册。tcpdump 抓取的 TCP 报文看起来如下：08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372具体的字段根据不同的报文类型会有不同，但上面这个例子是一般的格式形式。第一个字段 08:41:13.729687 是该数据报文被抓取的系统本地时间戳。然后，IP 是网络层协议类型，这里是 IPv4，如果是 IPv6 协议，该字段值是 IP6。192.168.64.28.22 是源 ip 地址和端口号，紧跟其后的是目的 ip 地址和其端口号，这里是 192.168.64.1.41916。在源 IP 和目的 IP 之后，可以看到是 TCP 报文标记段 Flags [P.]。该字段通常取值如下：值标志类型描述SSYNConnection StartFFINConnection FinishPPUSHData pushRRSTConnection reset.ACKAcknowledgment该字段也可以是这些值的组合，例如 [S.] 代表 SYN-ACK 数据包。接下来是该数据包中数据的序列号。对于抓取的第一个数据包，该字段值是一个绝对数字，后续包使用相对数值，以便更容易查询跟踪。例如此处 seq 196:568 代表该数据包包含该数据流的第 196 到 568 字节。接下来是 ack 值：ack 1。该数据包是数据发送方，ack 值为 1。在数据接收方，该字段代表数据流上的下一个预期字节数据，例如，该数据流中下一个数据包的 ack 值应该是 568。接下来字段是接收窗口大小 win 309，它表示接收缓冲区中可用的字节数，后跟 TCP 选项如 MSS（最大段大小）或者窗口比例值。更详尽的 TCP 协议内容请参考 Transmission Control Protocol(TCP) Parameters。最后，length 372 代表数据包有效载荷字节长度。这个长度和 seq 序列号中字节数值长度是不一样的。现在让我们学习如何过滤数据报文以便更容易的分析定位问题。4、过滤数据包正如上面所提，tcpdump 可以抓取很多种类型的数据报文，其中很多可能和我们需要查找的问题并没有关系。举个例子，假设你正在定位一个与 web 服务器连接的网络问题，就不必关系 SSH 数据报文，因此在抓包结果中过滤掉 SSH 报文可能更便于你分析问题。tcpdump 有很多参数选项可以设置数据包过滤规则，例如根据源 IP 以及目的 IP 地址，端口号，协议等等规则来过滤数据包。下面就介绍一些最常用的过滤方法。协议在命令中指定协议便可以按照协议类型来筛选数据包。比方说用如下命令只要抓取 ICMP 报文：$ sudo tcpdump -i any -c5 icmp 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然后再打开一个终端，去 ping 另一台机器：$ ping opensource.com PING opensource.com (54.204.39.132) 56(84) bytes of data. 64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms回到运行 tcpdump 命令的终端中，可以看到它筛选出了 ICMP 报文。这里 tcpdump 并没有显示有关 opensource.com 的域名解析数据包：09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64 09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64 09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64 09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64 09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64 5 packets captured 5 packets received by filter 0 packets dropped by kernel主机用 host 参数只抓取和特定主机相关的数据包：$ sudo tcpdump -i any -c5 -nn host 54.204.39.132 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 09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0 09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0 09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0 09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1 09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0 5 packets captured 5 packets received by filter 0 packets dropped by kernel如上所示，只抓取和显示与 54.204.39.132 有关的数据包。端口号tcpdump 可以根据服务类型或者端口号来筛选数据包。例如，抓取和 HTTP 服务相关的数据包：$ sudo tcpdump -i any -c5 -nn port 80 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 09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0 09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0 09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0 09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1 09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0 5 packets captured 5 packets received by filter 0 packets dropped by kernelIP 地址/主机名同样，你也可以根据源 IP 地址或者目的 IP 地址或者主机名来筛选数据包。例如抓取源 IP 地址为 192.168.122.98 的数据包：$ sudo tcpdump -i any -c5 -nn src 192.168.122.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 10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32) 10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32) 10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0 10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0 10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1 5 packets captured 5 packets received by filter 0 packets dropped by kernel注意此处示例中抓取了来自源 IP 地址 192.168.122.98 的 53 端口以及 80 端口的数据包，它们的应答包没有显示出来因为那些包的源 IP 地址已经变了。相对的，使用 dst 就是按目的 IP/主机名来筛选数据包。$ sudo tcpdump -i any -c5 -nn dst 192.168.122.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 10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48) 10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32) 10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0 10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0 10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found 5 packets captured 5 packets received by filter 0 packets dropped by kernel多条件筛选当然，可以使用多条件组合来筛选数据包，使用 and 以及 or 逻辑操作符来创建过滤规则。例如，筛选来自源 IP 地址 192.168.122.98 的 HTTP 数据包：$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80 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 10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0 10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0 10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1 10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0 10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0 5 packets captured 5 packets received by filter 0 packets dropped by kernel你也可以使用括号来创建更为复杂的过滤规则，但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式：$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)" 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 10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0 10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0 10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0 10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1 10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0 5 packets captured 5 packets received by filter 0 packets dropped by kernel该例子中我们只抓取了来自源 IP 为 192.168.122.98 或者 54.204.39.132 的 HTTP （端口号80）的数据包。使用该方法就很容易抓取到数据流中交互双方的数据包了。5、检查数据包内容在以上的示例中，我们只按数据包头部的信息来建立规则筛选数据包，例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题，可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。tcpdump 提供了两个选项可以查看数据包内容，-X 以十六进制打印出数据报文内容，-A 打印数据报文的 ASCII 值。例如，HTTP 请求报文内容如下：$ sudo tcpdump -i any -c10 -nn -A port 80 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 13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0 E..<..@.@.....zb6.'....P...@......r............ ............................ 13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0 E..<..@./..a6.'...zb.P..o..&...A..q a.......... .R.W....... ................ 13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0 E..4..@.@.....zb6.'....P...Ao..'........... .....R.W................ 13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1 E.....@.@..1..zb6.'....P...Ao..'........... .....R.WGET / HTTP/1.1 User-Agent: Wget/1.14 (linux-gnu) Accept: */* Host: opensource.com Connection: Keep-Alive ................ 13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0 E..4.F@./.."6.'...zb.P..o..'.......9.2..... .R.a.................... 13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found E....G@./...6.'...zb.P..o..'.......9....... .R.b....HTTP/1.1 302 Found Server: nginx Date: Sun, 23 Sep 2018 17:02:14 GMT Content-Type: text/html; charset=iso-8859-1 Content-Length: 207 X-Content-Type-Options: nosniff Location: https://opensource.com/ Cache-Control: max-age=1209600 Expires: Sun, 07 Oct 2018 17:02:14 GMT X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d X-Varnish: 632951979 Age: 0 Via: 1.1 varnish (Varnish/5.2) X-Cache: MISS Connection: keep-alive 302 Found Found The document has moved here. ................ 13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0 E..4..@.@.....zb6.'....P....o.............. .....R.b................ 13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0 E..4..@.@.....zb6.'....P....o.............. .....R.b................ 13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0 E..4.H@./.. 6.'...zb.P..o..........9.I..... .R...................... 13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0 E..4..@.@.....zb6.'....P....o.............. .....R.................. 10 packets captured 10 packets received by filter 0 packets dropped by kernel这对定位一些普通 HTTP 调用 API 接口的问题很有用。当然如果是加密报文，这个输出也就没多大用了。6、保存抓包数据tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如，你可以夜里让它在那里抓包，然后早上起来再去分析它。同样当有很多数据包时，显示过快也不利于分析，将数据包保存下来，更有利于分析问题。使用 -w 选项来保存数据包而不是在屏幕上显示出抓取的数据包：$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80 [sudo] password for ricardo: tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10 packets captured 10 packets received by filter 0 packets dropped by kernel该命令将抓取的数据包保存到文件 webserver.pcap。后缀名 pcap 表示文件是抓取的数据包格式。正如示例中所示，保存数据包到文件中时屏幕上就没有任何有关数据报文的输出，其中 -c10 表示抓取到 10 个数据包后就停止抓包。如果想有一些反馈来提示确实抓取到了数据包，可以使用 -v 选项。tcpdump 将数据包保存在二进制文件中，所以不能简单的用文本编辑器去打开它。使用 -r 选项参数来阅读该文件中的报文内容：$ tcpdump -nn -r webserver.pcap reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked) 13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0 13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0 13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0 13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1 13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0 13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found 13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0 13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0 13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0 13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0 $这里不需要管理员权限 sudo 了，因为此刻并不是在网络接口处抓包。你还可以使用我们讨论过的任何过滤规则来过滤文件中的内容，就像使用实时数据一样。 例如，通过执行以下命令从源 IP 地址 54.204.39.132 检查文件中的数据包：$ tcpdump -nn -r webserver.pcap src 54.204.39.132 reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked) 13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0 13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0 13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found 13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0下一步做什么？以上的基本功能已经可以帮助你使用强大的 tcpdump 抓包工具了。更多的内容请参考 tcpdump 网站 以及它的 帮助文件。tcpdump 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 Wireshark。Wireshark 还可以用来读取 tcpdump 保存的 pcap 文件。你可以使用 tcpdump 命令行在没有 GUI 界面的远程机器上抓包然后在 Wireshark 中分析数据包。via: https://opensource.com/article/18/10/introduction-tcpdump作者：Ricardo Gerardi 选题：lujun9972 译者：jrg 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 上使用 tcpdump 命令捕获和分析数据包
tcpdump 是一个很常用的网络包分析工具，可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报，这个库在几乎在所有的 Linux/Unix 中都有。tcpdump 可以从网卡或之前创建的数据包文件中读取内容，也可以将包写入文件中以供后续使用。必须是 root 用户或者使用 sudo 特权来运行 tcpdump。在本文中，我们将会通过一些实例来演示如何使用 tcpdump 命令，但首先让我们来看看在各种 Linux 操作系统中是如何安装 tcpdump 的。推荐阅读：使用 iftop 命令监控网络带宽安装tcpdump 默认在几乎所有的 Linux 发行版中都可用，但若你的 Linux 上没有的话，使用下面方法进行安装。CentOS/RHEL使用下面命令在 CentOS 和 RHEL 上安装 tcpdump，$ sudo yum install tcpdump* Fedora使用下面命令在 Fedora 上安装 tcpdump：$ dnf install tcpdump Ubuntu/Debian/Linux Mint在 Ubuntu/Debain/Linux Mint 上使用下面命令安装 tcpdump：$ apt-get install tcpdump 安装好 tcpdump 后，现在来看一些例子。案例演示从所有网卡中捕获数据包运行下面命令来从所有网卡中捕获数据包：$ tcpdump -i any 从指定网卡中捕获数据包要从指定网卡中捕获数据包，运行：$ tcpdump -i eth0 将捕获的包写入文件使用 -w 选项将所有捕获的包写入文件：$ tcpdump -i eth1 -w packets_file 读取之前产生的 tcpdump 文件使用下面命令从之前创建的 tcpdump 文件中读取内容：$ tcpdump -r packets_file 获取更多的包信息，并且以可读的形式显示时间戳要获取更多的包信息同时以可读的形式显示时间戳，使用：$ tcpdump -ttttnnvvS 查看整个网络的数据包要获取整个网络的数据包，在终端执行下面命令：$ tcpdump net 192.168.1.0/24 根据 IP 地址查看报文要获取指定 IP 的数据包，不管是作为源地址还是目的地址，使用下面命令：$ tcpdump host 192.168.1.100 要指定 IP 地址是源地址或是目的地址则使用：$ tcpdump src 192.168.1.100 $ tcpdump dst 192.168.1.100 查看某个协议或端口号的数据包要查看某个协议的数据包，运行下面命令：$ tcpdump ssh 要捕获某个端口或一个范围的数据包，使用：$ tcpdump port 22 $ tcpdump portrange 22-125 我们也可以与 src 和 dst 选项连用来捕获指定源端口或指定目的端口的报文。我们还可以使用“与” （and，&&）、“或” （or，|| ) 和“非”（not，!） 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。使用“与”可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如：$ tcpdump src 192.168.1.100 && port 22 -w ssh_packets 使用“或”“或”会检查是否匹配命令所列条件中的其中一条，像这样：$ tcpdump src 192.168.1.100 or dst 192.168.1.50 && port 22 -w ssh_packets $ tcpdump port 443 or 80 -w http_packets 使用“非”当我们想表达不匹配某项条件时可以使用“非”，像这样：$ tcpdump -i eth0 src port not 22 这会捕获 eth0 上除了 22 号端口的所有通讯。我们的教程至此就结束了，在本教程中我们讲解了如何安装并使用 tcpdump 来捕获网络数据包。如有任何疑问或建议，欢迎留言。via: http://linuxtechlab.com/learn-use-tcpdump-command-examples/作者：Shusain 译者：lujun9972 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
当你需要追踪某个进程产生和接收的系统调用时，首先浮现在你脑海中的是什么？你可能会想到strace，那么你是对的。你会使用什么样的命令行工具来监控原始网络通信呢？如果你想到了tcpdump，你又作出了一个极佳的选择。而如果你碰到必须追踪打开的文件（在Unix意义上：一切皆文件）的需求，可能你会使用lsof。strace、tcpdump以及lsof，确实是些伟大的工具，它们应该成为每个系统管理员工具集之中的一部分，而这也正是你为什么应该爱上sysdig的原因。它是一个强大的开源工具，用于系统级别的勘察和排障，它的创建者在介绍它时称之为“strace+tcpdump+lsof+上面点缀着lua樱桃的绝妙酱汁”。抛开幽默不说，sysdig的最棒特性之一在于，它不仅能分析Linux系统的“现场”状态，也能将该状态保存为转储文件以供离线检查。更重要的是，你可以自定义sysdig的行为，或者甚至通过内建的（你也可以自己编写）名为凿子（chisel）的小脚本增强其功能。单独的凿子可以以脚本指定的各种风格分析sysdig捕获的事件流。在本教程中，我们将探索sysdig的安装及其基本用法，在Linux上实施系统监控和排障。安装Sysdig对于本教程，由于为了简便、缩短安装流程以及版本的不可知，我们将选择使用官方网站提供的自动化安装过程。在自动化过程中，安装脚本会自动检测操作系统并安装必需的依赖包。以root身份运行以下命令来从官方apt/yum仓库安装sysdig：# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash 安装完成后，我们可以通过以下方法调用sysdig来感受一下它：# sysdig 我们的屏幕将马上被系统上发生的所有事件填满，对于这些信息，不便于我们做更多操作。要进一步处理，我们可以运行：# sysdig -cl | less 来查看可用的凿子列表。默认有以下类目可用，各个类目中分布有多个内建的凿子。CPU Usage：CPU使用量Errors：错误I/OLogs：日志Misc：混杂Net：网络Performance：性能Security：安全System State：系统状态要显示指定凿子上的信息（包括详细的命令行用法），运行以下命令：# sysdig -cl [凿子名称] 例如，我们可以检查“网络”类目下关于spy\_port凿子的信息：# sysdig -i spy_port 凿子可以通过过滤器（可同时应用于实时数据和记录文件）组合，以获取更多有用的输出。过滤器遵从“类.字段”结构。例如：fd.cip：客户端IP地址。evt.dir：事件方向，可以是‘>’用于进入事件，或‘<’用于退出事件。完整的过滤器列表可以通过以下命令显示：# sysdig -l 在本教程剩余部分，我将演示几个sysdig的使用案例。Sysdig实例： 服务器性能排障假定你的服务器发生了性能问题（如，没有回应，或者重大的回应延迟）。你可以使用瓶颈凿子来显示当前10个最慢系统调用的列表。使用以下命令在存活服务器上进行实时检查。“-c”标识，后跟凿子名称告诉sysdig运行指定的凿子。# sysdig -c bottlenecks 或者，你可以离线对服务器实施性能分析。在此种情况下，你可以保存完整的sysdig记录到文件，然后像下面这样针对记录运行瓶颈凿子。首先，保存sysdige记录（使用Ctrl+c来停止收集）：# sysdig -w trace.scap 收集完记录后，你可以运行以下命令来检查捕获间隔中最慢的系统调用：# sysdig -r trace.scap -c bottlenecks 你需要关注栏#2，#3和#4，这些分别表示执行时间、进程名和PID。Sysdig实例： 监控交互用户活动假定你作为系统管理员想要监控系统中交互的用户活动（如，用户在命令行输入了什么命令，以及用户去了什么目录），这时spy\_user凿子就派上用场了。让我们首先通过一些额外选项来收集一个sysdig记录。# sysdig -s 4096 -z -w /mnt/sysdig/$(hostname).scap.gz “-s 4096”告诉sysdig每个事件捕获4096字节。“-z” （与“-w”一起使用）为记录文件启用压缩。“-w ”保存sysdig记录到指定的文件。在上面的例子中，我们自定义了基于每个主机的压缩的记录文件的名称。记住，你可以在任何时候按下Ctrl+c来打断sysdig的执行。在我们收集到了合理数量的数据后，我们可以通过运行以下命令来查看每个用户的交互活动：# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users 上面输出的第一栏表示与指定用户的活动相关进程的PID。如果你想要定位一个指定的用户，以及只监控该用户的活动又怎么样呢？你可以通过用户名对spy\_users凿子的结果进行过滤：# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users "user.name=xmodulo" Sysdig实例： 监控文件I/O我们可以使用“-p”标识来自定义sysdig记录的输出格式，并指定双引号括起来的想要的字段（如用户名、进程名，以及文件或套接口名称）。在本例中，我们将创建一个记录文件，该文件将只包含在家目录中的写入事件（我们今后可以使用“sysdig -r writetrace.scap.gz”来检测该文件）。# sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz Sysdig实例： 监控网络I/O作为服务器排障的一部分，你可能想要监听网络通信，此工作通常由tcpdump做。对于sysdig，可以很容易进行通信嗅探，其风格更为对用户友好。例如，你可以检查由特定IP地址，特定进程（如apache2）提供的数据（ASCII编码格式）：# sysdig -s 4096 -A -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2 如果你想要监控原生数据传输（二进制格式），请把“-A”替换为“-X”：# sysdig -s 4096 -X -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2 要获取更多信息、实例以及案例分析，你可以查阅项目网站。相信我，会有着无限可能，但请不要仅仅局限于我所写的这些。安装sysdig，请从今天开始深入挖掘吧！via: http://xmodulo.com/monitor-troubleshoot-linux-server-sysdig.html作者：Gabriel Cánepa 译者：GOLinux 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
假设由于某种原因，你需要嗅探HTTP站点的流量（如HTTP请求与响应）。举个例子，你可能在测试一个web服务器的实验性功能，或者你在为某个web应用或RESTful服务排错，又或者你正在为PAC(proxy auto config)排错或寻找某个站点下载的恶意软件。不论什么原因，在这些情况下，进行HTTP流量嗅探对于系统管理、开发者、甚至最终用户来说都是很有帮助的。数据包嗅工具tcpdump被广泛用于实时数据包的导出，但是你需要设置过滤规则来捕获HTTP流量，甚至它的原始输出通常不能方便的停在HTTP协议层。实时web服务器日志解析器如ngxtop可以提供可读的实时web流量跟踪痕迹，但这仅适用于可完全访问live web服务器日志的情况。要是有一个仅用于抓取HTTP流量的类似tcpdump的数据包嗅探工具就非常好了。事实上，httpry就是:HTTP包嗅探工具。httpry捕获HTTP数据包，并且将HTTP协议层的数据内容以可读形式列举出来。通过这篇指文章，让我们了解如何使用httpry工具嗅探HTTP流量。在Linux上安装httpry基于Debian系统（Ubuntu 或 LinuxMint），基础仓库中没有httpry安装包(译者注：本人ubuntu14.04,仓库中已有包，可直接安装)。所以我们需要通过源码安装:$ sudo apt-get install gcc make git libpcap0.8-dev $ git clone https://github.com/jbittel/httpry.git $ cd httpry $ make $ sudo make install 在Fedora，CentOS 或 RHEL系统，可以使用如下yum命令安装httpry。在CentOS/RHEL系统上，运行yum之前使其能够访问EPEL repo。$ sudo yum install httpry 如果你仍想通过基于RPM系统的源码来安装httpry的话，你可以通过这几个步骤实现：$ sudo yum install gcc make git libpcap-devel $ git clone https://github.com/jbittel/httpry.git $ cd httpry $ make $ sudo make install httpry的基本用法以下是httpry的基本用法$ sudo httpry -i <network-interface> httpry就会监听指定的网络接口，并且实时的显示捕获到的HTTP请求/相应。在大多数情况下，由于发送与接到的数据包过多导致刷屏很快，难以分析。这时候你肯定想将捕获到的数据包保存下来以便离线分析。可以使用'b'或'-o'选项保存数据包。'-b'选项将数据包以二进制文件的形式保存下来，这样可以使用httpry软件打开文件以浏览。另一方面，'-o'选项将数据以可读的字符文件形式保存下来。以二进制形式保存文件：$ sudo httpry -i eth0 -b output.dump 浏览所保存的HTTP数据包文件：$ httpry -r output.dump 注意，不需要根用户权限就可以使用'-r'选项读取数据文件。将httpry数据以字符文件保存：$ sudo httpry -i eth0 -o output.txt httpry 的高级应用如果你想监视指定的HTTP方法（如：GET，POST，PUT，HEAD，CONNECT等），使用'-m'选项：$ sudo httpry -i eth0 -m get,head 如果你下载了httpry的源码，你会发现源码下有一些Perl脚本，这些脚本用于分析httpry输出。脚本位于目录httpry/scripts/plugins。如果你想写一个定制的httpry输出分析器，则这些脚可以作为很好的例子。其中一些有如下的功能：hostnames: 显示唯一主机名列表。find\_proxies: 探测web代理。search\_terms: 查找及统计在搜索服务里面的搜索词。content\_analysis: 查找含有指定关键的URL。xml\_output: 将输出转换为XML形式。log\_summary: 生成日志汇总。db\_dump: 将日志文件数据保存数据库。在使用这些脚本之前，首先使用'-o'选项运行httpry。当获取到输出文件后，立即使用如下命令执行脚本：$ cd httpry/scripts $ perl parse_log.pl -d ./plugins <httpry-output-file> 你可能在使用插件的时候遇到警告。比如，如果你没有安装带有DBI接口的MySQL数据库，那么使用db\_dump插件时可能会失败。如果一个插件初始化失败的话，那么只是这个插件不能使用，所以你可以忽略那些警告。当parse\_log.pl完成后，你将在httpry/scripts 目录下看到数个分析结果。例如，log\_summary.txt 与如下内容类似。总的来说，当你要分析HTTP数据包的时候，httpry非常有用。它可能并不被大多Linux使用者所熟知，但会用总是有好处的。你觉得这个工具怎么样呢？via: http://xmodulo.com/2014/08/sniff-http-traffic-command-line-linux.html作者：Dan Nanni 译者：DoubleC 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
Linux有问必答：如何使用tcpdump来捕获TCP SYN，ACK和FIN包
问题：我想要监控TCP连接活动（如，建立连接的三次握手，以及断开连接的四次握手）。要完成此事，我只需要捕获TCP控制包，如SYN，ACK或FIN标记相关的包。我怎样使用tcpdump来仅仅捕获TCP SYN，ACK和/或FYN包？作为业界标准的捕获工具，tcpdump提供了强大而又灵活的包过滤功能。作为tcpdump基础的libpcap包捕获引擎支持标准的包过滤规则，如基于5重包头的过滤（如基于源/目的IP地址/端口和IP协议类型）。tcpdump/libpcap的包过滤规则也支持更多通用分组表达式，在这些表达式中，包中的任意字节范围都可以使用关系或二进制操作符进行检查。对于字节范围表达，你可以使用以下格式：proto [ expr : size ] “proto”可以是熟知的协议之一（如ip，arp，tcp，udp，icmp，ipv6），“expr”表示与指定的协议头开头相关的字节偏移量。有我们熟知的直接偏移量如tcpflags，也有取值常量如tcp-syn，tcp-ack或者tcp-fin。“size”是可选的，表示从字节偏移量开始检查的字节数量。使用这种格式，你可以像下面这样过滤TCP SYN，ACK或FIN包。只捕获TCP SYN包： # tcpdump -i <interface> "tcp[tcpflags] & (tcp-syn) != 0" 只捕获TCP ACK包：# tcpdump -i <interface> "tcp[tcpflags] & (tcp-ack) != 0" 只捕获TCP FIN包：# tcpdump -i <interface> "tcp[tcpflags] & (tcp-fin) != 0" 之捕获TCP SYN或ACK包： # tcpdump -r <interface> "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" via: http://ask.xmodulo.com/capture-tcp-syn-ack-fin-packets-tcpdump.html译者：GOLinux 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出