如何在通过 SSH 会话测试远程服务器配置时自动重置 Linux 防火墙
您可以使用iptables 命令和 shell 脚本组合 轻松清除当前配置。此类设置没有内置选项。因此,您需要编写一个小的 shell 脚本并从 crontab 文件中调用它或设置一个 cron 作业。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 防火墙 |
操作系统兼容性 | Alma • Alpine • Arch • Debian • Fedora • Linux • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu |
预计阅读时间 | 4 分钟 |
如何在通过 SSH 会话测试远程服务器配置时自动重置 Linux 防火墙
流程如下:
步骤 1 - 创建防火墙重置脚本
使用文本编辑器(例如 vim 或 nano)创建一个名为 /root/reset.fw 的新 shell 脚本,如下所示。例如:
# vim /root/reset.fw
附加以下脚本
#!/bin/bash # reset.fw - Reset firewall # set x to 0 - No reset # set x to 1 - Reset firewall # --------------------------------------------------------------------------------------------------------------- # Added support for IPV6 Firewall # --------------------------------------------------------------------------------------------------------------- # Written by Vivek Gite <vivek@example.com> # --------------------------------------------------------------------------------------------------------------- # You can copy / paste / redistribute this script under GPL version 2.0 or above # ============================================================= x=1 # set to true if it is CentOS / RHEL / Fedora box RHEL=false # set true if it is CentOS/RHEL v7.x or above RHEL7=false ### no need to edit below ### IPT=/sbin/iptables IPT6=/sbin/ip6tables if [ "$x" == "1" ]; then if [ "$RHEL" == "true" ]; then # reset firewall using redhat script if [ "$RHEL7" == "true" ]; then systemctl stop iptables systemctl stop ip6tables else ## old rhel <= v6.x ## /etc/init.d/iptables stop /etc/init.d/ip6tables stop fi else # for all other Linux distro use following rules to reset firewall ### reset ipv4 iptales ### $IPT -F $IPT -X $IPT -Z for table in $(</proc/net/ip_tables_names) do $IPT -t $table -F $IPT -t $table -X $IPT -t $table -Z done $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT ### reset ipv6 iptales ### $IPT6 -F $IPT6 -X $IPT6 -Z for table in $(</proc/net/ip6_tables_names) do $IPT6 -t $table -F $IPT6 -t $table -X $IPT6 -t $table -Z done $IPT6 -P INPUT ACCEPT $IPT6 -P OUTPUT ACCEPT $IPT6 -P FORWARD ACCEPT fi else : fi
第 2 步 - 设置权限
使用 chmod 命令设置脚本的权限:
# chmod +x /root/reset.fw
步骤 3 - 安装 cron 任务
创建cronjob每 5 分钟重置一次
# crontab -e
当前配置,输入
或
# vim /etc/crontab
在您的 Linux 机器上附加以下设置以重置防火墙:为您的 Linux 系统创建工作配置后,
*/5 * * * * root /root/reset.fw >/dev/null 2>&1
请记住将x设置为0 。
处理命令行规则
通过基于屏幕(或 tumx)的会话运行 iptables 防火墙命令,如下所示:
Your-iptable-rule-here && sleep 120 && /root/reset.fw
您可以加载防火墙规则并休眠 120 秒,然后使用 /root/reset.fw 脚本禁用/重置防火墙。
关于安全的说明
此外,为了避免让服务器处于易受攻击的状态,最好让服务器恢复一个已知良好的表版本,或者只锁定到 ssh 的版本。例如:
iptables -P INPUT DROP iptables -P OUTPUT DROP # only accept ssh port (add other as per need such as HTTP 80 or HTTPS 443) iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
例如,可以按如下方式更新上述脚本:
... else # for all other Linux distro use following rules to reset firewall ### reset ipv4 iptales ### $IPT -F $IPT -X $IPT -Z for table in $(</proc/net/ip_tables_names) do $IPT -t $table -F $IPT -t $table -X $IPT -t $table -Z done $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT #Uncommet to drop everything but only allow ssh over ipv4 ## #$IPT -P INPUT DROP #$IPT -P OUTPUT DROP #$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #$IPT -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT ### reset ipv6 iptales ### $IPT6 -F $IPT6 -X $IPT6 -Z for table in $(</proc/net/ip6_tables_names) do $IPT6 -t $table -F $IPT6 -t $table -X $IPT6 -t $table -Z done $IPT6 -P INPUT ACCEPT $IPT6 -P OUTPUT ACCEPT $IPT6 -P FORWARD ACCEPT fi ...
了解 iptables-apply
您可以使用 iptables-apply 命令,这是远程更新 iptables 的更安全的方法。iptables-apply 将尝试应用新的防火墙规则文件或运行命令来配置 iptables,然后提示用户更改是否可以。如果新的 iptables 规则切断了现有连接,用户将无法肯定地回答。在这种情况下,脚本会在超时后回滚到之前工作的 iptables 规则。过程如下:
步骤 1 –保存 iptables 规则
# iptables-save > /root/iptables.working.rules
第 2 步 - 编辑 /root/iptables.working.rules 文件
使用文本编辑器编辑 /root/iptables.working.rules 文件:
# vim /root/iptables.working.rules
添加或删除规则,并在使用 vim 时按+保存文件。ESCx
步骤 3 - 使用 iptables-apply
运行以下防火墙命令来测试新的 iptables 规则,而不会冒着破坏远程 Linux 机器的风险。如果您在远程服务器上应用规则,则应考虑按如下方式进行测试:
# iptables-apply /root/iptables.working.rules
另一种语法:
# iptables-apply -t 30 -w /root/new-iptables-rules.save /root/iptables.working.rules
其中,
- -t 30:设置超时时间(以秒为单位),超过此时间后脚本将回滚到上一个规则集
- -w /root/new-iptables-rules.save:指定成功应用的规则将写入的保存文件。
- -w /root/iptables.working.rules:从此文件测试新规则(必须使用 iptables-save 命令创建)
总结
您可以使用自定义 shell 脚本或 iptables-apply 命令来避免锁定远程 Linux 服务器并自动重置 Linux 防火墙。
参见
- 通过 SSH 会话测试远程服务器配置时自动重置 PF 防火墙
- 使用 help 命令或 man 命令阅读以下手册页:
$ man 'iptables(8)'
$ man 'bash(1)'
$ man 'iptables-save(8)'
$ man iptables-restore(8)
这一切看起来很复杂?试试:在Alpine Linux Awall、CentOS 8、OpenSUSE、RHEL 8、Debian 12/11、Ubuntu Linux 版本16.04 LTS / 18.04 LTS / 20.04 LTS和22.04 LTS
上试用简单安全的 Linux 防火墙应用程序(前端)。