有什么方法可以知道每秒允许通过 iptables 的数据包数量?
答案1
我针对两种可能的情况提供了两个答案:
如果你问如何定义规则来限制每秒的数据包数
使用 iptables 的默认安装,规则是无状态的,这意味着它们不会跟踪接受了多少数据包。要开始跟踪柜台对于通过 iptables 的数据包,我们需要利用它的一个模块或者配额补丁(请参阅此处了解如何设置)。
在这里,我将讨论几个可用于设置每秒数据包限制的“内置”模块。就我们的目的而言,您可以使用limit
和conntrack
模块来定义带宽上限。该过程将包括创建一个新的 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。
这是网站,并附带帮助您入门的说明。