Для чего нужен 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_
Выключением можно не ограничиваться. В случае получения уведомления о взломе сервера, можно блокировать все соединения с внешним миром, удалить данные с диска, если её раскрытие критично. В общем, возможны любые действия, которые только можно придумать.
Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…
В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…
Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…
Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…
Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…
В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…