iptables 详解
iptables 是 Linux 系统中功能强大的 包过滤防火墙工具,用于管理网络数据包的流入、流出和转发规则,通过定义规则集实现对网络访问的控制(允许、拒绝、修改数据包等)。它工作在 内核空间,基于 Netfilter 框架(Linux 内核中的网络过滤子系统),是 Linux 系统安全防护的核心工具之一。
一、iptables 的核心概念
在使用 iptables 前,需理解以下核心术语:
1. 链(Chain)
链是 “规则的集合”,数据包在流经系统时会按固定顺序经过这些链,每条链包含若干条规则,规则按顺序匹配执行。
iptables 预设了 5 条核心链(基于数据包的流向划分):
- INPUT:处理 目标是本机 的数据包(如外部主机访问本机的 SSH 服务)。
- OUTPUT:处理 由本机生成 的数据包(如本机 ping 外部主机)。
- FORWARD:处理 经过本机转发 的数据包(如本机作为路由器,转发其他主机的数据包)。
- PREROUTING:在数据包 路由决策前 处理(常用于修改数据包的目标地址,如端口映射)。
- POSTROUTING:在数据包 路由决策后、发送前 处理(常用于修改数据包的源地址,如 NAT 转换)。
2. 表(Table)
表是 “链的集合”,不同的表用于实现不同的功能(过滤、NAT、修改数据包等)。iptables 有 5 种内置表(功能优先级从高到低):
- filter 表:默认表,用于 过滤数据包(允许 / 拒绝),包含 INPUT、OUTPUT、FORWARD 链,是最常用的表。
- nat 表:用于 网络地址转换(修改数据包的源 / 目标 IP 或端口),包含 PREROUTING、POSTROUTING、OUTPUT 链(如将内网 IP 转换为外网 IP 实现上网)。
- mangle 表:用于 修改数据包的标记或头部信息(如 TTL、TOS 字段),包含所有 5 条链(较少直接使用)。
- raw 表:用于 关闭数据包的连接跟踪(提高性能),包含 PREROUTING、OUTPUT 链(适用于高并发场景)。
- security 表:用于 强制访问控制(MAC),与 SELinux 配合使用(极少使用)。
表与链的关系:每个表包含特定的链,数据包会先进入对应的表,再按链的顺序匹配规则。例如,过滤功能优先使用 filter 表的 INPUT 链。
3. 规则(Rule)
规则是 iptables 的最小执行单元,由 匹配条件 和 目标动作 组成:
- 匹配条件:定义数据包需满足的特征(如源 IP、目标端口、协议类型 TCP/UDP 等)。
- 目标动作:当数据包匹配条件时执行的操作(如允许通过、拒绝、记录日志等)。
常见目标动作:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包(不返回任何响应,客户端会等待超时)。
- REJECT:拒绝数据包(返回错误信息,如 “Connection refused”)。
- SNAT:修改数据包的源地址(用于内网访问外网)。
- DNAT:修改数据包的目标地址(用于端口映射,如将外网 80 端口映射到内网服务器)。
- LOG:将数据包信息记录到系统日志(/var/log/messages 或自定义日志文件),之后继续匹配下一条规则。
- RETURN:跳出当前链,返回上一级链继续匹配。
二、iptables 的工作流程
数据包流经 iptables 的流程可简化为:
- 数据包进入系统,先经过 PREROUTING 链(raw → mangle → nat 表),进行路由决策前的处理(如 DNAT)。
- 内核根据数据包的目标 IP 决定流向:
- 若目标是本机,进入 INPUT 链(mangle → filter 表),通过后交给本机应用(如 SSH 服务)。
- 若需要转发(本机是路由器),进入 FORWARD 链(mangle → filter 表),通过后继续转发。
- 若由本机生成,进入 OUTPUT 链(raw → mangle → nat → filter 表)。
- 所有流出的数据包(转发或本机生成)最终经过 POSTROUTING 链(mangle → nat 表),进行发送前处理(如 SNAT)。
规则匹配逻辑:同一链中的规则按顺序匹配,一旦匹配到某条规则,就执行对应的动作(除非动作是 LOG 等需要继续匹配的类型),未匹配任何规则则执行链的 默认策略(如 filter 表 INPUT 链默认策略通常为 ACCEPT 或 DROP)。
三、iptables 常用命令
iptables 命令格式为:
iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 目标动作]
1. 基础操作(查看、清空、保存规则)
# 查看所有表的所有链规则(-L 列出规则,-n 显示 IP 而非域名,-v 详细信息)
iptables -L -n -v
iptables -t nat -L -n # 查看 nat 表规则# 清空指定链的规则(-F 清空,-X 删除自定义链,-Z 重置计数器)
iptables -F INPUT # 清空 filter 表 INPUT 链
iptables -t nat -F # 清空 nat 表所有链
iptables -F && iptables -X && iptables -Z # 清空所有规则、自定义链和计数器# 设置链的默认策略(-P 永久生效,策略为 ACCEPT 或 DROP)
iptables -P INPUT DROP # INPUT 链默认拒绝所有数据包
iptables -P OUTPUT ACCEPT # OUTPUT 链默认允许所有数据包# 保存规则(不同系统保存方式不同)
# CentOS:
service iptables save # 保存到 /etc/sysconfig/iptables
# Ubuntu(需安装 iptables-persistent):
iptables-save > /etc/iptables/rules.v4 # 手动保存
2. 过滤规则(filter 表,最常用)
# 允许本机回环地址(lo 接口,重要!否则本地服务可能无法通信)
iptables -A INPUT -i lo -j ACCEPT# 允许已建立的连接和相关连接(如 FTP 数据连接、SSH 保持连接)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT# 允许外部访问本机 SSH 服务(端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许外部访问本机 HTTP(80)和 HTTPS(443)服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT# 拒绝来自特定 IP(如 192.168.1.100)的所有连接
iptables -A INPUT -s 192.168.1.100 -j DROP# 拒绝特定 IP 访问本机 3306 端口(MySQL)
iptables -A INPUT -s 10.0.0.5 -p tcp --dport 3306 -j REJECT
3. NAT 规则(nat 表,用于地址转换)
# SNAT:将内网 IP(192.168.1.0/24)转换为外网出口 IP(1.2.3.4),实现内网上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 1.2.3.4# 动态 SNAT(适用于外网 IP 动态变化的场景,如拨号上网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE# DNAT:将外网 IP(1.2.3.4)的 80 端口映射到内网服务器(192.168.1.10:8080)
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080
4. 日志规则(记录匹配的数据包)
# 记录所有被拒绝的 INPUT 数据包(日志前缀为 "IPT-DROP: ")
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 6
iptables -A INPUT -j DROP # 记录后拒绝(注意顺序,LOG 后需跟其他动作)
5. 删除规则(按编号或内容删除)
# 查看规则编号(--line-numbers)
iptables -L INPUT --line-numbers# 删除 INPUT 链中编号为 3 的规则
iptables -D INPUT 3# 按内容删除(与添加规则的格式相同,将 -A 改为 -D)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
四、iptables 的注意事项
- 规则顺序:规则按添加顺序匹配,具体规则应放在通用规则前(如先允许 SSH 再拒绝所有,否则拒绝规则会先生效)。
- 默认策略:建议将 INPUT 链默认策略设为 DROP(“白名单” 模式),只开放必要端口,提高安全性。
- 保存规则:临时添加的规则在系统重启后会丢失,需按系统类型保存(如 CentOS 的
service iptables save
)。 - 兼容性:部分 Linux 发行版(如 Ubuntu 20.04+、CentOS 8+)默认使用 nftables 替代 iptables,但仍可通过
iptables-nft
兼容旧命令。 - 调试技巧:使用
LOG
动作记录未匹配的数据包,结合tail -f /var/log/messages
分析丢包原因。
五、总结
iptables 是 Linux 系统中控制网络访问的核心工具,通过表、链、规则的三层结构,实现了对数据包的过滤、转换和修改。掌握 iptables 不仅能增强系统安全性(如限制端口访问、屏蔽恶意 IP),还能实现网络地址转换(如内网穿透、端口映射)等功能。实际使用中,需根据业务需求设计 “白名单” 规则,遵循 “最小权限” 原则,只开放必要的网络访问。