如何为 Elastix A2Billing 账户配置访问限制
结论
可以对已经创建的 A2Billing 账户实施这些限制,但通常无法只在 Elastix 或 A2Billing 的某个页面中一次完成。比较合适的分工如下:
- Balance:在 A2Billing 账户中设置。
- Destination Limit:使用 A2Billing 的 RateCard、Tariff/Call Plan 和号码前缀控制。
- Days of Week、Active Hours:使用 Asterisk/Elastix 的 Time Conditions 或自定义拨号计划控制。
- Talktime Limit:单次通话最多 10 分钟,可以由 Asterisk 设置;每日或每月累计通话时间不超过 10 分钟,则需要额外的计数逻辑或定制 A2Billing。
这些设置可以直接应用于已有账户,不需要重新创建。
先把表格转换成策略
不必为表格中的每一行复制一套完整配置。可以先建立几组可复用的策略,例如:
MON_SAT_0800_2000MON_FRI_0800_1800MON_FRI_0800_2000ALL_DAYS_24HDEST_LOCALDEST_LOCAL_MOBILEDEST_LOCAL_MOBILE_SLJJCALL_10_MINUTESCALL_UNLIMITED
再把已有账户分别关联到对应策略。以后调整办公时间或号码范围时,只需修改策略,不必逐个修改账户。
设置账户余额
在 A2Billing 管理界面中打开已有客户或 Card,然后修改余额或 Credit 字段。
设置前需要确认 300,000 的具体含义:
- 如果表示三十万货币单位,应按账户币种写入相应数值。
- 如果逗号是小数分隔符,实际值可能是
300.000。 - 如果表示信用额度而不是预付余额,应使用当前版本对应的 Credit Limit,而不是直接增加余额。
不同 A2Billing 版本中的字段名称可能是 Credit、Balance 或类似名称,应以当前安装版本的 Card 编辑页面和数据库结构为准。
可以直接修改数据库,但在确认版本和字段含义之前不建议这样做。例如,某些版本使用 cc_card.credit 保存可用余额:
SELECT id, username, credit, currency
FROM cc_card
WHERE username = 'ACCOUNT_ID';
确认字段含义并完成数据库备份后,再执行更新:
UPDATE cc_card
SET credit = 300000
WHERE username = 'ACCOUNT_ID';
优先通过管理界面修改,可以减少币种、数据格式和审计方面的问题。
限制可拨打的目的地
目的地限制更适合由 A2Billing 的计费计划处理,不宜只依赖 Elastix 的 Outbound Route。
可以分别创建或复用三组 RateCard:
LocalMobileSLJJ
每组 RateCard 只包含对应的号码前缀。例如,Local 只包含本地号码前缀,Mobile 包含移动号码段,SLJJ 包含相应的长途或业务号码段。
然后建立不同的 Call Plan:
| Call Plan | 包含的 RateCard |
|---|---|
CP_LOCAL | Local |
CP_LOCAL_MOBILE | Local、Mobile |
CP_LOCAL_MOBILE_SLJJ | Local、Mobile、SLJJ |
最后,在已有 A2Billing Card 中选择相应的 Call Plan。
如果某个号码无法匹配该 Call Plan 中的任何费率前缀,A2Billing 应拒绝呼叫。还要检查是否存在范围过宽的通配费率,例如可以匹配所有号码的默认前缀,否则用户可能绕过目的地限制。
Local、Mobile 和 SLJJ 对应的具体前缀取决于当地编号规则,无法仅根据示例表格确定。
限制星期和使用时段
对于固定 SIP 分机或已知主叫账户,可以在 Elastix/FreePBX 中使用 Time Groups 和 Time Conditions,也可以在 extensions_custom.conf 中创建自定义上下文。
下面是星期一至星期五 08
至 18 的示例:[policy-mon-fri-0800-1800]
exten => _X.,1,NoOp(Check calling schedule)
same => n,GotoIfTime(08:00-18:00,mon-fri,*,*?allowed)
same => n,Playback(access-denied)
same => n,Hangup()
same => n(allowed),Goto(a2billing-entry,${EXTEN},1)
星期一至星期六 08
至 20 可以写成:[policy-mon-sat-0800-2000]
exten => _X.,1,NoOp(Check calling schedule)
same => n,GotoIfTime(08:00-20:00,mon-sat,*,*?allowed)
same => n,Playback(access-denied)
same => n,Hangup()
same => n(allowed),Goto(a2billing-entry,${EXTEN},1)
全天策略不需要判断时间:
[policy-all-days-24h]
exten => _X.,1,Goto(a2billing-entry,${EXTEN},1)
这里的 a2billing-entry 只是占位名称,需要替换成当前系统实际使用的 A2Billing 入口上下文。不要直接修改 FreePBX 自动生成的 extensions_additional.conf,因为重新加载配置时,改动可能会被覆盖。
还需要检查服务器时区。如果 Asterisk 使用了错误的时区,配置中的 08:00 就可能不对应当地时间。
设置单次通话最多 10 分钟
如果 “Talktime Limit 10 minutes” 指每通电话最多 10 分钟,可以在进入 A2Billing 呼叫流程前设置 Asterisk 的绝对通话超时:
[policy-call-max-10m]
exten => _X.,1,NoOp(Set maximum call duration to 600 seconds)
same => n,Set(TIMEOUT(absolute)=600)
same => n,Goto(a2billing-entry,${EXTEN},1)
也可以把时间限制和通话长度限制合并:
[policy-mon-fri-0800-1800-max10m]
exten => _X.,1,NoOp(Office-hours policy with 10-minute call limit)
same => n,GotoIfTime(08:00-18:00,mon-fri,*,*?allowed)
same => n,Playback(access-denied)
same => n,Hangup()
same => n(allowed),Set(TIMEOUT(absolute)=600)
same => n,Goto(a2billing-entry,${EXTEN},1)
TIMEOUT(absolute) 会从设置时开始计时。如果 A2Billing 流程包含较长的语音提示、PIN 输入或选号过程,这些时间也可能计入 600 秒。若要求接通后精确计时 600 秒,应在实际执行 Dial() 的位置设置超时,或者调整 A2Billing 的 AGI 呼叫逻辑。
标记为 “Unlimited” 的账户不要应用这条 600 秒策略。
如果 10 分钟指每日或每月的累计通话时间,上述配置不适用。系统需要读取 A2Billing 的通话详单,按账户和周期汇总已用秒数,并在发起新呼叫前判断剩余额度。标准配置通常无法只靠一个账户字段完整实现累计时间限制。
如何关联到已有账户
如果每个 A2Billing 账户对应一个固定 SIP 分机,可以为该分机分配相应的自定义拨号上下文:
[account-production-101]
include => policy-mon-fri-0800-1800-max10m
同时在 A2Billing 中为该账户选择 CP_LOCAL。
另一个允许拨打本地、移动和 SLJJ 号码的账户,可以使用相同的时间策略,但关联不同的 Call Plan:
[account-production-102]
include => policy-mon-fri-0800-1800-max10m
在 A2Billing 中为这个账户选择 CP_LOCAL_MOBILE_SLJJ。
这样配置后,Asterisk 负责控制时间和通话长度,A2Billing 负责控制目的地和余额。
如果多个用户拨打同一个接入号码,之后才输入 A2Billing PIN,Asterisk 在认证前无法知道具体账户,也就不能只靠入口拨号上下文为不同账户应用不同的使用时段。此时可以采用以下方式:
- 为不同策略分配不同的接入号码;
- 让每个账户通过固定 SIP 分机或固定上下文进入;
- 修改 A2Billing AGI,在账户认证成功后查询账户策略,再执行时间和通话限制。
第三种方式最灵活,但需要定制开发。升级 A2Billing 后,还要重新检查兼容性。
必须同时防止旁路
配置完成后,要确认受限分机不能通过其他路由绕过 A2Billing,例如:
- 直接进入 Elastix Outbound Route;
- 使用其他 Trunk;
- 使用不受限制的自定义上下文;
- 通过范围过宽的 A2Billing RateCard 匹配所有号码;
- 使用没有绑定策略的备用接入号码。
实际部署前,至少要测试以下情况:
- 允许时段内和时段外;
- 工作日和周末;
- Local、Mobile、SLJJ 各一个号码;
- 一个明确禁止的目的地;
- 通话达到 10 分钟后自动断线;
- 余额不足;
- 管理员定义的 “Unlimited” 账户。
这组需求可以实现。配置时,应由 A2Billing 管理账户余额和目的地限制,由 Asterisk/Elastix 管理星期、使用时段和单次通话时长。
备注:内容仅供参考。
