我想在有限的时间内在 mi 防火墙中打开一个端口,比如说 22,并在几分钟后将其关闭(以便来自其他 IP 而不是当前建立的 IP 的连接会发现该端口已关闭)。到目前为止,这是我带来的:
a) 在 iptables 中有一个永久规则,声明保持现有连接处于活动状态
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
b) 在 iptables 中添加一条规则,允许来自特定 IP 的连接进行连接,并在一段时间后将其删除:
iptables -I INPUT -p tcp --dport 22 -s XXX.XXX.XXX.XXX -j ACCEPT
这应该有效,还是我的推理有问题?
--state ESTABLISHED
是的,只要 conntrack 不忘记相应的状态条目,所有的 TCP 数据包都会被匹配。确保服务器的 conntrack 超时时间足够长(您可以在net.netfilter.nf_conntrack_tcp_timeout_established
sysctl 中找到它们——默认值为 5 天,但某些系统将其更改为非常短的超时时间)。(您实际上也应该接受已建立/相关的 ICMP 数据包,以让服务器接收诸如路径 MTU 发现数据包和其他 ICMP 错误数据包之类的内容。)
您可以使用ipset来匹配新的 IP 地址——它内置了超时功能。