【问题标题】:How does changing a network interface's MAC address with ifconfig affect a NIC that isn't in promiscuous mode?使用 ifconfig 更改网络接口的 MAC 地址如何影响未处于混杂模式的 NIC?
【发布时间】:2014-08-01 20:03:56
【问题描述】:

更改网络接口的 MAC 地址(ifconfig eth2 hw ether BB:BB:BB:BB:BB:BB)如何影响未处于混杂模式的 NIC?

当我使用 ifconfig 更改我的网卡的 MAC 时,它会在重新启动后恢复为原始 MAC。 据我了解,这意味着网卡将其原始MAC保存在自己的非易失性存储器中,Linux每次启动时都会读取这个原始MAC。 这一定意味着 ifconfig 不会更改保存在 NIC 自己的非易失性内存中的 MAC 值。此值保持不变。

尽管如此,当我使用 ifconfig 更改 MAC 时,Linux 开始使用这个新 MAC 作为源 MAC 发送以太网帧。

据我所知,未处于所谓“混杂模式”的 NIC 会拒绝其目标 MAC 地址与 NIC 的 MAC 地址不同的所有以太网帧(除非它是广播或多播)。 这意味着 Linux 甚至不会看到这些帧。它们将在到达 CPU 之前被丢弃。 我想 NIC 通过检查以太网帧的目标 MAC 地址与保存在 NIC 自己的非易失性存储器中的 NIC 的 MAC 地址来完成这项工作。

现在出现了一个我不明白的问题。 由于 NIC 使用其内部保存的原始 MAC 来决定是否在将帧传递给 CPU 之前将其丢弃,而 Linux 可能使用完全不同的 MAC 作为传出帧的源 MAC,那么对这些帧的响应如何到达 Linux 呢?

我对这个话题有什么误解?

我将举一个例子来更好地描述我的意思。

NIC 将 AA:AA:AA:AA:AA:AA 作为其原始 MAC 存储在其自己的内部非易失性存储器中。 它不处于混杂模式,因此它可以防止所有不包含 AA:AA:AA:AA:AA:AA 作为目标 MAC 的帧到达 CPU(和 Linux)。 现在有人输入:ifconfig eth2 hw ether BB:BB:BB:BB:BB:BB。 从现在开始,Linux 从此接口发送的传出帧将以 BB:BB:BB:BB:BB:BB 作为源 MAC。 最终,另一台主机将通过发送一个带有 BB:BB:BB:BB:BB:BB 作为目标 MAC 的帧来回复该帧。 这样的帧将到达第一台主机的 NIC。网卡现在会做什么?它将 BB:BB:BB:BB:BB:BB 与 AA:AA:AA:AA:AA:AA (内部存储在 NIC 的 ROM 中)进行比较,并决定不将其传递给 CPU?!?那么框架永远不会到达Linux?

问题在哪里?

【问题讨论】:

  • 这个问题是题外话,因为它与编程无关。
  • 它是关于编程的,因为我试图了解如何以编程方式强制 NIC 接受具有目标 MAC 而非 NIC 原始内置 MAC 的以太网帧,而无需将 NIC 放入混杂模式,并且知道它的内置 MAC 是不可更改的。
  • 不是关于编程的,请阅读 SO FAQ
  • 我读过它,但我不同意。但我不会争论。
  • @PiotrS 这个问题属于 superuser.com。

标签: linux ethernet nic


【解决方案1】:

现代网络接口中的 MAC 地址是保存在芯片配置寄存器中的易失值。这是在初始化之外的芯片操作中使用的唯一值。此值在启动时从非易失性存储器初始化 - 由芯片硬件本身或由驱动程序初始化,具体取决于特定芯片的设计。

非易失性值用于初始化之外的任何内容。它肯定用于过滤掉传入的数据包 - 非易失性内存太慢了。在网络接口运行期间,非易失性存储器处于空闲状态,未被使用。

NIC 的滥交与您的问题无关。只要您分配了一个新的 MAC,它就会生效,无论非易失性存储器的内容是什么,也无论接口是否混杂。

最后,NIC 接口中的非易失性存储器是可选的。在许多移动系统(例如笔记本电脑)上,没有专用于 NIC 的非易失性存储器。 NIC 的 MAC 地址保存在存储其他系统特定非易失性配置数据的非易失性存储器中。这样既省电又省钱。

【讨论】:

  • 感谢您的回答。所以这意味着 NIC 硬件至少包含两个 MAC 值——一个在非易失性内存中,一个在易失性内存中。
  • @PiotrS 是的,但非易失性值可能不存在于与 NIC 硬件相关的任何内容中。它可能在通用非易失性存储中。
  • “它可能在通用非易失性存储中”。但是,据我了解,易失性值必须由驱动程序初始化,而不是由网卡硬件初始化,因为网卡不知道非易失性值。所以这意味着如果没有驱动程序首先初始化其 volatile 值,NIC 将无法正常工作。
  • @PiotrS 当然。这就是为什么在系统启动期间通常由系统固件(有时称为 BIOS)设置易失性值的原因。我忘了提那个细节。系统固件通常充当驱动程序来执行网络启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2011-02-05
  • 1970-01-01
  • 2011-11-03
  • 2014-08-03
相关资源
最近更新 更多