在嵌入式 Linux 上过滤/限制 ARP 数据包的最佳方法

mat*_*att 4 firewall kernel iptables arp netfilter

我在某些网络设备上有一个嵌入式 Linux。因为这个设备非常重要,我必须进行许多网络测试(我有一个单独的设备)。这些测试包括用 ARP 数据包(正常数据包、畸形数据包、不同大小的数据包等)淹没我的设备

我在互联网上阅读了不同的 xx-tables:ebtables、arptables、iptables、nftables 等。我肯定在我的设备上使用 iptables。

  1. 什么 xx 表最适合过滤(限制,而不是丢弃)ARP 数据包?
  2. 我听说了一些关于 /proc/config.gz 文件的信息,它假设包含内核中包含的信息。我检查了未包含的 CONFIG_IP_NF_ARPFILTER。所以 - 为了使用 arptables - 我应该在启用 CONFIG_IP_NF_ARPFILTER 选项的情况下编译内核,对吗?例如 ebtables 也是如此?
  3. 当 iptables 在 OSI 级别 3 上运行时,我读到 ebtables 和 arptables 可在 OSI 级别 2 上运行。所以我认为在级别 2 上过滤任何内容都比在级别 3 上更好(性能?),对吗?
  4. 我在这个网站的某个地方找到了使用 ebtables 过滤 ARP 数据包的答案。ebtables 比 arptables 有什么优势吗?
  5. 额外一个。互联网上了解限制/过滤不同类型数据包和协议的网络流量的最佳来源是什么?

A.B*_*A.B 5

  1. 什么 xx 表最适合过滤(限制,而不是丢弃)ARP 数据包?

    • iptables

      iptables从IP层开始:处理ARP已经来不及了。

    • arptables

      虽然专门用于 ARP,但arptables缺乏必要的匹配和/或目标来限制而不仅仅是丢弃ARP 数据包。它不能用于您的目的。

    • ebtables可以是一个候选(它既可以处理 ARP又可以limit用来不丢弃所有东西)。

      亲:
      - 很容易使用

      con:
      - 它正在以太网桥上工作。这意味着如果您还没有使用桥接器,则必须创建一个桥接器并将您的(可能是唯一的)接口从属于它,以使其完全可用。这需要付出代价,包括配置和可能的一些网络开销(例如:网络接口设置为混杂)。
      - 因为它没有iptables的同伴ipset等价物,所以限制流量是粗糙的。它不能对每个源进行即时计量(因此必须在规则中手动添加此类源 MAC 或 IP)。

    • nft( nftables )

      pro:
      - 这个工具的目标是替换其他工具并避免重复代码,比如复制匹配模块(可以想象arptables也可以收到限制匹配,但这只是这种匹配的第三个实现模块,在ip(6)tables 'xt_limitebtables ' 之后ebt_limit)。因此,它旨在足够通用以在任何层使用相同的功能:它可以在ARP级别限制/计量流量,同时还可以针对每个源而不是全局执行此操作。

      con:
      - 某些功能可能需要最新的内核和工具(例如:meter 需要内核 >= 4.3 和nftables >= 0.8.3)。
      - 因为它的语法更通用,规则可能更难以正确创建。有时文档可能会产生误导(例如:非工作示例)。

    • tc (交通管制)?

      或许可以使用tc来限制 ARP 流量。由于tc功能在网络堆栈的早期工作,它的使用可能会限制资源的使用。但是这个工具也以其复杂性而闻名。即使将它用于入口流量而不是出口流量也需要步骤。我什至没有尝试如何做到这一点。

  2. CONFIG_IP_NF_ARPFILTER

    正如前一点所见,这是没有实际意义的:不能使用arptables。你需要NF_TABLES_ARP,否则BRIDGE_NF_EBTABLES(或者如果tc实际上是候选人,NET_SCHED)。这并不意味着它是唯一的先决条件,您必须验证还需要什么(至少是什么使这些选项可用,以及限制 ARP 所需的各种匹配内核模块)。

  3. 什么层最好?

    我会说使用最具体的层来完成这项工作将是最容易处理的。同时,越早处理,需要的开销越少,但通常处理起来更粗糙、更复杂。我确信这里有很多不同的可能建议。ARP 几乎可以被认为是在第 2 层和第 3 层之间。它在第 2 层实现,但例如等效的 IPv6 的 NDP 在第 3 层实现(使用多播 ICMPv6)。这不是唯一需要考虑的因素。

  4. ebtables 比 arptables 有什么优势吗?

    见第 1 点和第 2 点。

  5. 互联网上了解限制/过滤不同类型数据包和协议的网络流量的最佳来源是什么?

    抱歉,使用带有正确单词的搜索引擎无法找到任何内容。在继续更困难的话题之前,您应该从简单的话题开始。当然,SE 已经是一个信息来源。

以下是 ebtables 和 nftables 的示例


与 ebtables

因此,让我们假设您有一个接口,eth0并希望通过 IP 192.0.2.2/24使用ebtableseth0一旦接口成为桥接端口,将被忽略的 IP 将被忽略。它必须从eth0桥移到桥上。

ip link set eth0 up
ip link add bridge0 type bridge
ip link set bridge0 up
ip link set eth0 master bridge0
ip address add 192.0.2.2/24 dev bridge0
Run Code Online (Sandbox Code Playgroud)

查看ebtables 的ARP 选项以进行进一步过滤。如上所述,ebtables过于粗糙,无法限制每个来源,除非您手动使用其 MAC 或 IP 地址和规则声明每个来源。

限制每秒接受一个 ARP 请求(考虑任何来源)。

ebtables -A INPUT -p ARP --arp-opcode 1 --limit 1/second --limit-burst 2 -j ACCEPT
ebtables -A INPUT -p ARP --arp-opcode 1 -j DROP
Run Code Online (Sandbox Code Playgroud)

还有其他变体,例如创建一个veth对,将 IP 放在一端并将另一端设置为网桥端口,让网桥没有 IP(并使用FORWARD链过滤,说明哪个接口流量来自,而不是INPUT)。


与 nftables

要限制为每秒接受一个 ARP 请求并且每个 MAC 地址即时接受:

nft add table arp filter
nft add chain arp filter input '{ type filter hook input priority 0; policy accept; }'
nft add rule arp filter input arp operation 1 meter per-mac '{ ether saddr limit rate 1/second burst 2 packets }' counter accept
nft add rule arp filter input arp operation 1 counter drop
Run Code Online (Sandbox Code Playgroud)