我运行自己的sip服务器(星号)。显然,我的sip服务器允许在不首先进行任何REGISTER的情况下执行INVITE。这导致了对我的服务器的许多不成功的攻击。是否有任何方法只允许来自成功注册的客户端的INVITE请求?通过星号还是iptables?
您需要在sip.conf.中将allowguest参数更改为no
查看下面的链接,了解更多关于星号中的安全提示:
http://blogs.digium.com/2009/03/28/sip-security/
到目前为止,我的研究告诉我,REGISTER仅用于星号访问或转发INVITES,而不是验证INVITE请求。当收到INVITE时,星号会尝试检查给定的用户名,如果用户名有效,则会向客户端发送407(需要身份验证)。然后客户端在响应中插入密码(已加密),并向服务器发送INVITE2。现在,服务器对用户进行身份验证,当凭据匹配时,继续建立调用。
结论:INVITE与REGISTER没有关系,所以我不可能只限制REGISTER客户端发送INVITE。
作为一种变通方法,我编写了自己的脚本。源位于https://github.com/naidu/JailMe
考虑一个真正的会话边界控制器,当你被黑客入侵时,它会很快为自己买单。然而,如果你想要一个"足够好"的选项,请继续阅读:
有一个名为"字符串"的iptables模块,它将在数据包中搜索给定的字符串。在SIP的情况下,我们希望在来自任何给定地址的第一个数据包中看到"REGISTER",因此将其与-m state --state NEW
或类似内容结合起来。之后,我们希望保持活动状态,以确保连接跟踪保持打开状态(通常Asterisk发送OPTIONS,但它可以发送空UDP)。无论如何,如果客户端在NAT后面,你都希望这样
这不是理想的解决方案,因为iptables无法确定注册是否成功,但至少我们可以坚持让另一个人尝试注册。下面链接的答案之一显示了iptables:中字符串模块的使用
https://security.stackexchange.com/questions/31957/test-firewall-rules-linux
你也可以在你的拨号计划中放入一个AGI脚本,进行一些额外的检查,可能会查看IP地址和扩展是否注册。。。确保INVITE来自相同的源IP。
Fail2Ban是阻止不必要流量的简单方法!fail2可以检查系统日志中的失败尝试,如果在指定时间内某个远程IP的失败尝试过多(超过定义的阈值),则Fail2可以将其视为攻击,然后在iptables中添加该IP地址以阻止来自该IP地址的任何类型的流量。以下链接可以帮助
http://www.voip-info.org/wiki/view/Fail2Ban+(带+iptables)+And+Asterisk
http://www.markinthedark.nl/news/ubuntu-linux-unix/70-configure-fail2ban-for-asterisk-centos-5.html