最近做的一个嵌入式Radius认证方案,分上中下,上:认证方案,中:嵌入式客户端代码 下:交换机和Radius配置
技术交流:1532709892@qq.com
代码参考 开源库: http://github.com/liuqun/8021xclient
(一认证核心代码)
客户端与交换机802.1x认证过程
802.1x认证过程流程图
- 客户端向交换发送连接请求,若在20次内没有接受到交换机的回应(Request/Identity报文),
退出连接
- 交换机收到连接请求后向交换机请求Identity,客户端发送用户名给交换机
- 交换机接受到用户名后,再次发送请求,请求密码
- 客户端将密码经过MD5加密后上送给交换机
- 交换机用客户端的用户名和密码进行认证,如果认证成功,开放端口,并向客户端发送
Success,每隔一段时间请求一次和客户端 握手,如果认证失败向客户端发送Failure
- 客户端获取交换机的认证结果,如果认证成功,回送一个握手协议包,如果认证失败,退出认证
- 如果客户端收到退出命令,向交换机发送Log-Off命令,退出认证
客户端主动发送连接请求(EAPOL-Start)报文格式:
客户端通过接口SendStartPkt()发送一个EAPOL-Start消息包表示开始一次802.1x连接。
EAPOL-Start消息通过标准的EAPOL协议封装,客户端请求数据包格式如下:
广播MAC地址+设备MAC地址+EAPOL报文(EAPOL-Start)
这里用一个长度为18的字符变量szpacket[18]发送EAPOL-Start消息。
szPacket[0~5]:广播MAC地址
szPacket[6~11]:设备MAC地址,通过GetMacFromDevice接口获取
szPacket[12~13]:0X88,0X8e以太网协议类型(802.1x)
szPacket[14]: EAPOL协议版本
szPacket[15]: 0X01(EAPOL-Start),EAPOL协议数据类型
szPacket [16~17]: 0X0(数据内容空),数据域长度
szPacket [18~]:数据内容
客户端主动发送Identity报文格式:
交换机收到请求报文(EAPOL-Start)后,发送一个请求帧(Request/Identity报文),要求客户端发送输入的用户名。客户端收到请求(Request/Identity),将用户名通过数据帧(EAP-Response/ Identity报文)送给交换机。
EAP-Response/ Identity报文数据包格式如下:
广播MAC地址(6位) |
Ff:ff:ff:ff:ff:ff |
|
设备MAC地址(6位) |
00:09:f5:11:35:33 |
|
EAPOL |
EAPOL Head |
|
EAPOL Body[18~] |
EAPOL-Packet EAP: Code Indentifier Length Data(Type+data) |
广播MAC地址+设备MAC地址+EAPOL报文(EAPOL-Packet)
当EAPOL报文为EAPOL-Packet时,表明EAPOL报文数据内容封装的是一个EAP数据包,
从数据的第18位开始为EAP数据内容。
这里用一个长度为128的字符变量response[128]发送EAPOL- Packet消息,EAP报文内容如下:
szResponse [15]: 0X0(EAPOL-Packet),认证信息类型
szResponse [18]: 0X02(Response),EAP帧类型(Code)
szResponse [19]: 0X02(Response),用于匹配Request 和Response(Indentifier)
szResponse [22]: 0X01(IDENTITY),Data Type
szResponse [26~29]: IP地址
//szResponse [32~59]: 28字节版本号 版本号认证会导致错误,这里选择不认证版本号
szResponse [62~]:用户名
客户端主动发送MD5报文格式:
交换机收到客户端的数据帧(EAP-Response/Identity报文),没有上传到服务器,而是随机生成一个加密字,并将加密字通过(Request/Identity)交给客户端。客户端接收到加密字后,用该加密字对密码部分进行加密生成EAP-Response/MD5 Challenge报文给交换机。
EAP-Response/MD5 Challenge内容报文如下:
广播MAC地址+设备MAC地址+EAPOL报文(EAPOL-Packet)
当EAPOL报文为EAPOL-Packet时,表明EAPOL报文数据内容封装的是一个EAP数据包,
从数据的第18位开始为EAP数据内容。
这里用一个长度为128的字符变量response[128]发送EAPOL- Packet消息,EAP报文内容如下:
szResponse [15]: 0X0(EAPOL-Packet),认证信息类型
szResponse [18]: 0X02(Response),EAP帧类型(Code)
szResponse [19]: 0X02(Response),用于匹配Request 和Response(Indentifier)
szResponse [23]: 16 ,length
szResponse [24~39]: Passwd+随机加密码MD5加密后转化成的128位信息
szResponse [40~]: 用户名
交换机收到加密密码后,将用户名,密码,加密字封装成Radius(Acces-Request)报文,发送给Radius服务器处理认证。
Radiusclient通过pcap_next_ex接口不断的抓取握手认证包,获取连接状态。
802.1x协议包内容 captured[18]=3代表连接成功,captured[18]=4代表连接失败。
客户端主动断开连接请求(EAP-LogOff)报文格式:
用户可以直接发送EAPOL_Logoff报文给交换机,主动结束认证,交换机将端口从授权状态改变成未授权状态。
客户端通过接口SendStopPkt发送一个EAPOL-Logoff消息包终止当前802.1x连接。
EAPOL-Logoff消息通过标准的EAPOL协议封装,客户端请求数据包格式如下:
广播MAC地址+设备MAC地址+EAPOL报文(EAPOL-Logoff)
这里用一个长度为18的字符变量packet[18]发送EAPOL-Logoff消息。
szPacket[0~5]:广播MAC地址
szPacket [12~13]:0X88,0X8e以太网协议类型(802.1x)
szPacket [14]: EAPOL协议版本
szPacket [15]: 0X02(data_type=EAPOL-Logoff),EAPOL协议数据类型
int Authentication(const char *szUserName, const char *szPassWord, const char *szDeviceName)
{