介绍
运行在公网的FreeSWITCH服务器,每天都会接收到很多恶意的呼叫请求和注册请求,尝试盗打电话。合理的配置可以防止电话给倒打,但是每天大量的攻击,会让FS产生很多日志,降低FreeSWITCH的处理能力,cti模块结合fail2ban可以把恶意IP,使用防火墙封堵掉。
防盗打配置
非常重要的,不要开通国际长途。其次对于呼出拨号方案和呼入路由要小心配置。
- sip配置里面的external默认是可以任意呼入,默认的呼叫路由是public,public这个路由绝对不要启用呼叫外线功能。
- sip配置里面如果新加了sip项目也同第一点。
- sip配置里面的internal这个是用来分机注册的,auth-calls 必须是勾选,千万不能吧这个勾选去除。
- 分机配置里分机密码设置复杂些。不要勾选allow-empty-apssword。
- 对于提供给网关注册的分机的呼叫路由改成pulibc。
- 呼叫外线的拨号方案要谨慎启用。如果不需要分机拨打外线,千万不要启用呼叫外线的拨号方案,有分机拨打外线的需求是只能在internal路由可以启用呼叫外线的拨号方案。启用了呼叫外线,要确定sip->internal->auth-calls 是勾选的,所有分机密码也要改成足够复杂的,并且要测试一下注册错误的情况下,直接拨号是否可以拨打出去,来验证配置准确无误。
- 如果只有浏览器(wss)可以拨打外线,可以把sip->internal->sip-port 配置的 udp的sip端口防火墙封了去,只放开wss端口。
限制呼入
建议external可以设置成只有指定的IP才可以呼入,设置方法如下
- sip设置external的apply-inbound-acl设置为inbound,auth-calls 不要勾选,注意internal的auth-calls 必须勾选。
- ccadmin的配置文件有acl.conf,就应该ccadmin->配置文件->acl.conf的inbound 添加允许的IP,对应的XML格式如下。
<list name="inbound" default="deny">
<node type="allow" cidr="允许呼入的IP1/32"/>
<node type="allow" cidr="允许呼入的IP2/32"/>
</list>
封堵原理
cti 模块发现注册失败或者 不规范的SIP报文,或者被叫号码不符合cti.json配置的规范,就写入日志到cti_fail2ban.log,fail2ban通过监视日志把恶意IP加入防火墙,封堵恶意IP。
CTI配置
cti.json 配置被叫号码规范
"fail2ban": { |
- filename 恶意访问记录文件名,如果不用绝对路径,默认路径是fs的日志目录。
- stination_number_max_len 被叫号码的最大长度
- denny_prefix 拒绝的被叫号码前缀
- allow_prefix 允许的被叫号码前缀,如果一个前缀都不配置,就是允许任意号码。如果配置了,只允许配置的前缀,非允许的号码就会自动拒绝。
fail2ban配置
以下是安装和配置fail2ban的过程。如果不安装fail2ban,只配置cti.json的规则,只能挂断不符合规范的呼叫,不能杜绝攻击,需要安装配置好fail2ban,把非法Ip加入防火墙黑名单。
为了防止开发测试过程误触发屏蔽规则,导致开发机器连接不上服务器,建议把开发电脑的外网IP加入白名单。
安装fail2ban
yum安装
yum install fail2ban -y
源代码安装
git clone https://github.com/fail2ban/fail2ban.git
或者
wget https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
tar xzvf 1.0.2.tar.gz
cd fail2ban-1.0.2
python setup.py install
cp build/fail2ban.service /usr/lib/systemd/system
编辑jail.conf
cd /etc/fail2ban
mv jail.conf jail.conf.local
vi jail.conf
把以下内容写如 jail.conf
[cti] |
配置说明:
- logpath 监视cti记录的异常IP日志。
- bantime 封堵时间,单位秒,86400秒就是24小时。
- maxretry findtime(180秒)时间内日志文件出现的IP超过maxretry(5)次就封堵。
- ignoreip ip白名单
设置日志文件权限
给/ddt/fs/log/目录修改安全上下文
chcon -R -t var_log_t /ddt/fs/log
也可以直接关闭sulinux,如果不修改安全上下文,会导致fail2ban启动失败
设置filter
vi /etc/fail2ban/filter.d/cti.conf
把以下内容写入 /etc/fail2ban/filter.d/cti.conf
[Definition] |
设置开机启动fail2ban
systemctl enable fail2ban
启动fail2ban
systemctl start fail2ban
查看fail2ban启动状态
systemctl status fail2ban
查看被ban IP,其中cti为名称
fail2ban-client status cti
如果 File list 看不到文件名,说明fs还没启动,需要先启动fs,然后“systemctl restart fail2ban”重启fail2ban,必须File list 看到了日志文件名才可以。
Status for the jail: cti
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| - File list: /ddt/fs/log/cti_fail2ban.log
- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list: 0
手动封堵一个IP
fail2ban-client set cti banip IP地址
手动解封一个IP
fail2ban-client set cti unbanip IP地址
添加白名单
fail2ban-client set cti addignoreip IP地址
删除白名单
fail2ban-client set cti delignoreip IP地址
查看被禁止的IP地址
iptables -L -n