You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨Ocserv服务器基于FreeRADIUS实现用户全局最大并发连接数限制的方案咨询

跨Ocserv服务器基于FreeRADIUS实现用户全局最大并发连接数限制的方案咨询

嘿,这个问题我之前帮不少运维同学解决过,核心痛点就是你现在遇到的——单Ocserv节点的max-same-clients只能管自己服务器的连接,没法全局统一限制。要实现全局最多2次并发,得把统计逻辑转移到FreeRADIUS这个统一认证中心上,具体方案如下:

  • 启用FreeRADIUS的会话追踪模块
    首先得让FreeRADIUS能记录所有用户的活跃连接,最常用的方式是用SQL存储(比如MySQL/MariaDB或PostgreSQL)。你需要确保FreeRADIUS开启了rlm_sql模块,并且配置好对应数据库的连接信息。FreeRADIUS默认的radacct计费表就是用来追踪会话的,里面的AcctStopTime字段为NULL时,就代表这个会话还在活跃状态。

  • 在FreeRADIUS中添加全局并发数检查逻辑
    编辑FreeRADIUS的认证站点配置(比如/etc/freeradius/sites-available/default),在authorize阶段加入自定义的并发数检查:

    authorize {
        # 其他已有配置...
        sql {
            sql_user_name = "%{User-Name}"
            sql_query = "SELECT COUNT(*) FROM radacct WHERE UserName = '%{User-Name}' AND AcctStopTime IS NULL"
            if (sql_result >= 2) {
                reject
                update reply {
                    Reply-Message = "全局最多允许2个并发连接,请先断开部分连接后重试。"
                }
            }
        }
        # 其他已有配置...
    }
    

    这段配置会在用户认证时,查询当前活跃的会话数,如果已经达到2个,就直接拒绝认证请求。注意要根据你用的数据库类型调整SQL语句的细节,确保和表结构匹配。

  • 配置Ocserv向FreeRADIUS发送完整计费信息
    每个Ocserv服务器都必须配置发送计费开始(Accounting-Start)和停止(Accounting-Stop)请求,这样FreeRADIUS才能实时更新用户的活跃会话数。在Ocserv的主配置文件里,确保这两个directives正确设置:

    auth = "radius[config=/etc/ocserv/radius.config]"
    acct = "radius[config=/etc/ocserv/radius.config]"
    

    同时在radius.config里要填对FreeRADIUS的地址、共享密钥,并且确认计费功能是启用状态。

  • 处理异常会话的清理
    有时候用户异常断开(比如突然断网),Ocserv可能没来得及发送停止计费请求,导致FreeRADIUS里的会话记录一直处于活跃状态,影响统计准确性。可以通过两种方式解决:

    • 在FreeRADIUS的配置里设置session_timeout参数,自动标记超时的会话为结束;
    • 用定时任务(比如crontab)定期清理数据库中超时的会话记录,比如删除AcctStartTime超过2小时且AcctStopTime为NULL的记录。

备注:内容来源于stack exchange,提问作者AminMZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:59:34