Обмеження кількості підключень
Для захисту від brute force (перебору паролів), можна обмежити кількість підключень на 22 порт з однієї ip адреси до кількох разів на хвилину, після чого блокувати спроби підключення для даної ip.
## Создание цепочки правил sshguard
# Максимум 2 новых запроса в минуту для одного ip
/sbin/iptables -N sshguard
# Вкл. лог по желанию
#/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield: "
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT
/sbin/iptables -A sshguard -j ACCEPT
## Применение для трафика ssh цепочку sshguard
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard
recent - це модуль ядра (Core Netfilter Configuration), дозволяє створювати динамічні списки адрес IP. Модуль підтримує ряд опцій
-
--name name : ім'я списку, з яким працює команда. За замовчуванням для списку використовується ім'я DEFAULT
-
--rcheck : опція буде перевіряти наявність адреси відправника пакета в списку. За відсутності адреси в списку повертається значення false.
-
--update : опція буде перевіряти наявність адреси відправника пакета в списку. Якщо адреса присутня, відповідний запис оновлюється. За відсутності адреси в списку повертається значення false.
-
--hitcount hits : лічильник, повертає true за наявності адреси в списку, коли число прийнятих пакетів з адреси більше або дорівнює заданому значенню. Використовується разом з rcheck або update
-
--seconds seconds : визначає період (від моменту занесення адреси до списку), протягом якого адреса може перебувати в списку
-
--set : слугує для додавання адреси відправника пакета до списку. Якщо така адреса вже є в списку, запис буде оновлено
-
--remove : видалити адресу зі списку. Якщо адресу не виявлено, поверне false.
Опції можуть використовуватися з інверсією (!)
Невелике правило для iptables, що допомагає зайвий раз не тримати порти відкритими.
Приклад для доступу до SSH, хоча, як самі розумієте, можна використовувати як завгодно.
Суть правила проста - для того щоб відкрити доступ до шелу, потрібно спочатку стукнути на 1500 порт:
telnet'ом наприклад:
telnet myserver 1500
або через браузер:
http://192.168.0.100:1500
відповідно, якщо стукнути на 1499 - то порт закриється
iptables -N sshguard # Если адрес в списке, то подключение разрешено iptables -A sshguard -m state --state NEW -m recent --rcheck --name SSH -j ACCEPT # Разрешить пакеты для уже установленных соединений iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A sshguard -j DROP # Заносит адрес в список #iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -j LOG --log-prefix "SSH-open: " iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP # Удаляет адрес из списка iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP # Применение для трафика ssh цепочку sshguard iptables -A INPUT -p tcp --dport 22 -j sshguard
Відкриття порту ssh на заданий час
Ще один приклад демонструє спосіб відкриття порту ssh для певного ip на заданий час.
## определяем цепочку для SSH трафика
iptables -N sshguard
iptables -F sshguard
# Разрешить подключение если ip есть в списке и последнее подключение осуществлялось не позднее 108000 секунд (30 часов)
iptables -A sshguard -m state --state NEW -m recent --update --seconds 108000 --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
# Заблокировать если нет в списке
iptables -A sshguard -j DROP
## Открытие SSH
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
## Фильтрация ssh трафика через цепочку sshguard
iptables -A INPUT -p tcp --dport 22 -j sshguard
Тепер, щоб отримати ssh доступ, потрібно спершу стукнути на порт 222, наприклад так:
ssh user@server.name -p 222
після цього доступ для вашої ip на 22 порт буде дозволено на вказаний час, при цьому кожен новий коннект на ssh буде продовжувати цей час. Якщо ви не хочете продовження часу, то замініть --update --seconds 108000 на --rcheck.
