Quiero permitir conexiones en el puerto x para direcciones IP que tienen un estado "establecido" en el puerto y.
¿Es esto factible simplemente usando iptables?
Respuesta1
¿Quizás puedas usar el golpe de puerto? Abrir el puerto cuando se establece una conexión TCP, podría ser posible: http://en.wikipedia.org/wiki/Port_knocking
Respuesta2
La respuesta es "más o menos". Necesitará instalar ipset
el paquete y asegurarse de que su kernel sea ipset
compatible.
Primero tendrás que crear un "Conjunto de IP" con tiempo de espera:
ipset create MySet hash:ip timeout 60
luego agregue una regla que restablecerá el tiempo de espera para cada paquete establecido
iptables -A INPUT -p tcp --dport $port1 -m state --state ESTABLISHED -j SET --add-set MySet src
finalmente, agregue un conjunto de reglas para permitir el acceso al segundo puerto solo si la fuente ha sido registrada y elimine otras
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
EDITAR
Me acabo de dar cuenta de que también es posible utilizar la recent
extensión Match. Lo haces así:
-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