Port Knocking представляет собой технологию скрытия сетевых сервисов путем их временного открытия только после получения специальной последовательности запросов на закрытые порты. В этой статье мы детально рассмотрим процесс настройки Port Knocking для защиты SSH-сервера на системе Linux, используя демон knockd. Весь процесс разбит на логические этапы, каждый из которых сопровождается подробными объяснениями, командами и примерами конфигурационных файлов.
Установка демона knockd
Первым шагом необходимо установить пакет knockd, который является реализацией механизма Port Knocking для Linux. Для систем на базе Debian/Ubuntu (включая Astra Linux) выполните следующие команды:
sudo apt install knockd
Настройка конфигурации knockd
Далее настроим конфигурацию knockd основной файл конфигурации knockd находится по пути /etc/knockd.conf. Он определяет поведение демона: какие порты прослушивать, какую последовательность использовать для открытия доступа, какие команды выполнять при успешном "постукивании". Откройте файл конфигурации для редактирования:
sudo nano /etc/knockd.conf
Замените содержимое файла на следующую конфигурацию(так как изначально в файле находится шаблон):
[options]
UseSyslog
Interface = eth0
[SSH]
sequence = 7000,8000,9000
seq_timeout = 5
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 60
Объяснение конфигурации:
- [options] — секция общих настроек демона
UseSyslog — указывает демону использовать системный журнал (syslog) для записи событий
Interface = emp3s0 — задает сетевой интерфейс, на котором будет работать knockd (замените emp3s0 на имя вашего интерфейса, которое можно узнать командой ip addr) - [SSH] — секция, определяющая правило для доступа к SSH
sequence = 7000,8000,9000 — последовательность портов, которую должен "простучать" клиент. В данном случае это порты 7000, 8000 и 9000 в указанном порядке
seq_timeout = 5 — временное окно в секундах, в течение которого должна быть введена вся последовательность. Если между запросами пройдет более 5 секунд, последовательность сбросится
tcpflags = syn — тип TCP-пакетов, которые будут распознаваться. Обычно используются SYN-пакеты, так как они являются первыми в установлении TCP-соединения
start_command — команда, выполняемая при успешном получении правильной последовательности. Она добавляет правило в iptables, разрешающее подключение по SSH (порт 22) с IP-адреса, с которого пришла последовательность
stop_command — команда, выполняемая по истечении таймаута (cmd_timeout). Она удаляет ранее добавленное правило, тем самым снова закрывая доступ
cmd_timeout = 60 — время в секундах, на которое открывается доступ. Через 60 секунд после последнего успешного knock доступ автоматически закрывается
Важно отметить, что %IP% в командах является переменной, которая автоматически заменяется на IP-адрес клиента, отправившего правильную последовательность.
Настройка параметров запуска
Файл /etc/default/knockd содержит параметры, передаваемые демону при запуске. Отредактируйте его:
sudo nano /etc/default/knockd
Установите следующие значения:
# 1 = запускать любое другое значение = не запускать
START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
Настройка правил iptables
Выполните следующие команды для настройки базовых правил безопасности:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# По умолчанию блокируем все входящие SSH-подключения (knockd будет временно открывать доступ для конкретных IP)
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
# Блокируем ICMP echo-запросы (ping) для скрытия системы
sudo iptables -A INPUT -p icmp --icmp-type 8 -j DROP
Для просмотра текущих правил iptables с нумерацией строк выполните:
sudo iptables -L --line-numbers
Запуск и настройка автозапуска knockd
После настройки конфигурации и правил iptables необходимо запустить демон knockd и настроить его автоматический запуск при загрузке системы.
sudo systemctl start knockd
# Включение автозапуска при загрузке системы
sudo systemctl enable knockd
# Проверка статуса службы
sudo systemctl status knockd
Сохранение правил iptables
Правила iptables, настроенные через командную строку, являются временными и сбросятся после перезагрузки системы. Для их сохранения используйте пакет iptables-persistent.
sudo apt install iptables-persistent
sudo service netfilter-persistent save
Тестирование работы Port Knocking
После полной настройки необходимо протестировать работу системы.
for x in 7000 8000 9000; do nmap -Pn --max-retries 0 -p $x 46.148.229.110; done
46.148.229.110 - ip адрес сервера для примера
Когда выполнили стук по нужным портам можем подключиться к серверу:
ssh username@46.148.229.110
В статье была рассмотрена технология Port Knocking, для обеспечения полного цикла безопасного функционирования ssh сервера можно выполнить:
1 - настроить вход по ключам
2 - изменить стандартный порт ssh
Тогда такой сервер будет трудно детектировать и получить доступ к нему не имея ключей, не зная последовательности портов практически не возможно.