iptables - разрешить подключения к порту только для IP-адресов с установленным состоянием на другом порту

iptables - разрешить подключения к порту только для IP-адресов с установленным состоянием на другом порту

Я хочу разрешить соединения на порту x для IP-адресов, имеющих состояние «установлено» на порту y.

Можно ли это сделать, просто используя iptables?

решение1

Может быть, вы можете использовать port knocking? Открыть порт при установленном tcp-соединении, может быть возможно: http://en.wikipedia.org/wiki/Стук_в_порту

решение2

Ответ: "вроде того". Вам нужно установить ipsetпакет и убедиться, что ваше ядро ​​поддерживает ipsetего.

Сначала вам придется создать «IP-набор» с таймаутом:

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расширение match. Это делается так:

-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

Связанный контент