【问题标题】:java socket: listen before accept?java socket:在接受之前听?
【发布时间】:2011-10-17 23:50:40
【问题描述】:

上下文:由于 DOS 攻击,我在我的程序内存某处的集合中有一个禁止 IP 地址表。

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

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

谢谢。

【问题讨论】:

    标签: java security tcp serversocket


    【解决方案1】:

    如果不使用SecurityManager,您只能接受,然后检查传入的 IP 地址,如果它在禁止列表中则断开连接。使用SecurityManager,您可以让它抛出SecurityException,并对其进行特殊处理(例如在应用程序的安全日志中记录连接请求)。

    如果您甚至不希望这些连接访问您的服务器(我猜这就是重点),那么您真的想在防火墙级别阻止它。一旦连接到达您的应用程序,它就已经占用了与您的应用程序通信所需的内存和资源,因此您已经失去了 DOS/DDOS 游戏。

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

    【讨论】:

      【解决方案2】:

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

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

      serverfault 那边的男孩们可能比 SO 能更好地帮助解决这个问题。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 请问如何将安全管理器对象与我的应用程序和服务器套接字连接起来?
        • System.setSecurityManager(new SecurityManager());
        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        相关资源
        最近更新 更多