3.1 核心概念概述

iptables 的基本组成

iptables 的规则管理基于以下层次结构:

iptables
├── 表 (Tables)
│   ├── 链 (Chains)
│   │   ├── 规则 (Rules)
│   │   │   ├── 匹配条件 (Match Criteria)
│   │   │   └── 目标动作 (Target Actions)
│   │   └── 默认策略 (Default Policy)
│   └── ...
└── ...

数据包处理流程

数据包 → 表选择 → 链遍历 → 规则匹配 → 动作执行 → 结果输出

3.2 表 (Tables) 详解

表的概念

表是 iptables 中规则的逻辑分组,每个表都有特定的功能和用途。

四个内置表

1. filter 表

用途:包过滤,这是 iptables 的默认表

# 查看 filter 表
iptables -t filter -L
# 或者(默认就是 filter 表)
iptables -L

包含的链: - INPUT:处理进入本机的数据包 - OUTPUT:处理本机发出的数据包 - FORWARD:处理经过本机转发的数据包

典型应用

# 阻止特定IP访问
iptables -A INPUT -s 192.168.1.100 -j DROP

# 允许HTTP访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 阻止出站连接到特定端口
iptables -A OUTPUT -p tcp --dport 25 -j DROP

2. nat 表

用途:网络地址转换 (Network Address Translation)

# 查看 nat 表
iptables -t nat -L

包含的链: - PREROUTING:修改刚到达的数据包 - OUTPUT:修改本机产生的数据包 - POSTROUTING:修改即将发出的数据包

典型应用

# SNAT:源地址转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# DNAT:目标地址转换
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080

# MASQUERADE:动态源地址转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

3. mangle 表

用途:修改数据包的头部信息

# 查看 mangle 表
iptables -t mangle -L

包含的链: - PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING(所有链)

典型应用

# 修改 TOS 字段
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j TOS --set-tos 0x10

# 标记数据包
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 1

# 修改 TTL
iptables -t mangle -A OUTPUT -j TTL --ttl-set 64

4. raw 表

用途:配置免于连接跟踪的数据包

# 查看 raw 表
iptables -t raw -L

包含的链: - PREROUTING、OUTPUT

典型应用

# 跳过连接跟踪(提高性能)
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK

表的优先级

数据包处理时表的优先级顺序:

raw → mangle → nat → filter

3.3 链 (Chains) 详解

链的概念

链是规则的有序列表,数据包会按照链中规则的顺序进行匹配。

内置链详解

INPUT 链

作用:处理目标地址是本机的数据包

数据包流向

外部网络 → 网卡 → PREROUTING → 路由判断 → INPUT → 本地进程

应用场景

# 允许SSH连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 限制连接频率
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT

# 阻止特定国家的IP
iptables -A INPUT -m geoip --src-cc CN -j DROP

OUTPUT 链

作用:处理本机发出的数据包

数据包流向

本地进程 → OUTPUT → 路由判断 → POSTROUTING → 网卡 → 外部网络

应用场景

# 阻止访问特定网站
iptables -A OUTPUT -d www.example.com -j DROP

# 限制出站端口
iptables -A OUTPUT -p tcp --dport 25 -j DROP

# 允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

FORWARD 链

作用:处理经过本机转发的数据包

数据包流向

外部网络 → 网卡 → PREROUTING → 路由判断 → FORWARD → POSTROUTING → 网卡 → 外部网络

应用场景

# 允许内网访问外网
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

# 阻止特定协议转发
iptables -A FORWARD -p icmp -j DROP

# 限制转发带宽
iptables -A FORWARD -m limit --limit 1000/sec -j ACCEPT

PREROUTING 链

作用:在路由判断之前处理数据包

主要用途: - DNAT(目标地址转换) - 端口重定向 - 数据包标记

# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

# 负载均衡
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11

POSTROUTING 链

作用:在数据包离开系统之前处理

主要用途: - SNAT(源地址转换) - MASQUERADE(地址伪装)

# 网络共享
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 固定源地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1

自定义链

创建自定义链

# 创建自定义链
iptables -N CUSTOM_CHAIN

# 查看所有链
iptables -L

# 删除自定义链(必须先清空)
iptables -F CUSTOM_CHAIN
iptables -X CUSTOM_CHAIN

使用自定义链

# 创建日志链
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix "[DROPPED]: "
iptables -A LOG_DROP -j DROP

# 跳转到自定义链
iptables -A INPUT -s 192.168.1.100 -j LOG_DROP

3.4 规则 (Rules) 详解

规则的结构

一条完整的 iptables 规则包含:

iptables [表选项] [链操作] [匹配条件] [目标动作]

规则操作

添加规则

# 在链末尾添加规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 在指定位置插入规则
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

# 替换指定位置的规则
iptables -R INPUT 1 -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

删除规则

# 按规则内容删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# 按行号删除
iptables -D INPUT 1

# 清空链中所有规则
iptables -F INPUT

# 清空所有链的规则
iptables -F

查看规则

# 查看所有规则
iptables -L

# 显示行号
iptables -L --line-numbers

# 显示详细信息
iptables -L -v

# 不解析域名和端口名
iptables -L -n

# 组合选项
iptables -L -n -v --line-numbers

规则匹配顺序

规则1 → 匹配? → 是 → 执行动作 → 结束/继续
  ↓
 否
  ↓
规则2 → 匹配? → 是 → 执行动作 → 结束/继续
  ↓
 否
  ↓
...
  ↓
默认策略

3.5 匹配条件 (Match Criteria)

基本匹配条件

协议匹配

# TCP 协议
iptables -A INPUT -p tcp -j ACCEPT

# UDP 协议
iptables -A INPUT -p udp -j ACCEPT

# ICMP 协议
iptables -A INPUT -p icmp -j ACCEPT

# 所有协议
iptables -A INPUT -p all -j ACCEPT

地址匹配

# 源地址
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 目标地址
iptables -A OUTPUT -d 8.8.8.8 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT

# 排除地址
iptables -A INPUT ! -s 192.168.1.100 -j DROP

端口匹配

# 源端口
iptables -A INPUT -p tcp --sport 80 -j ACCEPT

# 目标端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 端口范围
iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT

# 多个端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

接口匹配

# 输入接口
iptables -A INPUT -i eth0 -j ACCEPT

# 输出接口
iptables -A OUTPUT -o eth1 -j ACCEPT

# 接口通配符
iptables -A INPUT -i eth+ -j ACCEPT

扩展匹配条件

状态匹配

# 连接状态
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP

# 连接跟踪
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

限制匹配

# 速率限制
iptables -A INPUT -p icmp -m limit --limit 1/sec --limit-burst 3 -j ACCEPT

# 连接数限制
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

# 最近访问限制
iptables -A INPUT -m recent --name SSH --set
iptables -A INPUT -m recent --name SSH --rcheck --seconds 60 --hitcount 4 -j DROP

时间匹配

# 时间范围
iptables -A INPUT -m time --timestart 09:00 --timestop 18:00 -j ACCEPT

# 星期限制
iptables -A INPUT -m time --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

# 日期范围
iptables -A INPUT -m time --datestart 2024-01-01 --datestop 2024-12-31 -j ACCEPT

3.6 目标动作 (Target Actions)

终止动作

ACCEPT

# 接受数据包
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

DROP

# 静默丢弃数据包
iptables -A INPUT -s 192.168.1.100 -j DROP

REJECT

# 拒绝数据包并发送错误信息
iptables -A INPUT -p tcp --dport 23 -j REJECT
iptables -A INPUT -p tcp --dport 23 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp --dport 53 -j REJECT --reject-with icmp-port-unreachable

非终止动作

LOG

# 记录日志
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "[SSH-ACCESS]: "
iptables -A INPUT -p tcp --dport 22 -j LOG --log-level 4

MARK

# 标记数据包
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 1

RETURN

# 返回调用链
iptables -A CUSTOM_CHAIN -p tcp --dport 80 -j RETURN

NAT 动作

SNAT

# 源地址转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1

DNAT

# 目标地址转换
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

MASQUERADE

# 地址伪装
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

REDIRECT

# 端口重定向
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

3.7 默认策略 (Default Policy)

策略概念

默认策略是当数据包不匹配链中任何规则时执行的动作。

设置默认策略

# 查看当前策略
iptables -L | grep policy

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 恢复默认策略
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

策略选择原则

安全优先策略(推荐)

# 默认拒绝,明确允许
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# 然后添加具体的允许规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

便利优先策略

# 默认允许,明确拒绝
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# 然后添加具体的拒绝规则
iptables -A INPUT -s 192.168.1.100 -j DROP

3.8 常用术语解释

网络相关术语

  • 数据包 (Packet):网络中传输的数据单元
  • 连接 (Connection):两个网络端点之间的通信会话
  • 会话 (Session):应用层的通信过程
  • 流 (Flow):具有相同特征的数据包序列

防火墙术语

  • 包过滤 (Packet Filtering):基于数据包头部信息进行过滤
  • 状态检测 (Stateful Inspection):跟踪连接状态的高级过滤
  • 深度包检测 (DPI):检查数据包内容的技术
  • 入侵检测 (IDS):检测恶意活动的系统

iptables 专用术语

  • 钩子 (Hook):Netfilter 框架中的拦截点
  • 匹配器 (Matcher):用于匹配数据包特征的模块
  • 目标 (Target):规则匹配后执行的动作
  • 扩展 (Extension):增强 iptables 功能的模块

3.9 规则编写最佳实践

规则顺序原则

  1. 特殊规则在前:具体的规则应该放在通用规则之前
  2. 常用规则在前:频繁匹配的规则应该放在前面
  3. 拒绝规则在后:DROP 规则通常放在最后
# 好的规则顺序
iptables -A INPUT -i lo -j ACCEPT                    # 本地回环
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  # 已建立连接
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT  # 特定SSH访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT        # HTTP访问
iptables -A INPUT -p icmp -j ACCEPT                  # ICMP
iptables -A INPUT -j DROP                            # 默认拒绝

性能优化原则

  1. 减少规则数量:合并相似规则
  2. 使用高效匹配:避免复杂的正则表达式
  3. 合理使用扩展:只在必要时使用扩展模块
# 低效的规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 高效的规则
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

安全性原则

  1. 最小权限原则:只开放必要的端口和服务
  2. 默认拒绝:使用 DROP 作为默认策略
  3. 日志记录:记录重要的安全事件
# 安全的基础配置
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 基本允许规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 日志记录可疑活动
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --rcheck --seconds 60 --hitcount 4 -j LOG --log-prefix "[SSH-BRUTE-FORCE]: "
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --rcheck --seconds 60 --hitcount 4 -j DROP

本章小结

本章详细介绍了 iptables 的基本概念和术语:

  1. 表的概念:filter、nat、mangle、raw 四个表的用途和特点
  2. 链的概念:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING 链的作用
  3. 规则结构:匹配条件和目标动作的组合
  4. 匹配条件:基本匹配和扩展匹配的各种选项
  5. 目标动作:终止、非终止和 NAT 动作的使用
  6. 默认策略:链的默认处理方式
  7. 最佳实践:规则编写的原则和技巧

本章练习

  1. 概念理解

    • 解释四个表的区别和用途
    • 描述数据包在不同链中的处理流程
    • 说明规则匹配的顺序和原理
  2. 实践练习

    • 创建自定义链并编写规则
    • 使用不同的匹配条件编写规则
    • 测试各种目标动作的效果
  3. 规则编写

    • 编写一套基本的安全规则
    • 实现简单的端口转发
    • 配置基本的 NAT 功能
  4. 故障排除

    • 分析规则不生效的原因
    • 调试规则匹配问题
    • 优化规则性能

下一章我们将深入学习表和链的详细配置和使用方法。