freeswitch系列二 kamailio 5.0安装及实现kamailio集成freeswitch

4,694 阅读2分钟
原文链接: blog.csdn.net

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. 参考文献