一:案例描述
一键可视顺控图像智能项目在网络部署过程中,对网络限制隔离安全性要求很高,用到正向隔离装置(南瑞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 实现
伪代码实现:
- 开启混杂模式
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的问题。