简介
使用 iptables 命令添加的规则会修改内核中当前生效的防火墙,但仅修改当前状态并不能形成持久配置。管理员通常使用 iptables-save 将 IPv4 规则序列化保存,并使用 iptables-restore 按该格式重新加载。在 Debian 和 Ubuntu 系统中,如果启用了适当的启动时加载程序,/etc/iptables/rules.v4 通常会作为持久化文件使用。
可以将整个流程理解为三个相互独立的层面。当前生效的规则集是内核此刻实际执行的规则。已保存的规则文件在磁盘上只是文本,只有工具或服务执行恢复操作后才会生效。基线备份则是用于回滚的已知起始状态。修改其中一层不会自动同步更新另外两层,因此管理员必须有意识地保存、恢复并验证每次状态转换。
在本实验中,你将保留原始防火墙配置作为回滚点,添加并保存一条范围明确的服务规则,在应用前验证已保存的文件,模拟规则集重新加载,最后恢复原始基线。整个流程将清楚区分三种重要状态:当前生效的规则、已保存的规则文件,以及用于回滚的副本。
备份当前生效的 IPv4 防火墙
在本步骤中,你将先记录防火墙的初始状态,再进行任何修改。如果后续命令的结果不符合预期,回滚文件可以帮助你恢复到已知的正常状态。
进入项目目录。
cd /home/labex/project
修改规则前,确认测试服务可用。
curl --noproxy '*' --fail --silent http://127.0.0.1:18087/status
这是一次基准测试。127.0.0.1 使用回环接口,--noproxy '*' 可确保即使配置了代理环境变量,请求仍在本地处理,而 --fail --silent 会提供简洁的响应和可靠的退出状态。先建立一个正常工作的基线,之后就更容易判断防火墙行为。
使用 iptables-save 输出完整的 IPv4 规则集。管道会将输出发送给 tee,由它写入 baseline.v4,同时保留使用普通实验用户执行命令的便利性。
sudo iptables-save | tee baseline.v4 >/dev/null
这里的权限边界是有意设计的:sudo iptables-save 负责读取受保护的内核规则集,而无特权的 tee 负责将内容写入项目目录。最后的重定向会把 tee 在屏幕上生成的副本输出发送到 /dev/null,并不会清空文件。生成的备份包含此主机报告的全部 IPv4 表和链的序列化内容,而不只是你稍后要添加的那条规则。
查看已保存文件的开头部分。
head -n 12 baseline.v4
具体计数器可能有所不同,但该文件采用的是按表分段的 iptables-restore 格式。一个最简的过滤表部分类似于:
*filter
:INPUT ACCEPT ...
...
COMMIT
每个部分都以表名(例如 *filter)开头,声明链及其策略,列出规则,并以 COMMIT 结束。iptables-restore 只有读取到该标记时,才会应用对应的表部分。不要把这个文件当作任意的独立 Shell 命令列表。
确认文件中包含过滤表标记和提交标记。
grep -E '^\*filter$|^COMMIT$' baseline.v4
添加并保存服务规则
在本步骤中,你将向当前生效的防火墙添加一条明确的允许规则,并将生成的规则集保存到约定的 IPv4 持久化路径。
在 INPUT 链的开头插入一条规则,允许回环接口上的 TCP 流量访问端口 18087。接口和端口限制使这条规则仅作用于本实验所需的流量。
sudo iptables -I INPUT 1 -i lo -p tcp --dport 18087 -j ACCEPT
INPUT 负责处理发往本机的流量。-I INPUT 1 将规则放在链首,-i lo 将其限制为回环接口,-p tcp --dport 18087 选择测试服务,-j ACCEPT 则允许匹配的流量。与会放行多个服务的宽泛规则相比,范围明确的规则更易于审计和删除。
检查当前生效的规则。退出状态为零表示指定的匹配条件和目标均已存在;本主机基于 nftables 的实现还会输出规范化后的匹配规则形式。
sudo iptables -C INPUT -i lo -p tcp --dport 18087 -j ACCEPT
保存完整的当前 IPv4 规则集。由于 /etc/iptables 需要管理员写入权限,因此使用 sudo tee。
sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
这条命令会在添加规则后重新生成一次快照。管道两端都需要使用 sudo,但原因不同:左侧负责读取防火墙状态,右侧负责打开由 root 所有的目标文件。仅仅创建 rules.v4 并不会激活或安排任何操作;它只是准备好一个可供恢复命令或启动时服务使用的文件。
在已保存的文件中搜索服务端口。grep 后面的 -- 会结束选项解析,当搜索模式可能以连字符开头时尤其有用。
sudo grep -- '--dport 18087' /etc/iptables/rules.v4
输出应包含一条以 -j ACCEPT 结尾的 INPUT 规则。此时,当前生效的规则集和已保存的文件都应包含目标规则。
不要将新文件与基线文件逐字节比较。数据包计数器以及其他软件维护的规则可能会合理地发生变化。在本实验中,关键证据是目标规则同时存在于当前生效状态和已保存的文件中。
验证并恢复已保存的规则集
在本步骤中,你将先删除当前生效的规则,在不应用文件内容的情况下验证已保存的文件,然后重新加载它。这样可以在一次实验会话中模拟启动时恢复规则的关键过程。
从当前生效的 INPUT 链中删除该规则。
sudo iptables -D INPUT -i lo -p tcp --dport 18087 -j ACCEPT
这次删除操作只会修改内核中当前生效的规则集,不会编辑 /etc/iptables/rules.v4,因此稍后的命令仍然可以恢复已保存的规则。这个有意制造的差异展示了当前生效状态与已保存状态之间的区别。
确认规则已不存在。由于这次检查预期会失败,因此使用 || 输出提示信息并让流程继续执行。
sudo iptables -C INPUT -i lo -p tcp --dport 18087 -j ACCEPT 2>/dev/null || echo "Live rule is absent"
应用已保存的防火墙配置前,使用 iptables-restore --test 进行测试。该命令会解析整个文件,并在语法无效时报告错误,但不会替换当前生效的规则集。
sudo iptables-restore --test < /etc/iptables/rules.v4
< 运算符会让 Shell 将文件作为标准输入提供给 iptables-restore。如果命令没有输出,表示语法验证通过;这并不意味着文件已经被应用。验证是重要的安全检查,因为格式错误或内容不完整的规则集在恢复时可能导致网络连接中断。
验证成功后,命令会静默结束。现在将已保存的规则恢复到当前生效的防火墙中。
sudo iptables-restore < /etc/iptables/rules.v4
与使用 iptables 添加单条规则不同,iptables-restore 会处理文件中包含的完整表部分。应将其视为影响较大的管理操作:先验证,保留回滚副本,并在操作后立即检查关键访问能力。在本实验环境中,已保存的文件是在几分钟前从同一台主机上创建的。
检查服务规则是否已恢复。
sudo iptables -C INPUT -i lo -p tcp --dport 18087 -j ACCEPT
确认恢复后应用仍然可以访问。
curl --noproxy '*' --fail --silent http://127.0.0.1:18087/status
回滚到原始基线
在本步骤中,你将使用步骤 1 中创建的备份,从当前生效的防火墙中移除实验修改,同时保留目标规则文件以供检查。
应用前先验证基线文件。
sudo iptables-restore --test < baseline.v4
这里,baseline.v4 和 /etc/iptables/rules.v4 的用途是有意区分的。基线文件代表原始的当前生效状态,而 rules.v4 代表包含服务规则的目标状态。恢复其中一个文件不会修改另一个文件。
恢复原始的当前生效规则集。
sudo iptables-restore < baseline.v4
确认实验规则不再处于当前生效状态。
sudo iptables -C INPUT -i lo -p tcp --dport 18087 -j ACCEPT 2>/dev/null || echo "Original firewall baseline restored"
已保存的目标文件是独立的文件,仍然包含你刚才练习恢复的规则。
sudo grep -- '--dport 18087' /etc/iptables/rules.v4
这项检查最清楚地证明了不同状态之间的隔离:当前生效的防火墙已经回滚,但持久化文件仍然记录着目标规则。管理员稍后可以再次恢复该文件,或配置持久化服务在系统启动时加载它。
最后,验证恢复到原始的宽松基线后,本地服务仍然可以访问。
curl --noproxy '*' --fail --silent http://127.0.0.1:18087/status
在生产环境中,请确认系统启动时由哪个服务加载发行版的持久化文件。例如,基于 Debian 的系统通常会使用 iptables-persistent 软件包配合 netfilter-persistent,但具体是否可用以及采用何种策略取决于主机配置。保存正确的 rules.v4 文件只是准备好了规则集;只有已安装并启用的加载程序,才会决定它是否会被自动恢复。
总结
你备份了当前生效的 IPv4 防火墙,添加并保存了一条范围明确的服务规则,使用 iptables-restore --test 验证了序列化规则集,将其重新加载到内核中,并回滚到了原始基线。你还区分了当前生效的防火墙、持久化文件和回滚文件——在修改或恢复数据包过滤状态之前,这是必须养成的重要习惯。



