Categories: Server Linux

Установка и настройка knockd

Для чего нужен knockd? Для реализации метода port knocking — «стука» в фаервол для открытия определённых портов. Это обычное применение данной программы, но этим оно не ограничивается и можно придумать более экзотическое её использование.

Для начала установовим пакеты knockd и iptables-persistent. Последний нужен для постоянного хранения правил фаервола в случае перезагрузки сервера.

apt-get install knockd iptables-persistent

Минимальный набор правил для iptables при это будет выглядеть так:

iptables -F_x000D_iptables -X_x000D_iptables -t nat -F_x000D_iptables -t nat -X_x000D__x000D_iptables -P INPUT DROP_x000D__x000D_iptables -A INPUT -i lo -j ACCEPT_x000D_iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT_x000D__x000D_iptables -A INPUT -i eth0 -j DROP

В данном случае eth0 — это название сетевого интерфейса. На свежих системах название будет другое. Например enp3s0 или подобное.

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

iptables-save > /etc/iptables/rules.v4

Теперь можно перейти непосредственно к настройке knockd. Для примера рассмотрим использование port knocking для открытия порта ssh сервиса.

Разрешим запуск knockd в режиме демон. Для этого отредактируем файл /etc/default/knockd и поменяем в нём строку на следующую:

START_KNOCKD=1

Если у вас, как и у меня, используется systemd, приведём файл /lib/systemd/system/knockd.service , который выглядит вот так:

[Unit]_x000D_Description=Port-Knock Daemon_x000D_After=network.target_x000D_Documentation=man:knockd(1)_x000D__x000D_[Service]_x000D_EnvironmentFile=-/etc/default/knockd_x000D_ExecStart=/usr/sbin/knockd $KNOCKD_OPTS_x000D_ExecReload=/bin/kill -HUP $MAINPID_x000D_KillMode=mixed_x000D_SuccessExitStatus=0 2 15_x000D_ProtectSystem=full_x000D_CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN

к следующему виду:

[Unit]_x000D_Description=Port-Knock Daemon_x000D_After=network.target_x000D_Requires=network.target_x000D_Documentation=man:knockd(1)_x000D__x000D_[Service]_x000D_EnvironmentFile=-/etc/default/knockd_x000D_ExecStartPre=/bin/sleep 1_x000D_ExecStart=/usr/sbin/knockd $KNOCKD_OPTS_x000D_ExecReload=/bin/kill -HUP $MAINPID_x000D_KillMode=mixed_x000D_SuccessExitStatus=0 2 15_x000D_ProtectSystem=full_x000D_CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN_x000D__x000D_[Install]_x000D_WantedBy=multi-user.target

После редактирования нужно, чтобы systemd узнал об изменении в конфигурационных файлах. Для этого выполним:

systemctl daemon-reload

Теперь можно разрешить запускать knockd как сервис:

systemctl enable knockd.service

И осталось последнее — отредактировать конфигурационный файл knockd /etc/knockd.conf . Так он выглядит при установке:

[options]_x000D_ UseSyslog_x000D__x000D_[openSSH]_x000D_ sequence = 7000,8000,9000_x000D_ seq_timeout = 5_x000D_ command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT_x000D_ tcpflags = syn_x000D__x000D_[closeSSH]_x000D_ sequence = 9000,8000,7000_x000D_ seq_timeout = 5_x000D_ command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT_x000D_ tcpflags = syn_x000D_

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

_x000D_[options]_x000D_ UseSyslog_x000D_ Interface = eth0_x000D__x000D_[opencloseSSH]_x000D_ sequence = 7000,8000,9000_x000D_ seq_timeout = 10_x000D_ cmd_timeout = 60_x000D_ tcpflags = syn_x000D_ start_command = /sbin/iptables -I INPUT 3 -s %IP% -p tcp --dport 22 -j ACCEPT_x000D_ stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT_x000D_

В sequence можно указать любые свободные порты, которые вам нравятся. Через 60 секунд после выполнения команды, указанной в start_command, выполнится команда stop_command, которая уберёт правило, открывающее доступ к 22 порту.

Запустим knockd сервис:

systemctl start knockd.service

И проверим, что он работает корректно:

root@tests:~# systemctl status knockd.service _x000D_● knockd.service - Port-Knock Daemon_x000D_ Loaded: loaded (/lib/systemd/system/knockd.service; enabled; vendor preset: enabled)_x000D_ Active: active (running) since Sat 2023-02-04 08:41:19 MSK; 53s ago_x000D_ Docs: man:knockd(1)_x000D_ Process: 1762844 ExecStartPre=/bin/sleep 1 (code=exited, status=0/SUCCESS)_x000D_ Main PID: 1762845 (knockd)_x000D_ Tasks: 1 (limit: 9507)_x000D_ Memory: 768.0K_x000D_ CPU: 25ms_x000D_ CGroup: /system.slice/knockd.service_x000D_ └─1762845 /usr/sbin/knockd_x000D__x000D_Feb 04 08:41:18 tests systemd[1]: Starting Port-Knock Daemon..._x000D_Feb 04 08:41:19 tests systemd[1]: Started Port-Knock Daemon._x000D_Feb 04 08:41:19 tests knockd[1762845]: starting up, listening on eth0

Теперь проверим, что сервис действительно работает. Для этого «постучим» на сервер снаружи:

knock  7000:tcp 8000:tcp 9008:tcp

На сервере в /var/log/syslog мы увидим следующее:

Feb 4 08:43:43 tests knockd: xx.xx.xx.xx: opencloseSSH: Stage 1_x000D_Feb 4 08:43:43 tests knockd: xx.xx.xx.xx: opencloseSSH: Stage 2_x000D_Feb 4 08:43:43 tests knockd: xx.xx.xx.xx: opencloseSSH: Stage 3_x000D_Feb 4 08:43:43 tests knockd: xx.xx.xx.xx: opencloseSSH: OPEN SESAME_x000D_Feb 4 08:43:43 tests knockd: opencloseSSH: running command: /sbin/iptables -I INPUT 3 -s xx.xx.xx.xx -p tcp --dport 22 -j ACCEPT

Это означает, что 22 порт открылся. Убедимся в этом, посмотрев список правил iptables:

iptables -nL_x000D_Chain INPUT (policy DROP)_x000D_target prot opt source destination _x000D_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0  _x000D_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED_x000D_ACCEPT tcp -- xx.xx.xx.xx 0.0.0.0/0 tcp dpt:22_x000D_DROP all -- 0.0.0.0/0 0.0.0.0/0  _x000D__x000D_Chain FORWARD (policy DROP)_x000D_target prot opt source destination _x000D__x000D_Chain OUTPUT (policy ACCEPT)_x000D_target prot opt source destination

Продолжая наблюдать логи в /var/log/syslog , через 60 секунд мы увидим отработку команды stop_command, указанной в конфиге:

Feb 4 08:44:43 tests knockd: xx.xx.xx.xx: opencloseSSH: command timeout_x000D_Feb 4 08:44:43 tests knockd: opencloseSSH: running command: /sbin/iptables -D INPUT -s xx.xx.xx.xx -p tcp --dport 22 -j ACCEPT

Правило для открытия 22 порта удалилось. Проверям в iptables:

iptables -nL_x000D_Chain INPUT (policy DROP)_x000D_target prot opt source destination _x000D_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0  _x000D_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED_x000D_DROP all -- 0.0.0.0/0 0.0.0.0/0  _x000D__x000D_Chain FORWARD (policy DROP)_x000D_target prot opt source destination _x000D__x000D_Chain OUTPUT (policy ACCEPT)_x000D_target prot opt source destination

Так и есть. Всё работает отлично.

Теперь пару слов о том, как ещё можно использовать knockd. В start_command в /etc/knockd.conf можно необязательно указывать добавление/удаление правил iptables. Можно сделать, например, выключение сервера в экстренной ситуации, указав:

_x000D_start_command = /sbin/shutdown -h now_x000D_

Выключением можно не ограничиваться. В случае получения уведомления о взломе сервера, можно блокировать все соединения с внешним миром, удалить данные с диска, если её раскрытие критично. В общем, возможны любые действия, которые только можно придумать.

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

1 месяц ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

1 месяц ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

1 месяц ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

1 месяц ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

1 месяц ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

1 месяц ago