![我怎样才能阻止 SipVicious ('friendly-scanner') 侵袭我的 SIP 服务器?](https://linux22.com/image/620045/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E9%98%BB%E6%AD%A2%20SipVicious%20('friendly-scanner')%20%E4%BE%B5%E8%A2%AD%E6%88%91%E7%9A%84%20SIP%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
我运行一个 SIP 服务器,它监听 UDP 端口 5060,并且需要接受来自公共互联网的经过身份验证的请求。
问题是,它偶尔会被扫描 SIP 服务器的人发现,然后他们整天坐在那里试图暴力破解服务器。我使用的凭证足够长,这种攻击永远不会奏效,但它很烦人,因为它占用了大量带宽。
我曾尝试设置 fail2ban 来读取 Asterisk 日志,并使用 iptables 禁止执行此操作的 IP,这样 Asterisk 在 10 次失败尝试后就无法查看传入的 SIP REGISTER 尝试(以我看到的攻击速度,这种情况在不到一秒的时间内就会发生)。但是,SipVicious 派生脚本在收到 ICMP 目标主机无法访问后不会立即停止发送 - 它们会继续用数据包攻击连接。它们停止的时间是可配置的,但不幸的是,进行此类暴力攻击的攻击者似乎通常会将超时时间设置得非常高(在看到 SIP 服务器的初始确认后,fail2ban 阻止他们获得任何 SIP 响应后,攻击仍会以高频率持续数小时)。
有没有办法让它停止向我的连接发送数据包?
答案1
许多攻击者使用的公开可用的 SipVicious 脚本会在收到没有 From: 行的无效 SIP 响应时立即停止攻击。您可以识别 SipVicious,因为它在 SIP 请求中将其 User-Agent 设置为 friendly-scanner。
使用这种技术对抗现实世界的攻击者,我能够立即阻止数据包的泛滥。您可以使用简单的脚本发送这样的数据包。例如:
cat >UnfriendlyScannerStopper.scala <<END
import java.net._
object UnfriendlyScannerStopper {
def main(args : Array[String]) : Unit = {
if (args.length < 2) {
System.out.println("Usage: FriendlyScannerStopper ipAddr port")
return
}
val udpSocket : DatagramSocket = new DatagramSocket();
val packetContents : String = "SIP/2.0 400 Go Away!!!\r\n\r\n"
udpSocket.send(new DatagramPacket(packetContents.getBytes("utf-8"), packetContents.size,
InetAddress.getByName(args(0)), Integer.parseInt(args(1))))
}
}
END
scala UnfriendlyScannerStopper.scala 188.138.107.179 5102
您需要将 188.138.107.179 和 5102 替换为您在攻击中发送的 SIP 数据包的 Via 标头中的地址和端口。
答案2
与上游提供商沟通。我的提供商有一个黑名单,其中包含一个 REST API,我可以向其提供 IP 地址。我设置了 fail2ban 来调用此 Web 服务,数据包在到达我的防火墙之前会在提供商网络中的某个地方被拦截。
答案3
没有人直接回答你的问题,所以:没有
您无法阻止某人向您的外围网关发送数据包。您能做的最好的事情就是阻止它们向上游发送(如上文提到的 longneck 所述),或者在防火墙处阻止它们。
Fail2ban 将根据失败攻击的次数触发(如您上面所述),因此另一种选择(或组合)是根据源 IP 的地理位置进行阻止。类似安全顾问或者一些硬件防火墙可以根据地理位置进行阻止,这将进一步减少到达服务器的数据包数量(参见www.telium.io)。
回到你最初的问题:不
答案4
这些 iptables 规则对我来说效果很好。在此类攻击期间,它们将 CPU 负载保持在 2% 以下。
http://txlab.wordpress.com/2013/06/29/protecting-a-vpbx-from-dos-attacks/