内网有一台FreeSWITCH配置有SIP线路,手机在内网环境时,可以软电话直接注册到FS上从而使用SIP线路呼出,但是在公网环境时没有VPN则不方便使用。
如果在公网环境有一台服务器,可以在上面部署一台FS,将内网的FS注册到公网的FS上面,软电话注册到公网FS,再通过内网的FS从内网的线路呼出。
在 conf/sip_profiles/external/ 目录中新建一个网关配置
<include> <gateway name="GWFS"> <param name="realm" value="1.2.3.4:5080"/> <!-- 公网FS的IP和服务端口 --> <param name="username" value="1003"/> <!-- 任意一个未注册的分机 --> <param name="password" value="password"/> <param name="extension-in-contact" value="true"/> <!-- 使Contact中的SIP地址为1003分机号而不是“gw+” --> <param name="ping" value="25"/> <!-- 避免过一段时间就找不到用户 --> </gateway> </include>在 fs_cli 中执行 sofia profile external register GWFS 或 sofia profile external rescan 注册该分机。
注册成功在公网FS fs_cli 中执行 show registrations 应该可以看到成功注册的 1003 分机。
在default dialplan中进行路由,将呼叫 bridge 到内网FS,并将Contact中的 1003 换成要拨打的号码。
<extension name="FS"> <condition field="destination_number" expression="^(00.*)$"> <action application="bridge" data="${regex(${sofia_contact(internal/1003)}|^(.*)sip:1003@(.*)|%1sip:$1@%2)}"/> </condition> </extension>这里的 1003 是第1步注册使用的分机号, 00 是路由过滤的前缀,外拨时需要加到号码前。
在public dialplan中进行路由,将呼叫 bridge 到线路网关。
<extension name="FS pub"> <condition field="destination_number" expression="^00(.*)$"> <action application="bridge" data="sofia/gateway/GWSIP/$1"/> </condition> </extension>这里的 GWSIP 是线路网关的名字。
使用时,公网环境中的手机软电话先注册到公网FS上,然后拨打 0018812345678 即可使用内网的SIP线路呼出,显示的号码为线路的外显号码。