在 CentOS 7.2 这个稳定且广受欢迎的服务器操作系统版本中,防火墙的管理是一个核心的系统安全议题,与之前的 CentOS 版本不同,CentOS 7 默认采用 firewalld 作为动态防火墙管理器,而非用户更为熟悉的 iptables。iptables 凭借其强大的功能和灵活的规则配置,仍然是许多系统管理员的首选工具,本文将深入探讨在 CentOS 7.2 系统上如何安装、配置和使用 iptables,以实现精确的网络访问控制。

从 firewalld 迁移到 iptables
由于 firewalld 和 iptables 是两种不同的防火墙服务,它们不能同时运行,要在 CentOS 7.2 上使用 iptables,首要任务是禁用 firewalld 并安装 iptables 服务。
这个过程可以通过以下步骤完成:
-
停止并禁用 firewalld: 执行以下命令来停止当前运行的
firewalld服务,并禁止它在系统启动时自动加载。systemctl stop firewalld systemctl mask firewalld
-
安装 iptables-services: CentOS 7.2 的官方软件源中提供了
iptables-services软件包,它包含了iptables和ip6tables的服务管理脚本。yum install iptables-services -y
-
启动并启用 iptables: 安装完成后,即可启动
iptables服务,并将其设置为开机自启,以确保防火墙规则在重启后依然生效。systemctl enable iptables systemctl start iptables
至此,系统已成功从
firewalld切换到iptables,防火墙将使用/etc/sysconfig/iptables文件中定义的规则。
理解 iptables 的核心架构
iptables 的强大之处在于其基于“表”和“链”的规则结构,数据包在流经网络协议栈时,会依次穿过不同的链,iptables 在这些链上检查数据包,并根据匹配的规则执行相应的动作。
最核心的是 filter 表,它负责数据包的过滤功能,该表包含三个内置链:

| 链名称 | 功能描述 |
|---|---|
| INPUT | 处理进入本机的数据包。 |
| FORWARD | 处理需要经过本机转发的数据包。 |
| OUTPUT | 处理从本机发出的数据包。 |
每条规则都由一系列“匹配条件”和一个“目标动作”组成,常见的动作包括:
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给予任何回应。
- REJECT:拒绝数据包,并向发送方返回一个错误消息。
常用规则配置与管理
掌握基本的命令行操作是使用 iptables 的关键,以下是一些常见的配置示例。
查看当前规则
使用 -L(list)参数可以列出当前的规则列表,-v(verbose)和 --line-numbers 参数可以提供更详细的信息和规则序号,便于管理。
iptables -L -v --line-numbers
允许特定服务
默认情况下,filter 表的 INPUT 链和 FORWARD 链策略可能是 ACCEPT,但更安全的做法是将其设置为 DROP,然后逐条添加需要放行的规则,允许 SSH(端口22)、HTTP(端口80)和 HTTPS(端口443)流量:
# 允许已建立的或相关的连接(非常重要,否则现有连接会中断) iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 允许本地回环接口 iptables -A INPUT -i lo -j ACCEPT # 允许 SSH iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 HTTP iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTPS iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 设置 INPUT 链的默认策略为 DROP iptables -P INPUT DROP
保存规则
通过命令行添加的规则是临时的,重启服务或系统后会丢失,必须将其保存到配置文件中才能永久生效。

service iptables save
该命令会将当前内存中的 iptables 规则保存到 /etc/sysconfig/iptables 文件。
相关问答FAQs
在按照步骤操作后,我发现添加的 iptables 规则在服务器重启后就消失了,这是为什么?
解答: 这是因为您只通过命令行(如 iptables -A ...)将规则添加到了内核的内存中,但没有将这些规则持久化到硬盘上的配置文件里,在 CentOS 7.2 使用 iptables-services 的情况下,必须手动执行 service iptables save 命令,这个命令会读取当前内存中所有生效的规则,并将其写入到 /etc/sysconfig/iptables 文件。iptables 服务在下次启动时会自动加载这个文件里的规则,从而实现持久化。
firewalld 和 iptables 到底有什么核心区别,我应该选择哪一个?
解答: 核心区别在于管理模式和易用性。
firewalld是“动态”的防火墙,支持在不中断现有连接的情况下实时更新规则,它引入了“区域”的概念,如public,trusted,dmz,可以根据网络接口的不同信任级别应用不同的规则集,对于复杂的网络环境管理更直观、更友好。iptables是“静态”的,每次规则变更都需要重新加载整个规则集,可能会短暂中断网络连接,它直接对链进行操作,虽然语法更底层、更复杂,但提供了无与伦比的灵活性和精细控制能力,是进行高级网络策略(如复杂的NAT、端口转发等)的利器。
选择建议: 如果您的应用场景相对简单,或者您更偏好图形化工具(如 firewall-config)和区域管理,firewalld 是更现代、更便捷的选择,如果您是需要精细控制每一条数据包、构建复杂网络策略的老派管理员,或者您的脚本工具链是基于 iptables 构建的,那么坚持使用 iptables 会更加得心应手。