Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

锐捷插件认证流程的问题 #35

Open
ysc3839 opened this issue Jan 7, 2019 · 14 comments
Open

锐捷插件认证流程的问题 #35

ysc3839 opened this issue Jan 7, 2019 · 14 comments

Comments

@ysc3839
Copy link
Contributor

ysc3839 commented Jan 7, 2019

目前锐捷插件进行第二次认证是主动把状态设为 EAP_STATE_START_SENT

PR_INFO("DHCP 完成,正在开始第二次认证");
free_frame(&PRIV->last_recv_packet); // Duplicated in process_success
switch_to_state(EAP_STATE_START_SENT, NULL);
return;

但是代码中是有实现多次认证的功能的,是否应该改成由程序本身来开始第二次认证?

minieap/eap_state_machine.c

Lines 188 to 192 in 7124083

PR_INFO("第 %d 次认证成功,正在执行下一次认证", PRIV->auth_round);
PRIV->fail_count = 0;
packet_plugin_set_auth_round(++PRIV->auth_round);
switch_to_state(EAP_STATE_START_SENT, frame); // Do not restart_auth or reset to keep auth_round
return SUCCESS;

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

@updateing
Copy link
Owner

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

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Jan 11, 2019

我目前简单修改了一下,把锐捷插件中的 switch_to_state 去掉了。然后再配置文件里设置成两次认证,似乎没有什么问题。

switch_to_state(EAP_STATE_START_SENT, NULL);

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Jan 11, 2019

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

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

@updateing
Copy link
Owner

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

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Jan 13, 2019

  1. 执行 DHCP 脚本是会等待执行完的,可以直接在脚本里实现 DHCP 成功后再退出。
  2. 将 dhcp-type 设为 0, 2, 3 都会认证失败。但是设成 1,同时只执行一次认证是会成功的,第二次认证时服务器才会返回通知信息。
    "\t--dhcp-type, -d <0-3>\t\tDHCP 方式: [默认" STR(DEFAULT_DHCP_TYPE) "]\n"
    "\t\t\t\t\t0 = 不使用 DHCP\n"
    "\t\t\t\t\t1 = 二次认证\n"
    "\t\t\t\t\t2 = 认证后 DHCP\n"
    "\t\t\t\t\t3 = 认证前 DHCP\n"

@updateing
Copy link
Owner

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

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

@updateing 再反馈一下与环境有关的奇怪现象:
我之前用的是旧的版本,刚才使用新版本发现管理后台上的 IP 地址显示为 0.0.0.0。
查看代码发现,新版本中是第二次认证才会发送 DHCP 信息

static int rjv3_should_fill_dhcp_prop(struct _packet_plugin* this) {
return (PRIV->dhcp_type == DHCP_BEFORE_AUTH) ||
(PRIV->dhcp_type == DHCP_DOUBLE_AUTH && PRIV->succ_count >= 2);
}

所以怀疑后台改设置了?IP 地址为空也能成功认证?第二次认证发送过去的 IP 地址会被忽略?

@updateing
Copy link
Owner

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

@updateing 确认了,把 rjv3_should_fill_dhcp_prop 改成 return TRUE 就能看的正确的 IP 地址。

static int rjv3_should_fill_dhcp_prop(struct _packet_plugin* this) {
return (PRIV->dhcp_type == DHCP_BEFORE_AUTH) ||
(PRIV->dhcp_type == DHCP_DOUBLE_AUTH && PRIV->succ_count >= 2);
}

@updateing
Copy link
Owner

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

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

@ysc3839
Copy link
Contributor Author

ysc3839 commented Feb 28, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants