тук-тук на 2021, через 3-4 минуты на 10707 и порт 22 открывается для IP с которого стучали на 5 минут для пакетов SYN
обычно открывают доступ на несколько секунд: 5-10. не больше.
например:
стук на 2021, в течении 5 сек. ожидают стук на 10707, и в последующие 5 сек. на порт 22. если в любой момент происходит обращение на любой другой порт из диапазона 1024-65535, то все "дверцы" закрываются, и нужно начинать сначала.
Вначале попроще, с одним стуком на один порт:
ждем стук на порт 2021, после в течении 5 сек ждем на порт ssh. если в в течении этого времени было обращение на любой др. порт из диапазона 1024-65535, то закрываем доступ и всю процедуру нужно начинать сначала.
1. создаем несколько пользовательских цепочек:
iptables -N bad_packets - здесь будет реализованы защиты (брутфорс и др. методы защиты на свой вкус)
iptables -N knocks - здесь будет отслеживаться "стук" по нужному порту, и осуществляться "закрытие" "дверцы" в случае неправильного подключения или перебора портов
iptables -N tcp_in - здесь отслеживается входящий tcp трафик, в т.ч. и ssh
iptables -N tcp_allowed - здесь будет отслеживаться правильность установления соединения tcp
2. таблица filter, цепочка INPUT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # разрешаем все установленные соединения
iptables -A INPUT -i lo -j ACCEPT # разрешаем loopback
iptables -A INPUT -j bad_packets # в этой цепочке будет реализована защита от брутфорса
iptables -A INPUT -p tcp -j tcp_in # в этой цепочке будет реализован доступ к ssh в частности
....... далее на свое усмотрение
3. таблица filter, цепочка bad_packets
..... тут много чего можно позащищать, в частности нужно реализовать защиту от брутфорса
4. таблица filter, цепочка knocks
iptables -A knocks -p tcp --dport 2021 -m conntrack --ctstate NEW -m recent --name knock_ssh --rsource --set -j RETURN
iptables -A knocks -p tcp -m multiport --dports 1024:65535,22 -m recent --name knock_ssh --rsource --remove
5. таблица filter, цепочка tcp_in
iptables -A tcp_in -p tcp --dport 22 -m recent --name knock_ssh --rsource --rcheck --seconds 5 -j tcp_allowed
....... здесь еще какие, то порты открыть, если нужно
и в конце чуть не забыл

iptables -A tcp_in -p tcp -j knocks
iptables -A tcp_in -p tcp -j REJECT --reject-with icmp-port-unreachable
6. таблица filter, цепочка tcp_allowed
iptables -A tcp_allowed -p tcp --syn -m conntrack --ctstate NEW -j ACCEPT
iptables -A tcp_allowed -j REJECT --reject-with icmp-port-unreachable
все. теперь при обращении на порт 2021 на 5 сек откроется 22 порт.
я запарился писать

с двумя портами надо?

обратите внимание, я когда писал первый раз не написал обращение в цепочку knocks из tcp_in. сейчас исправил
