2011-10-17 57 views
2

上下文:由于DOS攻击,我有一张禁止ip地址表,位于我程序内存某处的某个集合中。java socket:在接受之前收听?

我使用TCP服务器套接字,接受每个连接,然后检查IP地址,然后我关闭连接或继续处理客户端。

我想知道在Java中是否有可能侦听TCP服务器套接字上的连接,并且接受或拒绝某种方式建立tcp链接(给定请求客户端的IP地址)。我的意思是不必接受&来关闭客户端套接字,这正是我已经在做的事情。

谢谢。

回答

6

如果不使用SecurityManager,则只能接受,然后检查传入的IP地址,并在连接被禁止列表中时删除该连接。使用SecurityManager,你可以让它发出SecurityException,并给它特殊的处理(例如在应用中的安全日志中记录连接请求)。

如果你不希望这些连接甚至打你的服务器(我猜测这是重点),你真的想在防火墙级别阻止它。一旦连接击中你的应用程序,它已经占用了与你的应用程序交谈所需的内存和资源,所以那时你已经失去了DOS/DDOS游戏。

在接受之前或之后删除它并不重要,因为连接已经达到应用程序的应用程序级别。即使使用SecurityManager,它仍然会增加服务器的负载。

+0

不知道! – Joel

2

您可能可以,但是无论如何,您无法阻止他们在您的Java代码中访问您的系统。

最好的办法是,不要使用Java,而应使用诸如iptables之类的东西或其他防火墙来立即丢弃它们的数据包。

在serverfault的男孩可能比SO更好地帮助。

1

如果您可以遵守在.policy文件中定义的地址,或者编写自己的Policy对象,则可以使用带有合适的SocketPermissions定义的SecurityManager。

编辑:但我不得不承认,防火墙将是一个更好的解决方案。

+0

如何将安全管理器对象与我的应用程序和服务器套接字连接起来? – Joel

+1

'System.setSecurityManager(new SecurityManager());' – EJP