利用原始套接字解决mac地址错误问题【南瑞SysKeeper-2000】

发布时间:2023年12月18日

一:案例描述

一键可视顺控图像智能项目在网络部署过程中,对网络限制隔离安全性要求很高,用到正向隔离装置(南瑞SysKeeper-2000型号)。

? ? ??

图一 正向装置示意图

现场发现问题:直连网线情况下,我方系统A抓包到有数据报文,但是不进行业务处理。

二:案例分析和解决
2.1 抓包分析问题

?????? 1.防火墙

考虑到抓包只是到了网卡,可能被防火墙拦截了

?????? 确认已经是关闭状态的。

?????? 2.对比测试

?????? 利用不过正向隔离装置进行测试(直接其他电脑发送数据),抓包发现系统A收到数据了数据,并进行了业务处理。

?????? 通过对比抓包,发现两个差别点时候链路层的目的MAC地址不一样:目的mac如果非本机,则本机的应用程序无法收到此数据。

?????? 图2 三个窗口(左窗口为mac值;而中窗口因为目的mac错误导致应用程序无法接收到数据;右窗口目的mac正确,应用程序能够接收到数据)

???? 由此,推断是这正向隔离装置的目的mac地址配置错误,导致无法被应用程序接收。

?????? 3.配置确认

百度排查此正向隔离装置---南瑞SysKeeper-2000,确实需要配置此mac地址,进一步证

了此猜测。

???? 项目实施过程中,南瑞厂家技术已经离开,为保证演示,需要其他方式进行规避解决处理。

2.2 解决方案----原始套接字

2.2.1 理论

?????? 考虑到数据已经到了网卡,理论上我们可以从网卡得到数据。而我们应用程序无法得到数据是因为使用了UDP/TCP套接字,UDP/TCP套接字编程得到的只是负载数据(没有ip,mac等信息),且对方的网络报文有误(目的mac有误),导致操作系统内核过滤丢弃此数据,不转发给应用层。

?????? 而原始套接字可以直接从链路层得到更多的数据,包括ip,mac等信息,对于的七层模型中的数据链路层+网络层+传输层。

?????? 对于七层模型:

??????

对应于模型来看:

?????????????

?????? 从抓包看也能对应上:

??????

正常的UDP报文截图

原始套接字编程

Tcp/udp编程

读写数据内容

eth+ip+udp/tcp+data

data(本例中的220字节)

?????? ??

2.2.2 实现

伪代码实现:

  1. 开启混杂模式
    ifconfig eth0 promisc ?设置混杂模式
    ifconfig eth0 -promisc 取消混杂模式

2)创建原始套接字:

//ETH_P_ALL 接收发往本机mac的所有类型ip arp rarp的数据帧, 接收从本机发出的所有类型的数据帧.

?????? //(混杂模式打开的情况下,会接收到非发往本地mac的数据帧 ),

int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

3)接受数据

//获取链路层的数据帧---null 所有网卡

?int iRevNum = recvfrom(sock_raw_fd, buf, sizeof(buf),0,NULL,NULL);

4)处理数据

?????? eth+ip+udp/tcp+data对于的

if( 0x0800 == ntohs(ethdr->ether_type) ) 判断为IP数据包,占用14字节

?????? ip+udp/tcp 占用了56字节,

?????? 剩下的就是data负载数据了。

??????

从图上,可以看到从IP数据包中得到了mac信息,且data收到了8个负载数据字节。

由此,来解决现场的错误目的mac的问题。

文章来源:https://blog.csdn.net/changeholdon/article/details/135072380
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。