iptables

iptables 是 Linux 内核中用于管理网络包过滤的工具,通过定义规则(rules)控制网络流量。它是 Linux 防火墙体系的核心组件之一,广泛用于网络安全防护、端口转发、流量控制等场景。

                               XXXXXXXXXXXXXXXXXX
                             XXX     Network    XXX
                               XXXXXXXXXXXXXXXXXX
                                       +
                                       |
                                       v
 +-------------+              +------------------+
 |table: filter| <---+        | table: nat       |
 |chain: INPUT |     |        | chain: PREROUTING|
 +-----+-------+     |        +--------+---------+
       |             |                 |
       v             |                 v
 [local process]     |           ****************          +--------------+
       |             +---------+ Routing decision +------> |table: filter |
       v                         ****************          |chain: FORWARD|
****************                                           +------+-------+
Routing decision                                                  |
****************                                                  |
       |                                                          |
       v                        ****************                  |
+-------------+       +------>  Routing decision  <---------------+
|table: nat   |       |         ****************
|chain: OUTPUT|       |               +
+-----+-------+       |               |
      |               |               v
      v               |      +-------------------+
+--------------+      |      | table: nat        |
|table: filter | +----+      | chain: POSTROUTING|
|chain: OUTPUT |             +--------+----------+
+--------------+                      |
                                      v
                               XXXXXXXXXXXXXXXXXX
                             XXX    Network     XXX
                               XXXXXXXXXXXXXXXXXX


一、iptables 的基本概念

1. iptables 的组成结构

iptables 的规则系统由 表(tables)链(chains)规则(rules) 三部分组成:

组件

描述

表(tables)

定义不同处理规则的分类,每个表对应不同的功能

链(chains)

预定义的规则集合,用于处理特定类型的网络包

规则(rules)

具体的匹配条件和动作(如 ACCEPT/DROP)


二、iptables 的表(Tables)

iptables 支持四种主要表,每种表对应不同的网络处理阶段:

表名

作用

适用场景

filter

用于过滤数据包(默认表)

控制入站/出站/转发的流量

nat

网络地址转换(Network Address Translation)

路由、端口转发、SNAT/DNAT

mangle

修改数据包的特定字段(如 TTL、TOS)

用于特殊处理数据包

raw

用于跳过 iptables 的连接跟踪(conntrack)

适用于需要绕过 conntrack 的场景(如 FTP 被动模式)


三、iptables 的链(Chains)

每个表中预定义了若干链,用于处理特定类型的流量:

1. filter 表中的链

链名

作用

INPUT

处理进入本机的数据包(如 Web 服务请求)

OUTPUT

处理本机发出的数据包(如 Web 服务响应)

FORWARD

处理经过本机转发的数据包(如路由器场景)

2. nat 表中的链

链名

作用

PREROUTING

处理进入本机的数据包(在路由前)

POSTROUTING

处理即将离开本机的数据包(在路由后)

OUTPUT

处理本机发出的数据包(在 nat 表中)

3. mangle 表中的链

链名

作用

PREROUTING

修改进入本机的数据包(如修改 TTL)

INPUT

修改进入本机的数据包

OUTPUT

修改本机发出的数据包

FORWARD

修改转发的数据包

POSTROUTING

修改即将离开本机的数据包


四、iptables 的规则结构

每条规则由 匹配条件(match)目标动作(target) 组成:

iptables -A 链名 [匹配条件] -j [目标动作]

1. 匹配条件(match)

  • 基本匹配:IP 地址、端口、协议(如 -p tcp

  • 状态匹配--state ESTABLISHED(已建立的连接)

  • 扩展匹配:使用 -m 指定模块(如 -m limit 限制速率)

  • 连接跟踪--syn(SYN 报文)、--connlimit(连接数限制)

2. 目标动作(target)

  • ACCEPT:允许数据包通过

  • DROP:丢弃数据包(无响应)

  • REJECT:拒绝数据包并返回错误(如 TCP RST)

  • REDIRECT:将数据包重定向到本机其他端口(用于端口转发)

  • MASQUERADE:动态地址转换(SNAT 的简化形式)

  • DNAT:目标地址转换(用于端口映射)

  • SNAT:源地址转换(用于多宿主主机)


五、iptables 的常用命令

1. 查看规则

# 查看所有规则(数字格式 + 详细信息)
iptables -L -n -v 
 

# 查看 nat 表的规则
iptables -L -t nat 

2. 添加规则

# 允许 80 端口入站 
iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

# 拒绝所有非 ESTABLISHED 的连接 
iptables -A INPUT -m state --state ! ESTABLISHED -j DROP

3. 删除规则

# 通过匹配条件删除规则 
iptables -D INPUT -p tcp --dport 80 -j ACCEPT 

# 通过编号删除规则 
iptables -D INPUT 1           # 删除 INPUT 链的第 1 条规则

4. 保存和恢复规则

# 保存规则(不同发行版可能不同) 
iptables-save > /etc/iptables/rules.v4 

# 恢复规则 
iptables-restore < /etc/iptables/rules.v4


六、iptables 的进阶用法

1. NAT 配置(端口转发)

# 将外部访问 8080 端口的流量转发到本地 80 端口 
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80

2. 限制连接数

# 限制每个 IP 只能建立 5 个 SSH 连接 
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j DROP

3. 日志记录

# 记录所有被 DROP 的数据包 
iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4

4. 伪装源地址(MASQUERADE)

# 用于多宿主主机的 SNAT 
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


七、iptables 的性能优化

1. 规则顺序优化

  • 将常用的允许规则(如 ESTABLISHED)放在最前面

  • 将拒绝规则(DROP)放在最后

2. 避免使用通配符

  • 避免使用 --match anything,使用具体匹配条件(如 IP、端口)

3. 使用扩展模块

  • 使用 limit 模块限制速率,避免 DoS 攻击

  • 使用 conntrack 模块优化连接跟踪


八、iptables 与 nftables 的比较

特性

iptables

nftables

性能

依赖内核的 Netfilter

更高效的内核级实现

语法

复杂,命令繁多

更简洁的语法

功能

支持扩展模块

支持更高级的匹配和操作

兼容性

传统 Linux 发行版

现代 Linux 发行版(如 Ubuntu 20.04+)

注意:iptables 是 nftables 的兼容层,未来可能被完全取代。


九、iptables 的安全实践

  1. 设置默认策略

    iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP

  2. 防御 DoS 攻击

    # 限制每秒连接数 
    iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT

  3. 使用状态检测

    # 允许已建立的连接 
    iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT


十、常见问题与解决方案

1. 规则生效后无法访问网络

  • 检查 OUTPUT 链是否允许流量

  • 确保 POSTROUTING 链的 SNAT 配置正确

2. 端口转发无效

  • 检查 PREROUTINGPOSTROUTING 链的规则

  • 确保目标主机监听了对应端口

3. 规则未持久化

  • 确认规则保存到 /etc/iptables/rules.v4

  • 启用 iptables 服务(如 systemctl enable iptables


十一、总结

iptables 是 Linux 网络防火墙的核心工具,通过灵活的规则配置可以实现强大的网络控制。掌握其表、链、规则的结构,结合实际场景(如端口转发、流量限制、安全防护),可以有效提升系统的安全性与稳定性。对于现代 Linux 系统,建议逐步过渡到 nftables 以获得更好的性能和功能支持。

Comment

华计科技: 中华自主研发设计

华计科技为您提供咨询服务,IT技术支持和项目开发: (+86) 156 2654 0671

联系我们