c -通过MAC地址验证TCP连接是否来自同一台机器



请不要批评这个解决方案。这不是我的设计,是的,它很烂。

在一台运行Linux并使用C语言的计算机上,我们需要验证与进程建立的TCP连接是否来自同一台机器。通过IP地址进行操作是有问题的,因为操作系统正在生成两个IP地址,而进程只知道一个。无论如何,通过IP地址验证有点差。

我们希望通过比较"远程"MAC地址和本地MAC地址来进行验证。我们已经得到了本地MAC地址。我只需要知道如何获得"远程"MAC地址。它存在于形成连接时发送的数据包中(以及所有后续连接中)。我们如何把它拖出以太网层?

在任何人再说一遍之前,我知道你不能得到远程主机的MAC地址,如果它不在同一个子网/局域网上。这很好。大概我们会得到像00:00:00:00:00这样的东西,因为这与本地MAC地址不同,所以它会有所不同-这正是我们想要的。

,

所以,总结一下,我们有一个TCP连接套接字fd,我们收到了一个数据包,然后我们如何找到远程主机的MAC地址,数据包头中的MAC地址?

如果我理解正确的话,您不是试图区分远程机器,而是使用源MAC和目标MAC匹配从机器发送到自身的流量的想法,以便只允许本地流量。

这似乎相当迂回,而且已经指出,是不安全的。

让TCP客户端只监听环回接口(127.0.0.1)而不监听INADDR_ANY是一个更好的主意。或者更进一步,使用unix域套接字而不是TCP套接字(这是目前X服务器用来防止远程连接可能性的常用方法)

同子网TCP连接的MAC地址几乎肯定在ARP缓存中。

在Linux上,您可以通过查找/proc/net/arp来检查ARP缓存。下面是它在我的Ubuntu盒子上的样子:

aix@aix:~$ cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
10.0.0.32        0x1         0x2         00:1e:4f:f5:be:dc     *        eth0
10.10.10.1       0x1         0x2         00:1f:6c:3e:02:e3     *        eth0

如果你不喜欢解析伪文件,可能有一些可调用的API可以用来获取相同的数据。

如何配置防火墙(内部或外部)来阻止或mac过滤端口上的外部流量?

环回连接(无论是通过环回接口还是其他接口)不通过任何以太网设备路由,因此没有MAC地址与之关联。

我建议您只使用getsocknamegetpeername来获得本地和远程IP地址,并比较它们是否相等。这将工作,没有任何先验知识配置的IP地址的系统。

此外,如果您想要IPv4/v6不可知,您可以使用getnameinfoNI_NUMERIC标志将两个地址转换为数字字符串表示形式,并将它们strcmp

相关内容

最新更新