我需要通过 SSH 配置服务器,并在此过程中进行配置iptables
。更准确地说,我希望按以下顺序运行以下命令:
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 5000
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
iptables -A INPUT -j DROP
iptables-save
我该如何实现这一点而不会被锁定?我可以批量应用这些吗?
答案1
我可能会将规则保存在一个新文件中,然后/etc/iptables/new.rules
使用以下命令iptables-apply
对其进行测试:
iptables-apply -t 180 new.rules
这样,规则将保持有效 180 秒(-t = 时间),但除非您确认连接仍按预期工作,否则不会保存。如果 180 秒后没有交互,规则将恢复到之前的状态。
答案2
我通常这样做:
1)我备份了旧的 iptables 配置文件:
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
2)在尝试新设置之前,我会执行此命令,以确保如果新设置中的某些内容将我锁定,我可以重新连接(基本上我会在 10/15 分钟后替换旧规则):
echo“mv /etc/sysconfig/iptables.bak /etc/sysconfig/iptables && service iptables restart”| 现在 + 15 分钟
3)现在我可以安全地修改 iptables 规则了。如果出现问题,我可以在 15 分钟内重新连接。
答案3
我认为您认为自己会被锁定的原因是您在配置 ACCEPT 规则之前输入了默认 DROP 规则。
通过单个 shell 命令运行命令,例如:
bash -c 'iptables -F; iptables -P INPUT DROP; ...'
整个字符串将被发送并读取,然后进行处理,然后应用规则。由于命令不需要输入,它们将全部处理,完成后您仍然可以访问。
答案4
如果您想避免暂时被锁定的情况(并避免防火墙设置因错误而失败的风险),一种技术替代方案是避免 INPUT 表刷新。 用以下方法替换iptables -F
或iptables -F INPUT
iptables -I INPUT 1 -p tcp -m tcp --dport 22 -j ACCEPT
while iptables -D 2 INPUT; do
:
done
for chain in $(iptables -L -n | awk '/^Chain/ && $2 != "INPUT" { print $2 }'); do
iptables -F "$chain"
done
然后像往常一样定义规则(只需将 -A 用于 INPUT,请不要-I INPUT 1
),最后删除连接安全规则:iptables -D INPUT 1