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

规则链说明

  1. PREROUTING:路由前处理

  2. INPUT:进入本机数据包

  3. FORWARD:转发数据包

  4. OUTPUT:本机发出数据包

  5. 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 ] -命令 匹配 操作

核心命令#

命令

功能

示例

-P --policy

定义默认策略

iptables -P INPUT DROP

-L --list

查看规则列表

iptables -L -n -v

-A --append

追加规则

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

-I --insert

插入规则

iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

-D --delete

删除规则

iptables -D INPUT 3

-F --flush

清空所有规则

iptables -F

匹配条件#

选项

功能

示例

-i --in-interface

输入接口

-i eth0

-o --out-interface

输出接口

-o eth1

-p --proto

协议类型

-p tcp

-s --source

源地址

-s 192.168.1.100

--sport

源端口

--sport 8080

--dport

目的端口

--dport 80

-m --match

匹配模块

-m state --state NEW

处理动作#

  • 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

最佳实践#

  1. 默认拒绝:设置默认策略为 DROP,显式允许必要流量

  2. 状态检测:充分利用连接状态跟踪

  3. 规则优化:将常用规则放在前面提高效率

  4. 日志记录:对拒绝的流量添加日志以便排查

  5. 定期备份:保存规则配置防止意外丢失

通过合理组合四张表的功能,iptables 能够实现从基础包过滤到复杂网络地址转换的全方位网络控制。