iptables - 仅允许与另一个端口上已建立状态的 IP 地址建立到某个端口的连接

iptables - 仅允许与另一个端口上已建立状态的 IP 地址建立到某个端口的连接

我想允许在端口 x 上与在端口 y 上处于“已建立”状态的 IP 地址建立连接。

仅使用 iptables 可以做到吗?

答案1

也许你可以使用端口敲击?建立 tcp 连接时打开端口,可能是可能的: http://en.wikipedia.org/wiki/Port_knocking

答案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

编辑

我刚刚意识到也可以使用recentmatch 扩展。你可以这样做:

-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

相关内容