如何在 Linux 上永久保存 iptables 防火墙规则
Linux 系统管理员和开发人员使用 iptables 和 ip6tables 命令来设置、维护和检查 Linux 内核中 IPv4 和 IPv6 数据包过滤规则的防火墙表。重新启动 Linux 服务器时,使用这些命令所做的任何修改都会丢失。因此,我们需要在重新启动后永久存储这些规则。本页示例了如何在 Ubuntu 或 Debian Linux 服务器上永久保存 iptables 防火墙规则。
教程详细信息 | |
---|---|
难度等级 | 先进的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 防火墙 |
操作系统兼容性 | 阿尔玛 • CentOS • Debian • Fedora • Linux • Oracle • RHEL • Rocky • Ubuntu |
预计阅读时间 | 4 分钟 |
在 Linux 上永久保存 iptables 防火墙规则
您需要使用以下命令来永久保存 iptables 防火墙规则:
- iptables-save command或者ip6tables-save command– 将 IPv4 或 IPv6 表的内容以易于解析的格式保存或转储到屏幕或指定的文件中。
- iptables-restore command或者ip6tables-restore command– 从 Linux 下的给定文件恢复 IPv4 或 IPv6 防火墙规则和表。
步骤 1 – 打开终端
打开终端应用程序,然后输入以下命令。要使用 ssh 命令登录远程服务器:
您必须以 root 用户身份使用 sudo 命令或 su 命令输入以下命令。
$ ssh vivek@server1.example.com
$ ssh ec2-user@ec2-host-or-ip
第 2 步 - 保存 IPv4 和 IPv6 Linux 防火墙规则
Debian 和 Ubuntu Linux 用户类型:
CentOS/RHEL/Fedora/Rocky 和 AlmaLinux 用户运行:您也可以通过传递-c或--counters选项
将所有数据包和字节计数器的当前值包含在输出文件中,如下所示:
$ sudo /sbin/iptables-save > /etc/iptables/rules.v4
## IPv6 ##
$ sudo /sbin/ip6tables-save > /etc/iptables/rules.v6
$ sudo /sbin/iptables-save > /etc/sysconfig/iptables
## IPv6 ##
$ sudo /sbin/ip6tables-save > /etc/sysconfig/ip6tables
$ $ sudo /sbin/iptables-save -c > /etc/iptables/rules.v4
在 Linux 上显示已保存的规则
我们可以使用cat 命令/more 命令 /less 命令 / bat 命令显示已保存的文件,或者使用grep 命令/ egrep 命令搜索:
$ cat /etc/iptables/rules.v4
*mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/24 -m policy --pol none --dir out -j MASQUERADE COMMIT *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p esp -j ACCEPT -A INPUT -p ah -j ACCEPT -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-upto 5/s --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-name icmp-echo-drop -j ACCEPT -A INPUT -p udp -m multiport --dports 21194 -j ACCEPT -A INPUT -p tcp -s 1xx.yy.zz.ttt,10.8.0.0/24,10.8.1.0/24 --dport 22 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p tcp --dport 3128 -d 10.8.0.1 -s 10.8.0.0/24,10.8.1.0/24 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -d 172.xx.yyy.zzz -p udp --dport 53 -j ACCEPT -A INPUT -d 172.xx.yyy.z -p udp --dport 53 -j ACCEPT -A INPUT -i eth0 -m limit --limit 5/min -j LOG --log-prefix "[iptables denied] " --log-level 7 -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j DROP -A OUTPUT -d 10.8.0.0/24 -m owner --gid-owner 15000 -j DROP -A FORWARD -s 10.8.0.0/24 -d 169.254.0.0/16 -j DROP -A OUTPUT -d 169.254.0.0/16 -m owner --gid-owner 15000 -j DROP -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p tcp --dport 445 -j DROP -A FORWARD -p udp -m multiport --ports 137,138 -j DROP -A FORWARD -p tcp -m multiport --ports 137,139 -j DROP -A FORWARD -m conntrack --ctstate NEW -s 10.8.0.0/24 -m policy --pol none --dir in -j ACCEPT -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "[iptables forward denied] " --log-level 7 COMMIT
步骤 3 - 恢复 IPv4 和 IPv6 Linux 文件墙规则
我们只是根据操作系统反转上述命令,如下所示:
是否也想恢复所有数据包和字节计数器的值?尝试传递-c或--counters选项,如下所示:
另一个有用的选项是解析和构造规则集,但不要提交它。这称为测试模式。语法如下:
或
## Debian or Ubuntu ##
$ sudo /sbin/iptables-restore < /etc/iptables/rules.v4
$ sudo /sbin/ip6tables-restore < /etc/iptables/rules.v6
## CentOS/RHEL ##
$ sudo /sbin/iptables-restore < /etc/sysconfig/iptables
$ sudo /sbin/ip6tables-restore < /etc/sysconfig/ip6tables
$ sudo /sbin/iptables-restore -c < /etc/iptables/rules.v4
$ sudo /sbin/iptables-restore --test < /etc/iptables/rules.v4
$ sudo /sbin/ip6tables-restore --test < /etc/iptables/rules.v6
$ sudo /sbin/iptables-restore -t < /etc/sysconfig/iptables
$ sudo /sbin/ip6tables-restore -t < /etc/sysconfig/ip6tables
步骤 4 - 为Debian 或 Ubuntu Linux安装 iptables-persistent 包
请注意,以下命令将与 iptables 前端(例如ufw 命令或firewall-cmd 命令)冲突。如果您正在使用这些工具,请避免使用以下软件包。
我们需要安装 iptables-persistent。它将充当 Netfilter 规则的加载器,iptables 插件 netfilter-persistent 是使用基于插件的架构的 Netfilter 配置加载器。换句话说,从上述文件中自动加载已保存的 iptables 规则。输入以下apt 命令或apt-get 命令:
使用 systemctl 命令确保在 Debian 或 Ubuntu 上启用了服务:
如果没有启用它:
获取状态:输出:
$ sudo apt install iptables-persistent
## OR ##
$ sudo apt-get install iptables-persistent
$ sudo systemctl is-enabled netfilter-persistent.service
$ sudo systemctl enable netfilter-persistent.service
$ sudo systemctl status netfilter-persistent.service
● netfilter-persistent.service - netfilter persistent configuration Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/netfilter-persistent.service.d └─iptables.conf Active: active (exited) since Thu 2020-08-20 19:24:22 UTC; 3 days ago Docs: man:netfilter-persistent(8) Main PID: 577 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4620) Memory: 0B CGroup: /system.slice/netfilter-persistent.service Aug 20 19:24:21 example-vpn-1 systemd[1]: Starting netfilter persistent configuration... Aug 20 19:24:21 example-vpn-1 netfilter-persistent[583]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start Aug 20 19:24:21 example-vpn-1 netfilter-persistent[583]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start Aug 20 19:24:22 example-vpn-1 systemd[1]: Finished netfilter persistent configuration.
步骤 5 - 为RHEL/CentOS/Fedora/Rocky 和 AlmaLinux安装 iptables-services 包
默认情况下,RHEL/CentOS 7 或 8 自带了firewalld。如果你需要旧的基于文件的防火墙,请输入以下命令:示例输出:
# Disable firewalld if installed #
$ sudo systemctl stop firewalld.service
$ sudo systemctl disable firewalld.service
$ sudo systemctl mask firewalld.service
# install package on Linux to save iptables rules using the yum command/dnf command ##
$ sudo yum install iptables-services
$ sudo systemctl enable iptables
$ sudo systemctl enable ip6tables
$ sudo systemctl status iptables
● iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled) Active: active (exited) since Mon 2020-08-24 09:29:59 EDT; 3s ago Process: 8259 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS) Main PID: 8259 (code=exited, status=0/SUCCESS) Aug 24 09:29:59 centos-8-cloud.sweet.home systemd[1]: Starting IPv4 firewall with iptables... Aug 24 09:29:59 centos-8-cloud.sweet.home iptables.init[8259]: iptables: Applying firewall rules: [ OK ] Aug 24 09:29:59 centos-8-cloud.sweet.home systemd[1]: Started IPv4 firewall with iptables.
RHEL/CentOS/Rocky/AlmaLinux 上的规则存储在哪里?
安装服务后,您可以配置 /etc/sysconfig/iptables for IPv4 和 /etc/sysconfig/ip6tables for IPv6 文件。添加到这些文件的任何规则都会使它们持久化。然后使用 systemctl 命令重新启动服务以加载这些更改:
# Step 1 - Edit/add/append/delete the Ipv4 and IPv6 rules: sudo vim /etc/sysconfig/iptables sudo vim /etc/sysconfig/ip6tables # Step 2 - Load the changes: sudo systemctl restart iptables sudo systemctl restart ip6tables
相关另外,请查看我们针对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 上永久保存和恢复 iptables 规则,尤其是在 Debian/Ubuntu 或 CentOS/RHEL/Rocky/Alma Linux 服务器上。请记住仅使用一项服务来配置 Linux 防火墙。不要混合使用 ufw、firewalld 和 iptables 配置文件和前端。请使用 man 命令/help 命令阅读以下手册页,并查看我们的iptables 命令示例页面。例如:
$ man iptables
$ man ip6tables
$ man iptables-save
$ man ip6tables-save
$ man iptables-restore
$ man ip6tables-restore