odin Posted August 3, 2025 Posted August 3, 2025 (edited) Стояла задача предоставить доступ пользователям к внутренниму сервису. Обеспечив минимальную безопасность сервиса - сокрытие самого порта от сканеров и брутфорсеров. С минимальным инструментарием клиента. Использовать только одну программу клиента, которая поддерживает множественность адресов подключения - резервные адреса. Клиент RAS Client (Parallels client) У клиента выставляем 5 адреса подключения 1) адрес роутера, порт пробрасываемого сервиса 2) адрес роутера, порт СТУК 1 3) адрес роутера, порт СТУК 2 4) адрес роутера, порт СТУК 3 5) адрес роутера, порт пробрасываемого сервиса Первое подключение происходит долго , идёт простукивание портов. Все последующие быстро, уже в белом списке. На роутере, предварительно, пробросить порт обычными средствами. Спойлер #!/bin/sh # PORT KNOKING для пробрасываемого порта # класть в /opt/etc/ndm/netfilter.d/100portknok.sh # не забыть chmod +x /opt/etc/ndm/netfilter.d/100portknok.sh # # логика работы # требуется 3 стука # если между простуками будет обращение к постороннему порту доверие утрачивается # сделано для защиты от случайного срабатывания при массовом сканировании портов # пример # если сделать 3 массовых сканирования всех портов то без этой проверки попадёт в списко доверия - KKD # Рекомендация # если второй порт Больше первого, то 3й порт брать Меньше первого, пример : 7777 8888 6666 # если второй порт Меньше первого, то 3й порт брать Больше первого, пример : 7777 6666 8888 # если модули ещё не загружены, то рано применять countMod=$(lsmod | grep -c xt_recent) if [ "$countMod" -eq 0 ]; then exit 0 fi # проверка для какой таблици запускается скрипт [ "$type" == "ip6tables" ] && exit 0 [ "$table" != "filter" ] && exit 0 # поверка на наличие моей цепочки в таблице filter count=$(iptables -t filter -L _NDM_FORWARD | grep -c KNOCKING-LAST) if [ "$count" -gt 0 ]; then exit 0 fi # переменные #WAN MYIF=eth3 # порты простука KK1=1111 KK2=2222 KK3=3333 # внутренний получатель пакетов TIP=192.168.0.2 # порт получателя пакетов TPORT=80 # интервал времени кежду портами MYIDLE=15 # вермя пропуска (28800 = 8ч) WT=28800 # цепочки iptables -N STATE0 iptables -N STATE1 iptables -N STATE2 iptables -N STATE3 iptables -N SUB_STATE1 iptables -N SUB_STATE2 iptables -N SUB_STATE3 iptables -N KNOCKING-LAST iptables -N KNOCKING-FIRST # используются цепочки стоящие после проверок на безопасность echo "=== PORT KNOCKING ===" iptables -I _NDM_INPUT -m state --state NEW -i $MYIF -p tcp -j KNOCKING-FIRST iptables -I _NDM_FORWARD -m state --state NEW -i $MYIF -p tcp -j KNOCKING-LAST #============================================================================================== # Белый список IP (white list), пример : iptables -I _NDM_FORWARD -s 8.8.8.8 -m recent --set --name KKD --rsource #============================================================================================== echo "=== KNOCKING-LAST===" # -=01=- пропущен на 8ч iptables -A KNOCKING-LAST -d $TIP -p tcp -m tcp --dport $TPORT \ -m recent --rcheck --seconds $WT --name KKD --rsource -j ACCEPT # -=02=- на 3й стадии iptables -A KNOCKING-LAST -d $TIP -p tcp -m tcp --dport $TPORT -j STATE3 # -=03=- время истекло 8ч или не в том списке iptables -A KNOCKING-LAST -m recent --remove --name KK1 --rsource iptables -A KNOCKING-LAST -m recent --remove --name KK2 --rsource iptables -A KNOCKING-LAST -m recent --remove --name KK3 --rsource iptables -A KNOCKING-LAST -m recent --remove --name KKD --rsource # -=04=- не наш пакет iptables -A KNOCKING-LAST -j RETURN #============================================================================================== echo "=== KNOCKING-FIRST===" # -=05=- на 2й стадии iptables -A KNOCKING-FIRST -p tcp -m tcp --dport $KK3 -j STATE2 # -=06=- на 1й стадии iptables -A KNOCKING-FIRST -p tcp -m tcp --dport $KK2 -j STATE1 # -=07=- на 0й стадии iptables -A KNOCKING-FIRST -p tcp -m tcp --dport $KK1 -j STATE0 # -=08=- промах по порту, удаление из списков iptables -A KNOCKING-FIRST -m recent --remove --name KK1 --rsource iptables -A KNOCKING-FIRST -m recent --remove --name KK2 --rsource iptables -A KNOCKING-FIRST -m recent --remove --name KK3 --rsource # -=09=- НЕ выбрал нужный порт, вернуть iptables -A KNOCKING-FIRST -j RETURN # для проверки когда выпадает #iptables -A SUB_KNOCKING-FIRST -m recent --set --name KK- --rsource -j ACCEPT #============================================================================================== echo "=== STATE0===" # === СТАДИЯ 1 порт $KK1 === # -=10=- елси он ещё в 1ом списке iptables -A STATE0 -m recent --update --seconds $MYIDLE --name KK1 --rsource -j DROP # -=11=- если не в списке, занести в 1й список iptables -A STATE0 -m recent --set --name KK1 --rsource # для включения счётчика времени и самоудалине ИП из списка iptables -A STATE0 -m recent --rcheck --seconds $MYIDLE --name KK1 --rsource -j DROP #============================================================================================== echo "=== STATE1 ===" # === СТАДИЯ 2 порт $KK2 (только если был $KK1) === # -=12=- если он уже во 2ом списке iptables -A STATE1 -m recent --update --seconds $MYIDLE --name KK2 --rsource -j DROP # -=13=- если он ещё в 1ом списке (первое попадание) iptables -A STATE1 -m recent --rcheck --seconds $MYIDLE --name KK1 --rsource -j SUB_STATE1 # -=14=- попал в нужный порт но оказался не в том списке (не та стадия) iptables -A STATE1 -j RETURN # -=15=- из 1го перенести во 2й список iptables -A SUB_STATE1 -m recent --remove --name KK1 --rsource iptables -A SUB_STATE1 -m recent --set --name KK2 --rsource # для включения счётчика времени и самоудалине ИП из списка iptables -A SUB_STATE1 -m recent --rcheck --seconds $MYIDLE --name KK2 --rsource -j DROP #============================================================================================== echo "=== STATE2 ===" # === СТАДИЯ 3 порт $KK3 (только если был $KK2) === # -=16=- если он уже во 3ем списке iptables -A STATE2 -m recent --update --seconds $MYIDLE --name KK3 --rsource -j DROP # -=17=- если он ещё в 2ем списке (первое попадание) iptables -A STATE2 -m recent --rcheck --seconds $MYIDLE --name KK2 --rsource -j SUB_STATE2 # -=18=- попал в нужный порт но оказался не в том списке (не та стадия) iptables -A STATE2 -j RETURN # -=19=- из 1го перенести во 2й список iptables -A SUB_STATE2 -m recent --remove --name KK2 --rsource iptables -A SUB_STATE2 -m recent --set --name KK3 --rsource # для включения счётчика времени и самоудалине ИП из списка iptables -A SUB_STATE2 -m recent --rcheck --seconds $MYIDLE --name KK3 --rsource -j DROP #============================================================================================== echo "=== STATE3 ===" # === СТАДИЯ 4 порт $TPORT (только если был $KK3) === # -=20=- если он ещё в 3ем списке (первое попадание) iptables -A STATE3 -m recent --rcheck --seconds $MYIDLE --name KK3 --rsource -j SUB_STATE3 # -=21=- попал в нужный порт но оказался не в том списке (не та стадия) iptables -A STATE3 -j DROP # -=22=- из 3го перенесли в 4й список iptables -A SUB_STATE3 -m recent --remove --name KK3 --rsource iptables -A SUB_STATE3 -m recent --set --name KKD --rsource # для включения счётчика времени и самоудалине ИП из списка iptables -A SUB_STATE3 -m recent --rcheck --seconds $MYIDLE --name KKD --rsource -j ACCEPT Первый раз пишу BASH скрипт, посему "не сильно бейте". Жду конструктивную критику и пожелания по улучшению. Edited August 18, 2025 by odin исправлена ошибка в скрипте Quote
FLK Posted August 3, 2025 Posted August 3, 2025 (edited) 3 часа назад, odin сказал: Обеспечив минимальную безопасность сервиса - сокрытие самого порта от сканеров и брутфорсеров. На этот счет уже придуман хороший инструмент Edited August 3, 2025 by FLK Quote
odin Posted August 3, 2025 Author Posted August 3, 2025 (edited) Я в курсе, сам пользуюсь. НО , одно другому не мешает. Усиление безопасности никогда не помешает. Добавлю. Если есть открытый порт то уже вызывает интерес. Для кого то даже спортивный. Так что лучше открыть порт не привлекая излишнего внимания. Один мой знакомы рассказал мне такую историю У него была легковая машина. На очередном СТО автомеханик ему предложил поставить противоугонную систему. Суть её была в том что зажигание не сработает пока не провести руку рядом с некоторой поверхностью, даже не прикасаясь. И вот как то он ехал и остановили его ДПС, оказалось переодетые бандиты которые промышляли перепродажей отобранных машин. И лишь только потому что его машина никак не заводилась он остался в живых. Это я к тому что не стоит рассчитывать открытые решения, потайные тоже рулят. Ещё пример. у 99% населения на входной двери квартиры стоят секретки на 20мин работы медвежатника. Но это не значит что надо ставить супер дорогую секретку, этим вы только привлечёте ещё больше внимание, прямо бросите вызов. Единственно правильное решение, скрытый замок, например магнитный или радио. Проводите магнитом в некотором месте двери или стены и начинают работать основные замки. Edited August 3, 2025 by odin Quote
Александр Рыжов Posted August 3, 2025 Posted August 3, 2025 Может возможно knockd для этих целей приспособить? Quote
odin Posted August 3, 2025 Author Posted August 3, 2025 (edited) Пробовал НО там вручную надо закрывать порт и нет ограничений по посторонним портам К тому же там приложение, здесь просто скрипт В моём решении порт открывается на 8ч и сам закрывается. Не надо лишних телодвижений по закрытию "двери" Добавлю knokd трогает только таблицу filter, Таблица nat не трогается открыв порт в таблице nat его тут же надо закрыть в таблице filter и потом отдельным правилом открывать/фильтровать итого, надо 2 правила вручную создавать, одно перманентно закрывает, второе при условии открывает, без скрипта ни как Так что их решение хорошо для локально открываемого порта. Здесь порт открываете средствами вебморды кинетика а блокируете и фильтруется средствами скрипта. Edited August 3, 2025 by odin Quote
MDP Posted August 11, 2025 Posted August 11, 2025 (edited) В 03.08.2025 в 18:43, odin сказал: Пробовал Есть предложение ... с помощью "постукивания" запускать приложение на кинетике, которое в данный момент не активно, но настроено. VPN-server, FTP-server и т.п. Думаю тоже полезно было бы? Так-то я их с мобильного приложения запускаю, когда требуется, но вдруг кому-то пригодиться ? Edited August 11, 2025 by MDP Quote
Le ecureuil Posted August 11, 2025 Posted August 11, 2025 Пока выглядит как ненужная фишка для полутора калек. Я не могу себе представить именно такой сценарий с простукиванием для массового юзера разумным. Намного проще поставить мобильное приложение и через него безопасно включать/выключать приложения. 2 Quote
MDP Posted August 11, 2025 Posted August 11, 2025 32 минуты назад, Le ecureuil сказал: Пока выглядит как ненужная фишка для полутора калек. Я не могу себе представить именно такой сценарий с простукиванием для массового юзера разумным. Намного проще поставить мобильное приложение и через него безопасно включать/выключать приложения. Сама идея постукивания прикольная😁... осталось дело за малым, к чему её применить. Quote
odin Posted August 12, 2025 Author Posted August 12, 2025 (edited) Цитата Есть предложение ... с помощью "постукивания" запускать приложение на кинетике, которое в данный момент не активно, но настроено. VPN-server, FTP-server и т.п. не получится. скрипт накидывает правила в фаервол для того чтоб он сам уже реагировал на "стуки" iptables не умеет запускать внешние команды это сможет сделать только knokd Edited August 12, 2025 by odin Quote
odin Posted August 19, 2025 Author Posted August 19, 2025 (edited) Antiscan - чудесный инструмент НО когда утром один офис пытается подключится ко второму то ИП первого офиса попадает в бан из-за повышенной активности у меня единственное решение это спрятать ключевой порт за СТУКОМ так что рекомендую моё решение Edited August 23, 2025 by odin Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.