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 规则编写最佳实践
规则顺序原则
- 特殊规则在前:具体的规则应该放在通用规则之前
- 常用规则在前:频繁匹配的规则应该放在前面
- 拒绝规则在后: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 # 默认拒绝
性能优化原则
- 减少规则数量:合并相似规则
- 使用高效匹配:避免复杂的正则表达式
- 合理使用扩展:只在必要时使用扩展模块
# 低效的规则
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
安全性原则
- 最小权限原则:只开放必要的端口和服务
- 默认拒绝:使用 DROP 作为默认策略
- 日志记录:记录重要的安全事件
# 安全的基础配置
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 的基本概念和术语:
- 表的概念:filter、nat、mangle、raw 四个表的用途和特点
- 链的概念:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING 链的作用
- 规则结构:匹配条件和目标动作的组合
- 匹配条件:基本匹配和扩展匹配的各种选项
- 目标动作:终止、非终止和 NAT 动作的使用
- 默认策略:链的默认处理方式
- 最佳实践:规则编写的原则和技巧
本章练习
概念理解:
- 解释四个表的区别和用途
- 描述数据包在不同链中的处理流程
- 说明规则匹配的顺序和原理
实践练习:
- 创建自定义链并编写规则
- 使用不同的匹配条件编写规则
- 测试各种目标动作的效果
规则编写:
- 编写一套基本的安全规则
- 实现简单的端口转发
- 配置基本的 NAT 功能
故障排除:
- 分析规则不生效的原因
- 调试规则匹配问题
- 优化规则性能
下一章我们将深入学习表和链的详细配置和使用方法。