公网Kamailio 代理 freeswitch 和做 sbc

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/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 介绍 - **Kamailio**:是一款开源的软交换系统,在SIP协议处理方面表现出色,常被用于SIP信令的路由、处理转发等操作。有良好的模块化架构,可通过加载不同的模块来扩展其功能,在通信领域应用广泛,能适应多种复杂的网络环境业务需求 [^1]。 - **FreeSWITCH**:同样为开源软交换系统,以强大的媒体处理能力著称,特别是其media_bug能力,是众多系统中最便捷最易使用的,可实现高效的音视频处理交换 [^1][^3]。 ### 功能 - **Kamailio**: - **信令处理**:能高效处理SIP信令,如在标准SIP网关的分布式开发中,可实现SIP信令的透传,避免对信令进行不必要的修改 [^2]。 - **地址处理**:会把网络地址网络端口加到contact头,在原来contact的基础上增加alias参数,还可将相关信息加到rr头里面 [^4]。 - **媒体流转发集成**:与rtpengine集成可实现SIP + RTP媒体流转发(包括音视频RTCP),支持多种用户场景,如无NAT、公私网双向呼叫、通过dispatcher模块对公私网两侧的多网关进行负载均衡 [^5]。 - **FreeSWITCH**:主要侧重于媒体处理,可进行高效的音视频编解码、混音、录制等操作,提供了丰富的媒体处理接口工具,方便开发者进行定制开发 [^3]。 ### 使用场景 - **Kamailio**:适用于对SIP信令处理要求较高、需要进行信令路由转发的场景,如标准SIP网关的分布式开发,可作为注册服务器使用,确保信令的准确传递 [^1][^2]。 - **FreeSWITCH**:适用于对媒体处理要求较高的场景,如音视频会议系统、呼叫中心等,可充分发挥其强大的媒体处理能力 [^1][^3]。 ### 代码示例 以下是Kamailio与rtpengine集成的部分核心配置代码: ```python # 模块加载与参数 loadmodule "rtpengine.so" modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:22222") # 可选参数,根据需要调整: # modparam("rtpengine", "rtpengine_tout_ms", 1000) # modparam("rtpengine", "rtpengine_retr", 5) # modparam("rtpengine", "hash_table_size", 2048) # modparam("rtpengine", "setid_avp", "$avp(rtpengine_setid)") # 核心函数调用 rtpengine_offer([flags]): 在处理初始INVITE时调用,用于协商媒体。 rtpengine_answer([flags]): 在处理2xx响应时调用,用于确认媒体协商。 rtpengine_delete([flags]): 在处理BYE或会话结束时调用,用于释放rtpengine资源。 rtpengine_manage([flags]): 一个更通用的函数,可以替代rtpengine_offerrtpengine_answer,并提供更多灵活性。通常建议使用rtpengine_manage。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值