我正在使用 iptables 为 VPS 创建一些防火墙规则。我的 shell 脚本如下所示:
#!/bin/sh
# My system IP/set ip address of server
SERVER_IP="1.2.3.4"
# Flushing all existing rules
iptables -F
iptables -X
# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Allow SSH on 22
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# Default policy DROP
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
如果我iptables -F
在运行此脚本后运行命令,我将无法使用 SSH(我可以重新登录,但我不想让 SSH 关闭)。
我有三个问题。
- 当我运行命令时,我是否会因为未删除的默认过滤策略而被锁定
iptables -F
? - 如果我这么做的话,我不会被锁定吗
iptables -FX
? - 如果我在 shell 脚本末尾添加默认删除策略,那么默认过滤策略是否有必要?
干杯!
答案1
当然,您会被锁定——您将策略设置为默认拒绝,然后刷新所有允许您进入的规则。
- 是的。
- 不,因为
-X
与连锁政策没有太大关系-F
(也就是说,没有任何关系)。 - 是的,因为规则可以被删除、刷新、旋转和破坏。链式策略则不能。
答案2
您应该只会发现 ssh 被暂时锁定,因为您在规则中允许了“ESTABLISHED”。但是,暂时的数据包丢失会扰乱 ssh,并且 tcp 需要 10 秒或更长时间才能恢复。
我自己总是在刷新命令之后立即在顶部放入一个通用的“iptables -A INPUT -m state --state established,related”规则,这样锁定时间就很短!
您没有使用 conntrack 来刷新状态,是吗?
ps 如果您正在控制来自相对受信任的局域网的连接,那么最后使用 REJECT 规则会更有帮助,因为失败的新连接尝试会被立即拒绝,而不必超时。