Защита SSH средствами iptables

Примеры использования iptables для защиты SSH-доступа.

iptables — утилита командной строки, стандартный интерфейс управления межсетевым экраном (брандмауэром) Netfilter для ядра Linux. С её помощью можно создавать и изменять правила фильтрации и перенаправления пакетов. Для работы с iptables требуются права суперпользователя (root).

Ключевые понятия

Правило — состоит из критерия, действия и счётчика. Если пакет соответствует критерию, к нему применяется действие и он учитывается счётчиком. Правила срабатывают в порядке следования — порядок важен.

  • Критерий — логическое выражение, анализирующее свойства пакета и определяющее, подпадает ли он под текущее правило. Несколько критериев объединяются логическим «И».
  • Действие — описание того, что нужно сделать с пакетом, если он соответствует критерию.
  • Счётчик — учитывает количество пакетов, попавших под критерий, и их суммарный объём в байтах.

Цепочка — упорядоченная последовательность правил. Бывают базовые и пользовательские:

  • Базовая цепочка — создаётся по умолчанию при инициализации таблицы. Имеет «действие по умолчанию», которое применяется к пакетам, не обработанным ни одним другим правилом. Имена базовых цепочек всегда в верхнем регистре: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.
  • Пользовательская цепочка — создаётся пользователем, работает только в пределах своей таблицы. Рекомендуется не использовать верхний регистр, чтобы не путать с базовыми цепочками.

Таблица — совокупность цепочек, объединённых общим назначением. Имена таблиц пишутся в нижнем регистре. При вызове команды таблица указывается через флаг -t имя_таблицы. Если таблица не указана явно, используется filter.

1. Ограничение количества подключений (защита от brute force)

Чтобы защититься от перебора паролей, можно ограничить количество новых подключений к 22-му порту с одного IP-адреса — например, не более 2 попыток в минуту, после чего блокировать дальнейшие попытки.

## Создание цепочки sshguard
/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

## Применить цепочку sshguard к SSH-трафику
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard

В этих правилах используется модуль ядра recent, который позволяет создавать динамические списки IP-адресов. Основные опции модуля:

  • --name name — имя списка. По умолчанию используется DEFAULT
  • --rcheck — проверяет наличие адреса отправителя в списке; если адрес не найден, возвращает false
  • --update — проверяет наличие адреса в списке и обновляет запись, если адрес найден; если нет — возвращает false
  • --hitcount hits — возвращает true, если число пакетов с данного адреса больше или равно заданному значению; используется вместе с --rcheck или --update
  • --seconds seconds — задаёт период, в течение которого адрес остаётся в списке с момента добавления
  • --set — добавляет адрес отправителя в список; если адрес уже есть, обновляет запись
  • --remove — удаляет адрес из списка; если адрес не найден, возвращает false

Примечание

Использование --update вместо --rcheck приводит к тому, что каждая новая попытка подключения обнуляет таймер. Если не выдержать интервал и снова попытаться подключиться, отсчёт 60 секунд начнётся заново.

2. Динамическое открытие и закрытие SSH-порта

Этот подход позволяет не держать SSH-порт открытым постоянно. Порт открывается только для конкретного IP-адреса — после того как с него поступил специальный «стук».

Чтобы открыть доступ к SSH, нужно предварительно обратиться на порт 1500 — например, через telnet:

telnet myserver 1500

или через браузер:

http://192.168.0.100:1500

Обращение на порт 1499 закрывает доступ.

iptables -N sshguard

# Разрешить подключение, если IP есть в списке
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

# Открыть доступ: занести IP в список
#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

# Закрыть доступ: удалить IP из списка
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP

# Применить цепочку sshguard к SSH-трафику
iptables -A INPUT -p tcp --dport 22 -j sshguard

Порт открывается только для того IP-адреса, с которого был выполнен «стук».

3. Открытие SSH-порта на заданное время

Этот пример позволяет открыть SSH-доступ для конкретного IP на ограниченный период времени.

## Создание и очистка цепочки sshguard
iptables -N sshguard
iptables -F sshguard

# Разрешить подключение, если IP в списке и последнее обращение — не позднее 30 часов назад (108000 секунд)
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

# Блокировать, если IP не в списке
iptables -A sshguard -j DROP

## Открытие доступа: занести IP в список при обращении на порт 222
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set

## Применить цепочку sshguard к SSH-трафику
iptables -A INPUT -p tcp --dport 22 -j sshguard

Чтобы получить доступ по SSH, нужно сначала «постучаться» на порт 222:

ssh user@server.name -p 222

После этого доступ к 22-му порту для вашего IP будет открыт на указанное время. Каждое новое подключение к SSH продлевает этот срок. Если продление не нужно, замените --update --seconds 108000 на --rcheck.

Порт открывается только для того IP-адреса, с которого было выполнено подключение.

Посмотреть, каким IP-адресам в данный момент разрешён доступ к SSH:

cat /proc/net/ipt_recent/SSH

Помощь

Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!

Обновлено:
Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам