Защита сервера входа Java от наводнений

#java #dos #protection #flooding

#java #ddos #отказ в обслуживании #наводнение

Вопрос:

в настоящее время мой Java-сервер подвергается DDoS-атаке с тысяч разных IP-адресов. Чтобы противостоять этому, я заблокировал 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.");
    }
}
  

Ответ №1:

Есть несколько вариантов, чтобы попытаться справиться с DDoS, но вам нужно убедиться, что определенные части оптимизированы.

Например, ваша checkLog функция должна быть удивительно быстрой, поэтому вы можете захотеть использовать ‘hashmap’, возможно, чтобы вы могли быстро проверить, но, чтобы убедиться, что все идет быстро, вы можете захотеть взглянуть на 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), для лучшего масштабирования до большого количества подключений.

Комментарии:

1. Спасибо Джеймс, я заменил метод checklog на hashmap и попытался переключиться с ввода-вывода на MINA, однако возникли проблемы с этим, так что, возможно, в другой раз, есть еще предложения?

2. Создайте профиль своего приложения и посмотрите, где происходят замедления.

Ответ №2:

В идеале вы бы вообще не хотели, чтобы вредоносные запросы попадали в ваше приложение, а скорее перехватывали / отбрасывали трафик до того, как он достигнет ваших серверов приложений. Таким образом, ваши клиенты read не столкнутся с какими-либо проблемами, например, со снижением производительности во время атаки.

Ошибка сервера может быть хорошим местом, чтобы спросить, собираетесь ли вы идти по этому пути.