FreeSWITCH用户管理全攻略:添加用户与出局路由配置指南
一、用户管理基础架构
FreeSWITCH采用模块化设计实现用户管理,核心组件包括:
- 用户目录(Directory):存储用户认证信息、拨号计划及服务配置
- 数据库后端:支持SQLite(默认)、PostgreSQL、MySQL等数据库
- XML配置层:通过
directory模块加载用户配置 - ACL策略:控制用户访问权限及出局路由规则
典型用户数据流:SIP请求→认证模块验证→目录查询→路由决策→出局网关处理。建议生产环境采用数据库存储用户数据,避免直接修改XML配置文件。
二、用户添加的三种实现方式
1. 数据库方式(推荐)
使用SQLite示例(PostgreSQL/MySQL操作类似):
-- 连接FreeSWITCH内置数据库sqlite3 /usr/local/freeswitch/db/core.db-- 添加用户(示例)INSERT INTO users (uuid, domain, username, password, realm)VALUES ('a1b2c3d4', 'domain.com', '1001', 'crypt-password', 'domain.com');-- 添加用户配置(关联sip_profile)INSERT INTO sip_users (sip_user, context, dial_string)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文件:
<!-- 1001.xml 示例 --><include><user id="1001"><params><param name="password" value="$${crypt(1234)}"/><param name="vm-password" value="1234"/></params><variables><variable name="toll_allow" value="domestic,international"/><variable name="accountcode" value="1001"/><variable name="user_context" value="default"/><variable name="effective_caller_id_name" value="User 1001"/></variables></user></include>
配置要点:
- 密码加密建议使用
freeswitch@host> fs_cli -x "crypt 1234"生成加密字符串 toll_allow控制用户呼叫权限- 修改后需执行
freeswitch@host> reloadxml
3. API动态添加
通过ESL接口实时创建用户:
# 使用fs_cli执行freeswitch@host> api user_add 1002 domain.com crypt-passwordfreeswitch@host> api domain_exists domain.comfreeswitch@host> api reload mod_xml_curl # 若使用XML远程加载
适用场景:
- 动态扩容场景
- 需要与外部系统集成的场景
- 临时测试用户创建
三、出局路由配置策略
1. 路由决策流程
FreeSWITCH出局路由遵循以下顺序:
- 拨号计划匹配(
dialplan模块) - 网关选择(
sofia模块) - ACL权限检查
- 媒体协商
2. 网关配置示例
编辑/usr/local/freeswitch/conf/sip_profiles/external/网关配置:
<gateway name="provider_gw"><params><param name="proxy" value="sip.provider.com:5060"/><param name="register" value="true"/><param name="username" value="account"/><param name="password" value="secret"/><param name="realm" value="provider.com"/></params><variables><variable name="dial-string" value="{presence_id=${dialed_user}@$${domain}}${sofia_contact(${dialed_user}@$${domain})}"/><variable name="caller_id_number" value="1001"/></variables></gateway>
3. 拨号计划优化
在conf/dialplan/default.xml中配置出局规则:
<extension name="outbound_calls"><condition field="destination_number" expression="^9(1\d{10})$"><action application="set" data="outbound_gateway=provider_gw"/><action application="bridge" data="${user_data(${dialed_user}@$${domain} var dialstring)}"/></condition></extension>
优化技巧:
- 使用正则表达式匹配号段
- 结合
time_of_day模块实现分时路由 - 通过
limit模块控制并发呼叫
四、安全加固方案
1. ACL权限控制
配置conf/autoload_configs/acl.conf.xml:
<list name="loopback.auto" default="deny"><node type="allow" domain="$${domain}"/><node type="allow" cidr="192.168.1.0/24"/></list><list name="global_ip" default="deny"><node type="allow" ip="203.0.113.0/24"/></list>
2. 认证策略优化
- 启用SIP Digest认证:
<param name="digest" value="true"/>
- 配置TLS加密:
<param name="tls" value="$${base_dir}/conf/tls/server.pem"/><param name="tls-verify-date" value="true"/>
3. 监控与审计
- 启用CDR记录:
<param name="cdr-enable" value="true"/><param name="cdr-log-dir" value="$${base_dir}/log/cdr"/>
- 配置Fraud检测:
<param name="max-calls" value="10"/><param name="limit-on" value="true"/>
五、常见问题解决方案
1. 用户注册失败排查
- 检查
sofia status profile internal reg输出 - 验证数据库连接:
sqlite3 core.db "SELECT * FROM users WHERE username='1001'" - 查看日志:
tail -f /usr/local/freeswitch/log/freeswitch.log
2. 出局呼叫404错误
- 确认网关状态:
sofia status gateway provider_gw - 检查拨号计划匹配:
fs_cli -x "show channels" - 验证号码规范化:
fs_cli -x "parse 918005551212"
3. 性能优化建议
- 数据库优化:为users表添加索引
CREATE INDEX idx_username ON users(username);
- 配置连接池:
<param name="db-pool-size" value="20"/>
- 启用缓存:
<param name="cache-users" value="true"/>
六、进阶配置技巧
1. 动态路由实现
结合Lua脚本实现智能路由:
session:answer()local destination = session:getVariable("destination_number")local gateway = ""if string.sub(destination,1,1) == "9" thengateway = "provider_gw"elsegateway = "backup_gw"endsession:execute("set", "outbound_gateway=" .. gateway)session:execute("bridge", session:getVariable("dialstring"))
2. 多域管理方案
配置虚拟域:
<domain name="domain1.com" parse="true"><params><param name="dial-string" value="{presence_id=${dialed_user}@${domain}}${sofia_contact(${dialed_user}@${domain})}"/></params></domain>
3. 高可用部署
主备节点配置要点:
- 共享数据库存储用户数据
- 使用
mod_event_socket实现配置同步 - 配置心跳检测:
<param name="heartbeat-interval" value="30"/><param name="heartbeat-threshold" value="3"/>
通过以上配置方法,运维人员可以构建安全、高效的FreeSWITCH用户管理系统。实际部署时建议先在测试环境验证配置,逐步推广到生产环境,并建立完善的监控告警机制。