我想允许在端口 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
编辑
我刚刚意识到也可以使用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