Защита SSH через port knocking
Иногда, по каким-то причинам необходимо закрыть какой-то порт так, чтоб к нему все же оставался доступ с любого IP адреса.
Например, регулятор требует, чтоб SSH порт был закрыт для всего мира.
На выручку приходит port knocking.
Итак, поставим knockd и настроим его так, чтоб SSH был закрыт, но открывался при попытке соединиться с последовательносью портов.
Установка knockd
sudo apt install knockd
sudo vim /etc/knockd.conf
Тут у нас есть уже настроенные правила, которые нам надо поправить. Меняем порты в которые мы будем стучаться, чтоб открылся наш SSH.
[openSSH]
sequence = 2233,2244,2255
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
...
[closeSSH]
sequence = 12322
Тут мы поменяли список портов и команде сменили -A
и -I
, что означает делать вставку правила файервола в начало списка правил, вместо того, чтоб добавлять его в конец.
Теперь нужно указать интерфейс, на котором knockd будет слушать попытки подключения. Для этого смотрим какой интерфейс мы будем использовать:
sudo ip addr
sudo vim /etc/default/knockd
Тут раскоментируем строку и вписываем правильное имя интерфейса:
...
KNOCKD_OPTS="-i ens18"
Iptables
Дальше настраиваем файервол:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
и делаем его активным после перезагрузки:
sudo apt install iptables-persistent
При установке соглашаемся сохранить наши существующие правила файервола.
Осталось перезапустить сервис knockd и проверить как все работает.
sudo service knockd restart
Подключаемся:
telnet ip 2233
telnet ip 2244
telnet ip 2255
ssh ip
Вот и все. SSH порт откроется для вашего текущего IP адреса и пустит вас на сервер.
Чтоб закрыть порт нужно постучать в указанный порт:
telnet ip 12322