minieap icon indicating copy to clipboard operation
minieap copied to clipboard

锐捷插件认证流程的问题

Open ysc3839 opened this issue 6 years ago • 14 comments

目前锐捷插件进行第二次认证是主动把状态设为 EAP_STATE_START_SENT。 https://github.com/updateing/minieap/blob/7124083ee2e8162114ab3a1de74582bbb5f965bf/packet_plugin/rjv3/packet_plugin_rjv3_priv.c#L517-L520

但是代码中是有实现多次认证的功能的,是否应该改成由程序本身来开始第二次认证? https://github.com/updateing/minieap/blob/7124083ee2e8162114ab3a1de74582bbb5f965bf/eap_state_machine.c#L188-L192

问这个问题是因为我打算把 minieap 配合 OpenWrt 的 proto 来使用,就像 DHCP 那样。这样的话网线断开的话系统会自动处理重连。其他程序或脚本也能直接通过接口状态得知是否认证成功,以及直接控制重新认证。 其中需要实现认证成功后执行一个脚本,但是按照目前的认证流程,会触发两次认证成功。

ysc3839 avatar Jan 07 '19 18:01 ysc3839

主程序现有的二次认证逻辑直接要求发 START 包,不太好控制因为 DHCP 太慢导致无法上报 IP 信息的情况,所以是在锐捷插件里等到 DHCP 完成时才转入认证流程。

如果二次认证只在锐捷里用得到(我确实没发现其他地方用到的),或许可以考虑一下让插件完全接管二次认证,主程序中对二次认证的处理仅限于“收到指定次数的成功报文才执行认证成功的逻辑”和“通知插件可以开始第二次认证”,不再主动转换状态。这样似乎也可以满足你的需求?

updateing avatar Jan 11 '19 17:01 updateing

我目前简单修改了一下,把锐捷插件中的 switch_to_state 去掉了。然后再配置文件里设置成两次认证,似乎没有什么问题。 https://github.com/updateing/minieap/blob/7124083ee2e8162114ab3a1de74582bbb5f965bf/packet_plugin/rjv3/packet_plugin_rjv3_priv.c#L519

至于 DHCP,应该不会影响吧?因为是先执行完了 DHCP 脚本,再进行下一次认证的。

ysc3839 avatar Jan 11 '19 18:01 ysc3839

补充说明一些题外话: 如果路由器的 WAN 口不是一个独立网卡而是交换机 VLAN 的话,网线断开并不会使对应的 VLAN 接口下线。如果要实现断线重新认证的话估计只能轮询检测交换机的接口状态。 不过我这里在插上网线后服务器会主动发一个 EAP 请求,所以断线后可以自动重新认证。

我这里在 DHCP 未成功的情况下,第一次认证就会失败,也许要在两次认证前都执行一下 DHCP 脚本?

ysc3839 avatar Jan 11 '19 18:01 ysc3839

  1. 第二次认证中,头部有个取反+倒序的字段会包含 IP 信息,所以得取得有效 IP 以后才可以开始第二次认证。如果直接在主程序里要求两次认证,那就不会等待 DHCP 结果而直接发包了。头部字段里的 IP 会显示在管理网站上,我觉得还是挺重要的……

  2. 听起来你的环境是认证前就可以拿到地址了?我这边是得第一次认证后才能拿到的。认证前就能拿 IP 的话,往往单次认证就可以使用了。如果只使用单次认证,会出现怎样的情况呢?

updateing avatar Jan 13 '19 13:01 updateing

  1. 执行 DHCP 脚本是会等待执行完的,可以直接在脚本里实现 DHCP 成功后再退出。
  2. 将 dhcp-type 设为 0, 2, 3 都会认证失败。但是设成 1,同时只执行一次认证是会成功的,第二次认证时服务器才会返回通知信息。 https://github.com/updateing/minieap/blob/bf4f1b4fec68621365301d6b2f61361319372ff3/packet_plugin/rjv3/packet_plugin_rjv3.c#L105-L109

ysc3839 avatar Jan 13 '19 14:01 ysc3839

这类环境还真是没听说过……

我尝试一下做这样的修改吧。

updateing avatar Jan 17 '19 14:01 updateing

@updateing 再反馈一下与环境有关的奇怪现象: 我之前用的是旧的版本,刚才使用新版本发现管理后台上的 IP 地址显示为 0.0.0.0。 查看代码发现,新版本中是第二次认证才会发送 DHCP 信息 https://github.com/updateing/minieap/blob/bf4f1b4fec68621365301d6b2f61361319372ff3/packet_plugin/rjv3/packet_plugin_rjv3_priv.c#L335-L338 所以怀疑后台改设置了?IP 地址为空也能成功认证?第二次认证发送过去的 IP 地址会被忽略?

ysc3839 avatar Feb 28 '19 13:02 ysc3839

这样一说的话,我校的环境(在我毕业前)确实与你那边不一样。我们是要求第一次认证必须不带地址的,不然会提示“请将 IP 地址改为自动获取形式”blahblah,所以才有的二次认证这个功能。我们那时管理后台也只显示第二次认证中带的 IP 地址。可能服务端是接受深度定制的吧……

updateing avatar Feb 28 '19 13:02 updateing

@updateing 是我搞错了……现在情况更复杂了…… 我手动去掉了网卡的 IPv4 地址,然后用旧版本认证,服务器提示 用户动态IP地址类型绑定错误! 同样情况下使用新版本认证却成功了,后台显示 IP 地址 0.0.0.0。 这也许是旧版本的 bug?

ysc3839 avatar Feb 28 '19 13:02 ysc3839

@updateing 之前使用的旧版本是这个 https://github.com/GZHU-Dress/minieap

ysc3839 avatar Feb 28 '19 13:02 ysc3839

@updateing 确认了,把 rjv3_should_fill_dhcp_prop 改成 return TRUE 就能看的正确的 IP 地址。 https://github.com/updateing/minieap/blob/bf4f1b4fec68621365301d6b2f61361319372ff3/packet_plugin/rjv3/packet_plugin_rjv3_priv.c#L335-L338

ysc3839 avatar Feb 28 '19 13:02 ysc3839

那就真的奇怪了,为什么设置认证前DHCP会失败呢…… 讲道理认证前和二次认证的唯一区别就是发送IP地址的时机,没理由二次能用而认证前完全不能通过。可以麻烦再确认一下吗?

updateing avatar Feb 28 '19 13:02 updateing

@updateing 你是指把 dhcp_type 改成 DHCP_BEFORE_AUTH 吗?这似乎是服务器的限制。稍后我用新版本确认一下吧。

ysc3839 avatar Feb 28 '19 13:02 ysc3839

@updateing 大概是破案了。配置文件里面写 dhcp-type=3 ,认证成功了…… 只需要认证一次,服务器会正常返回计费通知。

ysc3839 avatar Feb 28 '19 15:02 ysc3839