防火墙是网络安全的第一道防线。本文将从种类选型、核心概念到 iptables 实战配置,带你系统掌握 Linux 防火墙技术。
一、防火墙有哪些种类?企业该如何选型?
1.1 硬件防火墙
部署在企业网络入口处,提供三层路由转发与安全防护能力。常见厂商包括:
路由/交换设备:H3C、华为、Cisco(思科)等
专业安全厂商:深信服、绿盟、奇安信、天融信、山石网科等
国际厂商:Juniper、Palo Alto、Fortinet 等
硬件防火墙性能强、吞吐量大,适合对安全要求高、访问量巨大的中大型企业。
1.2 软件防火墙(Linux 主机防火墙)
直接运行在服务器操作系统上,适合封禁 IP、限制端口等场景。主要方案:
| 方案 | 说明 |
|---|
| iptables | 经典方案,直接写入 Linux 内核,工作在网络第 4 层(传输层),Docker 等容器技术也依赖其工作 |
| firewalld | CentOS 7 默认防火墙管理工具,支持动态更新规则 |
| nftables | CentOS 8 / RHEL 8 起替代 iptables 的新框架,性能更优 |
| ufw | Ubuntu 默认防火墙前端工具(Uncomplicated Firewall),使用更简洁 |
1.3 云防火墙(公有云场景)
云上环境无需自建硬件防火墙,主要使用云厂商提供的安全产品:
1.4 企业选型建议
| 企业规模 | 推荐方案 |
|---|
| 初创 / 中小企业 | 公有云 + 安全组 + 云 WAF + 态势感知,成本低、运维轻 |
| 中大型企业(高访问量) | 硬件防火墙 + WAF + 物理服务器 + 云服务器混合架构 |
| 金融 / 政企(合规要求) | 硬件防火墙 + IDS/IPS + WAF + 堡垒机 + 日志审计 |
二、必须搞懂的核心概念
在学习 iptables 之前,先理解四个核心概念。可以用一个形象的比喻来记忆:
| 概念 | 英文 | 比喻 | 说明 |
|---|
| 表(Table) | Table | 一栋楼 | iptables 最大的功能分类单位,按功能划分 |
| 链(Chain) | Chain | 楼里的房间 | 存放规则的容器,不同的数据流走不同的链 |
| 规则(Rule) | Rule | 房间里的柜子 | 具体的过滤条件,如允许或拒绝某个 IP/端口 |
| 策略(Policy) | Policy | 柜子里衣服的摆放规则 | 当数据包不匹配任何规则时的默认处理方式 |
层级关系:表 → 链 → 规则 → 策略(默认动作)
三、iptables 的执行流程
数据包经过防火墙时,规则按以下逻辑执行:
层层过滤:规则按配置顺序从上到下依次匹配。
命中即停:一旦匹配到某条规则,明确为 DROP(拒绝)或 ACCEPT(允许)后,不再继续向下匹配。
未命中则继续:如果当前规则没有明确表态,则继续匹配下一条规则。
默认兜底:当所有规则都匹配完毕后,才执行链的默认策略(Policy)。
关键原则:规则的顺序至关重要!建议将"拒绝类规则"放在前面(使用 -I 插入到链首),"允许类规则"放在后面(使用 -A 追加到链尾)。
四、四表五链详解
iptables 采用"四表五链"架构,不同表负责不同功能,不同链处理不同方向的数据流。
4.1 四大表
| 表名 | 功能 | 典型场景 |
|---|
| filter | 数据包过滤(默认表) | 防火墙核心功能,允许或拒绝 IP/端口 |
| nat | 网络地址转换 | 共享上网、端口映射、IP 映射 |
| raw | 连接跟踪豁免 | 高性能场景下跳过连接状态跟踪 |
| mangle | 数据包修改 | 修改 TTL、TOS 等字段,用于 QoS 等场景 |
4.2 五条链
| 链名 | 方向 | 说明 |
|---|
| PREROUTING | 入方向(路由前) | 数据包到达后、路由判断之前处理,常用于 DNAT(目的地址转换) |
| INPUT | 入方向 | 过滤目标地址为本机的数据包,即"进入主机的数据" |
| FORWARD | 转发方向 | 转发流经本机但目的地不是本机的数据包,与 NAT 关系密切 |
| OUTPUT | 出方向 | 处理源地址为本机的数据包,即"从主机发出的数据" |
| POSTROUTING | 出方向(路由后) | 数据包离开前处理,常用于 SNAT(源地址转换),实现共享上网 |
4.3 filter 表详解
filter 是 iptables 的默认表,也是真正负责主机防火墙功能的核心。它包含三条链:
4.4 nat 表详解
nat 表负责网络地址转换,与主机自身安全无关,主要用于网络层面:
五、环境准备与基础命令
5.1 安装 iptables
以 CentOS 7 为例(实际生产中请先在测试环境验证):
# 安装 iptables 服务yum install -y iptables-services# 关闭并禁用 firewalld(两者不能共存)systemctl stop firewalldsystemctl disable firewalld# 启动并设置开机自启systemctl start iptables.servicesystemctl enable iptables.service
5.2 加载内核模块
modprobe ip_tablesmodprobe iptable_filtermodprobe iptable_natmodprobe ip_conntrackmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpmodprobe ipt_state
如需永久生效,将上述命令写入 /etc/rc.local。
5.3 常用查看命令
# 查看 filter 表规则(默认表)iptables -nL# 查看指定表的规则iptables -t nat -nL# 查看规则并显示序号iptables -nL --line-number# 查看规则并显示数据包计数iptables -nLv
六、iptables 命令参数速查表
6.1 基本操作参数
| 参数 | 含义 | 说明 |
|---|
-L | 列出所有规则 | 显示指定链/表的全部规则 |
-n | 数字显示 | 不将 IP/端口反向解析为域名 |
-t | 指定表 | 不指定时默认操作 filter 表 |
-A | 追加规则 | 将规则添加到链的末尾,适合允许类规则 |
-I | 插入规则 | 将规则插入到链的首部,适合拒绝类规则 |
-D | 删除规则 | 按序号删除,如 -D INPUT 1 |
6.2 匹配条件参数
| 参数 | 含义 | 说明 |
|---|
-p | 指定协议 | tcp / udp / icmp / all |
--dport | 目标端口 | 必须配合 -p tcp 或 -p udp 使用 |
--sport | 源端口 | 数据包的来源端口 |
-s | 源 IP | 屏蔽/允许特定 IP 或网段时无需指定协议 |
-d | 目标 IP | 数据包的目标地址 |
-m | 指定匹配模块 | 如 multiport(多端口)、state(状态)、limit(限速) |
-i | 入接口网卡 | 数据包从哪个网卡进入 |
-o | 出接口网卡 | 数据包从哪个网卡出去 |
6.3 动作与管理参数
| 参数 | 含义 | 说明 |
|---|
-j | 执行动作 | ACCEPT(允许)/ DROP(丢弃,不回通知)/ REJECT(拒绝,回通知) |
-F | 清空规则 | 清除指定表的所有规则,操作前务必备份 |
-X | 删除自定义链 | 删除用户自定义的链 |
-Z | 计数器清零 | 重置数据包和字节计数器 |
-v | 详细模式 | 显示数据包数量和字节数 |
七、实战配置:filter 表规则
操作前务必备份现有规则!
# 备份当前规则iptables-save > /root/iptables_backup.rules# 清空所有规则(谨慎操作)iptables -Fiptables -Xiptables -Z
7.1 封禁特定端口
# 拒绝所有用户访问 22 端口(SSH)iptables -t filter -A INPUT -p tcp --dport 22 -j DROP# 查看规则iptables -t filter -nL --line-number# 删除该规则(按序号)iptables -t filter -D INPUT 1
生产提醒:封禁 SSH 端口前,务必确保有其他管理通道(如云控制台 VNC),否则会导致远程管理中断!
7.2 封禁特定 IP
# 封禁单个 IP(两个网卡网段都需要封)iptables -I INPUT -s 192.168.1.100 -j DROPiptables -I INPUT -s 10.0.1.100 -j DROP# 封禁整个网段iptables -I INPUT -s 10.0.1.0/24 -j DROP
-I vs -A:封禁类规则建议使用 -I(插入到链首),确保优先匹配;允许类规则使用 -A(追加到链尾)。
7.3 封禁网段访问特定端口
# 禁止 10.0.0.0/24 网段访问 8080 端口iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
7.4 只允许指定网段访问
方法一:使用 ! 取反
# 只允许 172.16.1.0/24 网段,其他全部拒绝iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
方法二:修改默认策略(推荐)
# 先添加允许规则iptables -A INPUT -s 172.16.1.0/24 -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 再修改默认策略为 DROPiptables -P INPUT DROP
注意顺序:方法二中,一定要先配好允许规则,再修改默认策略为 DROP,否则当前连接可能立即中断。
7.5 指定多个端口
# 使用 multiport 模块匹配多个不连续端口iptables -A INPUT -m multiport -p tcp --dport 80, 443, 8080 -j ACCEPT# 匹配连续端口范围(无需 multiport 模块)iptables -A INPUT -p tcp --dport1:1024 -j ACCEPT# 排除特定端口(除 80、443 外全部拒绝)iptables -I INPUT -p tcp -m multiport ! --dport 80, 443 -j DROP
7.6 禁止 Ping(ICMP 控制)
方法一:通过 iptables 规则
# 禁止外部 ping 本机(icmp-type 8 为 Echo Request)iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP
方法二:通过内核参数(更彻底)
# 编辑 /etc/sysctl.conf,添加:net.ipv4.icmp_echo_ignore_all =1# 使配置生效sysctl -p
建议:生产环境中,不建议完全禁 Ping。可以通过限速方式防止 ICMP Flood 攻击,而不是完全屏蔽。
7.7 匹配 TCP 连接状态
iptables 支持基于连接状态的过滤,这是构建安全策略的基础:
| 状态 | 说明 |
|---|
NEW | 新建连接请求 |
ESTABLISHED | 已建立的连接 |
RELATED | 与已有连接相关联的新连接(如 FTP 数据连接) |
INVALID | 非法或无法识别的连接 |
# 允许已建立和关联的连接通过(非常关键的规则)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
7.8 限制连接速率
使用 limit 模块控制数据包通过速率,可用于防 DoS 攻击:
# 限制每分钟最多 10 个数据包iptables -A INPUT -p icmp -m limit --limit 10/minute -j ACCEPT# 配合 burst 参数:前 5 个包立即放行,之后每 6 秒释放 1 个iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
| 参数 | 说明 |
|---|
--limit n/{second\|minute\|hour} | 指定时间内的平均请求速率 |
--limit-burst n | 突发允许的最大数据包数,默认为 5 |
八、生产环境推荐配置模板
以下是一个适用于中小企业的 iptables 基础安全策略模板:
# 1. 清空现有规则iptables -Fiptables -Xiptables -Z# 2. 允许本地回环iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT# 3. 允许已建立和关联的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 4. 允许管理网段 SSH 访问iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT# 5. 允许 Web 服务端口iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT# 6. 限制 ICMP(防 Ping Flood)iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 3 -j ACCEPT# 7. 拒绝其他所有入站连接iptables -A INPUT -j DROP# 8. 保存规则iptables-save > /etc/sysconfig/iptables
九、总结
| 知识点 | 核心要点 |
|---|
| 防火墙选型 | 中小企业用云安全产品,大型企业用硬件+软件组合方案 |
| 核心概念 | 表→链→规则→策略,层层递进 |
| 执行流程 | 顺序匹配,命中即停,默认策略兜底 |
| 四表五链 | filter(过滤)、nat(地址转换)最常用;INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING |
| 规则技巧 | 拒绝规则用 -I 置顶,允许规则用 -A 追加;善用状态匹配和速率限制 |
| 安全建议 | 操作前备份、修改默认策略前先配允许规则、保留管理通道 |
最后提醒:iptables 是 Linux 防火墙的基石,但从 CentOS 8 开始,nftables 已成为默认替代方案。建议在新项目中逐步迁移到 nftables,其语法更统一、性能更优。不过理解 iptables 的原理,对学习任何防火墙技术都大有裨益。