HTML Diff
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 &lt; iptables.rules service iptables save<p>Теперь доступ есть только у тех, кто знает нашу последовательность. Я буду "стучаться" с помощью<strong>nmap</strong>. Для этого напишем простенький скрипт:</p>
13 systemctl start iptables systemctl enable iptables iptables-restore &lt; 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 &amp;&amp; ./knock.sh 192.168.11.101 8881 7777 9991<p>Теперь у нас есть 30 секунд для подключения. Если не успели за этот интервал, то придётся запускать скрипт заново.</p>
15 chmod + x knock.sh &amp;&amp; ./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