说明,笔者根据以前安装流程来实现的OpenSIPS安装配置,所以,默认环境和以下使用的很多命令仍然是按照默认环境来执行的。用户需要首先确保安装环境更新,以便能够顺利安装必要的支持包。具体配置说明,请参考:
最完整快速的安装方式安装开源OpenSIPS-3.1和CP控制界面-class 8
1安装mysql数据库和JSON
一般来说,SIP服务提供商或者企业电话系统的呼叫都需要经过一定的数据库安全认证。OpenSIPS 的SIP用户可以使用无密码的呼叫设置,但是为了保证其安全,绝大部分的场景中仍然需要用户密码设置。用户需要首先确认支持包安装成功,执行以下命令检查:
apt-get install opensips-mysql-module
ls /usr/lib/x86_64-linux-gnu/opensips/modules/db_mysql.so
安装成功用户,然后安装JSON接口支持包(因为界面系统需要通过此接口连接):
apt-get install opensips-http-modules
ls /usr/lib/x86_64-linux-gnu/opensips/modules/httpd.so
2创建数据库相关表
用户通过CLI命令安装数据库的表:
opensips-cli -x database create opensips_new
输入DB URL:mysql://localhost。执行数据库创建流程。注意,这里的数据库用户名称和密码:opensips:opensipsrw,用户也可以使用其他的用户名称,但是一定要注意在后续的其他配置中做相应修改保证其安全性。
#mysql
> CREATE USER 'opensips'@'localhost' IDENTIFIED BY 'opensipsrw';
> GRANT ALL PRIVILEGES ON opensips.* TO 'opensips'@'localhost';
> FLUSH PRIVILEGES;
> QUIT
3修改cfg文件支持注册和呼叫请求流程
数据库和支持包安装好以后,我们开始配置和用户注册,呼叫相关的流程。opensips的cfg文件需要增加一些必要的配置。首先,cfg文件需要加载支持模块:
loadmodule "httpd.so"
modparam("httpd", "port", 8080) // GUI 端口
loadmodule "mi_http.so"
modparam("mi_http", "root", "json") // 支持json
加载mysql 数据库模块:
loadmodule "db_mysql.so"
设置相关模块的参数设置,注意mysql数据库用户名称和密码
modparam("usrloc", "working_mode_preset", "single-instance-sql-write-back")
modparam("usrloc", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips")
增加auth模块对SIP用户的支持,注意数据库的用户名称和密码
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
modparam("auth_db|uri", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips")
modparam("auth_db", "load_credentials", "")
在相关auth的检查脚本中增加检测:
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "auth");
exit;
}
if (!$au==$fU) {
send_reply(403,"Forbidden auth ID");
exit;
}
consume_credentials();
if (!www_authorize("", "subscriber")) {
www_challenge("", "auth");
exit;
}
if (!$au==$tU) {
send_reply(403,"Forbidden auth ID");
exit;
}
配置文件修改以后,用户保存配置文件,然后重新启动opensips服务器。
4在opensips-cli 添加必要参数支持
用户编辑opensips-cli.cfg文件,添加数据库的参数支持,注意数据库用户和密码设置和创建数据库时的匹配。
database_url: mysql://opensips:opensipsrw@localhost
database_name: opensips
database_modules: ALL
domain: sip.domain.com // 也可以是其他的domain,sip.freepbx.cn
plain_text_passwords: true
注意,如果还有opensips.org的话,要删除。通过CLI命令添加两个SIP用户和密码:
opensips-cli -x user add 1000 freepbx
opensips-cli -x user add 1001 freepbx
重新启动原来使用的两个软电话分机,重新注册,测试双方的呼叫。如果一切配置成功的话,双方的呼叫是成功的。如果用户想删除注册信息的话,也可以执行以下命令:
opensips-cli -x mi ul_rm location XXXX // 删除SIP账号 XXXX
或者使用dump命令检查location的状态:
opensips-cli -x mi ul_dump
5OpenSIPS的多租户配置支持
很多时候,如果运营商做IPPBX的运营的话,它们可能会在OpenSIPS平台配置多租户的SIP用户帐户支持不同的企业客户。这里,一般的多租户就是指对多个域名的支持,企业用户通过自己的域名来定义用户,用户具有不同域名下的SIP账号。例如,1000:@sip.A.com和1000@sip.B.com 是完全不同的两个SIP账号,分别属于两个公司的SIP账号。笔者这里不过多介绍关于多租户运营的优缺点,用户可以通过网上资料来获得一些背景知识。通过界面设置多租户的SIP用户帐户需要修改几个必要的配置文件。首先需要修改GUI配置文件的环境支持密码为明文的密码设置:
通过vim 编辑以下文件:
/var/www/html/opensips-cp/config/tools/users/user_management/local.inc.php
Set $config->passwd_mode=0
保存此文件。然后用户需要修改cfg配置文件,增加相关的模块加载和测试配置。
loadmodule "domain.so"
modparam("domain", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") // 注意密码
modparam("domain", "db_mode", 1) # 使用catching
modparam("auth_db|usrloc", "use_domain", 1)
在opensips.cfg中增加其他的判断脚本:
## authenticate and authorize
#if(is_myself("$fd")) { /*no multidomain version*/
if(is_from_local()) { /*multidomain version*/
修改判断设置:
##if (!is_myself("$rd")) {
if (!is_uri_host_local()) {
保存cfg配置文件,重新启动opensips,然后通过命令查看启动状态:
systemctl status opensips
如果有关于SIP账号的domain错误的话,用户可能会注册失败。用户可以删除数据库的location再次测试。如果前面的配置成功配置以后,用户可以通过界面来添加不同的domain:

每次添加domain以后,因为模块使用了catched设置,用户需要点击”Reload on Server“ 服务器来重新加载模块数据,从数据库更新数据。
用户添加了doamin以后,也可以通过界面添加此域名下的多租户的SIP账号,例如1000,1001。

用户在注册成功以后,如果管理员想查看contact的信息,可以点击Contacts查看SIP的状态消息:


管理员也可以删除contacts:

6OpenSIPS添加SIP账号用户别名
别名是SIP账号中一种比较实用功能。在SIP平台中,如果PSTN呼入以后,可以作为一个DID的转发呼叫然后路由到SIP服务器的SIP账号中。用户也可以根据不同的业务组对SIP账号定义不同的名称。简单来说,呼叫方呼叫目的地号码时可以使用不同的简化的号码或者其他别名进行呼叫,而不呼叫原号码。SIP账号使用别名可以方便呼叫方拨号,也可以实现对呼入号码的DID路由。在opensips的平台环境中,别名的URL通过opensips转译成一个本地的SIP账号,通过数据库dbaliases lookup的查询方式实现Alias-URI 和原始Original-URI的处理。
如果需要通过opensips实现别名支持的话,我们需要加载dbaliases和其相关的参数配置选项。打开opensips.cfg 配置文件,添加别名数据库的参数配置:
loadmodule "alias_db.so"
modparam("alias_db", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") // 注意数据库密码
#apply DB based aliases (uncomment to enable)
alias_db_lookup("dbaliases");
保存cfg文件,重新启动opensips,然后对SIP账号1000添加别名。这里的别名可以是任意的号码,号码格式也可以通过界面配置文件进行自定义的格式支持。用户可以根据自己的业务需求对SIP 1000账号添加一个别名,例如186XXX或者其他的号码,方便记忆,发布使用管理即可。


如果用户需要对别名号码实现号码格式的验证支持的话,用户可以修改php配置文件:
vim:opensips-cp/config/tools/users/alias_management/local.inc.php
$config->alias_format = "/^[0-9a-zA-Z]+/"; // 强制的号码格式
保存php文件,重新刷新界面就可以实现别名号码格式的强制设置。
修改了别名以后,我们使用另外一个SIP 账号,例如1001,呼叫设置了别名为其他号码的,例如186123。如果配置成功的话,SIP 1000就会振铃。说明,SIP 1000支持的别名设置186123是成功的。
以上是opensips的多租户的实现方式,当然也可以通过SBC或者freesbc支持的不同的多租户方式实现对内网IPPBX的内网管理方式。freesbc/prosbc作为一个多租户的前端服务器,呼叫进入以后,通过不同的域名路由到不同的内网的IPPBX,IPPBX各自独立。外网SIP账号通过域名方式加FreeSBC地址来实现注册。

freesbc多租户IPPBX支持
7总结
本章节主要介绍了关于通过mysql数据库实现SIP账号认证的配置,多租户设置和别名设置。为了实现以上的配置,opensips需要首先安装mysql数据库,创建数据库和创建用户表,并且需要在cfg文件中加载数据库和相关的参数。为了实现多租户的支持,opensips需要加载多租户模块,然后通过界面来创建一个多租户,然后按照多租户来创建一个SIP账号。最后,笔者介绍了关于别名的使用和其配置方式以及测试结果。通过以上比较详细的介绍,希望opensips用户能够熟悉关于多租户的实现和SIP别名的管理。
参考资料:
https://docs.telcobridges.com/tbwiki/FreeSBC:_Multiple_Domains/Hosted_PBXs_Configuration
www.freesbc.cn
www.opensips.org
融合通信/IPPBX/FreePBX商业解决方案:www.hiastar.com
最新Asterisk完整中文用户手册详解:www.asterisk.org.cn
Freepbx/FreeSBC技术文档: www.freepbx.org.cn
如何使用免费会话边界控制器-FreeSBC,qq技术分享群:334023047
关注微信公众号:asterisk-cn,获得有价值的通信行业技术分享