上下文:由于 DOS 攻击,我在程序内存某处的集合中有一张禁止 IP 地址表。
我使用 TCP 服务器套接字,接受每个连接,然后检查 IP 地址,然后关闭连接或继续处理客户端。
我想知道是否有可能在 Java 中侦听 TCP 服务器套接字上的传入连接,并在给定请求客户端的 IP 地址的情况下以某种方式接受或拒绝建立 tcp 链接。我的意思是不必接受 & 来关闭客户端套接字,这是我已经在做的。
谢谢。
上下文:由于 DOS 攻击,我在程序内存某处的集合中有一张禁止 IP 地址表。
我使用 TCP 服务器套接字,接受每个连接,然后检查 IP 地址,然后关闭连接或继续处理客户端。
我想知道是否有可能在 Java 中侦听 TCP 服务器套接字上的传入连接,并在给定请求客户端的 IP 地址的情况下以某种方式接受或拒绝建立 tcp 链接。我的意思是不必接受 & 来关闭客户端套接字,这是我已经在做的。
谢谢。
如果不使用SecurityManager,您只能接受,然后检查传入的 IP 地址,如果连接在禁止列表中,则断开连接。使用SecurityManager,您可以让它抛出SecurityException,并对其进行特殊处理(例如将连接请求记录在应用程序的安全日志中)。
如果您不希望这些连接甚至访问您的服务器(我猜这就是重点),您真的想在防火墙级别阻止它。一旦连接到达您的应用程序,它就已经占用了与您的应用程序通信所需的内存和资源,因此您已经失去了 DOS/DDOS 游戏。
在接受之前或之后删除它并不重要,因为连接已经到达应用程序的应用程序级别。即使使用SecurityManager,它仍然会增加服务器上的负载。
您也许可以,但无论如何您都无法阻止他们在您的 Java 代码中访问您的系统。
您最好的选择是,不使用 Java,而是使用类似iptables
防火墙或其他防火墙来立即丢弃他们的数据包。
serverfault 的男孩们可能比 SO 能更好地帮助解决这个问题。
如果您可以遵守在 .policy 文件中定义的地址,或者编写自己的 Policy 对象,则可以使用定义了合适的接受 SocketPermissions 的 SecurityManager。
编辑:但我不得不承认防火墙将是一个更好的解决方案。