它写在日志中:
=INFO REPORT==== 2012-03-14 17:48:54 === I(<0.467.0>:ejabberd_listener:281) : (#Port<0.4384>) Accepted connection {{10,254,239,2},51986} -> {{10,254,239,1},5222} =INFO REPORT==== 2012-03-14 17:48:54 === I(<0.1308.0>:ejabberd_c2s:784) : ({socket_state,tls,{tlssock,#Port<0.4384>,#Port<0.4386>},<0.1307.0>}) Failed authentication for USERNAME =INFO REPORT==== 2012-03-14 17:48:54 === I(<0.1308.0>:ejabberd_c2s:649) : ({socket_state,tls,{tlssock,#Port<0.4384>,#Port<0.4386>},<0.1307.0>}) Failed authentication for USERNAME
它不会写入IP失败。
和string“接受连接”和“失败身份validation”可能甚至不能站在附近(如我认为在负载较重的服务器),以便能够使用fail2ban。
该怎么办? 以及如何jabber服务器(使用ejabberd)受到保护?
您可以使用iptables来限制IP地址每分钟可以尝试的连接尝试次数。 由于这些是自动化攻击,大部分时间,脚本一旦被阻塞就会移动到另一个目标。
这个例子是为TCP端口22(ssh),并将允许每分钟3连接尝试从IP地址丢弃数据包之前。
iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 1/m --limit-burst 3 -j ACCEPT iptables -A INPUT -p tcp --dport 22 --syn -j DROP
fail2ban将在iptables之上提供一个有用的附加逻辑层。 ejabberd网站上的一个请求提出了使用log_modsession来使用fail2ban的可能方法。 它包含在ejabberd模块中 。
要logging失败的authentication尝试,ejabberd的核心需要修补。 幸运的是,虽然log_modsession与该补丁一起提供,所以您只需要应用它并重新编译ejabberd。
另一种方法是使用fail2ban使用的相同方法,因为他们使用文件变更监视器(fam)库,我想我们可以创build一个自定义守护进程来监视ejabberd日志文件并以与fail2ban兼容的格式输出, python和Perl的绑定。
有时调整另一个程序的来源,以适应您的需求增加了一个额外的下载/补丁/编译工作,所以你不能从你的发行版安全更新中受益,你必须做的工作,另一方面,您可以提交您的补丁给负责ejabberd的作者,等待他们的回答,如果他们发现有价值的,整个社会可以受益。
但恕我直言,我会去与自定义守护进程。