1. 概述
kamailio是个纯粹的SIP服务器。本文介绍先如何在debian8下安装debian5.0,然后详细介绍如何实现使用kamailio做freeswitch均衡负载。kamailio同时实现做为代理服务器、注册服务器、重定向服务器。
2. 在debian 8 安装debian 5.0
2.1. 安装环境
这里的安装在和freeswitch系列一 在debian中安装freeswitch1.6相同的服务器上。
2.2. 安装kamailio
配置kamailio软件源, 创建文件: /etc/apt/sources.list.d/kamailio.list 并加入如下信息
deb http://deb.kamailio.org/kamailio jessie main
deb-src http://deb.kamailio.org/kamailio jessie main
配置公钥
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xfb40d3e6508ea4c8
// 执行安装apt-get更新
apt-get update
安装数据库 : 安装mysql不是必须,下文需要用到mysql,所以这里进行安装
apt-get install mysql-server
安装 kamailio 和kamailio的msqyl模块
apt-get install kamailio kamailio-mysql-modules
服务控制命令
systemctl status kamailio
systemctl start kamailio
systemctl stop kamailio
systemctl restart kamailio
2.3. 重定义日志文件
对/etc/rsyslog.d/kamailio.conf 做如下改动,重启rsyslog( service rsyslog restart)和Kamailio。这样所有Kamailio的日志将会输出到上面指定的文件(/var/log/kamailio.log)。
*.*;auth,authpriv.none,local0.none -/var/log/syslog
if $syslogfacility-text=='local0' then -/var/log/kamailio.log
2.4. kamailio重要目录
- /usr/lib/x86_64-linux-gnu/kamailio/modules/:modules so目录, 定义在kamailio配置文件的mpath里
- /run/kamailio:运行时生成的临时文件
- /etc/init.d/kamailio:启动脚本
- /etc/default/kamailio:启动使用此文件做为配置文件
- /etc/kamailio/:主目录
- /etc/kamailio/kamctlrc:是kamctl 和 kamdbctl的配置文件
- kamailio.cfg:kamailio主要配置文件
- /lib/systemd/system/kamailio.service: systemctl 的启动配置文件
3. Kamailio 集成freeswitch
下面介绍kamailio做2台freeswitch的均衡负载。此时kamailio扮演代理服务器、注册服务器、重定向服务器的角色
4. freeswitch的配置
为了集成到kamailio,freeswitch也需要做相应的修改
4.1. 修改freeswitch 则witch端口
在上文安装完毕,如果同一服务器上先启动了freeswitch, 则kamailio会启动失败。因为freeswitch和kamailio都默认使用同一端口5060。这里我们修改freeswitch的默认端口。 修改 /etc/freeswitch/vars.xml,把其中的5060,5080也改成其它的,如5260,5280。修改internal_auth_calls为false,关闭权限检查
<!-- Internal SIP Profile -->
<X-PRE-PROCESS cmd="set" data="internal_auth_calls=false"/>
<X-PRE-PROCESS cmd="set" data="internal_sip_port=5260"/>
<X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/>
<X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/>
<!-- External SIP Profile -->
<X-PRE-PROCESS cmd="set" data="external_auth_calls=false"/>
<X-PRE-PROCESS cmd="set" data="external_sip_port=5280"/>
<X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/>
<X-PRE-PROCESS cmd="set" data="external_ssl_enable=false"/>
4.2. 配置ACL
配置ACL:配置白名单访问,配置Kamailio访问 修改/etc/freeswitch/autoload_configs/acl.conf.xml,修为domains里的node为kamailio的ip.
<list name="domains" default="deny">
<!-- domain= is special it scans the domain from the directory to build the ACL -->
<node type="allow" domain="?{domain}"/>
<!-- use cidr= if you wish to allow ip ranges to this domains acl. -->
<!-- <node type="allow" cidr="192.168.0.0/24"/> -->
<node type="allow" cidr="10.240.80.153"/>
<node type="allow" cidr="127.0.0.1"/>
</list>
4.3. 配置拨号计划
在dialplan/public.xml里开始地方加入如下配置,表示1080-1089号码直接转到default.xml计划中
<!-- 1080 - 1089 for test -->
<extension name="from_kamailio">
<condition field="destination_number" expression="^(10[8][0-9])$">
<action application="transfer" data="$1 XML default"/>
</condition>
</extension>
修改dialplan/default.xml:关键修改bridge的部分的data内容为sofia/internal/$1@10.240.80.153
<extension name="Local_Extension_kamalio">
<condition field="destination_number" expression="^(10[8][0-9])$">
<action application="export" data="dialed_extension=$1"/>
<!-- bind_meta_app can have these args <key> [a|b|ab] [a|b|o|s] <app> -->
<action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/>
<action application="bind_meta_app" data="2 b s record_session::?{recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
<action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/>
<action application="bind_meta_app" data="4 b s execute_extension::att_xfer XML features"/>
<action application="set" data="ringback=${us-ring}"/>
<action application="set" data="transfer_ringback=?{hold_music}"/>
<action application="set" data="call_timeout=30"/>
<!-- <action application="set" data="sip_exclude_contact=${network_addr}"/> -->
<action application="set" data="hangup_after_bridge=true"/>
<!--<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/> -->
<action application="set" data="continue_on_fail=true"/>
<action application="hash" data="insert/${domain_name}-call_return/${dialed_extension}/${caller_id_number}"/>
<action application="hash" data="insert/${domain_name}-last_dial_ext/${dialed_extension}/${uuid}"/>
<action application="set" data="called_party_callgroup=${user_data(${dialed_extension}@${domain_name} var callgroup)}"/>
<action application="hash" data="insert/${domain_name}-last_dial_ext/${called_party_callgroup}/${uuid}"/>
<action application="hash" data="insert/${domain_name}-last_dial_ext/global/${uuid}"/>
<!--<action application="export" data="nolocal:rtp_secure_media=${user_data(${dialed_extension}@${domain_name} var rtp_secure_media)}"/>-->
<action application="log" data="INFO in to extension public-ex user/?{dialed_extension}@?{domain_name}"/>
<action application="hash" data="insert/${domain_name}-last_dial/${called_party_callgroup}/${uuid}"/>
<!-- 修改这部分内容,其中10.240.80.153为kamilio的IP -->
<action application="bridge" data="sofia/internal/$1@10.240.80.153"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<!--
<action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>
-->
</condition>
</extension>
4.4. 重启 freeswitch
重启 freeswitch
5. kamailio配置
为了集成freeswitch,kamailio也需要进行配置。这里使用dispatcher模块做均衡负载
5.1 配置mysql数据库
进入上文建立的数据库,创建如下账号
grant all privileges on kamailio.* to kamailio@'%' identified by 'kamailio';
根据/etc/kamailio/kamctlrc的提示修改对应的数据库配置,这里略,自己看配置
执行如下命令,创建数据库kamailio
kamdbctl create
登录kamailio数据库,插入刚刚创建的freeswitch的信息,这里插入两条记录,走freeswitch内部接口。这两条数据是上文创建freeswitch的信息。
insert into dispatcher(id,setid,destination,priority,flags,description) values(5,0,'sip:10.240.80.153:5260', 1, 0, 'fs5');
insert into dispatcher(id,setid,destination,priority,flags,description) values(6,0,'sip:10.240.80.152:5260', 1, 0, 'fs6');
5.2. 配置kamailio.cfg
以下信息对/etc/kamailio/kamailio.cfg进行配置 配置数据库
// 增加一行 开启mysql模块
#!define WITH_MYSQL
// 设置访问数据库的信息
#!ifdef WITH_MYSQL
# - database URL - used to connect to database server by modules such
# as: auth_db, acc, usrloc, a.s.o.
#!ifndef DBURL
#!define DBURL "mysql://kamailio:kamailio@localhost/kamailio"
#!endif
#!endif
#!ifdef WITH_MULTIDOMAIN
配置dispatcher模块
// 定义 开关负载均衡dispatcher 模块
#!define WITH_LOADBALANCE
// 加载模块,注意放置到所有loadmodule的最后
#!ifdef WITH_LOADBALANCE
loadmodule "dispatcher.so"
#!endif
// dispatcher配置
// modparam :第一个参数是模块名称,第二个参数是模块里的方法,第三是方法的参数
#!ifdef WITH_LOADBALANCE
modparam("dispatcher", "db_url", DBURL)
// 开户失败重推功能
modparam("dispatcher", "flags", 2)
// AVPs (Attribute-Value pairs)
modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")
modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")
modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")
// 心跳时间
modparam("dispatcher", "ds_ping_interval", 20)
// 心跳失败多少次,则认为负载服务掉线
modparam("dispatcher", "ds_probing_threshold", 3)
// 2: 则仅测试具有probing模式设置的非活动状态的网关。
modparam("dispatcher", "ds_probing_mode", 2)
#modparam("dispatcher", "force_dst", 1)
// 定义哪些是合格的返回值,多个返回值使用;分隔
modparam("dispatcher", "ds_ping_reply_codes", "class=2;code=403;code=404;code=407;code=484;class=3")
#!endif
配置request_route 部分,关键信息如下 :
# dispatch destinations to PSTN
route(PSTN);
#!ifdef WITH_LOADBALANCE
if (!ds_is_from_list()) {
route(LOADBALANCE);
} else {
route(LOCATION);
}
#!else
# user location service
route(LOCATION);
#!endif
route(RELAY);
配置LOADBALANCE路由
// 配置路由
#!ifdef WITH_LOADBALANCE
route[LOADBALANCE] {
if(!ds_select_dst("0", "2"))
{
xlog("L_NOTICE", "No destination available!\n");
send_reply("404", "No destination lb\n");
exit;
}
xlog("L_DEBUG", "Routing call to <$ru> via <$du>\n");
t_set_fr(0,2000);
t_on_failure("MANAGE_FAILURE");
return;
}
#!endif
5.3. 重启kamailio
至此kamailio+freeswitch集群已经完成,测试的部分,我们下一篇再介绍
6. 参考文献
- 官网wiki:由于中文资料缺乏,这个是我们学习的资料
- cookbooks:学习kamailio.cfg配置的主要页面
- kamailio安装页面