Crmgo Блог

Динамічне відкриття/закриття ssh порту

Динамічне відкриття/закриття ssh порту

Обмеження кількості підключень Для захисту від brute force (перебору паролів), можна обмежити кількість підключень на 22 порт з однієї ip адреси до кількох разів на хвилину, після чого блокувати спроби підключення для даної ip. recent - це модуль ядра (Core…

Динамічне відкриття/закриття ssh порту

Обмеження кількості підключень

Для захисту від 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


 

 

 

Порт відкривається тільки для ip, з якого було відкрито

 

 

Відкриття порту 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.

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.