Привет всем! Давно не писал ничего, честно говоря, желания особого не было. А тут вдруг, просматривая логи в очередной раз понял “как же задолбали эти бруты!”. Кстати, я уже описывал настройку portknocking для mikrotik и для freebsd. А как же родненький линукс?
Для справки. Port Knocking – процедура открытия себе доступа при простукивании определённых (в том числе закрытых) портов сервера. Изначально у нас доступ на SSH закрыт всем. Открыт только для “белого списка”. И если в течении 30 секунд попытаться установить соединение с портами, к примеру: 11890/tcp, 11900/tcp, 11001/tcp (именно в таком порядке), то наш IP-адрес заносится в белый список на минуту.
Возникает сразу 2 вопроса (ну у всех разное количество, но у меня 2 возникло):
- А что, если кто-то будет сканировать порты просто?
- А хватит ли нам минуты, чтобы произвести все действия административного характера?
Отвечу сразу же сам:
На случай сканирования портов, мы создадим ещё и “ловушки”. Например, если после стука на 11890 порт у нас будет, 11891 – то такая ситуация приводит к тому, что IP-источник заносится в чёрный список.
Теперь по поводу минуты. Не забывайте, что в большинстве случаев будем работать с stateful-файрволлом, который отслеживает состояния. И если установлено соединение по ssh (минуты хватит, чтобы его установить), то дальше уже все пакеты пойдут по первому правилу как established-соединение, даже если мы вылетим из белого списка.
Этапы установки PortKnocking
- Установим пакет knockd привычным способом:
Для Debian-like систем:
# apt-get install knockd
Для CentOS-like систем:
# yum install knockd
- Сконфигурируем должным образом файл /etc/knockd.conf
[options]
UseSyslog
logfile = /var/log/knockd.log
[opencloseSSH]
sequence = 11890:tcp,11900:tcp,11001:tcp
seq_timeout = 20
start_command = /sbin/iptables -I INPUT 2 -s %IP% -p tcp -m tcp --dport 22 -j ACCEPT
tcpflags = syn
cmd_timeout = 60
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp -m tcp --dport 22 -j ACCEPT - Добавим правила в rc.local:
/sbin/iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -I INPUT 2 -p tcp -m tcp --dport 22 -j DROP - Запустим сервис и ОБЯЗАТЕЛЬНО!!! протестируем как всё работает.
# tcpdump -i any ‘port 11890 || port 11900 || port 11001’
при кнокинге должен “ловить” пакеты.
В лог-файле /var/log/knockd.log должны появляться соответствующие строки:
[2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 1
[2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 2
[2020-05-17 11:57] 188.113.#.#: opencloseSSH: Stage 3
[2020-05-17 11:57] 188.113.#.#: opencloseSSH: OPEN SESAME
[2020-05-17 11:57] opencloseSSH: running command: /sbin/iptables -I INPUT 2 -s 188.113.#.# -p tcp -m tcp --dport 22 -j ACCEPT
Что при это происходит
- Все обращения на SSH-порт у нас заблокированы правилом №2 в rc.local.
- В случае успешного прохождения по цепочке Stage, мы добавляем правило №2 с разрешением для нашего IP-адреса. При этом остальные правила сдвигаются вниз. И мы можем попасть на сервер с нашего адреса.
- Когда таймаут истекает, мы остаёмся на линии благодаря первому правилу пропускания ESTABLISHED-соединения.
Когда всё успешно протестировано, можно добавить новые правила в knockd.conf, где прописать аналогично, только сперва запрет, а потом разрешение – для правил-ловушек от сканирования портов.
Удачи!
Comments: