четверг, 18 октября 2012 г.

iptables защита ssh от перебора паролей

Правила хитрые, но с комментариями. По сути тут даже не защита от перебора паролей, а полный запрет для всех чужих IP, разрешен лишь белый список и всего 3 попытки ввести неверный пароль.
Скрипт - bash.

#!/bin/bash
# Даем 3 попытки стукнуться в ssh, иначе баним на 10 минут
iptables -A INPUT -p TCP -i eth0 --syn --dport 22 -m recent --name radiator --set
iptables -A INPUT -p TCP -i eth0 --syn --dport 22 -m recent --name radiator --update --seconds 600 --hitcount 2 -j DROP

## Местоположение файлов
WHITELIST=guest.txt

## Белый список ip, с которых можно зайти по ssh:
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Разрешение $x..."
iptables -A INPUT -p tcp --dport 22 --src $x -j ACCEPT
done

## Блокируем все IP, которые не в белом списке
iptables -A INPUT -p tcp --dport 22 -j DROP

## Даем 3 попытки стукнуться в ssh, иначе баним на 10 минут
#iptables -A INPUT -p TCP -i eth0 --syn --dport 22 -m recent --name radiator --set
#iptables -A INPUT -p TCP -i eth0 --syn --dport 22 -m recent --name radiator --update --seconds 600 --hitcount 2 -j DROP
exit 0


Небольшое пояснение - ssh должен быть запущен на стандартном, 22 порту. Правила смотрят на количество отправленных пакетов syn - установку соединения. Если соединение не удалось установить - значит ssh сбрасывает его, обычно из-за неверного пароля или имени пользователя. Как видно из правила, мы слушаем интерфейс eth0, если сервер смотрит в сеть другим интерфейсом - его надо изменить. В файл guest.txt можно класть как одиночные ip, так и сразу с маской сети, главное - каждый ip или подсеть в новой строке.
Так же можно защищать и FTP, и любые другие подобные сервисы, если по каким-то причинам не установлен fail2ban. Правило было подсказано на linux.org.ru и доработано мной

Закрыл apache в связке с nginx

Собственно, все очень просто. Допустим, apache у нас на порту 81, nginx - 80. А IP сервера - 1.2.3.4. Тогда правила выглядят так:

iptables -A INPUT -p tcp --src 127.0.0.1 --dport 81 -j ACCEPT  
iptables -A INPUT -p tcp --src 1.2.3.4 --dport 81 -j ACCEPT
iptables -A INPUT -p tcp --dport 81 -j DROP

Собственно обязательно разрешить оба варианта - и localhost и внешний IP сервера, чтобы он как бы сам на себя мог ходить.
Не помню, хоть убейте, как UDP резать.