锐捷插件认证流程的问题
ysc3839 opened this issue · 14 comments
目前锐捷插件进行第二次认证是主动把状态设为 EAP_STATE_START_SENT
。
minieap/packet_plugin/rjv3/packet_plugin_rjv3_priv.c
Lines 517 to 520 in 7124083
但是代码中是有实现多次认证的功能的,是否应该改成由程序本身来开始第二次认证?
Lines 188 to 192 in 7124083
问这个问题是因为我打算把 minieap 配合 OpenWrt 的 proto 来使用,就像 DHCP 那样。这样的话网线断开的话系统会自动处理重连。其他程序或脚本也能直接通过接口状态得知是否认证成功,以及直接控制重新认证。
其中需要实现认证成功后执行一个脚本,但是按照目前的认证流程,会触发两次认证成功。
主程序现有的二次认证逻辑直接要求发 START 包,不太好控制因为 DHCP 太慢导致无法上报 IP 信息的情况,所以是在锐捷插件里等到 DHCP 完成时才转入认证流程。
如果二次认证只在锐捷里用得到(我确实没发现其他地方用到的),或许可以考虑一下让插件完全接管二次认证,主程序中对二次认证的处理仅限于“收到指定次数的成功报文才执行认证成功的逻辑”和“通知插件可以开始第二次认证”,不再主动转换状态。这样似乎也可以满足你的需求?
我目前简单修改了一下,把锐捷插件中的 switch_to_state 去掉了。然后再配置文件里设置成两次认证,似乎没有什么问题。
至于 DHCP,应该不会影响吧?因为是先执行完了 DHCP 脚本,再进行下一次认证的。
补充说明一些题外话:
如果路由器的 WAN 口不是一个独立网卡而是交换机 VLAN 的话,网线断开并不会使对应的 VLAN 接口下线。如果要实现断线重新认证的话估计只能轮询检测交换机的接口状态。
不过我这里在插上网线后服务器会主动发一个 EAP 请求,所以断线后可以自动重新认证。
我这里在 DHCP 未成功的情况下,第一次认证就会失败,也许要在两次认证前都执行一下 DHCP 脚本?
-
第二次认证中,头部有个取反+倒序的字段会包含 IP 信息,所以得取得有效 IP 以后才可以开始第二次认证。如果直接在主程序里要求两次认证,那就不会等待 DHCP 结果而直接发包了。头部字段里的 IP 会显示在管理网站上,我觉得还是挺重要的……
-
听起来你的环境是认证前就可以拿到地址了?我这边是得第一次认证后才能拿到的。认证前就能拿 IP 的话,往往单次认证就可以使用了。如果只使用单次认证,会出现怎样的情况呢?
- 执行 DHCP 脚本是会等待执行完的,可以直接在脚本里实现 DHCP 成功后再退出。
- 将 dhcp-type 设为 0, 2, 3 都会认证失败。但是设成 1,同时只执行一次认证是会成功的,第二次认证时服务器才会返回通知信息。
minieap/packet_plugin/rjv3/packet_plugin_rjv3.c
Lines 105 to 109 in bf4f1b4
这类环境还真是没听说过……
我尝试一下做这样的修改吧。
@updateing 再反馈一下与环境有关的奇怪现象:
我之前用的是旧的版本,刚才使用新版本发现管理后台上的 IP 地址显示为 0.0.0.0。
查看代码发现,新版本中是第二次认证才会发送 DHCP 信息
minieap/packet_plugin/rjv3/packet_plugin_rjv3_priv.c
Lines 335 to 338 in bf4f1b4
所以怀疑后台改设置了?IP 地址为空也能成功认证?第二次认证发送过去的 IP 地址会被忽略?
这样一说的话,我校的环境(在我毕业前)确实与你那边不一样。我们是要求第一次认证必须不带地址的,不然会提示“请将 IP 地址改为自动获取形式”blahblah,所以才有的二次认证这个功能。我们那时管理后台也只显示第二次认证中带的 IP 地址。可能服务端是接受深度定制的吧……
@updateing 是我搞错了……现在情况更复杂了……
我手动去掉了网卡的 IPv4 地址,然后用旧版本认证,服务器提示 用户动态IP地址类型绑定错误!
同样情况下使用新版本认证却成功了,后台显示 IP 地址 0.0.0.0。
这也许是旧版本的 bug?
@updateing 之前使用的旧版本是这个 https://github.com/GZHU-Dress/minieap
@updateing 确认了,把 rjv3_should_fill_dhcp_prop 改成 return TRUE
就能看的正确的 IP 地址。
minieap/packet_plugin/rjv3/packet_plugin_rjv3_priv.c
Lines 335 to 338 in bf4f1b4
那就真的奇怪了,为什么设置认证前DHCP会失败呢…… 讲道理认证前和二次认证的唯一区别就是发送IP地址的时机,没理由二次能用而认证前完全不能通过。可以麻烦再确认一下吗?
@updateing 你是指把 dhcp_type 改成 DHCP_BEFORE_AUTH 吗?这似乎是服务器的限制。稍后我用新版本确认一下吧。
@updateing 大概是破案了。配置文件里面写 dhcp-type=3
,认证成功了……
只需要认证一次,服务器会正常返回计费通知。