Java 登录服务器防洪保护

标签 java ddos denial-of-service flooding

我的 Java 服务器目前正受到数千个不同 IP 的 DDoS 攻击。为了应对它,我一直在通过专用服务器防火墙阻止 ip。然而,越来越多的人不断涌现。这次攻击淹没了我的登录服务器,导致玩家无法登录。

我已经在其他地方询问过,例如我的 Java 应用程序类型的论坛,但我几乎没有得到任何答案。但是他们告诉我这是 DDoS 的一种形式,另一个用户也向我推荐了这个,但我认为这不会奏效。 http://www.java2s.com/Open-Source/Java-Document/Net/mina-2.0.0-M1/org/apache/mina/filter/firewall/ConnectionThrottleFilter.java.htm

显然这是我的登录服务器上的 DoS,有人有任何线索吗?下面我将提供登录服务器的主要框架。

try {
    shutdownClientHandler = false;
    clientListener = new java.net.ServerSocket(serverlistenerPort, 1, null);
    misc.println("Login server is now online!");
    while (true) {
    try {
        java.net.Socket s = clientListener.accept();
        s.setTcpNoDelay(true);
        String connectingHost = s.getInetAddress().getHostName();
        if (true) {
            if (checkLog("flooders", connectingHost)) {
                //misc.println("Flooder Detected, closing connection.");
                s.close(); // Closes the connection immediately.
            } else {
                connections.add(connectingHost);
                if (checkHost(connectingHost)) {
                    misc.println("Connection from "+connectingHost+":"+s.getPort());
                    try {
                        playerHandler.newPlayerClient(s, connectingHost);
                    } catch (Exception E) {misc.println("Login Server crash detected. Protecting...");
                    s.close();
                }
            } else {
                misc.println("ClientHandler: Rejected "+connectingHost+":"+s.getPort());
                s.close();
            }
        }
        } else {
            misc.println("ClientHandler: Rejected "+connectingHost+":"+s.getPort());
            s.close();
        }
        Thread.sleep(30;
    } catch (Exception e) {
        logError(e.getMessage());
    }
    }
} catch (java.io.IOException ioe) {
    if (!shutdownClientHandler) {
        misc.println("World is already online!");
    } else {
        misc.println("ClientHandler was shut down.");
    }
}

最佳答案

有几个选项可以尝试处理 DDoS,但您需要对某些部分进行优化。

例如,您的 checkLog 函数需要非常快,因此您可能想要使用“ HashMap ”,这样您就可以快速检查,但是,为了确保一切都快速进行,您可能需要查看 ConcurrentHashMap ( http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html ),以便更好地读写它。

您还可以考虑对前端进行负载平衡,这样一台服务器就不必做所有事情。

根据需要在服务器上执行的操作,找到一种快速方法来验证某人是否已通过身份验证,但如果您没有特殊硬件来更好地处理 token 解密,这可能会降低您的服务器速度,例如。

您可能还想看看使用 NIO ( http://tutorials.jenkov.com/java-nio/index.html ),以更好地扩展到大量连接。

关于Java 登录服务器防洪保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084270/

相关文章:

linux - 为什么 Sockstress "Low and Slow DoS Attack"需要 Fantaip?

java - 如何检测 Servlet 内的 ping?

java - amchart - 使用相同 X 轴的多个 Y 轴

java - android studio gradle问题:找不到com.android.tools.build:gradle:3.5.0

java - Apache Camel : How to send two http requests in parallel and wait for the responses?

java - 修改 switch 语句内的变量以便在 switch 外部使用

azure - 如果 Windows Azure 网站遭到 DDOS 攻击,会发生什么情况?

azure - 如果 Google 更改其 A 记录以指向我的 Azure 应用服务,会发生什么情况?

javascript - 如何防止对我用 node.js 编写的 http 服务器的 DOS 攻击?

playframework - Play 框架中的请求队列