iptables#
概述#
防火墙是用于实现 Linux 访问控制功能的系统,工作在网络边缘,通过预定义策略检测出入网络的 IP 和数据包。
防火墙类型#
三层/四层防火墙:在网络层工作,检测源地址和目标地址
七层防火墙:在应用层工作,检查所有数据内容
混合方案:结合两者优势,平衡安全性与效率
演进历史#
ipfirewall(内核 1.x):功能有限,规则需全部放入内核
ipchains(内核 2.x):支持规则串联
iptables/ip6tables(现代):规则列表形式,提供精细访问控制
iptables 是用户空间的规则定义工具,实际防火墙功能由内核空间的 netfilter 实现。
核心架构#
五个规则链#
graph TB
A[数据包进入] --> B[PREROUTING]
B --> C{路由判断}
C -->|目标为本机| D[INPUT]
D --> E[用户空间应用程序]
E --> F[OUTPUT]
F --> G[POSTROUTING]
C -->|需要转发| H[FORWARD]
H --> G
G --> I[数据包输出]
subgraph 内核空间
B
D
F
G
H
end
subgraph 用户空间
E
end
规则链说明:
PREROUTING:路由前处理
INPUT:进入本机数据包
FORWARD:转发数据包
OUTPUT:本机发出数据包
POSTROUTING:路由后处理
数据流向#
入站流量:PREROUTING → INPUT → 应用程序
出站流量:应用程序 → OUTPUT → POSTROUTING
转发流量:PREROUTING → FORWARD → POSTROUTING
表系统详解#
表的概念层次#
flowchart TD
A[数据包进入] --> B[表处理优先级]
B --> C[raw表]
C --> D[mangle表]
D --> E[nat表]
E --> F[filter表]
C --> C1[连接跟踪前处理]
D --> D1[修改数据包内容]
E --> E1[网络地址转换]
F --> F1[包过滤决策]
style C fill:#e1f5fe
style D fill:#f3e5f5
style E fill:#e8f5e8
style F fill:#fff3e0
四张核心表#
1. raw 表#
特性:最高优先级,连接跟踪前处理 链:PREROUTING、OUTPUT
# 性能优化:免跟踪 HTTP 流量
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK
2. mangle 表#
特性:修改数据包内容(标记、TTL、TOS) 链:所有五链
# 流量标记
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
iptables -t mangle -A PREROUTING -j TTL --ttl-set 64
3. nat 表#
特性:网络地址转换 链:PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT)
# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:8080
# 共享上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
4. filter 表#
特性:默认表,数据包过滤 链:INPUT、FORWARD、OUTPUT
# 基础访问控制
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A INPUT -i lo -j ACCEPT
表链关系总览#
flowchart TD
subgraph 表链映射
A[raw表] --> A1[PREROUTING]
A --> A2[OUTPUT]
B[mangle表] --> B1[PREROUTING]
B --> B2[INPUT]
B --> B3[FORWARD]
B --> B4[OUTPUT]
B --> B5[POSTROUTING]
C[nat表] --> C1[PREROUTING]
C --> C2[OUTPUT]
C --> C3[POSTROUTING]
D[filter表] --> D1[INPUT]
D --> D2[FORWARD]
D --> D3[OUTPUT]
end
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style D fill:#fff3e0
完整处理流程#
flowchart LR
A[数据包进入] --> B[PREROUTING]
subgraph PREROUTING处理
B --> C[raw表]
C --> D[mangle表]
D --> E[nat表 DNAT]
end
E --> F{路由判断}
F -->|目标为本机| G[INPUT]
subgraph INPUT处理
G --> H[mangle表]
H --> I[filter表]
end
I --> J[本地进程]
F -->|需要转发| K[FORWARD]
subgraph FORWARD处理
K --> L[mangle表]
L --> M[filter表]
end
M --> N[POSTROUTING]
J --> O[OUTPUT]
subgraph OUTPUT处理
O --> P[raw表]
P --> Q[mangle表]
Q --> R[nat表]
end
R --> N
subgraph POSTROUTING处理
N --> S[mangle表]
S --> T[nat表 SNAT]
end
T --> U[数据包发出]
命令语法#
基础格式#
iptables [-t 表] -命令 匹配 操作
核心命令#
命令 |
功能 |
示例 |
|---|---|---|
|
定义默认策略 |
|
|
查看规则列表 |
|
|
追加规则 |
|
|
插入规则 |
|
|
删除规则 |
|
|
清空所有规则 |
|
匹配条件#
选项 |
功能 |
示例 |
|---|---|---|
|
输入接口 |
|
|
输出接口 |
|
|
协议类型 |
|
|
源地址 |
|
|
源端口 |
|
|
目的端口 |
|
|
匹配模块 |
|
处理动作#
ACCEPT:允许通过
DROP:静默丢弃
REJECT:拒绝并返回错误
LOG:记录日志
SNAT/DNAT:地址转换
MASQUERADE:IP 伪装
实用配置示例#
基础防火墙配置#
# 清空现有规则
iptables -F
iptables -X
# 设置默认策略
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 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
# 允许 ICMP (ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
网络地址转换#
# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# SNAT:内网共享上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT:端口映射
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
高级访问控制#
# 基于 MAC 地址过滤
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
# 连接数限制
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
# 频率限制
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT
# 记录可疑流量
iptables -A INPUT -s 10.0.0.0/8 -j LOG --log-prefix "SPOOFED: "
iptables -A INPUT -s 10.0.0.0/8 -j DROP
规则管理技巧#
# 查看带行号的规则
iptables -L INPUT -n --line-numbers
# 在指定位置插入规则
iptables -I INPUT 2 -s 192.168.1.50 -j ACCEPT
# 保存和恢复规则
iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules
# 清空计数器
iptables -Z
最佳实践#
默认拒绝:设置默认策略为 DROP,显式允许必要流量
状态检测:充分利用连接状态跟踪
规则优化:将常用规则放在前面提高效率
日志记录:对拒绝的流量添加日志以便排查
定期备份:保存规则配置防止意外丢失
通过合理组合四张表的功能,iptables 能够实现从基础包过滤到复杂网络地址转换的全方位网络控制。