Данный проект появился, как рудимент, а точнее как часть большого проекта по оптимизации процедуры обновления адрес листов по требованию заказчика, мы его немного подпилили и добавили нормальный вывод, а не сырые данные.

Для чего

Port Knocking - необходим тогда, когда вам необходимо получить доступ к ресурсу, который не хочется открывать всем подряд, а определить IP адреса нет возможности, так как они динамические.

Как пользоваться

Я хотел написать инструкцию, для каждого аргумента, но решил сделать чуть по другому и показать на примере, как можно использовать данную программку.

У программы есть несколько аргументов, запустите --help чтобы посмотреть короткие и длинные обозначения.

Примеры

Создание Knocking

Программе необходимо передать специально сформированную строку с определённым синтаксисом, что бы программа могла правильно выполнить процедуру Knocking

Пока программа умеет использовать только два протокола, это TCP и UDP, настоятельно рекомендую не использовать порты 53, так как некоторые ОПСОС-ы заворачивают трафик DNS на свои сервера.

Итак, поставим задачу: необходимо организовать Knocking на хост 5.19.245.3 по портам TCP 40000,111,443,77 и по протоколу UDP 777 и 9000

При формировании строки первым символом вы должны указать ОБЯЗАТЕЛЬНО заглавную букву H обозначающую, что далее через разделитель двоеточие : будет идти адрес на который необходимо сделать процедуру Knocking.

H:5.19.245.3 - далее вы указываете порты и протоколы заглавными буквами, где T - tcp, а U - udp

H:5.19.245.3,T:40000,T:111,T:443,T:77,U:777,U:9000 - параметры разделены запятыми, обратите внимание, что программа читает строку слева направо, и в таком же направлении производит Knocking.

Запустите программу с аргументом --command="H:5.19.245.3,T:40000,T:111,T:443,T:77,U:777,U:9000"

И Knocking сразу начнётся.

Доменное имя

Вы можете указать вместо IP адреса доменное имя H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000

Если для данного IP адреса есть несколько записей типа A, то для каждого IP адреса будет произведена процедура Knocking.

Тем самым вы можете создать любой поддомен, например validhostme.mikrotik.me и указать все ваши хосты, как записи A для данного домена.

Централизованное хранение

Вы можете взять любой субдомен как пример testknk.mikrotik.me и создать TXT записи, где значение записей будет ваша строка Knocking, например, H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000, записей может быть несколько и по каждой записи будет запущена процедура Knocking, технически мы не ограничивали, но и не проверяли на большом количестве записей.

В случае, если вы будете использовать DNS запросы, вам необходимо добавить параметр action со значением dns

Запуск будет выглядеть так --action=dns --command="testknk.mikrotik.me"

DNS запросы

Обратите внимание, программа использует реализацию DOH (DNS over HTTPS), поэтому ей необходим выход в интернет. Причём используется несколько серверов и выберется самый быстрый из них относительно хоста. на котором запущена программа.

Шифрование данных

Да, конечно хранить в DNS в открытом виде строки Knocking не самая лучшая идея, хотя она имеет право на жизнь, но рано или поздно её обнаружат и сам процесс Knocking-a будет скомпрометирован.

Вы можете зашифровать вашу строку конфигурации, например, такой командой

-a="encrypt" -p="dondslk((" -c="H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000"

Результатом выполнения будет вернувшаяся кодированная строка base64, а внутри неё byte код, результат шифрования строки конфигурации, с типом шифрования aes-cgm 128.

Результат: 3OKtTRqg0h4Dl7xmLYfu/QCCWSx4ut9mMLCW4rcEZWRhncqly89bJFTe+CjuuOZnvs66OYyHmQady8nRyEdBmlByg1ceUe1o1IqKGNl3+g==

Чтобы убедиться, что всё работает вы можете и должны проверять обратное преобразование, выполните команду

-a="decrypt" -p="dondslk((" -c="3OKtTRqg0h4Dl7xmLYfu/QCCWSx4ut9mMLCW4rcEZWRhncqly89bJFTe+CjuuOZnvs66OYyHmQady8nRyEdBmlByg1ceUe1o1IqKGNl3+g=="

Результатом выполнения данной команды должна быть строка, которую вы закодировали.

Теперь вы можете поместить данный результат в TXT запись домена, и в этом случае указать в аргументе пароль, которым был зашифрован конфиг.

Обратите внимание, пока можно использовать ТОЛЬКО один пароль для всех записей. Возможно в будущем мы это поправим.

Также вы можете указать данную зашифрованную строку непосредственно в аргумент Command, но тогда action должен быть либо со значением Knocking, либо не указан.

Обязательно укажите пароль

Loop

Если ваш хост, с которого вы запускаете Knocking, находиться в таких условия, что ваш внешний IP адрес может поменяться, вы можете указать аргумент --loop= и указать число, с каким тайм-аутом повторять Knocking, значение указывается в минутах. Например --loop=1 будет повторять Knocking каждую минуту.

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

Debug

Это пока мало похоже на debug, но всё же вы можете добавить аргумент --verbose и получить дополнительный вывод.

Мелочи

Программа не пытается установить соединение.

Если вы используете MikroTik, настоятельно рекомендую использовать при настройке Knocking таблицу raw.

Тестирование

Попробуйте, запустите программу со следующими параметрами и исследуйте вывод

-v -a="dns" -p="dondslk((" -c="knocktest.mikrotik.me"

Планы на будущее

  1. Дать возможность пользователю принудительно отказаться от DoH
  2. Реализовать возможность также через DNS отправки сообщения пользователям, например если не смогли расшифровать ключей и есть определённая запись, вывести сообщение, что пароль изменён.
  3. Динамический ключ, ключ будет рассчитываться из даты или других параметров.
  4. Совсем не быстро, но реализовать напрямую расчёт общего ключа по алгоритму DH, но для это понадобиться веб сервис.
  5. Получение конфигурации по http.
  6. Мы используем данный софт и для своих целей, и как показала практика при большом количестве записей Knocking, уходит приличное время, например при 200 ростах, может потребоваться около 5 минут на прохождения всех списков, так как мы в самом начале заложили к код модульность выполнения Knocking, сейчас мы не можем реализовать распараллеливание Knocking, но для нас это приоритетная задача.

Программа пишется сразу с учётом множества операционных систем единым кодом, для Windows, Linux и MacOS а также других ОS.

Пока программа находиться в тестировании.

Репозиторий https://github.com/vasilevkirill/knockme

Релизы https://github.com/vasilevkirill/knockme/releases

автор Васильев Кирилл.

Рассказать друзьям

Чатик телеграм

@mikrotikme