防火墙中的 ARP 缓存以及与端点设备的区别

网络工程 防火墙 ARP
2022-02-13 13:52:28

想象一个设备 A (192.168.32.5/24)。然后两台主机 B 和 C 连接到同一个接口(通过交换机),静态配置了相同的 IP 地址(192.168.32.8/24)。没有花哨的工具/技术来防止两台主机拥有相同的 IP 地址和不同的 MAC 地址。想象一下,那些 B 和 C 以缓慢的速度(每 5 秒)连续 ping A。

如果设备“A”是主机,那么这样的“A”主机将根据收到的数据包更新其 ARP 表,因为终端主机通常不会对到达的数据包进行额外检查,它们只查看 src MAC 地址和 IP 地址和相应地更新 ARP 表。我不想知道某些 ICMP 回显回复是否正确发送到 ICMP 回显请求发送者,我只是感兴趣,我认为会发生什么,看到每次新的回显请求进入时 ARP 表都会更新。

相反,如果设备“A”是防火墙,我所知道的是第一个 ICMP 回显请求将更新 FW 的 ARP 表,而第二个将不做任何事情,这意味着 FW 将保留第一个条目。只有在第一个条目到期时,FW 才准备好接受 src IP 和 MAC 地址不同的 ap 数据包。

我在第二个例子中描述的是防火墙的默认行为吗?如果是,我在哪里可以找到文档?我一直看到防火墙的行为类似于(例如 Cisco,Checkpoints),我总是被告知他们这样做是因为它们是“防火墙”,但我找不到关于它的单一声明,甚至从可能描述防火墙角色的安全文档中也找不到. 现在 Fortinet 似乎没有那样做。我想知道防火墙是否存在“默认”预期行为。

TIA

1个回答

你有一些误解。

没有花哨的工具/技术来防止两台主机拥有相同的 IP 地址和不同的 MAC 地址。

这是您的主机的操作系统要求,没有什么特别或花哨的。请参阅RFC 5227,IPv4 地址冲突检测(注意我强调的内容):

2.1 . 探测地址

在开始使用 IPv4 地址(无论是从手动配置、DHCP 还是其他方式接收)之前,实现此规范的主机必须通过广播 ARP Probe 数据包来测试该地址是否已在使用中。这也适用于以下情况:网络接口从非活动状态转换为活动状态、计算机从睡眠中唤醒、链路状态更改发出以太网电缆已连接的信号时、802.11 无线接口与新基站相关联时,或者当主机主动连接到逻辑链路时发生任何其他连接变化。


如果设备“A”是主机,那么这样的“A”主机将根据收到的数据包更新其 ARP 表,因为终端主机通常不会对到达的数据包进行额外检查,它们只查看 src MAC 地址和 IP 地址和相应地更新 ARP 表。

不,他们没有。只有 ARP 数据包更新 ARP 表。这是 RFC 中的要求,具有 IPv4 (0x0800) 或 IPv6 (0x86DD) 的 EtherType 的帧将发送到相应的 IP 进程,而不是 ARP 进程。只有带有 ARP EtherType (0x0806) 的帧才会发送到 ARP 进程。即使接收到未经请求的 ARP 数据包也不会在 ARP 表中创建条目;这只会更新 ARP 表中的现有条目(请参见下面的伪代码)。


相反,如果设备“A”是防火墙,我所知道的是第一个 ICMP 回显请求将更新 FW 的 ARP 表,而第二个将不做任何事情,这意味着 FW 将保留第一个条目。

不完全是,但更接近。接收 ICMP 回应请求不会更新 ARP 表,但如果 ARP 表还没有目的地并且需要使用 ARP 请求更新它,则发送 ICMP 回应回复可能会。

这个答案是相关的。


RFC 826,以太网地址解析协议具有用于更新 ARP 表的伪代码:

当接收到地址解析数据包时,接收以太网模块将数据包交给地址解析模块,地址解析模块通过类似于以下的算法。否定条件表示处理结束并丢弃数据包。

?Do I have the hardware type in ar$hrd?
Yes: (almost definitely)
  [optionally check the hardware length ar$hln]
  ?Do I speak the protocol in ar$pro?
  Yes:
    [optionally check the protocol length ar$pln]
    Merge_flag := false
    If the pair <protocol type, sender protocol address> is
        already in my translation table, update the sender
        hardware address field of the entry with the new
        information in the packet and set Merge_flag to true.
    ?Am I the target protocol address?
    Yes:
      If Merge_flag is false, add the triplet <protocol type,
          sender protocol address, sender hardware address> to
          the translation table.
      ?Is the opcode ares_op$REQUEST?  (NOW look at the opcode!!)
      Yes:
        Swap hardware and protocol fields, putting the local
            hardware and protocol addresses in the sender fields.
        Set the ar$op field to ares_op$REPLY
        Send the packet to the (new) target hardware address on
            the same hardware on which the request was received.

请注意,在查看操作码之前,<protocol type, sender protocol address, sender hardware address> 三元组已合并到表中。这是基于通信是双向的假设;如果 A 有理由与 B 交谈,那么 B 可能会有理由与 A 交谈。还要注意,如果 <protocol type, sender protocol address> 对已经存在一个条目,那么新的硬件地址将取代旧的一。相关问题为此提供了一些动力。