我想在有限的时间内打开 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
这应该可行吗,或者我的推理有问题?
答案1
--state ESTABLISHED
是的,只要 conntrack 不会忘记相应的状态条目,所有 TCP 数据包都会被匹配。确保服务器的 conntrack 超时时间足够长(您可以在net.netfilter.nf_conntrack_tcp_timeout_established
sysctl 中找到它们 - 默认值为 5 天,但有些系统会将其更改为非常短超时)。
(您实际上也应该接受已建立/相关的 ICMP 数据包,以让服务器接收路径 MTU 发现数据包和其他 ICMP 错误数据包等内容。)
您可以使用ipset用于匹配新的 IP 地址 - 它具有内置的超时功能。