1

我的 java 服务器目前正被数千个不同的 ip 进行 DDoSed。为了应对它,我一直在通过专用服务器防火墙阻止 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.");
    }
}
4

2 回答 2

4

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

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

您还可以查看前端的负载平衡,以便一台服务器不必做所有事情。

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

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

于 2011-05-21T21:06:35.103 回答
2

理想情况下,您根本不希望恶意请求攻击您的应用程序,而是在流量到达您的应用程序服务器之前拦截/丢弃流量。这样,您的读取客户端将不会遇到任何问题,例如在攻击进行时性能下降。

如果您打算沿着这条路走下去,ServerFault可能是一个很好的询问处。

于 2011-05-21T21:59:08.377 回答