Защита ssh средствами Iptables

Защита ssh средствами Iptables

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

Ключевыми понятиями iptables являются:

Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен.

Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».

Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже.

Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.

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

Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.

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

Ограничение количества подключений

Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.

recent — это модуль ядра (Core Netfilter Configuration), позволяет создавать динамические списки адресов IP. Модуль поддерживает ряд опций

--name name — имя списка, с которым работает команда. По умолчанию для списка используется имя DEFAULT

--rcheck — опция будет проверять наличие адреса отправителя пакета в списке При отсутствии адреса в списке возвращается значение false.

--update — опция будет проверять наличие адреса отправителя пакета в списке. Если адрес присутствует, соответствующая запись обновляется. При отсутствии адреса в списке возвращается значение false.

--hitcount hits — счетчик, возвращает true при наличии адреса в списке, когда число принятых пакетов с адреса больше или равно заданного значения. Используется совместно с rcheck или update

--seconds seconds — определяет период (от момента занесения адреса в список), в течение которого адрес может находиться в списке

--set — служит для добавления адреса отправителя пакета в список. Если такой адрес уже есть в списке, запись будет обновлена

--remove — удалить адрес из списка. Если адрес не обнаружен вернет false.

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

Динамическое открытие/закрытие ssh порта

Небольшое правило для iptables помогающее лишний раз не держать порты открытыми.

Пример для доступа к SSH, хотя как сами понимаете можно использовать как угодно.

Для того чтобы открыть доступ к шеллу нужно сначала стукнуться на 1500 порт: telnet'ом например:

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

соответственно если стукнуть на 1499 — то порт закроется

Порт открывается только для ip с которого был открыт

Открытие порта ssh на заданное время

Еще один пример демонстрирует способ открытия порта ssh для определенного ip на заданное время.

Теперь, чтобы получить ssh доступ нужно сперва постучаться на порт 222, например так:

после этого доступ для вашего ip на 22 порт будет разрешен на указанное время, при этом каждый новый коннект на ssh будет продлевать это время. Если вы не хотите продления времени то замените --update --seconds 108000 на --rcheck.

📎📎📎📎📎📎📎📎📎📎