Поиск по сайту:

Как скрыть сетевые порты с помощью последовательности стука портов в Debian 10


На этой странице

  1. Требования
  2. Шаг 1. Установка Knockd
  3. Шаг 2. Конфигурация Knockd
  4. Шаг 3. Правила брандмауэра
  5. Шаг 4. Тестирование
  6. Альтернативная конфигурация
  7. Заключение

Стук портов - это метод динамического открытия сетевых портов путем «стука» (т.е. подключения) к заранее определенной последовательности портов. Это особенно полезно для сокрытия открытого сетевого порта от сканирования портов, поскольку рассматриваемый порт будет закрыт, если не будет выполнена последовательность пробивания портов. Достаточно длинную последовательность пробивания портов практически невозможно взломать методом грубой силы: например, чтобы успешно угадать (путем грубой силы) комбинацию из 3 портов TCP, злоумышленник должен будет попытаться взломать каждую из 281 триллиона возможных комбинаций и просканировать их. открывайте порты после каждой последовательности детонации портов. Как вы, наверное, можете себе представить, это займет очень и очень много времени.

Это руководство поможет вам в установке Knockd, гибкого демона перехвата портов, в Debian 10. В демонстрационных целях мы настроим его для скрытия порта SSH, хотя любой другой порт/служба может быть защищена с помощью этого подхода.

Требования

  • Сервер под управлением Debian 10.
  • Корневой доступ к вашему серверу.
  • Должна быть установлена переменная среды $EDITOR.
  • Вторая система для тестирования.

ПРИМЕЧАНИЕ. Если вы собираетесь использовать блокировку портов, чтобы скрыть порт SSH, убедитесь, что у вас есть альтернативный метод доступа (например, через консоль), который пригодится, если вы случайно заблокируете себя.

Перед установкой Knockd проверьте имя общедоступного сетевого интерфейса вашей системы с помощью следующей команды:

ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

Обратите внимание на имя интерфейса (в данном случае ens18). Он понадобится позже.

Шаг 1: Установка Knockd

Knockd — это демон, прослушивающий порты, который прослушивает соединения и соответственно открывает порты. Мы будем использовать Knockd с правилами iptables для реализации стука портов. Установите необходимые пакеты следующим образом:

apt update
apt install knockd iptables-persistent

Шаг 2: Конфигурация Knockd

Knockd использует один файл конфигурации, /etc/knockd.conf, для определения последовательности ударов и других параметров. Есть два практических режима работы. Первый требует одной последовательности ударов, чтобы открыть и закрыть предопределенный порт, в то время как другой использует отдельные последовательности открытия и закрытия. Мы будем использовать первый, так как он требует меньшего взаимодействия с пользователем.

Сначала сделайте резервную копию существующего файла конфигурации:

mv /etc/knockd.conf /etc/knockd.conf.bak

Во-вторых, откройте файл конфигурации в текстовом редакторе:

$EDITOR /etc/knockd.conf

И введите конфигурацию, показанную ниже:

(замените ens18 на имя вашего сетевого интерфейса.)

[options]
        UseSyslog
	Interface = ens18
[SSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout = 20

Это даст команду Knockd включить трафик на порт 22 после получения правильной последовательности стуков (в данном случае 1000, 2000, 3000), а затем повторно отключить трафик после 20-секундной задержки. Таким образом, SSH-соединения будут приниматься только в течение этого 20-секундного окна.

Затем включите Knockd, отредактировав файл /etc/default/knockd:

$EDITOR /etc/default/knockd

И установите START_KNOCKD в 1:

START_KNOCKD=1

Сохраните файл и выйдите. Мы также изменим модуль systemd для работы с Knockd. Для этого создайте новый файл модуля, чтобы переопределить значение по умолчанию:

$EDITOR /etc/systemd/system/knockd.service

И вставьте следующее:

[Unit]
Description=Port-Knock Daemon
After=network.target
Requires=network.target
Documentation=man:knockd(1)
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStartPre=/usr/bin/sleep 1
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target

Затем используйте следующую команду для загрузки и включения нового модуля:

systemctl daemon-reload
systemctl enable --now knockd.service

Шаг 3: Правила брандмауэра

На данный момент Knockd готов, но по умолчанию весь трафик разрешен через брандмауэр. Мы создадим правила брандмауэра, чтобы запретить доступ к порту 22/tcp.

Следующие команды гарантируют, что существующие соединения не будут прерваны.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Ниже приведены правила сброса подключений к порту 22/tcp:

iptables -A INPUT -p tcp --destination-port 22 -j DROP
ip6tables -A INPUT -p tcp --destination-port 22 -j DROP

Затем сохраните текущие цепочки правил для сохранения после перезагрузки:

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Шаг 4: Тестирование

Из другой системы попробуйте начать новый сеанс SSH с вашим сервером. Вы не должны быть в состоянии подключиться. Для выполнения последовательности постукивания можно использовать различные инструменты, хотя мы будем демонстрировать с помощью Knock, клиента постукивания, входящего в состав Knockd. Установите пакет Knockd, как показано на шаге 1, в другую систему, затем выполните команды:

knock server_ip_address 1000 2000 3000
ssh _ip_address

Теперь соединение SSH должно быть успешным.

Альтернативная конфигурация

В качестве альтернативы Knockd можно настроить так, чтобы для открытия и закрытия сетевых портов требовались две разные последовательности. Это полезно, если вы хотите, чтобы порты оставались открытыми в течение длительного периода времени. Чтобы настроить Knockd таким образом, откройте его файл конфигурации:

$EDITOR /etc/knockd.conf

И замените существующую конфигурацию следующей:

[options]
        UseSyslog
        Interface = your_interface
[openSSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
        sequence = 3000,2000,1000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Затем перезапустите службу, чтобы загрузить новую конфигурацию:

systemctl restart knockd.service

Заключение

Knockd может быть эффективным решением для атак методом грубой силы, которые очень распространены в SSH и других сервисах. Несмотря на то, что systemd перезапустит Knockd в случае сбоя, у вас всегда должен быть резервный метод доступа к вашему серверу, если вы используете перехват портов, чтобы скрыть порт SSH.