Порт-нокинг с использованием iptables

Вопрос или проблема

Как настроить port knocking на Linux с использованием iptables?

Вот один из способов настройки (используя модуль ‘recent‘):
Я сделаю это ‘вики сообщества’, чтобы позволить вносить исправления, если это потребуется.

# установить политику по умолчанию для цепочки INPUT на DROP
iptables -P INPUT DROP

# разрешить весь трафик локального узла
iptables -A INPUT -i lo -j ACCEPT

# разрешить все уже установленное соединения
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

# добавьте свои собственные правила здесь...

# в конце перенаправьте все пакеты в цепочку KNOCKING
# это облегчает быстрое включение/отключение цепочки KNOCKING, если это необходимо
iptables -A INPUT -j KNOCKING

# если исходный ip уже аутентифицирован, разрешить его
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT

# если пакет не аутентифицирован и первый порт-стук верен,
# добавьте исходный ip в список 'knock1'
iptables -A KNOCKING -p tcp -m tcp --dport 1111 -m recent --set --name knock1 -j DROP

# если исходный ip уже в списке 'knock1' (со временем истечения 10 секунд)
# и второй порт-стук верен, добавьте исходный ip в список 'knock2'
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock1 -m tcp --dport 2222 -m recent --set --name knock2 -j DROP

# если исходный ip уже в списке 'knock2' (со временем истечения 10 секунд)
# и третий порт-стук верен, добавьте исходный ip в список 'knock3'
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock2 -m tcp --dport 3333 -m recent --set --name knock3 -j DROP

# если исходный ip уже в списке 'knock3' (со временем истечения 10 секунд)
# и четвертый порт-стук верен, добавьте исходный ip в список 'knockfinal'
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock3 -m tcp --dport 4444 -m recent --set --name knockfinal -j DROP

# в противном случае ничего не делаем, и политика по умолчанию для INPUT отбросит пакет

В более сжатом формате:

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# добавьте свои собственные правила здесь...
iptables -A INPUT -j KNOCKING

iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT
iptables -A KNOCKING -p tcp -m tcp --dport 1111 -m recent --set --name knock1 -j DROP
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock1 -m tcp --dport 2222 -m recent --set --name knock2 -j DROP
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock2 -m tcp --dport 3333 -m recent --set --name knock3 -j DROP
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock3 -m tcp --dport 4444 -m recent --set --name knockfinal -j DROP

Теперь, когда прошло 4 года и мир переходит с iptables на nftables, возможно, вам понадобится решение на основе nftables.
Два примера решений можно найти здесь:

Ответ или решение

Теория

Port knocking — это метод повышения безопасности сетевых приложений. Суть заключается в том, что доступ к сервису (например, SSH) можно получить только после последовательного отправления запросов на заранее определенный набор портов. Если последовательность правильная, в файерволле автоматически открывается доступ к защищенному порту для IP-адреса пользователя. Такой подход предотвращает прямые попытки взлома, например, грубую силу, усложняя определение доступных портов.

Port knocking можно настроить с использованием iptables, популярного инструмента для управления правилами фильтрации пакетов в Linux.

Пример

Для настройки port knocking с использованием iptables, мы будем использовать модуль recent, который позволяет отслеживать недавние подключения. Пример конфигурации приведен ниже:

# Устанавливаем политику по умолчанию для цепочки INPUT на DROP
iptables -P INPUT DROP

# Разрешаем весь локальный трафик
iptables -A INPUT -i lo -j ACCEPT

# Разрешаем все уже установленные соединения
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

# Добавление бизнес-логики для ваших нужд...

# В конце перенаправляем все пакеты в цепочку KNOCKING
iptables -A INPUT -j KNOCKING

# Если IP-адрес уже аутентифицирован, разрешаем доступ
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT

# Проверка первого "стука" на порт 1111
iptables -A KNOCKING -p tcp -m tcp --dport 1111 -m recent --set --name knock1 -j DROP

# Проверка второго "стука" на порт 2222
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock1 -m tcp --dport 2222 -m recent --set --name knock2 -j DROP

# Проверка третьего "стука" на порт 3333
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock2 -m tcp --dport 3333 -m recent --set --name knock3 -j DROP

# Проверка четвертого "стука" на порт 4444
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock3 -m tcp --dport 4444 -m recent --set --name knockfinal -j DROP

После успешного прохождения всех этапов "стука", IP-адрес будет добавлен в список knockfinal, и следующий пакет от этого IP будет разрешен.

Применение

Port knocking используется для повышения уровня безопасности систем, доступ к которым может потребоваться только уполномоченным пользователям. Преимущества метода заключаются в том, что он добавляет дополнительный уровень контроля к привычному файерволлу и затрудняет злоумышленникам определение доступных портов.

Этот метод лучше всего подходит для сценариев, где требуется скрыть открытые порты от общего доступа, например, для серверов SSH. Однако важно отметить, что port knocking не является полноценной заменой других мер безопасности (например, VPN или двухфакторной аутентификации), а служит вспомогательным механизмом в общей стратегии безопасности.

С переходом на nftables многие функции, ранее доступные через iptables, становятся более гибкими и мощными. Инструкции по настройке port knocking с использованием nftables можно найти в следующих источниках:

Это позволяет адаптировать правила к вашим конкретным потребностям и помогает защитить вашу систему от несанкционированного доступа.

Оцените материал
Добавить комментарий

Капча загружается...