Защищаем SSH при помощи технологии "Port Knocking" [исправить]
Реализация идеи динамического открытия доступа к 22 порту, при предварительном
обращении telnet-ом на определенный сетевой порт (в примере 333 - открыть
доступ и 334 - закрыть). Идея реализована средствами iptables, без привлечения
дополнительных утилит и анализаторов логов. # Создаю цепочку с именем SSH
iptables -N SSH
# Правило по умолчанию в INPUT - DROP
iptables -P INPUT DROP
# Всё что пришло на 22 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 22 -j SSH
# Всё что пришло на 333 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 333 -j SSH
# Всё что пришло на 334 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 334 -j SSH
Разделения на цепочки сделано для своего удобства, от этого можно и отказаться.
Теперь заполняем цепочку SSH.
# Проверяем на наличие имени "SSH" у IP адреса устанавливающего соединение на 22 порт.
# И если оно присутствует - то ACCEPT
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT
# Устанавливает имя SSH любому IP адресу с которого пришло новое TCP соединение на указанный порт. (порт 333)
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 333 -m recent --set --name SSH --rsource -j DROP
# Удаляет имя "SSH" с IP адреса установившего соединение на этот порт. (порт 334)
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 334 -m recent --remove --name SSH --rsource -j DROP
Насладимся итоговым результатом:
Делаем:
telnet ip_address_or_domain_name 333
После чего спокойно подключаемся по SSH.
Когда прекращаем работу закрываем за собой 22 порт:
telnet ip_address_or_domain_name 334