[Linux.wiki] Защита ssh порта от атак.

Продолжаю изучать iptables.
Нашёл одну очень интересную статью (ссылка ниже).

Как можно защитить свой ssh порт от атак. В данном случае атака подразумевает собой перебор паролей к вашему серверу.
Количество комбинаций в принципе конечно и чисто теоретически подобрать пароль можно. Всё зависит от скорости работы и ресурсов. Например, сколько попыток можно совершить в секунду, минуту, час…
Частично это зависит от вашего сервера – сколько подключений он может выдержать. Лучше до этой проверки не доходить, а ограничить количество подключений к вашему ssh порту. Ограничить число соединений с какого-либо source ip-address.
Например, если произошло больше 4 подключений к вашему ssh порту за последние 5 минут с какого-то ip – забанить его на час. Если попытки будут продолжаться, то бан будет автоматически продеваться.

Получивщийся фильт выглядит следующий образом. Мои комментарии ниже.

# Сначала очищаю текущий правила в фильтрах, если таковые имеются:
sudo iptables -F
#1. Открываю доступ для уже установленных соединений и для пакетов приходящих в ответ на запросы самого сервера (лучше всегда добавлять).
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#2. Открываю доступ к порты ssh для надёжных ip. Если у вас дома постоянный адрес, например. В данном примере у меня ssh порт =2222.
sudo iptables -A INPUT -s 192.168.56.1/32 -p tcp --dport 2222 -j ACCEPT
#3. Открываю доступ к моему веб.серверу для всех.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#4. Создаю дополнительную цепочку (chaine) в которой буду обрабатывать часть пакетов по критерию (данном примере правило №8 будет заворачивать пакеты в эту цепочку).
sudo iptables -N BADGUY
#5. Пакеты повавшие в цепочку BADGUY маркируются как badguys и отбрасываются – по сути попадают в специальный список. См. файлы в /proc/net/xt_recent/
sudo iptables -t filter -A BADGUY -i eth1 -m recent --set --name badguys -j DROP
#6. Входящий пакет после прохождения правила 3 попадает под проверку данным правилом. Если пакет есть в списке badguys, то запись обновляется и продлевается на 1 час, пакет отбрасывается. Таким образом ip-address которые ранее были замечены в попытка частых подключений к ssh блокируются на час.
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name badguys --update --seconds 3600 -j DROP
#7. Если пакет на был в списке badguys, например это первая попытка подключения к порту ssh/2222, то пакет просто вносится в список sshcheck. Больше никаких действий. Переход на следующее правило.
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --set --name sshcheck
#8. Если это 4 попытка подключения за последние 5 минут к порту ssh/2222, то пакет переходит к цепочке BADGUY, где делается отметка в badguys и пакет отбрасывается. Также далее в течение одного часа пакет от данного source-ip-address на порт ssh/2222 будут блокироваться по правилу 6.
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name sshcheck --rcheck --seconds 300 --hitcount 4 -j BADGUY
#9. Если 4 попыток за 5 минут не было, но подключение 2ое за последние 30 секунд, то source-ip-address блокируется на 30 секунд (на порт ssh/2222).
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name sshcheck --rcheck --seconds 30 --hitcount 2 -j DROP

Итого.
Злоумышленику придётся подбирать пароль в следующих условиях – максимум 3 попытки за 5 минут, иначе бан на 1 час. Итого в сутки можно попробовать максимум 864 комбинаций.
Вроде кажется много… Но ваш пароль можно будет подобрать за один день простым перебором, если он состоит из трёх цифр, например. Это очень плохо и нужно использовать более сложные пароли!
Если же вы используете только цифры и пароль например из 9 цифр, то потребутся миллион дней или около 2740 лет, чтобы их все перебрать в указанных условиях.
Если вы используете ещё буквы и ещё в разном регистре, плюс спец символы, то задача становится намного сложнее.

Конечно атака может быть проведена с разных source ip-address и тогда всё становится быстрее, но для этого используются доверенные адреса, подсети вашего провайдера, например.
См. так же [Linux.wiki] Как закрыть доступ к ssh с помощью iptables.

Вот мой iptables без пояснений:
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -s 192.168.56.1/32 -p tcp --dport 2222 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -N BADGUY
sudo iptables -t filter -A BADGUY -i eth1 -m recent --set --name badguys -j DROP
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name badguys --update --seconds 3600 -j DROP
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --set --name sshcheck
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name sshcheck --rcheck --seconds 300 --hitcount 4 -j BADGUY
sudo iptables -A INPUT -i eth1 -p tcp --syn --dport 2222 -m recent --name sshcheck --rcheck --seconds 30 --hitcount 2 -j DROP

Удачи!

Ссылки:
man iptables
iptables recent matching rule