iptables的“包过滤清单表”实际就是filter表,默认控制input、forward、output链的放行/拒绝逻辑;centos 7默认使用firewalld,需先停用并启用iptables服务,再通过命令行或编辑/etc/sysconfig/iptables配置规则,且必须用service iptables save持久化,否则重启丢失。

iptables 的“包过滤清单表”实际就是指 filter 表(默认表),它控制 INPUT、FORWARD、OUTPUT 三条链的包放行/拒绝逻辑。CentOS 7 默认不启用 iptables 服务,而是用 firewalld,所以修改前必须先切换到 iptables 模式。
确认当前防火墙状态并停用 firewalld
直接运行 systemctl status firewalld 和 systemctl status iptables,如果 firewalld 是 active(running),iptables 是 inactive,则不能直接改规则——iptables 进程根本没在跑,改了配置文件也不会生效。
- 停用并屏蔽
firewalld:systemctl stop firewalld+systemctl disable firewalld(或更彻底:systemctl mask firewalld) - 安装
iptables-services(若未装):yum install -y iptables-services - 启动并启用
iptables:systemctl start iptables&&systemctl enable iptables
注意:SELinux 若为 enforcing 状态,可能干扰规则加载,临时设为 permissive(setenforce 0)可快速验证是否是 SELinux 导致规则不生效。
修改 filter 表规则的两种方式及其关键区别
iptables 规则分「运行时生效」和「重启后仍存在」两类。很多人混淆这两者,导致改完重启就丢规则。
-
命令行实时修改:用
iptables -A INPUT -p tcp --dport 80 -j ACCEPT这类命令添加规则,立即生效,但systemctl restart iptables后会清空重载——因为服务默认从/etc/sysconfig/iptables文件读取规则,而不是保存当前内存状态 -
配置文件永久修改:编辑
/etc/sysconfig/iptables,手动增删-A INPUT ...行,再执行systemctl restart iptables才能持久化 - 想把当前命令行规则存进配置文件?必须运行
service iptables save(不是iptables-save > /etc/sysconfig/iptables——后者会破坏原有格式,导致重启失败)
该命令本质是调用 iptables-save 并按 CentOS 特定格式写入,包括开头的 *filter、结尾的 COMMIT,缺一不可。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
编辑 /etc/sysconfig/iptables 时容易崩掉的几处细节
这个文件不是普通文本,是 iptables-restore 能解析的专用格式。手误就会让 systemctl restart iptables 报错退出,且防火墙自动关闭(危险!)。
- 每一行规则必须以
-A、-I、-D开头,不能有中文、全角符号、多余空格或注释混在规则行里 - 必须严格包含三段结构:
*filter→ 规则块 →COMMIT;漏掉COMMIT或多写一个*filter都会导致加载失败 - 默认策略行(如
:INPUT DROP [0:0])不能删,只能改DROP为ACCEPT或反之;改错会直接锁死 SSH - 加新端口规则,务必放在
-A INPUT -j REJECT --reject-with icmp-host-prohibited这行之前,否则永远不生效
建议每次修改前先备份:cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak,出错立刻还原。
验证 filter 表规则是否真生效
光看 systemctl status iptables 显示 active 并不等于规则起作用。得查内核实际加载的链:
- 运行
iptables -L -n -v:显示带字节数和包计数的详细规则,确认你的--dport 80行出现在 OUTPUT 或 INPUT 链里,且pkts列有增长 - 检查默认策略:
iptables -L -n最后一行是REJECT还是DROP?前者会返回 ICMP 错误,后者静默丢弃,排查时行为完全不同 - 测试连通性时,别只用本地
curl localhost:80,要从另一台机器telnet your_ip 80,否则绕过了 INPUT 链
最常被忽略的是:规则顺序决定匹配优先级,而 iptables -L 默认不显示行号。加 --line-numbers 才能看清插入位置是否合理。










