В этом руководстве я продемонстрирую, как применять технологию port knocking для обеспечения безопасности SSH-сервиса на серверах с Debian и Ubuntu.
Содержание статьи
- 1 Port Knocking в SSH — это метод защиты, при котором доступ к серверу возможен только после отправки определенной последовательности пакетов на заранее установленные порты.
- 2 Установка и конфигурация Knockd на сервере с Debian/Ubuntu
- 3 Блокируйте SSH-порт 22.
- 4 Примените клиент Knock для передачи серии Knock.
- 5 Автоматический перезапуск Knockd.
Port Knocking в SSH — это метод защиты, при котором доступ к серверу возможен только после отправки определенной последовательности пакетов на заранее установленные порты.
Порт-нокинг — это метод, позволяющий предоставлять доступ к серверным сервисам исключительно авторизованным пользователям, и в этом руководстве рассматривается пример с SSH. Хотя SSH работает на сервере, его порт закрыт для внешних подключений с помощью настроек брандмауэра, что предотвращает прямой доступ к порту 22.
На сервере работает демон knockd, который позволяет изменять правила брандмауэра и временно открывать порт SSH 22 для пользователя при выполнении определенной последовательности стуков в заданные порты. Такая последовательность стуков выступает в роли пароля для доступа к порту SSH. Только пользователи, знающие правильную комбинацию стуков, могут активировать knockd для открытия SSH-порта. Когда пользователь завершает сеанс, используется другая комбинация стуков для закрытия порта SSH.
Давайте разберем процесс установки и настройки knockd, а также создание правила для межсетевого экрана. Это руководство рассчитано на пользователей Linux на клиентской машине.
Установка и конфигурация Knockd на сервере с Debian/Ubuntu
Введите следующую команду для установки knockd из стандартного программного репозитория.
sudo apt-get install knockd
Откройте основной конфигурационный файл для редактирования с помощью текстового редактора командной строки, например, Nano.
sudo nano /etc/knockd.conf
Необходимо изменить три элемента в данном файле. В блоке [openSSH] по умолчанию установлена последовательность knock: 7000,8000,9000. При желании её можно настроить по своему усмотрению, например, указав 10001,10002,10003. Также можно задать 4 и более порта для этой последовательности. При этом открывать эти порты в брандмауэре не требуется.
В команде iptables замените — A на — I, чтобы данное правило стало первым в списке правил. Порядок правил в iptables имеет важное значение. Как только вы отправите нужную последовательность knock, программа knockd выполнит данную команду iptables, открыв порт SSH исключительно для вашего IP-адреса. Все остальные IP-адреса останутся заблокированными для подключения к порту SSH.
В разделе [closeSSH] измените стандартную последовательность knock для закрытия порта на вашу, например, 10003,10002,10001.

Сохраните файл и закройте его.
После этого введите следующую команду, чтобы определить имя главного сетевого интерфейса на сервере.
ip addr
У меня это ens18. Теперь необходимо внести изменения в файл конфигурации, находящийся по адресу /etc/default/knockd.
sudo nano /etc/default/knockd
START_KNOCKD=0
Замените 0 на 1, чтобы активировать автозапуск при старте системы.
START_KNOCKD=1
По умолчанию программа knockd отслеживает интерфейс eth0. Если у вашего сервера используется другой сетевой интерфейс, необходимо внести соответствующие изменения. Найдите строку ниже.
#KNOCKD_OPTS="-i eth1"
Уберите символ # и замените eth1 на название главного сетевого интерфейса вашего сервера.
KNOCKD_OPTS color: #ff00ff;">ens18"
Сохраните файл и закройте его. После этого запустите демон knockd.
sudo systemctl start knockd
sudo systemctl enable knockd
Убедитесь в его состоянии, чтобы подтвердить, что он функционирует.
systemctl status knockd

Блокируйте SSH-порт 22.
Чтобы заблокировать SSH-порт 22 в файрволе UFW, сначала необходимо получить список действующих правил файрвола.
sudo ufw status numbered
Первое и третье правило, как вы можете заметить, разрешают доступ к SSH-порту. Для того чтобы закрыть TCP-порт 22, необходимо удалить эти два правила.
sudo ufw delete 3 sudo ufw delete 1
Совет: сначала необходимо удалить правило с наибольшим индексом.
Теперь, если вы попытаетесь установить соединение с вашим сервером через SSH, служба SSH не будет реагировать на ваш запрос.
Примените клиент Knock для передачи серии Knock.
Демон knockd идет в комплекте с клиентом knock, поэтому вы можете установить его на своем клиентском компьютере с операционной системой Debian или Ubuntu, выполнив следующую команду:
sudo apt-get install knockd
Для активации файрвола сервера на TCP-порту 22 необходимо выполнить правильную последовательность knock с вашего клиентского устройства.
knock - v 10.0.0.104 10001 10002 10003
попытка tcp 10.0.0.104:10001 попытка tcp 10.0.0.104:10002 попытка tcp 10.0.0.104:10003
Попытка knock может не увенчаться успехом, если между клиентом и сервером наблюдается высокая задержка. Возможно, потребуется несколько раз отправить последовательность knock, если порт SSH по-прежнему остается закрытым.
После удачного выполнения knock вы сможете установить SSH-соединение с вашим сервером. Когда все задачи будут завершены, вы можете снова использовать knock, чтобы закрыть SSH-порт для вашего IP-адреса.
knock - v 10.0.0.104 10003 10002 10001
Учтите, что knockd будет реагировать только на последовательность knock, отправленную на главный сетевой интерфейс (т. е. на основной IP-адрес). Если на сервере имеется несколько IP-адресов и вы попытаетесь отправить последовательность knock на альтернативный IP, knockd не сможет активировать SSH-порт.
Автоматический перезапуск Knockd.
Если демон knockd прекращает свою работу на сервере, вы потеряете возможность подключения к нему через SSH. Чтобы предотвратить это, вы можете настроить задание cron, которое будет автоматически перезапускать knockd каждый час.
Внесите изменения в файл crontab для пользователя root.
sudo crontab - e<

