【发布时间】:2026-01-22 05:00:01
【问题描述】:
请不要批评解决方案。这不是我的设计,是的,这很糟糕。
在运行 Linux 并使用 C 的计算机上,我们需要验证与进程建立的 TCP 连接是否来自同一台计算机。通过 IP 地址进行操作是有问题的,因为操作系统正在生成两个 IP 地址,而进程只知道一个。反正通过IP地址验证有点差。
我们希望通过将“远程”MAC 地址与本地 MAC 地址进行比较来进行验证。我们已经获得了本地 MAC 地址。我只需要知道如何获取“远程”MAC 地址。它位于形成连接时发送的数据包中(以及所有后续连接中)。我们如何将其拖出以太网层?
在任何人再说一遍之前,我知道如果远程主机不在同一个子网/LAN 上,您将无法获取远程主机的 MAC 地址。没关系。大概我们会得到类似 00:00:00:00:00:00 的东西,因为它与本地 MAC 地址不同,所以它会有所不同——这正是我们想要的。
--
所以,总而言之,我们有一个 TCP 连接套接字 fd,我们收到了一个数据包,那么我们如何找到远程主机的 MAC 地址,即包头中的 MAC 地址?
【问题讨论】:
-
您是否要确定身份?因为我可以想到几种比使用可欺骗 MAC 地址更好的方法
-
如果本地数据包带有两个不同的 IP 地址,您怎么知道它们不会带有两个不同的 MAC 地址?如果某些数据包通过环回适配器,它们不会到达硬件附近的任何地方,因此根本没有 MAC 地址 (IIRC)。
-
您是否知道可以仅将服务器绑定到环回接口这一事实?在这种情况下,只有同一台机器上的客户端可以建立连接(并且它们必须使用 127.0.0.1 作为远程地址),无法从另一台机器连接。
-
当然你说这不是你的设计,但请确保每个人都知道,如果这是出于安全原因,那么它并没有真正起到多大作用。随意更改MAC地址很容易。
-
Hasturkun:是的,我知道这就是为什么我说“首先,请不要批评解决方案。这不是我的设计,是的,它很烂”。米奥先生:我知道。我不是专家,但我认为我们可能会更安全,因为对欺骗 MAC 地址的人的 SYN/ACK 响应不应该靠近欺骗者 - 但就像我说我不是专家一样。我会尽我所能来提高认识,但我怀疑它会产生多大的效果。巴特:好主意。我会建议它,看看会发生什么。
标签: c linux sockets mac-address