1

私の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.");
    }
}
4

2 に答える 2

4

DDoS に対処する方法はいくつかありますが、特定の部分を最適化する必要があります。

たとえば、checkLog関数は驚くほど高速である必要があるため、おそらく「ハッシュマップ」を使用してすばやく確認できますが、すべてが高速であることを確認するには、ConcurrentHashMap ( http://download .oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html )、より適切に読み書きできるようになります。

1 つのサーバーがすべてを実行する必要がないように、フロントエンドの負荷分散を検討することもできます。

サーバーで実行する必要があるアクションに応じて、誰かが認証されたことを確認する簡単な方法を見つけてください。

また、NIO ( http://tutorials.jenkov.com/java-nio/index.html ) を使用して、多数の接続へのスケーリングを改善することもできます。

于 2011-05-21T21:06:35.103 に答える
2

理想的には、悪意のあるリクエストがアプリケーションにまったくヒットしないようにし、トラフィックがアプリケーションサーバーに到達する前にトラフィックを傍受/ドロップすることをお勧めします。このようにして、攻撃の進行中にパフォーマンスが低下するなど、読み取りクライアントで問題が発生することはありません。

ServerFaultは、その道を進むつもりなら、尋ねるのに良い場所かもしれません。

于 2011-05-21T21:59:08.377 に答える