是否可以通过 iptables 获取每秒允许的数据包总数?

是否可以通过 iptables 获取每秒允许的数据包总数?

有什么方法可以知道每秒允许通过 iptables 的数据包数量?

答案1

我针对两种可能的情况提供了两个答案:

如果你问如何定义规则来限制每秒的数据包数

使用 iptables 的默认安装,规则是无状态的,这意味着它们不会跟踪接受了多少数据包。要开始跟踪柜台对于通过 iptables 的数据包,我们需要利用它的一个模块或者配额补丁请参阅此处了解如何设置)。

在这里,我将讨论几个可用于设置每秒数据包限制的“内置”模块。就我们的目的而言,您可以使用limitconntrack模块来定义带宽上限。该过程将包括创建一个新的 iptables 链:

$ sudo iptables --flush  # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT

解释:--match选项指定要使用的模块(我们将input在下面指定模块的用途)。

然后,在该链中创建一个新规则。在此示例中,我们的规则每秒匹配的数据包不超过 50 个:

$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --jump ACCEPT

当数据包不被上述规则捕获时,就会发生速率限制,在这种情况下,我们将丢弃这些数据包:

$ sudo iptables --append RATE-LIMIT --jump DROP

这只是使用 iptables “限制”数据包的可能方法之一。有关更多示例和大量精彩解释,请参阅本指南

笔记:Iptables 是一个复杂的程序,需要先熟悉它才能继续执行此类规则。您应该先阅读本指南如果您还不太熟悉 iptables。


如果你问如何简单地查看每秒接受的数据包

获取所需格式的数据包信息(数据包/秒)可能需要使用数据包嗅探器,因为 iptables 本身没有更详细的数据包报告工具(只是对每个数据包进行简单的记录)。两个最常见的 Linux 选项是:

tcpdump

tcpdump程序与许多其他 Linux 数据包嗅探器(包括 Wireshark)一样,使用libpcap库直接在网络接口(您的 NIC)上查找数据包。如果您有兴趣查看每秒的统计数据所有数据包,你可以使用这种快速而肮脏的方法:

sudo tcpdump -i <interface-name> -w my-capture.pcap

如果需要,您可以让此程序运行一段时间,然后打开一个新的终端窗口并恢复正常的网络活动。Ctrl+C需要时,点击停止。这应该会显示一些捕获的统计数据,包括“内核丢弃”的数据包。这些是被 iptables 阻止的数据包。要获取所有数据包(包括丢弃的数据包)的每秒数据包速率,请使用以下命令capinfos

capinfos my-capture.pcap

您将获得几行输出。查找该Average packet rate行。

Wireshark

最后,您可以考虑使用 Wireshark 查看此信息。它比 tcpdump 更复杂,并且有很多可用的过滤器(例如
tcp.analysis.lost_segment 过滤器)可以显示每秒丢失了哪些数据包。请注意,数据包丢失并不总是由防火墙造成的。如果您确信您的网络接口稳定且没有丢失数据包,那么您的数据仍然会基本准确。

要在 Wireshark 中查看数据包统计信息,请单击菜单Statistics,然后选择IO Graph。观看此视频Wireshark 绘图演示


编辑:您提到您正在开发一个 Java 应用,用于在达到每秒数据包数的一定配额时触发某些事件。在这种情况下,您应该使用 Java 的网络库,例如网页开发工具它使用大多数 Linux 数据包嗅探器使用的相同库。来自他们的 github repo:

Pcap4J 是一个用于捕获、制作和发送数据包的 Java 库。Pcap4J 通过 JNA 包装本机数据包捕获库(libpcap、WinPcap 或 Npcap)并为您提供面向 Java 的 API。

这是网站,并附带帮助您入门的说明。

相关内容