Стояла задача предоставить доступ пользователям к внутренниму сервису.
Обеспечив минимальную безопасность сервиса - сокрытие самого порта от сканеров и брутфорсеров.
С минимальным инструментарием клиента.
Использовать только одну программу клиента, которая поддерживает множественность адресов подключения - резервные адреса.
Клиент 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
# проверка для какой таблици запускается скрипт
[ "$type" == "ip6tables" ] && exit 0
[ "$table" != "filter" ] && exit 0
# поверка на наличие правил в системе
if iptables -С KNOCKING-LAST -j RETURN ; 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
# для проверки когда выпадает
#iptables -N SUB_KNOCKING-FIRST
# white list
iptables -I _NDM_INPUT -s 1.1.1.1 -m recent --set --name KKD --rsource
# используются цепочки стоящие после проверок на безопасность
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
#==============================================================================================
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
# для проверки когда выпадает
#iptables -A KNOCKING-FIRST -m recent --rcheck --name KK1 --rsource -j SUB_KNOCKING-FIRST
#iptables -A KNOCKING-FIRST -m recent --rcheck --name KK2 --rsource -j SUB_KNOCKING-FIRST
#iptables -A KNOCKING-FIRST -m recent --rcheck --name KK3 --rsource -j SUB_KNOCKING-FIRST
# -=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 скрипт, посему "не сильно бейте".
Жду конструктивную критику и пожелания по улучшению.