KNOCK1="123"
KNOCK2="456"
KNOCK3="789"
KNOCK4="555"
TIME_OPEN="30"/sbin/iptables -N knock_rmv
/sbin/iptables -A knock_rmv -m recent --name phase1 --remove
/sbin/iptables -A knock_rmv -m recent --name phase2 --remove
/sbin/iptables -A knock_rmv -m recent --name phase3 --remove
/sbin/iptables -A knock_rmv -m recent --name phase4 --remove
/sbin/iptables -N knock_ph1
/sbin/iptables -A knock_ph1 -m recent --name phase1 --remove
/sbin/iptables -A knock_ph1 -m recent --name phase2 --set
/sbin/iptables -A knock_ph1 -j DROP
/sbin/iptables -N knock_ph2
/sbin/iptables -A knock_ph2 -m recent --name phase2 --remove
/sbin/iptables -A knock_ph2 -m recent --name phase3 --set
/sbin/iptables -A knock_ph2 -j DROP
/sbin/iptables -N knock_ph3
/sbin/iptables -A knock_ph3 -m recent --name phase3 --remove
/sbin/iptables -A knock_ph3 -m recent --name phase4 --set
/sbin/iptables -A knock_ph3 -j DROP
/sbin/iptables -N knock_end
/sbin/iptables -A knock_end -j knock_rmv
/sbin/iptables -A knock_end -j ACCEPT
/sbin/iptables -A INPUT -i $IF_EXT -p udp --dport $KNOCK1 -m recent --name phase1 --set -j DROP
/sbin/iptables -A INPUT -i $IF_EXT -p udp --dport $KNOCK2 -m recent --name phase1 --rcheck -j knock_ph1
/sbin/iptables -A INPUT -i $IF_EXT -p udp --dport $KNOCK3 -m recent --name phase2 --rcheck -j knock_ph2
/sbin/iptables -A INPUT -i $IF_EXT -p udp --dport $KNOCK4 -m recent --name phase3 --rcheck -j knock_ph3
/sbin/iptables -A INPUT -i $IF_EXT -p udp -m multiport --dports $KNOCK2,$KNOCK3,$KNOCK4 -j knock_rmv
/sbin/iptables -A INPUT -i $IF_EXT -p tcp --dport 22 -m recent --rcheck --seconds $TIME_OPEN --name phase4 -j knock_end
Это дает возможность открыть порт SSH для доступа на $TIME_OPEN секунд для IP, с которого пришли UDP пакеты(любые) на порты $KNOCK1, затем $KNOCK2, $KNOCK3 и $KNOCK4. При этом обращение на эти порты в другом порядке не откроет порт SSH для доступа.
Для открытия порта SSH на host необходимо выполнить команды с удаленного хоста
echo " " | nc -w 1 -u host $KNOCK1
echo " " | nc -w 1 -u host $KNOCK2
echo " " | nc -w 1 -u host $KNOCK3
echo " " | nc -w 1 -u host $KNOCK4
ssh user@host
И все. Предсказать порядок портов оооочень сложно - сканирование не спасает.
Для доступа с венды можно переделать на TCP вместо UDP и тыкаться в порты telnet'ом.