iptables 详解
iptables 是 Linux 系统中一个强大的防火墙工具,它基于 Netfilter 框架。Netfilter 是 Linux 内核中的一个数据包过滤和修改框架,而 iptables 是用于在用户空间配置 Netfilter 规则的命令行工具。通过 iptables,系统管理员可以定义各种规则来过滤、修改、转发或拦截网络数据包,从而实现网络流量控制、端口转发、地址伪装等功能。可以说,iptables 是 Linux 系统网络安全和流量管理的基石。
核心思想:基于规则链对数据包进行匹配和处理。 数据包在网络协议栈中穿行时,会根据定义好的规则链进行检查,并按照链中的规则顺序执行相应的动作。
一、Netfilter 框架与 iptables 关系
理解 iptables,首先要了解它与 Netfilter 的关系:
- Netfilter:位于 Linux 内核中,是一个用于网络数据包过滤、修改、转发和跟踪的框架。它定义了几个”钩子” (Hooks) 点,当数据包经过这些钩子点时,Netfilter 会检查是否有注册的规则需要处理该数据包。
- iptables:是用户空间的命令行工具,用于向 Netfilter 框架添加、删除、修改和查询规则。它提供了简洁的接口来管理内核中的数据包处理逻辑。
一个数据包在 Linux 系统内的穿越路径图 (简化版) 及其经过的 Netfilter 钩子点:
graph LR
subgraph Data Packet Flow
Client[Client] -- 数据包发送 --> NetworkIn[网络接口接收]
NetworkIn -- PREROUTING --> Decision1{是否本地进程?}
Decision1 -- 是 --> INPUT --> LocalProcess[本地进程]
Decision1 -- 否 --> FORWARD --> Decision2{是否转发?}
Decision2 -- 是 --> PostRouting[POSTROUTING] --> NetworkOut[网络接口发送] --> Server[Server]
LocalProcess -- OUTPUT --> PostRouting
end
style Client fill:#D5F5E3,stroke:#28B463,stroke-width:2px;
style Server fill:#D5F5E3,stroke:#28B463,stroke-width:2px;
style NetworkIn fill:#E8DAEF,stroke:#8E44AD,stroke-width:2px;
style NetworkOut fill:#E8DAEF,stroke:#8E44AD,stroke-width:2px;
style LocalProcess fill:#FADBD8,stroke:#CB4335,stroke-width:2px;
图:数据包在 Linux 系统中的流向以及 Netfilter 钩子点的大致位置
二、iptables 的三个基本概念:表 (Tables)、链 (Chains)、规则 (Rules)
iptables 的核心由三个层次构成:表 -> 链 -> 规则。
2.1 表 (Tables)
表是 iptables 中规则的集合,用于处理特定类型的网络任务。每个表都包含一些预定义的链。iptables 共有 5 个表:
filter表 (默认表):- 用途:实现数据包过滤,针对数据包是否被允许通过防火墙进行判断。包含允许/拒绝数据包进入或离开某个接口的规则。
- 包含链:
INPUT,FORWARD,OUTPUT。 - 优先级:中等。
- 常见应用:阻止恶意IP访问、限制端口访问、建立白名单/黑名单。
nat表 (Network Address Translation):- 用途:实现网络地址转换,修改数据包的源地址(SNAT)或目的地址(DNAT)。
- 包含链:
PREROUTING,INPUT(在旧版本中可能用于NAT,很少用),OUTPUT,POSTROUTING。 - 优先级:高。
- 常见应用:端口转发 (DNAT)、地址伪装/共享上网 (SNAT/MASQUERADE)。
mangle表:- 用途:修改数据包的 IP 头信息,例如 TTL(Time To Live)、TOS(Type of Service)等,但不涉及 IP 地址或端口的更改。
- 包含链:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。 - 优先级:最高。
- 常见应用:QoS (Quality of Service)、标记数据包以便后续处理。
raw表:- 用途:主要用于关闭 Netfilter 的连接跟踪 (Connection Tracking) 机制。
- 包含链:
PREROUTING,OUTPUT。 - 优先级:最高 (比 mangle 更早)。
- 常见应用:对某些高流量的、不需要连接跟踪的数据包进行优化(如简单的 UDP 服务)。
security表 (较新):- 用途:在 SELinux 环境下强制实施 MAC (Mandatory Access Control) 策略。
- 包含链:
INPUT,OUTPUT,FORWARD。 - 优先级:在
filter表之后。
2.2 链 (Chains)
链是规则的有序列表。当数据包到达 Netfilter 框架的某个钩子点时,它会按照顺序遍历该钩子点所对应的链中的所有规则。iptables 主要有 5 条预定义链 (通常存在于 filter 表和 mangle 表中,nat 和 raw 表有自己特定的链):
PREROUTING链:- 触发时机:数据包刚进入防火墙时,在路由判断之前。
- 表:
raw,mangle,nat。 - 用途:用于在数据包路由到本地进程或转发到其他接口之前,对其进行修改(如 DNAT)或标记。
INPUT链:- 触发时机:数据包将要被本地进程接收时。
- 表:
mangle,filter,security。 - 用途:控制进入本机的所有数据包(目的地是本机 IP 的数据包),例如允许/拒绝 SSH 访问本机端口。
FORWARD链:- 触发时机:数据包要被转发到另一个接口时(路由器功能)。
- 表:
mangle,filter,security。 - 用途:控制穿越防火墙的数据包,例如在路由器上,控制内部网络与外部网络的通信。
OUTPUT链:- 触发时机:本地进程产生的数据包即将离开本机时。
- 表:
raw,mangle,nat,filter,security。 - 用途:控制本机发出的所有数据包。
POSTROUTING链:- 触发时机:数据包即将离开防火墙时,在所有路由判断之后。
- 表:
mangle,nat。 - 用途:用于在数据包离开之前,对其进行最终修改(如 SNAT/MASQUERADE)。
数据包流向与链的关系图:
graph TD
A(数据包进入网卡) --> B{"PREROUTING Chain <br>(Mangle, Raw, Nat)"}
B --> C{路由判断: 目标是本机<br>还是转发?}
C -- 目标是本机 --> D{"INPUT Chain (Mangle, <br>Filter, Security)"}
D --> E(本地进程接收)
C -- 目标是转发 --> F{"FORWARD Chain (Mangle, <br>Filter, Security)"}
F --> G{"POSTROUTING Chain <br>(Mangle, Nat)"}
G --> H(数据包离开网卡)
I(本地进程发送数据包) --> J{"OUTPUT Chain (Mangle, <br>Raw, Nat, Filter, Security)"}
J --> G
2.3 规则 (Rules)
规则是 iptables 的最小逻辑单元,由匹配条件 (Matches) 和动作 (Targets) 组成。
匹配条件:指定触发规则的数据包特征,例如:
-p <protocol>:协议类型 (tcp, udp, icmp, all)。-s <source_ip>:源 IP 地址或网络。-d <destination_ip>:目的 IP 地址或网络。--sport <source_port>:源端口号。--dport <destination_port>:目的端口号。-i <input_interface>:入站接口。-o <output_interface>:出站接口。-m <module>:通过模块扩展匹配功能,如-m state(连接跟踪状态),-m mac(MAC 地址),-m limit(速率限制) 等。
动作 (Target):指定当数据包匹配规则后执行的操作。
ACCEPT:允许数据包通过。DROP:默默丢弃数据包,不返回任何信息给发送方。REJECT:丢弃数据包,并向发送方返回一个错误信息(例如 ICMP host unreachable)。SNAT:源网络地址转换(详见 DNAT/SNAT 详解)。DNAT:目的网络地址转换(详见 DNAT/SNAT 详解)。MASQUERADE:源地址伪装,一种特殊的 SNAT,用于动态 IP 地址。LOG:记录数据包信息到系统日志,然后继续匹配下一条规则。RETURN:停止在当前链中匹配,返回到调用链。JUMP <user-defined-chain>:跳转到用户自定义链,进行更复杂的处理。
三、iptables 常用命令
iptables 命令的基本格式: iptables -t <table_name> <command> <chain_name> <match> -j <target>
3.1 链管理
iptables -L:列出所有规则(默认是filter表)。-t <table_name>:指定表,如iptables -t nat -L。-n:不进行 IP/端口到名称的解析,显示数字形式。-v:显示详细信息,包括数据包和字节计数。--line-numbers:显示规则的行号,方便删除/插入。
iptables -F:清空所有规则(默认是filter表的所有链)。-t <table_name>:清空指定表的所有规则。<chain_name>:清空指定链的规则,如iptables -F INPUT。
iptables -X:删除用户自定义链。iptables -Z:将所有链的包计数器和字节计数器归零。iptables -P <chain_name> <target>:设置链的默认策略。- 例如:
iptables -P INPUT DROP(将 INPUT 链的默认策略设置为 DROP)。 - 警告:设置默认策略为
DROP前请三思,确保你不会把自己锁在系统之外。
- 例如:
3.2 规则管理
iptables -A <chain_name> <match> -j <target>:添加规则到链的末尾。- 例如:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 例如:
iptables -D <chain_name> <rule_number|match>:删除规则。- 按行号删除:
iptables -D INPUT 5(删除 INPUT 链的第 5 条规则)。 - 按规则内容删除:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT。
- 按行号删除:
iptables -I <chain_name> [rule_number] <match> -j <target>:插入规则。- 默认插入到链的开头(第 1 条),也可指定行号。
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT。
- 默认插入到链的开头(第 1 条),也可指定行号。
iptables -R <chain_name> <rule_number> <match> -j <target>:替换规则。iptables -R INPUT 5 -p tcp --dport 8080 -j ACCEPT(替换 INPUT 链的第 5 条规则)。
四、iptables 进阶应用示例
4.1 允许 SSH 访问
1 | # 允许 TCP 协议, 목적端口 22 的流量进入 INPUT 链 |
4.2 拒绝某个 IP 地址的访问
1 | # 拒绝源 IP 为 192.168.1.100 的所有流量进入 |
4.3 端口转发 (DNAT)
将外部访问公网 IP 的 80 端口转发到内部服务器 192.168.1.100 的 80 端口。
1 | # 开启 IP 转发 |
注:eth0 假设为公网接口,eth1 为内网接口。
4.4 限制连接速率
1 | # 限制对 22 端口的 SSH 连接,每分钟最多 5 次新连接 |
五、保存和恢复 iptables 规则
iptables 规则默认只存在于内存中,系统重启后会丢失。需要保存规则才能持久化。
- 保存规则:
- Debian/Ubuntu:
sudo iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL (旧版本):
sudo service iptables save或sudo /sbin/service iptables save(会保存到/etc/sysconfig/iptables) - CentOS/RHEL (新版本,使用 firewalld 或 nftables): 可能需要禁用 firewalld (不推荐),或直接使用
iptables-save。
- Debian/Ubuntu:
- 恢复规则:
sudo iptables-restore < /etc/iptables/rules.v4- 为了在重启时自动恢复,通常需要配置系统服务或在启动脚本中加入
iptables-restore命令。
六、iptables 的局限性与替代方案
局限性:
- 语法复杂:对于新手来说,iptables 的命令行语法可能比较晦涩难懂,容易出错。
- 状态管理:所有规则都是线性检查,管理大量复杂规则时效率可能下降。
替代方案:
随着 Linux 系统和网络技术的发展,出现了更高级的防火墙管理工具:
firewalld:- 特点:动态防火墙管理工具,基于区域 (zones) 的概念。用户只需将接口或源 IP 归属到特定区域,然后为区域配置服务,无需直接操作 iptables 链和规则。支持运行时修改,无需重启服务。
- 底层:
firewalld可以使用iptables也能够使用nftables作为后端。 - 优势:更易用,更适合服务管理,避免了直接操作 iptables 的复杂性。
nftables:- 特点:Linux 内核 Netfilter 项目的下一代包过滤框架。它旨在取代
iptables、ip6tables、arptables和ebtables等工具,提供统一的语法和更强大的功能。 - 优势:语法更简洁,效率更高,支持原子操作(一次性应用所有规则),并能更好地处理复杂规则集。
- 趋势:是未来的发展方向,现代 Linux 发行版逐渐转向
nftables。
- 特点:Linux 内核 Netfilter 项目的下一代包过滤框架。它旨在取代
七、总结
iptables 是 Linux 系统中一个强大而灵活的防火墙工具,它通过 Netfilter 框架在内核层面实现对网络数据包的精细控制。理解表、链和规则这三个核心概念是掌握 iptables 的关键。通过配置规则,可以实现数据过滤、地址转换、流量控制等多种功能,从而保障系统网络安全和优化网络性能。虽然其命令行语法相对复杂,但在许多 Linux 环境中仍是常用的防火墙解决方案。对于新系统,建议关注 firewalld 或直接学习 nftables,它们提供了更现代、更简洁的管理方式。
