Pull to refresh

Comments 27

Неделя port knocking на Хабре! Ждем следующую статью "Я тут почитал предыдущие, ну нельзя же так!" Вот за это и любим наш Хабр ;)

Может, это классическая схема с "... захожу под другим именем и пишу заведомо неправильный ответ" :-)

Тогда если завтра выйдет пост про реализацию PortKnocking через NFQueue, то это буду либо я, либо наши сеньоры =))
Шутка.

Думаю, простого комментария по этой теме хватит :)


#!/usr/sbin/nft -f

flush ruleset

define SSH_KNOCK_PING_LEN1 = 128
define SSH_KNOCK_PING_LEN2 = 138
define SSH_KNOCK_PING_LEN3 = 148
define SSH_KNOCK_PING_LEN4 = 158

table inet filter {
  set s_ip_ssh_knock_step1 { type ipv4_addr; timeout 15s; gc-interval 5s; }
  set s_ip_ssh_knock_step2 { type ipv4_addr; timeout 15s; gc-interval 5s; }
  set s_ip_ssh_knock_step3 { type ipv4_addr; timeout 15s; gc-interval 5s; }
  set s_ip_ssh_knock_step4 { type ipv4_addr; timeout 15s; gc-interval 5s; }

  chain input {
    type filter hook input priority filter;

    ct state invalid counter drop
    ct state related,established counter accept

    ct state new tcp dport ssh ip saddr @s_ip_ssh_knock_step4 counter accept
    icmp type echo-request jump input_knock
    ct state new tcp dport ssh counter drop
  }
  chain input_knock {
    ip saddr @s_ip_ssh_knock_step3 meta length $SSH_KNOCK_PING_LEN4 add @s_ip_ssh_knock_step4 { ip saddr } counter
    ip saddr @s_ip_ssh_knock_step2 meta length $SSH_KNOCK_PING_LEN3 add @s_ip_ssh_knock_step3 { ip saddr } counter
    ip saddr @s_ip_ssh_knock_step1 meta length $SSH_KNOCK_PING_LEN2 add @s_ip_ssh_knock_step2 { ip saddr } counter
                                   meta length $SSH_KNOCK_PING_LEN1 add @s_ip_ssh_knock_step1 { ip saddr } counter
  }
}

Вы что?! Нельзя использовать PortKnocker, используйте VPN, Nginx... и вообще желательно отключить фаервол)))

Это значит, что послав один пакет, можно (гипотетически) сразу попасть во все списки.

Вы сравниваете размер и нахождение в предыдущем сете. Размер реального пакета удовлетворяет только одной из записей в таблице. Сколько бы из них и в каком порядке вы ни тестировали. Какая разница, в каком порядке располагать записи? Каждый пакет будет прописывать адресанта в свой сет.

только если адресант есть в предыдущем. то есть послав пакет размером 1028 раньше 999 в 3 список попасть не получится. Как я и говорил, если бы было 3 записи размером 999, то первый же пакет записал адресанта во все списки. А это - не зер гут

только если адресант есть в предыдущем. то есть послав пакет размером 1028 раньше 999 в 3 список попасть не получится.

Ага, так и задумано ведь.

Как я и говорил, если бы было 3 записи размером 999, то первый же пакет записал адресанта во все списки.

Не говорили :) при одинаковом размере да, только обратная проверка сетов работает (как единственное условие сравнения при всегда прямом прохождении ip-таблиц).

А вот и говорил =)))
"Почему я рассматриваю списки с начала в конец? Потому что при прохождении правил, таргет SET не прекращает прохождение по списку правил файрвола. Это значит, что послав один пакет, можно (гипотетически) сразу попасть во все списки. В данном примере, конечно, не получится, но все равно лучше смотреть с конца в начало."

Простите за занудство, но вы привели идеальный пример и не указали крайние случаи :) Гипотетическая область значений подразумевает явное их указание, имхо. Хотя бы для исключения таких вопросов, как мой.

Я так понял это было указано для общего случая, а не конкретного.
К примеру у меня какое-то время fail2ban работал так: при попытке доступа IP попадает в список подозрительных, а если подозрительный IP попадает в fail2ban правило, то уже банится.
И второе правило должно быть до первого.

Так ведь человеку посередине достаточно подслушать на какие порты отправляются пакеты и повторить атаку. Тут надо хитрее, список портов должен зависеть от чего-то глобального, например от времени. Схема будет сложнее, зато безопаснее.

С нетерпением жду ваш вариант. Мне он уже по нраву =)))

немного наркомании - брать OTP, и генерить скриптом правила айпитаблей, отсекая например 1 и 5 число в 6-символьном OTP. оно и будет портом для пастука (например) %)

Тут надо хитрее, список портов должен зависеть от чего-то глобального, например от времени. Схема будет сложнее, зато безопаснее.

Можно пойти дальше, если есть IPv6 /64 подсеть, то еще и IPv6 адрес генерировать в зависимости от времени, например раз в минуту менять на новый.

Если правильно понял, такой конфиг принимает соединения точечно, для всех остальных сервак остается безмолвным черным ящиком, который нет смысла атаковать. Шикарное решение.

Для семейного миниофиса (3-5 сотрудников) можно и в прод выпустить. На микротиках это работает не плохо и сам часто этим пользуюсь. На андройде есть не плохая тулза (Knock on Ports - от A Yaburov) для стука на разные устройства. Из минусов - не понятно, кто стучится -), но с впн возни много и далеко не всегда получится подключится через впн... Так что вариант вполне себе...

@ZakharovAV, поясните, пожалуйста, почему у финального списка ("достучавшихся") тип hash:net,iface ? А не просто hash:ip

Хороший вопрос. Это чтобы разрешить с внутренней сети подключаться по ssh =))) добавляем в ipset нужную подсеть и нужный интерфейс и то же самое правило разрешает работать в локалке

Sign up to leave a comment.