【问题标题】:Can the Micrel KSZ8995 be coaxed into abiding by RFC 3927, so as not to leak link-local addresses?能否哄骗 Micrel KSZ8995 遵守 RFC 3927,以免泄露链路本地地址?
【发布时间】:2012-11-19 11:41:12
【问题描述】:

我的嵌入式系统使用一个 Micrel KSZ8995M 交换机,连接到两个“内部”设备(内部是指物理上位于同一块板上)和一个 LAN。

设备 1 是运行 Busybox Linux 的 ARMv5 处理器,其 LAN IP 由 DHCP 配置或在eth0 上静态配置,eth0:0 上的链接本地/APIPA 169.254.137.10 地址。

设备 2 是运行 ARTOS 的较小芯片,谁知道还有什么,只有一个链接本地/APIPA 169.254.137.11 地址。

+----------------------------+
| +----------+  +----------+ |
| | Device 1 |  | Device 2 | |
| +-----+----+  +-----+----+ |
|       |             |      |   <-- a "unit"
| +-----+-------------+----+ |
| | Micrel KSZ899M switch  | |
| +-----------+------------+ |
+-------------|--------------+
              |
           +--+--+
           | LAN |
           +  -  +

目的是让设备 1 和设备 2 能够通过 TCP/IP 相互通信,而 LAN(或任何递归连接的网络)上的任何其他设备都无法看到设备 2 或查看数据传输在两个设备之间。

此外,网络上可能存在整个单元的多个实例,并且单元之间的链接本地地址不得冲突。

据我了解,RFC 3927 中定义的链路本地寻址仅用于“内部”通信,在具有链路本地寻址的接口之间分派的数据包不应由交换机或路由器转发。

不幸的是,由于系统作为一个整体连接到 LAN,我看到来自更广泛网络中的多个设备对设备 2 的 ARP 响应,这意味着链接本地 IP 是可见的并且在整个网络中发生冲突.也就是说,Micrel 似乎转发了这些,我看不到任何可以让它停止的配置。

我是否误解了 APIPA 寻址的工作方式?

或者,如果我是正确的,但 Micrel 只是不能正确支持它们,我可以强制它遵守吗?


参考资料:

【问题讨论】:

  • @Kaii:是的!我们必须使用寄存器而不是 CLI 命令,并设法将一组寄存器写入操作放在一起,这些操作对标记的 VLAN 有意义,但无法相当完成。有人意识到此交换机上基于端口的 VLAN 确实允许每个端口位于多个 VLAN 中,所以我们现在就这样做了。稍后我会挖掘配置。

标签: networking tcp-ip link-local


【解决方案1】:

据我了解,RFC 3927 中定义的链路本地寻址仅用于“内部”通信,在具有链路本地寻址的接口之间分派的数据包不应由交换机或路由器转发。

嗯,第 2 层交换机甚至不知道 IP 地址。你的理解是错误的。链路本地地址不得由 路由器 转发,如 RFC 3927 中所定义。(第 3 层网络设备)

ARP 请求是由 switches 转发的。 (二层网络设备)

请参阅数据表中的第一句话,其中指出:

KS8995M 是一款高度集成的二层管理型交换机

请参阅Network SwitchOSI Model,了解有关第 2 层(MAC/以太网)和第 3 层 (TCP/IP) 通信之间区别的更多详细信息。

正如您已经指出的,KSZ8895M 确实以这种方式定义“本地”:

“本地”数据包。基于 DA(目标地址)查找。如果查找表中的目标端口与数据包的来源端口匹配,则数据包被定义为“本地”。

这意味着当此数据包的目标分配给发送数据包的端口时,交换机不会转发数据包(在第 2 层、以太网、MAC 上!)。 “目标地址”在这个问题上是 MAC 地址,而不是 IP 地址。

结论:(已修订)

默认情况下,只要内部交换机物理连接到您的 LAN,连接到交换机的所有设备对外部都是可见的。

为避免这种情况,您必须将Network Segmentsvirtually 物理分开。

但你很幸运,KS8995M 确实支持VLANs - 使用 VLAN 你可以将“内部”网络与外部分开:

  • 将带有“设备 1”的端口添加到“VLAN 1”(专用 VLAN)
  • 仅将带有“设备 2”的端口添加到“VLAN 1”(专用 VLAN)
  • 将带有“设备 1”的端口添加到“VLAN 2”(VLAN 外)
  • 确保具有“外部 LAN”的端口只有“VLAN 2”(外部 VLAN)
  • 确保从所有端口中删除“VLAN 0”(默认 VLAN)。

这样,带有“设备 1”的端口可以与外部 LAN 网段和私有内部 LAN 网段进行通信。 “设备2”与外界虚拟隔离,局域网无法与“设备2”通信。

有关 VLAN 配置,请参阅 CLI 用户指南中的第 6 页。

【讨论】:

  • 哦,呵呵。是的。我错过了坚持第 2 层的交换机。因此,如果我要将每个“单元”隐藏在 [layer-3-aware] 路由器后面,那么我可以隔离 APIPA 流量吗?
  • @LightnessRacesinOrbit 是的。如果您的嵌入式“设备 1”有第二个 NIC,这将是最简单的方法:将 LAN 与“设备 1”的第二个 NIC 连接,并仅将内部交换机用于内部通信(内部交换机没有连接电缆)。
  • 唉,我们不得不求助于链路本地寻址,因为我们只有一个接口可供使用。
  • @LightnessRacesinOrbit 好消息,我浏览了文档。你很幸运 - 请参阅我的编辑。随时询问更多细节。不幸的是,您不能再次为真正的解决方案投票 ;-)
  • 不清楚vlandelport是否支持&lt;vid&gt;为0;我们会试试的
【解决方案2】:

KSZ8895M 数据表(通篇引用 KS8895M,因此我将假设功能等效)在第 24 页上说:

KS8895M不会转发以下数据包:

  • 错误数据包。这些包括帧错误、FCS 错误、对齐错误和非法大小的数据包错误。
  • 802.3x 暂停帧。 KS8895M 将拦截这些数据包并执行相应的操作。
  • “本地”数据包。基于 DA(目标地址)查找。如果查找表中的目标端口与数据包的来源端口匹配,则数据包被定义为“本地”。

这确实表明我认为 Micrel 不遵守 RFC 3927,而是以上面定义的方式定义“本地”。

那么,不,不幸的是,你将无法让它工作。

【讨论】:

  • 看到你自言自语很有趣 :)
  • @Kaii:这种情况发生的频率比我愿意承认的要多;)
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 2017-05-14
  • 2018-08-28
  • 2014-11-12
  • 2010-10-29
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多