Эта технология позволяет выполнить заданную команду, при условии, что к серверу мы будем подключаться к определенным портам и протоколам в заданной последовательности.
В нашем случаее "Заданными командами" будет добавление правил в FireWall на открытие и закрытие порта. Устанавливать и настраивать будем на примере Debian Bullseye.
Сервер:
Обновляем список зеркал и устанавливаем пакет:
# apt update && apt install knockd
Документация:
Для демона и программы.
# man knock
# man knockd
Настраиваем iptables:
- Разрешаем все входящие запросы на внутренний интерфейс lo;
- Разрешаем принимать пакеты уже установленных соединений;
- Разрешаем все входящие соеденения на tcp=port;
- Запрещаем все, что не разрешено.
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -P INPUT DROP
- Проверяем
# iptables -S или # iptables -nL
- Для очистки добавленных правил,
# iptables -P INPUT ACCEPT
# iptables -F
Чтобы настройки iptables сохранялись после перезагрузки:
# apt-get install iptables-persistent
Конфигурируем демон knockd:
В options задаем путь к LogFile. Важно! в openSSH, в переменной command, меням -A INPUT на -I INPUT 1, эта правка, позволит новому правилу быть выше запрещающего -P INPUT DROP.
# nano /etc/knockd.conf
[options]
UseSyslog
Interface = ens16.88
LogFile = /var/log/knockd.log
[openSSH]
sequence = 7000:udp,8000:udp,9000:tcp
seq_timeout = 5
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000:tcp,8000:tcp,7000:udp
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Альтернатива [openSSH] - [closeSSH] -> [autoSSH]:
Открываем порт переменной "start_command", с помощью таймера "cmd_timeout" чз 10 секунд автоматически закрываем его "stop_command".
[autoSSH]
sequence = 7000:udp,8000:udp,9000:tcp
tcpflags = syn
seq_timeout = 5
start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Настраиваем автозапуск и задаем сетевой интерфейс:
Важно! Для правильной работы демона, в конфиге "knockd.conf" или "knockd", необходимо указать название сетевого интерфейса.
# ip a
# nano /etc/default/knockd
START_KNOCKD=1
#KNOCKD_OPTS="-i eth1"
- Добавляем юнит в автозагрузку:
# systemctl enable knockd.service
Рестартуем демон knockd:
# /etc/init.d/knockd restart
- Проверяем что все ОК:
# systemctl status knockd.service
# less /var/log/knockd.log
starting up, listening on ens16.88
Готово! =)
Клиент:
С другого хоста проверяем:
[closeSSH]
# knock server_ip_address 9000:tcp 8000:tcp 7000:udp
- Далее пробуем подключиться к 22 порту (ssh),
# ssh user@server_ip_address -p 22
И если BAD!, то,
[openSSH]
# knock server_ip_address 7000:udp 8000:udp 9000:tcp
Клиент для Android:
| Port Knocker | Плагин для JuiceSSH |