说明:
在测试fusionpbx时,用户需要对阿里云安全策略有一定的了解,用户需要对FreeSWITCH的基础配置有一定的了解。
测试环境包括:基于阿里云的FusionPBX,SIP trunk, 和落地网关和SIP终端。具体拓扑示例如下:
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093139906.jpg)
简单配置说明:
- 用户呼出呼入使用SIP trunk 和FXO/E1/LET方式实现
- 分机可以支持安卓版本的SIP APP,电脑端 SIP终端和物理SIP话机
- 在云服务器配置必要的安全策略
基于云平台的fusionpbx可以应用的业务场景:
- 分公司员工异地通信(无需VPN异地部署,各地分机直接注册到云PBX,支持安卓苹果SIP客户端,支持基于PC的SIP 软电话,支持物理SIP 终端)
- 云通信对讲平台对接
- 跨国公司之间的沟通
1通过脚本安装FusionPBX
FusionPBX官方提供了各种开源操作系统支持的安装方式,为了安装方便,保证成功安装,笔者建议用户安装Debian操作系统。所以在开启云实例前,选择Debian系统。其他系统包括FreeSWITCH官方也不推荐,因此,为了节省时间,建议用户使用Debian比较新的版本。再次提醒,如果安装云平台的话,基于国内客户使用清华的源来更新系统的支持包,否则会相当慢。
首先下载官方的安装脚本,但是,官方脚本我们国内可能访问有问题,用户使用VPN方式获得脚本代码,保存到示例中。
wget -O - https://raw.githubusercontent.com/fusionpbx/fusionpbx-install.sh/master/debian/pre-install.sh | sh;
cd /usr/src/fusionpbx-install.sh/debian && ./install.sh
注意,如果国内用户访问以上链接时,其链接已经被屏蔽,如果需要获取安装脚本的话,用户需要通过VPN获得此脚本。
#!/bin/sh
#upgrade the packages
apt-get update && apt-get upgrade -y // debian 或者centos 使用不同命令-yum
#install packages
apt-get install -y git lsb-release
#get the install script
cd /usr/src && git clone https://github.com/fusionpbx/fusionpbx-install.sh.git
#change the working directory
cd /usr/src/fusionpbx-install.sh/debian
或者切换到centos 路径下安装centos系统资源支持包
注意,我们需要访问github,最近国内访问github非常慢,我们需要访问github的fusionpbx代码,所以,我们需要修改github.com 切换到github加速的域名上,访问速度会比较快。因此,用户需要修改install.sh 脚本中fusionpbx的访问路径来加速。
修改好了install.php 以后,然后执行安装脚本:
./install.sh的安装命令,一步步安装系统支持包,fusionpbx 包和freeswitch支持包,数据库配置,最好提示安装的IP地址和访问界面。
这里,如果无需FreeSWITCH高清语音支持的话,可以移除下载安装命令。
如果一切正常的话,安装完成后会显示用户名称和其数据库,界面登录密码。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093101959.jpg)
如果出现80端口被占用的错误的话,用户可以移除apache2 或者关闭其服务,或者修改apache2端口。
官方没有ISO镜像文件,用户只能通过脚本安装。如果是后期再次使用的话,基于用户自己手动下载源代码,然后拷贝到目的地链接,无需通过github下载。因为是基于互联网环境的安装,用户每次安装不能保证其版本和连接正常,因此会带来很多维护的不确定性。
2配置FusionPBX的SIP trunk
为了实现呼入呼出的测试,我们使用SIP trunk的方式来进行接入支持。SIP trunk配置非常简单,在账号子菜单中网关中添加SIP trunk IP,用户名称和密码即可。然后在ACL中添加SIP trunk 地址 允许设置。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093101682.jpg)
reload sip external 设置,可以看到SIP trunk已经注册成功。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093102813.jpg)
注意,一般运营商提供的对接是5060端口,FusionPBX的外部端口是5080端口,所以在配置时用户需要核实具体配置。如果需要对接5060端口,需要特别在SIP IP地址处指定,当然如果用户熟悉freeswitch的话,也可以通过xml修改,或者通过fusionpbx 高级设置中修改全局变量。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093030692.jpg)
3通过FusionPBX设置SIP trunk呼入呼出
因为FusinPBX的很多设置需要特别注意,因此,笔者把这些配置步骤都分开介绍。FusionPBX设置呼入呼出相对比较迷惑,用户需要使用不同浏览器多次配置才能保证其呼叫正常。简单配置的方式是,用户通过拨号规则子菜单提供目的地设置选择呼入还是呼出的方式进行设置。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093453545.jpg)
点击“show all”才能看到所有配置
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093521429.jpg)
通过SIP trunk 呼入路由,路由到分机 100:
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093522129.jpg)
配置呼出方式:
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093734398.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093522370.jpg)
用户如果自己可以修改xml的话,也可以修改xml文件实现非常灵活的配置:
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094115233.jpg)
以上配置中,呼出号码是15位号码(国际长途呼叫手机)。但是,在Fusionpbx环境中,笔者不建议这样使用。这样的配置和界面看到的配置有时可能是完全不同的,数据不能同步,这样会导致后期很多的维护问题,并且增加了系统的风险。
4FusionPBX呼入呼出配置界面存在的一些问题
通过FusionPBX设置呼入呼出时,因为可以通过编辑xml文件来实现某些特定的路由功能,因此用户需要注意修改记录的维护。
图片界面显示的语法和xml原始xml配置不同。用户需要手动添加到界面。如果需要通过界面修改语法的话,用户一定要非常熟悉FreeSWITCH的语法配置。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094115923.jpg)
点击目的地设置以后,没有显示分机选项。需要换不同浏览器测试或者重新刷新。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322093909205.jpg)
通过SIP 分机呼叫国内手机号码,手机接听。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094622711.jpg)
呼入以后,转分机100
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094621559.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094523865.jpg)
5云FusionPBX通过落地网关实现呼入呼出
这里,我们讨论通过落地网关实现云Fusionpbx 呼入呼出的设置。因为相关部门对SIP trunk的管理不断的规范,一些SIP trunk,甚至是正常的SIP trunk 双向呼叫有时会遇到问题,一些客户不得不使用落地网关的方式来实现企业通信的业务需求。但是,因为云FusionPBX在外网环境中,通过落地网关对接云FusionPBX的话,网关需要注册到FusionPBX(一般,同一网段直接通过IP对接)。比较头疼的是,FusionPBX本身的设计初衷是针对SIP trunk来支持呼入呼出的,它本身并没有一个良好的配置方式来支持落地网关的路由。网关注册到fusionPBX的话,网关可以作为一个SIP账号的方式实现注册,呼入呼出时通过bridge的方式桥接到这个SIP 分机。因此,用户需要首先在SIP 分机注册的基础上,再添加一个桥接方式:
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094523566.jpg)
然后,如果用户需要呼出的时候,选择桥接的地址。FusionPBX 通过桥接呼叫到分机1000(网关分机),然后出局。注意,目的地地址的IP的分机的设置地址,用户需要根据FreeSWITCH的语法自己手动添加。界面无选择选项和提示,可能会让用户非常迷惑。有时,填写了错误的语法,系统也可能不会提示错误。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094621130.jpg)
如果用户需要通过界面控制注册分机的呼入呼出的话,用户需要修改界面很多配置选项,例如context配置,xml配置选项。如果在呼入流程中涉及到其他业务处理的话,如果使用分机网关注册的方式的话,控制界面就很难实现对其业务层面的管理。另外,因为fusionpbx可以实现多租户的方式,如果多租户方式在呼入路由方面有很多不同的路由策略的话,fusionpbx不修改xml文件很难实现其丰富的呼入路由功能,界面管理就会非常复杂或者失控。所以,如果用户需要通过分机网关注册模式对云FusionPBX实现双向呼叫的话,简单的办法就是通过修改xml文件来实现。我们在测试环境中使用了openvox的无线落地网关,在xml配置落地网关可以实现呼入呼出的功能。
在Openvox的无线网关设置中,呼入设置的话,可以修改xml文件来指定路由规则。
首先,修改freeswitch 配置文件/etc/freeswitch/dialplan/default.xml (呼出规则)
<extension name="gw">
<condition field="${sofia_contact(1008@$${local_ip_v4})}" expression="^sofia\/internal\/sip:s\@(.*)$" break="never">
<action application="set" data="openvox=$1"/>
</condition>
<condition field="destination_number" expression="^55(\d{+})$">
<action application="bridge" data="SOFIA/internal/$1@${openvox}"/>
</condition>
</extension>
以55开头的号码匹配此规则,改匹配规则可以自动获取分机1008注册的IP和端口号。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322094621988.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322112409149.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322112307896.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322112537300.jpg)
此处前传号码即为呼叫的DID,可以自己定义号码,修改/etc/freeswitch/dialplan/default.xml 处匹配此号码后做相应的操作
综上所述,笔者介绍了各种落地路由的问题和维护带来的隐患。如果用户在云平台部署了FusionPBX需要通过网关落地的话,笔者只能建议通过修改xml配置文件,然后通过桥接方式出局。FusionPBX界面控制策略。
所以,为了保证界面控制的可维护性和配置便捷性,用户如果非必要,尽量通过SIP trunk的方式来实现呼入呼出路由。
6FusionPBX其他配置的讨论
笔者通过一点时间的测试和一些客户反馈发现FusionPBX仍然有许多地方需要做大量的优化和改进才能满足市场中IPPBX产品的需求。因为没有经过完整的功能测试,目前用户反馈的问题是:
- 中文界面汉化需要大量的配置文件的修改,有时需要涉及数据库内容修改。
- 界面配置风格可以灵活配置,但是,如果针对多租户用户容易导致用户对配置信息位置错误理解。
- 界面填写的很多参数缺乏强制选项和提示说明,用户很可能出现参数填写错误。如果用户不是一个FreeSWITCH专业工程师的话,他们就很难对FusionPBX配置有一个完整清晰的认识。
- 全局变量设置和具体的每个配置文件XML配置可能会产生冲突,多个配置文件同时支持对一个参数的配置,需要数据能够及时同步。笔者通常也会遇到这样的问题,修改了SIP 内部文件的端口以后,但是界面仍然显示历史端口,重新刷新也不一定能够保证同步。这样就会导致系统排查困难。
- 目前,根据笔者测试,fusionpbx界面系统对微软浏览器Edge支持相对比较好,谷歌浏览器相对比较差。例如,一些验证码(不能显示)或者分机(呼入路由选择中有时不能显示)。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322113032995.jpg)
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322112757381.jpg)
不同浏览器可能会出现验证码显示错误。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322113031174.jpg)
7如何在FusionPBX添加Fail2ban
因为在云平台部署,外网攻击是经常遇到的问题。除了通过SBC来过滤这些IP地址以外,用户只能通过Fail2ban 实现对IP地址的关联。因此,我们首先建议用户在没有SBC的前提下,使用fail2ban来降低一点安全风险,通过简单过滤方式对非法注册地址进行过滤。
![](http://www.ctiforum.com/uploadfile/2021/0322/20210322113031399.jpg)
配置fail2ban配置流程如下, 通过界面在拨号规则中增加一个对呼入路由的处理规则:
添加一个名称 no-found,号码是*, context 是public。因为是呼入的,当然需要从public开始过滤。
Tag Type Data Order
condition context public 10
action set call_direction=inbound 60
action log [inbound routes] 404 not found ${sip_network_ip} 100
Order: 999
Enabled: True
Description: Log invalid attempts
3. 手动修改fail2ban 对FreeSWITHC的配置文件支持(文件路径 是/etc/fail2ban/filter.d/fusionpbx-inbound.conf)
# Fail2Ban configuration file
# inbound route - 404 not found
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
#
#failregex = [hostname] FusionPBX: \[<HOST>\] authentication failed
#[hostname] variable doesn't seem to work in every case. Do this instead:
failregex = 404 not found <HOST>
#EXECUTE sofia/external/9999555150@domain.tld log([inbound routes] 404 not found 82.68.115.62)
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Edit /etc/fail2ban/jail.local
[fusionpbx-inbound]
enabled = true
port = 5080
protocol = udp
filter = fusionpbx-inbound
#logpath = /usr/local/freeswitch/log/freeswitch.log
logpath = /var/log/freeswitch/freeswitch.log
action = iptables-allports[name=fusionpbx-inbound, protocol=all]
# sendmail-whois[name=fusionpbx-inbound, dest=root, sender=fail2ban@example.org] #no smtp server installed
maxretry = 5
findtime = 300
bantime = 3600
重新启动fail2ban:
/etc/init.d/fail2ban restart
执行脚本,对fail2ban升级处理:
cd /usr/src/fusionpbx-install.sh/debian/resources/
./fail2ban.sh
cd /etc/fail2ban
nano jail.local
然后重新设置配置,默认是false,修改为true。
[freeswitch-ip-tcp]
enabled = true
[freeswitch-ip-udp]
enabled = true
jail.conf
bantime increase it to a larger number
bantime
86400 = 1 day
3600 = 1 hour
-1 = until restart
然后重新启动fail2ban:
service fail2ban restart
7总结
本文章中对开源FreeSWITHC界面管理系统-FusionPBX的呼入呼出路由的配置策略做了完整说明,包括通过SIP trunk 呼入呼出配置,通过落地网关呼入呼出时在界面管理方面遇到的问题,还有在使用过程中,fuisonpbx的一些兼容性问题,界面变量配置问题的讨论和如何通过fail2ban来实现对非法注册的IP进行过滤的设置。
在未来的部署测试中,笔者将继续针对fusionpbx的其他功能,例如WebRTC配置,振铃组设置,IVR,呼叫队列,亿联话机自动部署,方位话机自动部署等功能进行详细介绍。
参考资料:
www.fusionpbx.com
www.freesbc.cn
- 关于Asterisk文档,参考:www.asterisk.org.cn
- 融合通信/IPPBX/FreePBX商业解决方案:www.hiastar.com
- 最新Asterisk完整中文用户手册详解:www.asterisk.org.cn
- Freepbx/FreeSBC技术文档: www.freepbx.org.cn
- 如何使用免费会话边界控制器-FreeSBC,qq技术分享群:334023047
- 关注微信公众号:asterisk-cn,获得有价值的通信行业技术分享