如何检查 Linux 中网络接口是否处于混杂模式

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何检查 Linux 中的网络接口是否处于混杂模式(promiscuous mode)。混杂模式允许网络接口捕获其接收到的所有网络流量,而不管目标地址是什么,这对于网络监控和分析至关重要。

你将探索三种不同的方法来确定混杂模式的状态:使用 ip link show 命令检查接口标志,使用 tcpdump 命令观察数据包捕获行为,以及检查 /sys/class/net 文件系统中接口的配置。通过完成这些步骤,你将获得在 Linux 环境中验证网络接口配置的实用技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/RemoteAccessandNetworkingGroup -.-> linux/ifconfig("Network Configuring") linux/RemoteAccessandNetworkingGroup -.-> linux/ping("Network Testing") linux/RemoteAccessandNetworkingGroup -.-> linux/ip("IP Managing") linux/PackagesandSoftwaresGroup -.-> linux/curl("URL Data Transferring") linux/PackagesandSoftwaresGroup -.-> linux/apt("Package Handling") subgraph Lab Skills linux/ls -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/cat -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/cd -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/ifconfig -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/ping -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/ip -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/curl -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} linux/apt -.-> lab-558736{{"如何检查 Linux 中网络接口是否处于混杂模式"}} end

在这一步中,你将学习如何使用 ip link show 命令检查网络接口的混杂模式(promiscuous mode)状态。混杂模式是网络接口控制器(Network Interface Controller, NIC)的一种设置,它允许控制器将接收到的所有流量传递给中央处理器(Central Processing Unit, CPU),而不仅仅是专门发送给该控制器的帧。这种模式常用于网络监控和分析。

首先,如果你还没有打开终端,请打开它。你可以通过点击桌面左侧的 Xfce Terminal 图标来打开终端。

现在,让我们使用 ip link show 命令查看你的网络接口状态。输入以下命令并按回车键:

ip link show

你将看到类似以下的输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

找到对应你主网络接口的行,在这个环境中通常名为 eth0。检查尖括号 (<>) 内的标志。如果这些标志中存在 PROMISC,则该接口处于混杂模式。在上面的示例输出中,PROMISC 不存在,这表明 eth0 不处于混杂模式。

ip link show 命令是检查 Linux 中网络接口配置的基本工具。理解其输出,包括各种标志和状态,对于网络故障排除和管理至关重要。

点击 继续 进入下一步。

使用 tcpdump -i 进行验证

在这一步中,你将使用 tcpdump 命令来验证网络接口的混杂模式(promiscuous mode)状态。tcpdump 是一个强大的命令行数据包分析工具,它可以捕获并显示网络上传输或接收的数据包。当接口处于混杂模式时,tcpdump 可以捕获网段上的所有数据包,而不管其目标地址是什么。

首先,你需要安装 tcpdump。使用 sudo apt install 命令,这与你在上一个实验中安装 htop 的方式类似。

sudo apt update
sudo apt install tcpdump -y

-y 标志会在安装过程中自动对所有提示回答“是”。

现在,让我们使用 tcpdump 监听 eth0 接口。我们将使用 -i 选项指定接口,并使用 -n 选项防止进行 DNS 查找,这样可以使输出更简洁。

sudo tcpdump -i eth0 -n

你将看到输出表明 tcpdump 正在监听 eth0

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type ETHERNET (100Mbps), snapshot length 262144 bytes

如果接口处于混杂模式,tcpdump 将捕获它所看到的所有流量。如果接口不处于混杂模式,它将只捕获发往其 MAC 地址的流量或广播/多播流量。

为了生成一些流量,你可以打开另一个终端窗口(或者在当前终端中打开一个新标签页),然后尝试 ping 一个网站,例如:

ping -c 4 google.com

观察 tcpdump 所在终端的输出,你应该会看到正在捕获的数据包。

重要提示: 要停止 tcpdump,在运行 tcpdump 的终端中按 Ctrl + C

虽然 tcpdump 本身在初始输出中不会明确显示“混杂模式”,但它能够捕获并非专门发往该接口的流量,这是确认混杂模式是否启用的一种实用方法。如果你看到与你自己系统通信无关的流量(例如网段上其他设备的 ARP 请求),这就是混杂模式开启的有力迹象。

点击 继续 进入下一步。

/sys/class/net 中检查接口

在这一步中,你将探索 /sys 文件系统,以查找有关网络接口的信息,包括混杂模式(promiscuous mode)状态。/sys 文件系统是 Linux 中的一个虚拟文件系统,它提供了一种与内核和设备驱动程序进行交互的方式,会展示硬件设备及其配置的相关信息。

导航到 /sys 中的网络接口目录。使用 cd 命令更改当前目录:

cd /sys/class/net/

现在,使用 ls 命令列出该目录的内容:

ls

你将看到一个网络接口列表,类似于 ip link show 的输出。你应该会看到 eth0lo

eth0  lo

这里的每个目录都对应一个网络接口。让我们查看 eth0 目录的内容:

cd eth0

现在,列出 eth0 目录中的文件:

ls

你会看到许多包含 eth0 接口信息的文件和目录。我们关注的是指示混杂模式状态的文件。这些信息通常可以在与设备标志或状态相关的文件中找到。

虽然确切的文件名可能会因内核版本略有不同,但通常可以通过检查可能包含标志或状态信息的文件内容来找到这些信息。

让我们尝试读取一个可能指示状态或标志的文件内容。使用 cat 命令显示文件内容。例如,你可以查找名为 flags 或类似名称的文件。

cat flags

cat flags 命令的输出将是一个十六进制数字。这个数字代表各种接口标志的位掩码。要解释这个数字,你通常需要参考内核文档,了解特定标志及其对应的位值。不过,要专门检查混杂模式,在 /sys 中通常有更直接的方法。

/sys 中检查混杂模式更可靠的方法是查找一个明确指示混杂标志计数的文件。这个文件通常名为 flags 或类似名称,正确解读其内容就能知道混杂标志是否已设置。

如果你还没在 /sys/class/net/eth0 目录下,让我们回到该目录:

cd /sys/class/net/eth0

现在,让我们再次检查 flags 文件。flags 文件中的十六进制值代表各种接口状态。虽然直接解读十六进制值需要了解内核标志,但在步骤 1 中 ip link show 输出中 PROMISC 标志的存在是一种更方便用户确认混杂模式的方式。/sys 文件系统提供了像 ip 这样的工具所使用的原始内核数据。

要在 /sys 中直接检查,你通常会查找一个专门指示混杂计数或状态的文件。不过,在这个环境中,使用标准工具确认混杂模式最直接的方法是像步骤 1 中那样使用 ip link show/sys 文件系统提供了底层数据,但如果没有特定的内核文档,解读这些数据会更复杂。

这一步展示了 /sys 文件系统如何提供对设备信息的底层访问。虽然通过 /sys 中的单个文件直接检查混杂模式可能很复杂,但了解这个文件系统对于高级 Linux 系统分析很有价值。

点击 继续 完成此步骤。

总结

在这个实验中,你学习了如何使用 ip link show 命令检查 Linux 中的网络接口是否处于混杂模式(promiscuous mode)。该命令会显示网络接口配置,PROMISC 标志的存在表示接口处于混杂模式。你还开始探索使用 tcpdump 命令,通过捕获网络流量来验证混杂模式状态。