FreeSWITCH用户管理全攻略:添加用户与出局路由配置指南

FreeSWITCH用户管理全攻略:添加用户与出局路由配置指南

一、用户管理基础架构

FreeSWITCH采用模块化设计实现用户管理,核心组件包括:

  • 用户目录(Directory):存储用户认证信息、拨号计划及服务配置
  • 数据库后端:支持SQLite(默认)、PostgreSQL、MySQL等数据库
  • XML配置层:通过directory模块加载用户配置
  • ACL策略:控制用户访问权限及出局路由规则

典型用户数据流:SIP请求→认证模块验证→目录查询→路由决策→出局网关处理。建议生产环境采用数据库存储用户数据,避免直接修改XML配置文件。

二、用户添加的三种实现方式

1. 数据库方式(推荐)

使用SQLite示例(PostgreSQL/MySQL操作类似):

  1. -- 连接FreeSWITCH内置数据库
  2. sqlite3 /usr/local/freeswitch/db/core.db
  3. -- 添加用户(示例)
  4. INSERT INTO users (uuid, domain, username, password, realm)
  5. VALUES ('a1b2c3d4', 'domain.com', '1001', 'crypt-password', 'domain.com');
  6. -- 添加用户配置(关联sip_profile
  7. INSERT INTO sip_users (sip_user, context, dial_string)
  8. VALUES ('1001', 'default', '{presence_id=1001@domain.com}sofia/internal/1001@domain.com');

关键参数

  • password字段支持明文、MD5或BCRYPT加密
  • realm必须与sip_profiles中的domain配置一致
  • 重启mod_db模块使配置生效:freeswitch@host> reload mod_db

2. XML配置方式

编辑/usr/local/freeswitch/conf/directory/default/目录下的XML文件:

  1. <!-- 1001.xml 示例 -->
  2. <include>
  3. <user id="1001">
  4. <params>
  5. <param name="password" value="$${crypt(1234)}"/>
  6. <param name="vm-password" value="1234"/>
  7. </params>
  8. <variables>
  9. <variable name="toll_allow" value="domestic,international"/>
  10. <variable name="accountcode" value="1001"/>
  11. <variable name="user_context" value="default"/>
  12. <variable name="effective_caller_id_name" value="User 1001"/>
  13. </variables>
  14. </user>
  15. </include>

配置要点

  • 密码加密建议使用freeswitch@host> fs_cli -x "crypt 1234"生成加密字符串
  • toll_allow控制用户呼叫权限
  • 修改后需执行freeswitch@host> reloadxml

3. API动态添加

通过ESL接口实时创建用户:

  1. # 使用fs_cli执行
  2. freeswitch@host> api user_add 1002 domain.com crypt-password
  3. freeswitch@host> api domain_exists domain.com
  4. freeswitch@host> api reload mod_xml_curl # 若使用XML远程加载

适用场景

  • 动态扩容场景
  • 需要与外部系统集成的场景
  • 临时测试用户创建

三、出局路由配置策略

1. 路由决策流程

FreeSWITCH出局路由遵循以下顺序:

  1. 拨号计划匹配(dialplan模块)
  2. 网关选择(sofia模块)
  3. ACL权限检查
  4. 媒体协商

2. 网关配置示例

编辑/usr/local/freeswitch/conf/sip_profiles/external/网关配置:

  1. <gateway name="provider_gw">
  2. <params>
  3. <param name="proxy" value="sip.provider.com:5060"/>
  4. <param name="register" value="true"/>
  5. <param name="username" value="account"/>
  6. <param name="password" value="secret"/>
  7. <param name="realm" value="provider.com"/>
  8. </params>
  9. <variables>
  10. <variable name="dial-string" value="{presence_id=${dialed_user}@$${domain}}${sofia_contact(${dialed_user}@$${domain})}"/>
  11. <variable name="caller_id_number" value="1001"/>
  12. </variables>
  13. </gateway>

3. 拨号计划优化

conf/dialplan/default.xml中配置出局规则:

  1. <extension name="outbound_calls">
  2. <condition field="destination_number" expression="^9(1\d{10})$">
  3. <action application="set" data="outbound_gateway=provider_gw"/>
  4. <action application="bridge" data="${user_data(${dialed_user}@$${domain} var dialstring)}"/>
  5. </condition>
  6. </extension>

优化技巧

  • 使用正则表达式匹配号段
  • 结合time_of_day模块实现分时路由
  • 通过limit模块控制并发呼叫

四、安全加固方案

1. ACL权限控制

配置conf/autoload_configs/acl.conf.xml

  1. <list name="loopback.auto" default="deny">
  2. <node type="allow" domain="$${domain}"/>
  3. <node type="allow" cidr="192.168.1.0/24"/>
  4. </list>
  5. <list name="global_ip" default="deny">
  6. <node type="allow" ip="203.0.113.0/24"/>
  7. </list>

2. 认证策略优化

  • 启用SIP Digest认证:
    1. <param name="digest" value="true"/>
  • 配置TLS加密:
    1. <param name="tls" value="$${base_dir}/conf/tls/server.pem"/>
    2. <param name="tls-verify-date" value="true"/>

3. 监控与审计

  • 启用CDR记录:
    1. <param name="cdr-enable" value="true"/>
    2. <param name="cdr-log-dir" value="$${base_dir}/log/cdr"/>
  • 配置Fraud检测:
    1. <param name="max-calls" value="10"/>
    2. <param name="limit-on" value="true"/>

五、常见问题解决方案

1. 用户注册失败排查

  1. 检查sofia status profile internal reg输出
  2. 验证数据库连接:sqlite3 core.db "SELECT * FROM users WHERE username='1001'"
  3. 查看日志:tail -f /usr/local/freeswitch/log/freeswitch.log

2. 出局呼叫404错误

  1. 确认网关状态:sofia status gateway provider_gw
  2. 检查拨号计划匹配:fs_cli -x "show channels"
  3. 验证号码规范化:fs_cli -x "parse 918005551212"

3. 性能优化建议

  • 数据库优化:为users表添加索引
    1. CREATE INDEX idx_username ON users(username);
  • 配置连接池:
    1. <param name="db-pool-size" value="20"/>
  • 启用缓存:
    1. <param name="cache-users" value="true"/>

六、进阶配置技巧

1. 动态路由实现

结合Lua脚本实现智能路由:

  1. session:answer()
  2. local destination = session:getVariable("destination_number")
  3. local gateway = ""
  4. if string.sub(destination,1,1) == "9" then
  5. gateway = "provider_gw"
  6. else
  7. gateway = "backup_gw"
  8. end
  9. session:execute("set", "outbound_gateway=" .. gateway)
  10. session:execute("bridge", session:getVariable("dialstring"))

2. 多域管理方案

配置虚拟域:

  1. <domain name="domain1.com" parse="true">
  2. <params>
  3. <param name="dial-string" value="{presence_id=${dialed_user}@${domain}}${sofia_contact(${dialed_user}@${domain})}"/>
  4. </params>
  5. </domain>

3. 高可用部署

主备节点配置要点:

  • 共享数据库存储用户数据
  • 使用mod_event_socket实现配置同步
  • 配置心跳检测:
    1. <param name="heartbeat-interval" value="30"/>
    2. <param name="heartbeat-threshold" value="3"/>

通过以上配置方法,运维人员可以构建安全、高效的FreeSWITCH用户管理系统。实际部署时建议先在测试环境验证配置,逐步推广到生产环境,并建立完善的监控告警机制。