1.环境:
本文测试Kamailio 5.2 freeswitch 1.10.3 fs 和 kamailio 部署在阿里云公网ip:47.xx 内网172.xx
官方文档http://kb.asipto.com/freeswitch:kamailio-3.3.x-freeswitch-1.2.x-sbc
2.安装:
https://kamailio.org/docs/tutorials/5.2.x/kamailio-install-guide-git/ 5.2 其他的版本到https://www.kamailio.org/w/documentation/
一步步操作就行
fs 安装好 官方也有文档
3.官方说明
Following services are handled in the scenario built within document:
-
kamailio
-
user authentication
-
user registration
-
user location
-
call routing
-
instant messaging and presence
-
-
freeswitch
-
voicemail
-
conference
-
SBC - this can be used for topology hiding, transcoding, prepaid or playing audio messages within calls
-
other media services (announcement, ivr, a.s.o)
-
配置参考上面地址的就行主要是WITH_FREESWITCH 定义的地方全拷过去
里面 freeswitch.bindip配置为外网ip 端口用sip的internal_sip_port
注意下这个拨号的规定就行
switch($rU) {
case /"^41$":
# 41 - voicebox menu
# allow only authenticated users
if($au==$null)
{
sl_send_reply("403", "Not allowed");
exit;
}
$rU = "vm-" + $au;
break;
case /"^441[0-9][0-9]$":
# starting with 44 folowed by 1XY - direct call to voice box
strip(2);
route(FSVBOX);
break;
case /"^433[01][0-9][0-9]$":
# starting with 433 folowed by (0|1)XY - conference
strip(2);
break;
case /"^45[0-9]+$":
strip(2);
break;
default:
# offline - send to voicebox
if (!registered("location"))
{
route(FSVBOX);
exit;
}
# online - do bridging
prefix("kb-");
if(is_method("INVITE"))
{
# in case of failure - re-route to FreeSWITCH VoiceMail
t_on_failure("FAIL_FSVBOX");
}
}
注意下会议的拨号433000 和相互拨打的会加个prefix("kb-")前缀 fs日志看的到的到时候
启动kamailio 没错误就行
./sbin/kamailio -P /var/run/kamailio/kamailio.pid -m 128 -M 12
最后添加100 101两个用户
3.fs配置
修改conf/vars.xml里面的
<X-PRE-PROCESS cmd="set" data="internal_auth_calls=false"/> false
修改conf/autoload_configs/acl.conf.xml 为kamailio内网ip 和外网ip
<list name="domains" default="deny">
<node type="allow" domain="$${domain}"/>
<node type="allow" cidr="47.xx.xx.xx/32"/>
<node type="allow" cidr="172.xx.xx.xx/32"/>
</list>
修改 conf/dialplan/public.xml 注意为kamailio外网ip
<extension name="from_kamailio">
<condition field="network_addr" expression="^47\.xx\.xx\.xx$" />
<condition field="destination_number" expression="^(.+)$">
<action application="transfer" data="$1 XML default"/>
</condition>
</extension>
conf/dialplan/default.xml
<extension name="vbox">
<condition field="destination_number" expression="^vb-(1[0-9][0-9])$">
<action application="answer"/>
<action application="voicemail" data="default ${domain_name} $1"/>
</condition>
</extension>
<extension name="vmenu">
<condition field="destination_number" expression="^vm-(1[0-9][0-9])$">
<action application="voicemail" data="check default ${domain_name} $1"/>
</condition>
</extension>
<extension name="kbridge">
<condition field="destination_number" expression="^kb-(.+)$">
<action application="set" data="proxy_media=true"/> mod_sofia的proxy sdp 地址获取是空的 日志可以看到 sofia_glue.c:1620 sofia/internal/100@xx:6060 sending invite version: 1.10.3-release 64bit
<action application="set" data="call_timeout=50"/>
<action application="set" data="continue_on_fail=true"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="sip_invite_domain=192.168.178.23"/>//这里改成kamailio外网
<action application="export" data="sip_contact_user=ufs"/>
<action application="bridge" data="sofia/(fs外网IP)/$1@192.168.178.23"/>//这里改成kamailio外网
<action application="answer"/>
<action application="voicemail" data="default ${domain_name} $1"/>
</condition>
</extension>
好的基本可以了
100 用户登陆可以测试呼叫433000 参加会议
100 用户登陆可以测试呼叫101 相互通话
注意下default.xml的配置和fs 的nat 问题就没问题了
还可以 使用kamailio的pike 对注册ip的限制 屏蔽一些国外的不断注册 invite 也是如此
你还可以用2个kamailio做数据共享(dmq)多个代理
sbc用load_dispatcher 2个fs 共享数据库就行
交流群261074724 或技术help https://shop121230895.taobao.com/