Linux 防火墙 iptables 全解析:从基础到实战配置
iptables 是 Linux 系统中基于 netfilter 内核框架的包过滤防火墙工具,用于控制网络数据包的流入、流出和转发。本文将详细解析 iptables 的核心构成、规则语法及常用配置,帮助你掌握防火墙的搭建与管理。
iptables 的核心构成
iptables 的工作机制基于 “表(Table)- 链(Chain)- 规则(Rule)” 三层结构,每层负责不同的数据包处理逻辑。
表(Table):功能分类
iptables 包含 4 张核心表,每张表专注于一类网络功能:
| 表名 | 功能描述 | 包含的链(Chain) |
|---|---|---|
| filter | 核心表,负责数据包的过滤(允许 / 拒绝),是最常用的表。 | INPUT(入站)、OUTPUT(出站)、FORWARD(转发) |
| nat | 网络地址转换表,用于修改数据包的源 / 目的 IP 或端口(如端口映射、IP 伪装)。 | PREROUTING、POSTROUTING、OUTPUT |
| mangle | 用于修改数据包的标记(如 TOS 字段),辅助过滤或路由决策。 | PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD |
| raw | 用于关闭数据包的连接跟踪(针对特定场景优化性能)。 | PREROUTING、OUTPUT |
默认表:若未指定表(-t 参数),默认操作 filter 表。
链(Chain):数据包流向
链是表中预设的数据包处理节点,按数据包的流向划分:
| 链名 | 所属表 | 触发时机 |
|---|---|---|
| INPUT | filter/mangle | 数据包进入本机(目标 IP 是本机)时触发。 |
| OUTPUT | filter/mangle/nat | 本机产生的数据包出站时触发。 |
| FORWARD | filter/mangle | 数据包穿过本机(转发给其他主机)时触发(需开启内核转发)。 |
| PREROUTING | nat/mangle/raw | 数据包到达本机后,路由决策前触发(常用于 DNAT 目的地址转换)。 |
| POSTROUTING | nat/mangle | 数据包路由决策后,离开本机前触发(常用于 SNAT 源地址转换)。 |
规则(Rule):匹配与动作
规则是链中的具体指令,由匹配条件和目标动作组成:
- 匹配条件:如协议(TCP/UDP/ICMP)、源 / 目的 IP、端口、网卡等。
- 目标动作:满足条件时的处理方式(如允许、拒绝、转发等)。
iptables 基本操作命令
服务管理
iptables 规则默认在系统重启后失效,需通过服务命令管理规则的保存与加载:
1 | # 启动 iptables 服务 |
规则查看
1 | # 查看默认表(filter)的所有链和规则 |
规则清空与默认策略
1 | # 清空指定表的所有规则(默认 filter 表) |
注意:默认策略建议设置为 DROP(拒绝),仅开放必要的端口 / 服务,提升安全性。
规则配置语法与示例
基本语法
1 | iptables [-t 表名] <操作> <链名> [匹配条件] [-j 目标动作] |
操作选项(常用):
-A:在链的末尾追加一条规则。-I:在链的开头插入一条规则(可指定位置,如-I INPUT 1插入到第 1 位)。-D:删除链中的一条规则(如-D INPUT 1删除第 1 条规则)。-R:替换链中的一条规则(如-R INPUT 1 ...替换第 1 条规则)。
匹配条件(常用):
-p 协议:指定协议(tcp/udp/icmp/all)。-s 源IP:指定源 IP 或网段(如-s 192.168.1.100或-s 192.168.1.0/24)。-d 目标IP:指定目标 IP 或网段。--sport 源端口:指定源端口(仅 TCP/UDP,如--sport 22)。--dport 目标端口:指定目标端口(如--dport 80)。-i 网卡:指定入站网卡(如-i eth0)。-o 网卡:指定出站网卡(如-o eth0)。
目标动作(常用):
ACCEPT:允许数据包通过。DROP:丢弃数据包(不返回任何响应)。REJECT:拒绝数据包,并返回错误响应(如icmp-port-unreachable)。LOG:将数据包信息记录到日志(/var/log/messages),需配合其他动作使用。SNAT:源地址转换(如--to-source 公网IP,用于内网访问外网)。DNAT:目的地址转换(如--to-destination 内网IP:端口,用于端口映射)。MASQUERADE:动态 IP 伪装(适用于 ADSL 等动态公网 IP 场景)。
常用规则示例
(1)filter 表:基础过滤规则
1 | # 1. 允许本机回环地址(lo)的所有通信(必需,否则影响本地服务) |
(2)nat 表:地址转换规则
1 | # 1. 内网(192.168.1.0/24)通过公网 IP(10.0.0.1)访问外网(SNAT) |
(3)日志记录规则
1 | # 记录被拒绝的入站数据包(日志前缀为 "iptables-drop: ") |
日志查看:tail -f /var/log/messages | grep "iptables-drop"
规则的保存与生效
临时生效:通过
iptables命令添加的规则立即生效,但重启后丢失。永久生效:
1
2
3
4
5# 保存规则到配置文件
service iptables save # 规则保存到 /etc/sysconfig/iptables
# 验证配置文件
cat /etc/sysconfig/iptables
实战:构建安全的防火墙规则
以下是一个典型的服务器防火墙配置(仅开放必要服务,拒绝其他所有连接):
1 | # 1. 清空现有规则 |
常见问题与排查
- 规则不生效:
- 检查规则顺序:
-A追加的规则可能被前面的规则覆盖,建议用-I插入到链的开头。 - 检查默认策略:若默认策略为
ACCEPT,未匹配的规则会被允许,需设置为DROP。
- 检查规则顺序:
- 日志查看:
- 被
LOG动作记录的日志在/var/log/messages或/var/log/secure中。 - 用
dmesg命令可查看内核级别的 iptables 日志。
- 被
- 端口映射失败:
- 确保内核转发已开启:
echo 1 > /proc/sys/net/ipv4/ip_forward(永久生效需修改/etc/sysctl.conf)。 - 检查 nat 表规则是否正确,尤其是
PREROUTING和POSTROUTING链的顺序。
- 确保内核转发已开启: