我写了一个Java服务器应用程序,用于我正在处理的软件解决scheme。
服务器使用multithreading来处理套接字和postgresql作为数据库。 我担心潜在的恶徒,就像现在,有人很容易就能通过反复快速地连接我的服务器。
基本上我正在寻找一种方法来接受来自计算机的连接,这些计算机在过去一秒钟之内还没有连接。 我想我可以注册所有的连接,并设置一个计时器,但我也认为,服务器可能仍然过载,不得不同时检查多个连接,尽pipe没有计时器那么多。
我search了stackoverflow和serverfault没有结果这个特定的问题:/。
设置非常简单。 所有连接都在主要方法中被接受并被转发到相应的线程:
public static void main(String[] args) { gui = new mainFrame(); try { ServerSocket serverSock = new ServerSocket(80); while (true) { Socket sock = serverSock.accept(); new Thread(new listenThread(sock)).start(); } } catch (IOException ex) { methods.log("Couldn't create server"); ex.printStackTrace(); } }
将不胜感激任何帮助。 麦克风。
你可以在操作系统级别用iptables来解决这个问题。 下面的代码是从debian linux,YMMV下载的。 它将在60秒的时间内将连接数限制为3。
iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --set iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
这假设你在端口5432上运行你的postgresql服务器,而eth0是面向互联网的卡。
如果还有其他端口需要限制,您可以更换端口号。
来源和更多的例子(对于SSH,端口22) http://www.debian-administration.org/articles/187
OSSEC有一个叫做“主动回复”的东西,用于查看服务器日志,如果某些规则被破坏了,例如用户尝试login到SSH,如果密码失败的次数超过5次,它将阻止IP地址达到设定值的时间。
你可以保留一个这样的列表,但正如你所指出的那样,它会得到广泛的。 一旦策略是为列表中的不同项目设置到期时间,那么您为受阻用户检查的列表不会那么广泛。
这是非常概念化的,没有更多的细节,你的设置,我无法帮助你更多。
一个简单的解决scheme就是使用数据库服务器的连接池。 这将是限制数据库和服务器负载的一个自然瓶颈。
或者把你的应用放在一个基本的web服务器之后,这个服务器实现工作者线程并限制线程的数量(或者在你的应用中实现相同的function)