我正在用 Go 编写自定义应用程序。我的应用需要在 Linux、macOS 和 Windows 10+ 上运行。
我需要验证远程主机是否如我所想的那样。我试过了arping
,正如预期的那样,它不会跨路由器。如果远程主机不在本地计划中,还有其他方法可以获取其 MAC 地址吗?
我知道 ARP 不会跨路由器。但我希望该信息以某种方式作为其他类型通信的产物提供。
有想法吗?
答案1
MAC 地址是纯粹的第 2 层(链路层)属性。当数据包传递到第 3 层(网络层)时,MAC 地址会被剥离。这就是 ARP 无法跨路由器工作的根本原因。为了从您未直接连接的网段获取 MAC 地址,您需要一个节点的合作,该节点是直接与其相连。可能性:
a) 您要检索其 MAC 地址的远程主机本身。您可以直接询问它,但它当然可能会撒谎,因此如果您的目标是揭露冒名顶替者,那么这几乎没有用。它还可能无意中暴露它,例如将其用作其 IPv6 地址的主机部分或以其他方式将其包含在其第 3 层流量中,但您也不能依赖这一点。
b) 路由器将数据包从该网段转发给您。它当然可以看到 MAC 地址,如果您有管理权限或 SNMP 访问权限,则可以向它查询该信息。
c) 您可以控制该网段上的某个其他主机,并从该主机向被调查主机的 IP 地址发出 ARP 请求。
尽管如此,检查 MAC 地址并不是验证对方身份的可靠方法,因为 MAC 地址很容易伪造。根据您的需要,您可能需要考虑更好、更完善、更可靠的主机身份验证方法,例如 TLS 客户端和服务器证书。