System administration
20 September 2013

Защищаем систему. Или как настроить и использовать port knocking

From Sandbox
Салам-папалам всем!

Тут озадачился как же можно сделать свой сервер более безопаснее. Использование напрямую iptables с блокировкой по IP не решало проблемы, т.к. я могу к серверу подсоединяться не только с рабочего ПК, но и издому, или с другого города, или в автобусе (когда в пробках стою).
Решил использовать port knocking.
Кто ни разу не пользовался этим, милости прошу под кат.

Для тех кто не в теме кратко скажу: это демон, который «слушает» сетевой интерфейс и если «услышал», что идут запросы на 7000,8000,9000 порт, то добавляет разрешающее правило для вашего IP на определённый заранее вами порт. Она просто выполняет команду на разрешение или запрещение доступа в iptables.

Итак, я захотел прикрыть от всех ssh.
Сперва установим сам демон (для тестов я использовал свой рабочий ПК на Ubuntu):

sudo apt-get install knockd


Для CentOS можно установить так:

sudo rpm -Uhv http://pkgs.repoforge.org/knock/knock-0.5-3.el6.rf.x86_64.rpm


Далее нам надо отредактировать конфиг этого демона ( /etc/knockd.conf ):

[options]
        UseSyslog

[openSSH]
        sequence    = 7000:tcp,8000:tcp, 9000:udp
        seq_timeout = 5
        command     = /sbin/iptables -I INPUT 1 -s %IP% -d ВАШ_IP_ГДЕ_ХОТИТЕ_ОТКРЫТЬ_ДОСТУП -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000:udp,8000:tcp,7000:tcp
        seq_timeout = 5
        command = /sbin/iptables -D INPUT -s %IP% -d ВАШ_IP_ГДЕ_ХОТИТЕ_ПРИКРЫТЬ_ДОСТУП -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn



Затем перезапускаем демон:

sudo /etc/init.d/knockd restart


Далее, добавляем запрещающее правило для всех на 22-ой порт:

sudo iptables -A INPUT -s 0/0 -d ВАШ_IP_ГДЕ_ХОТИТЕ_ПРИКРЫТЬ_ДОСТУП -p tcp --dport 22 -j REJECT


В секции [openSSH] обратите внимание на строчки -I INPUT 1. Если мы просто напишем вместо этого -A INPUT, то оно будет добавляться в конец цепочки правил, и следовательно будет срабатывать только самое верхнее правило. Поэтому мы пишем так, что бы запрещающее правило было добавлено в конец.
sequence указывает на то, какими последовательностями портов мы будем открывать себе доступ. Обязательно укажите на своё.
Можно еще указать протокол, допустим так: 7000:udp, 8000:udp, 9000:tcp
tcpflags — тут мы указываем какие заголовки должны содержаться в передаваемых пакетах.

В секции [closeSSH] указываем обратную последовательность для закрытия 22-го порта. И там же команда на удаление вашего IP из списка разрешенных.

Теперь встаёт вопрос: как же послать эту волшебную последовательность на порты?
С сайта разработчика можно скачать программу для популярных платформ. Там же можно увидеть другие примеры использования.
В Windows я пользовался так: скачал, распаковал. Открыл командную строку,
cd ПУТЬ_ДО_ПАПКИ_С_ПРОГРАММОЙ
knock 192.168.0.1 7000:tcp 8000:tcp 9000:udp

Всё, открыли порт. Теперь мы можем заходить по SSH!

Если хотите для другого протокола это использовать, то таким же способом напишите секцию [openFTP], [closeFTP] с теми же правлами, только порты поменяйте на нужное и всё.
Минусы этой штуки в том, что надо дополнительную прогу использовать прежде чем подсоединиться. Но, мне кажется, что ради безопасности потерпеть можно.

Всем безопасности!

+16
27.3k 212
Comments 17
Top of the day