Я хочу разрешить подключения к порту x для IP-адресов, которые имеют «установленное» состояние на порту y.
Можно ли это сделать, просто используя iptables?
Ответ - «вроде». Вам нужно будет установить ipset
пакет и убедитесь, что ваше ядро ipset
служба поддержки.
Сначала вам нужно создать «IP Set» с таймаутом:
ipset create MySet hash:ip timeout 60
затем добавьте правило, которое будет сбрасывать тайм-аут для каждого установленного пакета
iptables -A INPUT -p tcp --dport $port1 -m state --state ESTABLISHED -j SET --add-set MySet src
наконец, добавьте набор правил, чтобы разрешить доступ ко второму порту, только если источник был записан, и отбросьте другие
iptables -A INPUT -p tcp --dport $port2 -j Port2_Test
iptables -A Port2_Test -m state --state ESTABLISHED -j ACCEPT
iptables -A Port2_Test -m state --state NEW -m set --match-set MySet src -j ACCEPT
iptables -A Port2_Test -p tcp -j REJECT
РЕДАКТИРОВАТЬ
Я только что понял, что также можно использовать recent
расширение соответствия. Вы делаете это так:
-A INPUT -p tcp --dport $portY -m state --state ESTABLISHED -m recent --name YThenX --set -j ACCEPT
...
-A INPUT -p tcp --dport $portX -j Port2_Test
...
-A Port2_Test -m state --state ESTABLISHED -j ACCEPT
-A Port2_Test -m state --state NEW -m recent --name YThenX --rcheck --seconds $timeout --reap $timeout -j ACCEPT
-A Port2_Test -p tcp -j REJECT
Может можно использовать стук порта? Открыть порт при установленном TCP-соединении возможно: http://en.wikipedia.org/wiki/Port_knocking