1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: linux, centos 7.5, ssh, port knocking, фаерволл, firewall, iptabels, iptables-services, iptables recent, iptables.rules, nmap</p>
1
<p>Теги: linux, centos 7.5, ssh, port knocking, фаерволл, firewall, iptabels, iptables-services, iptables recent, iptables.rules, nmap</p>
2
<p>Иногда возникает необходимость СОВСЕМ-СОВСЕМ обезопасить доступ по<strong>ssh</strong>на сервер. Например, когда у вас начальник страдает паранойей. Кто-то закрывает доступ для рута, другие ограничивают доступ для всех адресов, кроме конкретных. Мы же в данной заметке рассмотрим так называемый<strong>Port Knocking</strong>способ.</p>
2
<p>Иногда возникает необходимость СОВСЕМ-СОВСЕМ обезопасить доступ по<strong>ssh</strong>на сервер. Например, когда у вас начальник страдает паранойей. Кто-то закрывает доступ для рута, другие ограничивают доступ для всех адресов, кроме конкретных. Мы же в данной заметке рассмотрим так называемый<strong>Port Knocking</strong>способ.</p>
3
<p>Суть его заключается в следующем: настройки доступа (читай фаервола) требуют определённой последовательности подключений к определённым же закрытым портам. После того, как эта последовательность соблюдена, фаерволл открывает определённый порт для подключения.</p>
3
<p>Суть его заключается в следующем: настройки доступа (читай фаервола) требуют определённой последовательности подключений к определённым же закрытым портам. После того, как эта последовательность соблюдена, фаерволл открывает определённый порт для подключения.</p>
4
<h2>Введение</h2>
4
<h2>Введение</h2>
5
<p>Для реализации нам потребуется: • Тестовый Linux сервер - можете взять свой любимый дистрибутив • Пакеты<strong>iptabels</strong>и<strong>iptables-services</strong>• Модуль<strong>iptables recent</strong></p>
5
<p>Для реализации нам потребуется: • Тестовый Linux сервер - можете взять свой любимый дистрибутив • Пакеты<strong>iptabels</strong>и<strong>iptables-services</strong>• Модуль<strong>iptables recent</strong></p>
6
<p>Модуль<strong>recent</strong>нам понадобится для того, чтобы определять "стучался" ли в недавнем времени определенный IP-адрес в нужный нам порт. На основе этих данных можно строить последующую логику. Например, открывать определённый порт на короткий промежуток времени. Как раз то, что нам нужно!</p>
6
<p>Модуль<strong>recent</strong>нам понадобится для того, чтобы определять "стучался" ли в недавнем времени определенный IP-адрес в нужный нам порт. На основе этих данных можно строить последующую логику. Например, открывать определённый порт на короткий промежуток времени. Как раз то, что нам нужно!</p>
7
<p>Как всегда настраивая правила<strong>iptables</strong>будьте осторожны с применением настроек. Вы можете потерять коннект до хоста навсегда. Тем более если у вас нет консоли. Продумайте пути отката.</p>
7
<p>Как всегда настраивая правила<strong>iptables</strong>будьте осторожны с применением настроек. Вы можете потерять коннект до хоста навсегда. Тем более если у вас нет консоли. Продумайте пути отката.</p>
8
<p><em>Для своего стенда я буду использовать<strong>CentOS 7.5</strong>.</em></p>
8
<p><em>Для своего стенда я буду использовать<strong>CentOS 7.5</strong>.</em></p>
9
<h2>Приступим</h2>
9
<h2>Приступим</h2>
10
<p>Итак, у нас есть сервер с IP-адресом<strong>192.168.11.101</strong>. Нам необходимо запретить до него доступ всем, кроме тех, кто знает "как правильно постучаться". Последовательность портов будет такая:<strong>8881 7777 9991</strong></p>
10
<p>Итак, у нас есть сервер с IP-адресом<strong>192.168.11.101</strong>. Нам необходимо запретить до него доступ всем, кроме тех, кто знает "как правильно постучаться". Последовательность портов будет такая:<strong>8881 7777 9991</strong></p>
11
-
<p>Создаём длинное правило на се��вере. Записываем его в файл<strong>iptables.rules</strong>:</p>
11
+
<p>Создаём длинное правило на сервере. Записываем его в файл<strong>iptables.rules</strong>:</p>
12
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :TRAFFIC - [0:0] :SSH-INPUT - [0:0] :SSH-INPUTTWO - [0:0] -A INPUT -j TRAFFIC -A TRAFFIC -p icmp --icmp-type any -j ACCEPT -A TRAFFIC -m state --state ESTABLISHED,RELATED -j ACCEPT -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --seconds 30 --name SSH2 -j ACCEPT -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH2 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 9991 -m recent --rcheck --name SSH1 -j SSH-INPUTTWO -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH1 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 7777 -m recent --rcheck --name SSH0 -j SSH-INPUT -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH0 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 8881 -m recent --name SSH0 --set -j DROP -A SSH-INPUT -m recent --name SSH1 --set -j DROP -A SSH-INPUTTWO -m recent --name SSH2 --set -j DROP -A TRAFFIC -j DROP COMMIT<p>На сервере выполняем команды:</p>
12
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :TRAFFIC - [0:0] :SSH-INPUT - [0:0] :SSH-INPUTTWO - [0:0] -A INPUT -j TRAFFIC -A TRAFFIC -p icmp --icmp-type any -j ACCEPT -A TRAFFIC -m state --state ESTABLISHED,RELATED -j ACCEPT -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --seconds 30 --name SSH2 -j ACCEPT -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH2 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 9991 -m recent --rcheck --name SSH1 -j SSH-INPUTTWO -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH1 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 7777 -m recent --rcheck --name SSH0 -j SSH-INPUT -A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH0 --remove -j DROP -A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 8881 -m recent --name SSH0 --set -j DROP -A SSH-INPUT -m recent --name SSH1 --set -j DROP -A SSH-INPUTTWO -m recent --name SSH2 --set -j DROP -A TRAFFIC -j DROP COMMIT<p>На сервере выполняем команды:</p>
13
systemctl start iptables systemctl enable iptables iptables-restore < iptables.rules service iptables save<p>Теперь доступ есть только у тех, кто знает нашу последовательность. Я буду "стучаться" с помощью<strong>nmap</strong>. Для этого напишем простенький скрипт:</p>
13
systemctl start iptables systemctl enable iptables iptables-restore < iptables.rules service iptables save<p>Теперь доступ есть только у тех, кто знает нашу последовательность. Я буду "стучаться" с помощью<strong>nmap</strong>. Для этого напишем простенький скрипт:</p>
14
#!/bin/bash HOST=$1 shift for ARG in "$@" do sudo nmap -Pn --max-retries 0 -p $ARG $HOST Done<p>Запускаем его:</p>
14
#!/bin/bash HOST=$1 shift for ARG in "$@" do sudo nmap -Pn --max-retries 0 -p $ARG $HOST Done<p>Запускаем его:</p>
15
chmod + x knock.sh && ./knock.sh 192.168.11.101 8881 7777 9991<p>Теперь у нас есть 30 секунд для подключения. Если не успели за этот интервал, то придётся запускать скрипт заново.</p>
15
chmod + x knock.sh && ./knock.sh 192.168.11.101 8881 7777 9991<p>Теперь у нас есть 30 секунд для подключения. Если не успели за этот интервал, то придётся запускать скрипт заново.</p>
16
<h2>Заключение</h2>
16
<h2>Заключение</h2>
17
<p>В итоге мы закрыли доступ по<strong>ssh</strong>для всех, кроме "знающих". Остаётся, мизерная вероятность того, что кто-то в этот же 30 секундный промежуток попытается зайти на ваш сервер! Но это настолько маловероятно, да и вы сами знаете про стандартные средства защиты.</p>
17
<p>В итоге мы закрыли доступ по<strong>ssh</strong>для всех, кроме "знающих". Остаётся, мизерная вероятность того, что кто-то в этот же 30 секундный промежуток попытается зайти на ваш сервер! Но это настолько маловероятно, да и вы сами знаете про стандартные средства защиты.</p>
18
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
18
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
19
19