iptables 是 Linux 系统中一个强大的防火墙工具,它基于 Netfilter 框架。Netfilter 是 Linux 内核中的一个数据包过滤和修改框架,而 iptables 是用于在用户空间配置 Netfilter 规则的命令行工具。通过 iptables,系统管理员可以定义各种规则来过滤、修改、转发或拦截网络数据包,从而实现网络流量控制、端口转发、地址伪装等功能。可以说,iptables 是 Linux 系统网络安全和流量管理的基石。

核心思想:基于规则链对数据包进行匹配和处理。 数据包在网络协议栈中穿行时,会根据定义好的规则链进行检查,并按照链中的规则顺序执行相应的动作。


一、Netfilter 框架与 iptables 关系

理解 iptables,首先要了解它与 Netfilter 的关系:

  • Netfilter:位于 Linux 内核中,是一个用于网络数据包过滤、修改、转发和跟踪的框架。它定义了几个”钩子” (Hooks) 点,当数据包经过这些钩子点时,Netfilter 会检查是否有注册的规则需要处理该数据包。
  • iptables:是用户空间的命令行工具,用于向 Netfilter 框架添加、删除、修改和查询规则。它提供了简洁的接口来管理内核中的数据包处理逻辑。

一个数据包在 Linux 系统内的穿越路径图 (简化版) 及其经过的 Netfilter 钩子点:

图:数据包在 Linux 系统中的流向以及 Netfilter 钩子点的大致位置

二、iptables 的三个基本概念:表 (Tables)、链 (Chains)、规则 (Rules)

iptables 的核心由三个层次构成:表 -> 链 -> 规则

2.1 表 (Tables)

表是 iptables 中规则的集合,用于处理特定类型的网络任务。每个表都包含一些预定义的链。iptables 共有 5 个表:

  1. filter 表 (默认表)

    • 用途:实现数据包过滤,针对数据包是否被允许通过防火墙进行判断。包含允许/拒绝数据包进入或离开某个接口的规则。
    • 包含链INPUT, FORWARD, OUTPUT
    • 优先级:中等。
    • 常见应用:阻止恶意IP访问、限制端口访问、建立白名单/黑名单。
  2. nat 表 (Network Address Translation)

    • 用途:实现网络地址转换,修改数据包的源地址(SNAT)或目的地址(DNAT)。
    • 包含链PREROUTING, INPUT (在旧版本中可能用于NAT,很少用), OUTPUT, POSTROUTING
    • 优先级:高。
    • 常见应用:端口转发 (DNAT)、地址伪装/共享上网 (SNAT/MASQUERADE)。
  3. mangle

    • 用途:修改数据包的 IP 头信息,例如 TTL(Time To Live)、TOS(Type of Service)等,但不涉及 IP 地址或端口的更改。
    • 包含链PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    • 优先级:最高。
    • 常见应用:QoS (Quality of Service)、标记数据包以便后续处理。
  4. raw

    • 用途:主要用于关闭 Netfilter 的连接跟踪 (Connection Tracking) 机制。
    • 包含链PREROUTING, OUTPUT
    • 优先级:最高 (比 mangle 更早)。
    • 常见应用:对某些高流量的、不需要连接跟踪的数据包进行优化(如简单的 UDP 服务)。
  5. security 表 (较新)

    • 用途:在 SELinux 环境下强制实施 MAC (Mandatory Access Control) 策略。
    • 包含链INPUT, OUTPUT, FORWARD
    • 优先级:在 filter 表之后。

2.2 链 (Chains)

链是规则的有序列表。当数据包到达 Netfilter 框架的某个钩子点时,它会按照顺序遍历该钩子点所对应的链中的所有规则。iptables 主要有 5 条预定义链 (通常存在于 filter 表和 mangle 表中,nat 和 raw 表有自己特定的链):

  1. PREROUTING

    • 触发时机:数据包刚进入防火墙时,在路由判断之前。
    • raw, mangle, nat
    • 用途:用于在数据包路由到本地进程或转发到其他接口之前,对其进行修改(如 DNAT)或标记。
  2. INPUT

    • 触发时机:数据包将要被本地进程接收时。
    • mangle, filter, security
    • 用途:控制进入本机的所有数据包(目的地是本机 IP 的数据包),例如允许/拒绝 SSH 访问本机端口。
  3. FORWARD

    • 触发时机:数据包要被转发到另一个接口时(路由器功能)。
    • mangle, filter, security
    • 用途:控制穿越防火墙的数据包,例如在路由器上,控制内部网络与外部网络的通信。
  4. OUTPUT

    • 触发时机:本地进程产生的数据包即将离开本机时。
    • raw, mangle, nat, filter, security
    • 用途:控制本机发出的所有数据包。
  5. POSTROUTING

    • 触发时机:数据包即将离开防火墙时,在所有路由判断之后。
    • mangle, nat
    • 用途:用于在数据包离开之前,对其进行最终修改(如 SNAT/MASQUERADE)。

数据包流向与链的关系图:

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
  • 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
2
3
4
5
# 允许 TCP 协议, 목적端口 22 的流量进入 INPUT 链
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许已建立和相关联的连接通过 (连接跟踪机制,非常重要)
# 这样 SSH 响应流量可以正常返回
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

4.2 拒绝某个 IP 地址的访问

1
2
3
4
# 拒绝源 IP 为 192.168.1.100 的所有流量进入
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
# 或者拒绝到某个特定端口
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 80 -j REJECT

4.3 端口转发 (DNAT)

将外部访问公网 IP 的 80 端口转发到内部服务器 192.168.1.100 的 80 端口。

1
2
3
4
5
6
7
8
9
10
# 开启 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
# DNAT 规则:将发往本路由器公网 IP (假设为 203.0.113.1) 的 80 端口 TCP 流量重定向到内部服务器
sudo iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
# SNAT 规则:确保内部服务器的响应能正确返回到外部客户端
sudo iptables -t nat -A POSTROUTING -s 192.168.1.100 -o eth0 -j MASQUERADE
# 允许转发(如果 filter 表的 FORWARD 链默认策略是 DROP)
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
# 允许转发的响应流量
sudo iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport 80 -s 192.168.1.100 -j ACCEPT

注:eth0 假设为公网接口,eth1 为内网接口。

4.4 限制连接速率

1
2
3
4
# 限制对 22 端口的 SSH 连接,每分钟最多 5 次新连接
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
# 对于超出限制的连接,则拒绝
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

五、保存和恢复 iptables 规则

iptables 规则默认只存在于内存中,系统重启后会丢失。需要保存规则才能持久化。

  • 保存规则
    • Debian/Ubuntu: sudo iptables-save > /etc/iptables/rules.v4
    • CentOS/RHEL (旧版本): sudo service iptables savesudo /sbin/service iptables save (会保存到 /etc/sysconfig/iptables)
    • CentOS/RHEL (新版本,使用 firewalld 或 nftables): 可能需要禁用 firewalld (不推荐),或直接使用 iptables-save
  • 恢复规则
    • sudo iptables-restore < /etc/iptables/rules.v4
    • 为了在重启时自动恢复,通常需要配置系统服务或在启动脚本中加入 iptables-restore 命令。

六、iptables 的局限性与替代方案

局限性:

  • 语法复杂:对于新手来说,iptables 的命令行语法可能比较晦涩难懂,容易出错。
  • 状态管理:所有规则都是线性检查,管理大量复杂规则时效率可能下降。

替代方案:

随着 Linux 系统和网络技术的发展,出现了更高级的防火墙管理工具:

  1. firewalld

    • 特点:动态防火墙管理工具,基于区域 (zones) 的概念。用户只需将接口或源 IP 归属到特定区域,然后为区域配置服务,无需直接操作 iptables 链和规则。支持运行时修改,无需重启服务。
    • 底层firewalld 可以使用 iptables 也能够使用 nftables 作为后端。
    • 优势:更易用,更适合服务管理,避免了直接操作 iptables 的复杂性。
  2. nftables

    • 特点:Linux 内核 Netfilter 项目的下一代包过滤框架。它旨在取代 iptablesip6tablesarptablesebtables 等工具,提供统一的语法和更强大的功能。
    • 优势:语法更简洁,效率更高,支持原子操作(一次性应用所有规则),并能更好地处理复杂规则集。
    • 趋势:是未来的发展方向,现代 Linux 发行版逐渐转向 nftables

七、总结

iptables 是 Linux 系统中一个强大而灵活的防火墙工具,它通过 Netfilter 框架在内核层面实现对网络数据包的精细控制。理解表、链和规则这三个核心概念是掌握 iptables 的关键。通过配置规则,可以实现数据过滤、地址转换、流量控制等多种功能,从而保障系统网络安全和优化网络性能。虽然其命令行语法相对复杂,但在许多 Linux 环境中仍是常用的防火墙解决方案。对于新系统,建议关注 firewalld 或直接学习 nftables,它们提供了更现代、更简洁的管理方式。