Салам-папалам всем!
Тут озадачился как же можно сделать свой сервер более безопаснее. Использование напрямую 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 -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] с теми же правлами, только порты поменяйте на нужное и всё.
Минусы этой штуки в том, что надо дополнительную прогу использовать прежде чем подсоединиться. Но, мне кажется, что ради безопасности потерпеть можно.
Всем безопасности!
Автор: dimitrius86