Я написал приложение сервера Java для программного решения, с которым я возился.
Сервер использует многопоточность для обработки сокетов и postgresql как базы данных. Меня беспокоят потенциальные злоумышленники, так как прямо сейчас кто-то легко сможет вмешаться в мой сервер, многократно подключаясь очень быстро.
В основном я ищу способ принимать соединения только от компьютеров, которые не подключались в течение последней секунды или ж / д. Я решил, что могу зарегистрировать все подключения и установить таймер, но я также подумал, что сервер все еще может быть перегружен из-за необходимости проверять множество подключений одновременно, хотя и не так сильно, как это было бы без таймера.
Я искал stackoverflow и serverfault безрезультатно для этой конкретной проблемы: /.
Настройка действительно проста. Все соединения принимаются в основном методе и перенаправляются в соответствующий поток:
public static void main(String[] args) {
gui = new mainFrame();
try {
ServerSocket serverSock = new ServerSocket(80);
while (true) {
Socket sock = serverSock.accept();
new Thread(new listenThread(sock)).start();
}
} catch (IOException ex) {
methods.log("Couldn't create server");
ex.printStackTrace();
}
}
Был бы признателен за любую помощь. Майк.
У OSSEC есть что-то под названием «Активный ответ», которое просматривает журналы сервера, и если определенные правила нарушены, например, пользователь пытается войти в SSH с неудачным паролем более 5 раз, он заблокирует IP-адрес на установленную сумму. времени.
Вы можете вести такой список, но, как вы заметили, он будет обширным. Однажды стратегия будет состоять в том, чтобы установить время истечения срока действия для различных элементов в списке, чтобы список, по которому вы проверяете заблокированных пользователей, не был таким обширным.
Это очень концептуально, без более подробной информации о вашей настройке я не смог бы вам больше помочь.
Вы можете решить эту проблему на уровне ОС с помощью iptables. Строки ниже взяты из debian linux, YMMV. Это ограничит количество подключений до 3 за 60 секунд.
iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Предполагается, что вы запускаете свой сервер postgresql на порту 5432, а eth0 - это карта с выходом в Интернет.
Если есть какой-либо другой порт, который вы хотите ограничить, вы можете просто заменить номер порта.
Исходный код и другие примеры (для ssh, порт 22) http://www.debian-administration.org/articles/187
Простым решением было бы использовать пул соединений для вашего сервера базы данных. Это было бы естественным узким местом для ограничения нагрузки на базу данных и, следовательно, на сервер.
Или поместите свое приложение за базовым веб-сервером, который реализует рабочие потоки и ограничивает количество потоков (или реализуйте то же самое в своем приложении)