Существует масса самых различных реализаций этой техники, начиная от самопальных скриптов, написанных первокурсниками, и заканчивая плагинами для iptables, но наиболее любима в народе, проста в использовании и богата на функционал система knock. О ней и поговорим.
Настроить knock нетрудно:
1 Конфигурируем брандмауэр таким образом, чтобы все незанятые реальными сервисами порты выше 1024 были открыты. Часть из них незаметно будет слушать наш демон. Порт защищаемого сервиса оставляем закрытым.
2 Создаем файл /etc/knockd.conf и пишем в него примерно следующее:
[ssh-open] sequence = 1111,2222,3333 seq_timeout = 10 tcpflags = syn command = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT
[ssh-close] sequence = 3333,2222,1111 seq_timeout = 10 tcpflags = syn command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT
3 Запускаем демон:
# knockd -d
4 Берем такси, едем домой и на домашней машине выполняем команду:
$ knock my.lovely.server.com 1111 2222 3333
5 Подключаемся SSH-клиентом к серверу и делаем то, что нужно.
6 Благополучно закрываем SSH-порт:
$ knock my.lovely.server.com 3333 2222 1111
Отныне злодей даже и не догадается о том, что в наш любимый сервер можно проникнуть извне. Для него SSH-порт всегда будет закрыт (открывается он только для того IP, с которого был осуществлен «стук»). Но и это еще не все! Заказав такси прямо сейчас, ты сможешь вернуться к серверу и получить в подарок еще более надежную технику конспирации:
# vi /etc/knockd.conf
[ssh] sequence = 1111:udp,2222:tcp,3333:udp seq_timeout = 15 tcpflags = syn,ack start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT cmd_timeout = 10 stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT
Это более интересный способ открытия порта, использующий сразу два приема повышения безопасности. Во-первых, теперь Штирлиц должен долбить в дверь не только рукой, но и ногой, то есть «стучать» и в TCP, и в UDP-порты. А во-вторых, брандмауэр откроет SSH-порт для входящих соединений только на 10 секунд, в течение которых мы должны успеть установить SSH-соединение (естественно, iptables должен быть сконфигурирован так, чтобы он без вопросов пропускал любой трафик уже установленных соединений). Конечная команда на подключение выглядит следующим образом:
$ knock 1111:udp 2222:tcp 3333:udp & ssh my.lovely.server.com
UPD: Реализация Port knocking средствами iptables (спасибо Koffu - koffua.gmail@com):
# разрешаем установленные соединения через connection tracker. iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT # создаём новую цепочку для порядка iptables -N SSH # перенаправляем кнок-порт 22122 в новую цепочку iptables -A INPUT -p tcp -m tcp --dport 22122 --syn -j SSH # перенаправляем кнок-порт 22122 в новую цепочку iptables -A INPUT -p tcp -m tcp --dport 22 --syn -j SSH # добавляем запись о удалённом адресе в таблицу ssh,заносим его TTL, сбрасываем соединение. iptables -A SSH -p tcp -m tcp --dport 22122 --syn -m recent --set \ --name ssh --rsource -j REJECT --reject-with tcp-reset # разрешаем соединения на порт 22 адресам, которые есть в таблице и их timestamp<timestamp+30 iptables -A SSH -p tcp -m tcp --dport 22 --syn -m recent --rcheck \ --seconds 30 --name ssh --rsource -j ACCEPT # всё что не разрешилось выше попадает сюда и идёт лесом. iptables -A SSH -p tcp --dport 22 -j REJECT --reject-with tcp-reset