4.1 表的深入理解

表的处理优先级

当数据包通过 iptables 时,会按照以下顺序经过各个表:

数据包流向:raw → mangle → nat → filter

优先级详解

  1. raw 表:最高优先级,主要用于配置数据包是否被连接跟踪系统处理
  2. mangle 表:第二优先级,用于修改数据包的服务类型、生存时间等
  3. nat 表:第三优先级,用于网络地址转换
  4. filter 表:最低优先级,用于包过滤决策

表与链的关系矩阵

表/链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw
mangle
nat
filter

4.2 filter 表详解

filter 表的特点

  • 默认表:不指定 -t 参数时使用的表
  • 主要功能:包过滤,决定数据包的通过与否
  • 包含链:INPUT、FORWARD、OUTPUT

INPUT 链详细配置

基本配置示例

# 查看 INPUT 链当前规则
iptables -L INPUT -n -v --line-numbers

# 设置默认策略为拒绝
iptables -P INPUT DROP

# 允许本地回环通信
iptables -A INPUT -i lo -j ACCEPT

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

服务端口管理

# SSH 服务(端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP 服务(端口 80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS 服务(端口 443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 多端口同时配置
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

源地址控制

# 允许特定网段访问
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

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

# 允许多个网段
iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.50 -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 DROP

# 限制并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP

# 时间限制访问
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

FORWARD 链详细配置

路由器/网关配置

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

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

# 允许已建立的连接转发
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

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

# 允许特定服务转发
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

内网访问控制

# 阻止内网互访
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.1.0/24 -j DROP

# 允许特定网段互访
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT

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

OUTPUT 链详细配置

出站流量控制

# 设置默认策略(通常为 ACCEPT)
iptables -P OUTPUT ACCEPT

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

# 限制出站端口
iptables -A OUTPUT -p tcp --dport 25 -j DROP  # 阻止 SMTP
iptables -A OUTPUT -p tcp --dport 6667 -j DROP # 阻止 IRC

应用程序控制

# 允许特定用户访问网络
iptables -A OUTPUT -m owner --uid-owner 1000 -j ACCEPT

# 阻止特定用户访问网络
iptables -A OUTPUT -m owner --uid-owner 1001 -j DROP

# 限制特定进程
iptables -A OUTPUT -m owner --cmd-owner firefox -p tcp --dport 80 -j ACCEPT

4.3 nat 表详解

nat 表的特点

  • 主要功能:网络地址转换
  • 包含链:PREROUTING、OUTPUT、POSTROUTING
  • 应用场景:网络共享、服务器负载均衡、端口转发

PREROUTING 链配置

DNAT(目标地址转换)

# 基本 DNAT 配置
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

# 端口映射
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80

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

端口重定向

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

# 透明代理配置
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

条件 DNAT

# 基于源地址的 DNAT
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11

# 基于时间的 DNAT
iptables -t nat -A PREROUTING -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 -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(源地址转换)

# 基本 SNAT 配置
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# 多个外网 IP 负载均衡
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.10

# 基于端口的 SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp -o eth0 -j SNAT --to-source 203.0.113.1:1024-65535

MASQUERADE(地址伪装)

# 动态 IP 的网络共享
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# 多网卡环境
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth1 -j MASQUERADE

OUTPUT 链配置

本机发出数据包的 NAT

# 本机访问时的地址转换
iptables -t nat -A OUTPUT -d 192.168.1.10 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080

# 本机出站地址转换
iptables -t nat -A OUTPUT -p tcp --dport 25 -j SNAT --to-source 203.0.113.1

完整的 NAT 网关配置示例

#!/bin/bash
# NAT 网关配置脚本

# 清空现有规则
iptables -t nat -F
iptables -t filter -F

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 配置 MASQUERADE(适用于动态 IP)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 配置端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.20:22

# 配置 filter 表规则
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -j DROP

# 保存配置
iptables-save > /etc/sysconfig/iptables

4.4 mangle 表详解

mangle 表的特点

  • 主要功能:修改数据包头部信息
  • 包含链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING(所有链)
  • 应用场景:QoS、流量整形、数据包标记

数据包标记

# 标记来自特定网段的数据包
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -j MARK --set-mark 2

# 基于端口标记
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 11

# 标记特定应用的流量
iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 100

TOS(服务类型)修改

# 设置高优先级(最小延迟)
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j TOS --set-tos 0x10

# 设置最大吞吐量
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j TOS --set-tos 0x08

# 设置最高可靠性
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j TOS --set-tos 0x04

TTL(生存时间)修改

# 设置固定 TTL
iptables -t mangle -A OUTPUT -j TTL --ttl-set 64

# 增加 TTL
iptables -t mangle -A FORWARD -j TTL --ttl-inc 1

# 减少 TTL
iptables -t mangle -A FORWARD -j TTL --ttl-dec 1

DSCP(差分服务代码点)标记

# 设置 DSCP 值
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46  # EF (Expedited Forwarding)
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j DSCP --set-dscp 34  # AF41
iptables -t mangle -A OUTPUT -p udp --dport 53 -j DSCP --set-dscp 46  # DNS 查询

配合 tc 进行流量控制

# 使用 mangle 表标记,配合 tc 进行流量控制

# 1. 标记不同类型的流量
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -p tcp --dport 443 -j MARK --set-mark 2
iptables -t mangle -A POSTROUTING -p tcp --dport 22 -j MARK --set-mark 3

# 2. 使用 tc 配置队列规则
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 80mbit  # HTTP
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 50mbit  # HTTPS
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 30mbit  # SSH

# 3. 配置过滤器
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw classid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw classid 1:20
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw classid 1:30

4.5 raw 表详解

raw 表的特点

  • 主要功能:配置数据包是否被连接跟踪
  • 包含链:PREROUTING、OUTPUT
  • 应用场景:性能优化、跳过连接跟踪

NOTRACK 目标

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

# 跳过 DNS 查询的连接跟踪
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 53 -j NOTRACK

# 跳过本地回环的连接跟踪
iptables -t raw -A PREROUTING -i lo -j NOTRACK
iptables -t raw -A OUTPUT -o lo -j NOTRACK

性能优化示例

#!/bin/bash
# 高性能 Web 服务器配置

# 跳过静态内容的连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -m string --string "GET /static/" --algo bm -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -m string --string "HTTP/1.1 200 OK" --algo bm -j NOTRACK

# 跳过图片文件的连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -m string --string ".jpg" --algo bm -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --dport 80 -m string --string ".png" --algo bm -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --dport 80 -m string --string ".gif" --algo bm -j NOTRACK

4.6 链的优先级和数据包流向

完整的数据包流向图

                    PREROUTING
                        |
                   路由判断
                   /        \
                  /          \
            本机目标          转发目标
               |                |
            INPUT           FORWARD
               |                |
           本地进程         POSTROUTING
               |                |
            OUTPUT              |
               |                |
           路由判断              |
               |                |
          POSTROUTING           |
               |                |
               +----------------+
                        |
                    网络接口

详细的表处理顺序

进入本机的数据包

网络 → PREROUTING(raw) → PREROUTING(mangle) → PREROUTING(nat) → 路由判断 → INPUT(mangle) → INPUT(filter) → 本地进程

本机发出的数据包

本地进程 → OUTPUT(raw) → OUTPUT(mangle) → OUTPUT(nat) → OUTPUT(filter) → 路由判断 → POSTROUTING(mangle) → POSTROUTING(nat) → 网络

转发的数据包

网络 → PREROUTING(raw) → PREROUTING(mangle) → PREROUTING(nat) → 路由判断 → FORWARD(mangle) → FORWARD(filter) → POSTROUTING(mangle) → POSTROUTING(nat) → 网络

4.7 实际应用场景

场景1:企业网关配置

#!/bin/bash
# 企业网关防火墙配置

# 清空现有规则
iptables -F
iptables -t nat -F
iptables -t mangle -F

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

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# === INPUT 链配置 ===
# 允许本地回环
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
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT

# 允许 DNS 和 DHCP
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 67 -j ACCEPT

# === FORWARD 链配置 ===
# 允许已建立的连接
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

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

# 限制 P2P 流量
iptables -A FORWARD -p tcp --dport 6881:6999 -j DROP
iptables -A FORWARD -p udp --dport 6881:6999 -j DROP

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

# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10

# === QoS 配置 ===
# 标记不同类型的流量
iptables -t mangle -A FORWARD -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark 3

场景2:Web 服务器配置

#!/bin/bash
# Web 服务器防火墙配置

# 清空现有规则
iptables -F

# 设置默认策略
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

# === 管理访问 ===
# SSH 访问(限制源地址)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# === Web 服务 ===
# HTTP 和 HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# === 安全防护 ===
# 防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 防止端口扫描
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A INPUT -m recent --name portscan --set -j LOG --log-prefix "[PORT-SCAN]: "
iptables -A INPUT -m recent --name portscan --set -j DROP

# 限制连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j DROP

# === 日志记录 ===
# 记录被拒绝的连接
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "[IPTABLES-DENIED]: "
iptables -A INPUT -j DROP

场景3:数据库服务器配置

#!/bin/bash
# 数据库服务器防火墙配置

# 清空现有规则
iptables -F

# 设置默认策略
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

# === 管理访问 ===
# SSH(仅允许管理网段)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# === 数据库访问 ===
# MySQL(仅允许应用服务器)
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.11 -j ACCEPT

# PostgreSQL(仅允许应用服务器)
iptables -A INPUT -p tcp --dport 5432 -s 192.168.1.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 5432 -s 192.168.1.11 -j ACCEPT

# === 监控访问 ===
# 允许监控系统访问
iptables -A INPUT -p tcp --dport 9100 -s 192.168.1.100 -j ACCEPT  # Node Exporter

# === 安全防护 ===
# 严格的连接限制
iptables -A INPUT -p tcp --dport 3306 -m connlimit --connlimit-above 10 -j DROP
iptables -A INPUT -p tcp --dport 5432 -m connlimit --connlimit-above 10 -j DROP

# 防止暴力破解
iptables -A INPUT -p tcp --dport 3306 -m recent --name MYSQL --set
iptables -A INPUT -p tcp --dport 3306 -m recent --name MYSQL --rcheck --seconds 300 --hitcount 5 -j DROP

# 记录所有被拒绝的数据库连接尝试
iptables -A INPUT -p tcp --dport 3306 -j LOG --log-prefix "[MYSQL-DENIED]: "
iptables -A INPUT -p tcp --dport 5432 -j LOG --log-prefix "[PGSQL-DENIED]: "
iptables -A INPUT -j DROP

4.8 性能优化技巧

规则优化原则

  1. 最常用规则放在前面
  2. 使用 NOTRACK 跳过不必要的连接跟踪
  3. 合并相似规则
  4. 避免复杂的字符串匹配

连接跟踪优化

# 增加连接跟踪表大小
echo 'net.netfilter.nf_conntrack_max = 1048576' >> /etc/sysctl.conf

# 减少连接跟踪超时时间
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 3600' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30' >> /etc/sysctl.conf

# 应用配置
sysctl -p

规则计数器监控

# 查看规则匹配统计
iptables -L -n -v

# 重置计数器
iptables -Z

# 监控脚本
#!/bin/bash
while true; do
    echo "=== $(date) ==="
    iptables -L INPUT -n -v | head -10
    sleep 60
done

本章小结

本章深入介绍了 iptables 的表和链:

  1. 表的详解:filter、nat、mangle、raw 四个表的具体用法
  2. 链的配置:每个链的详细配置方法和应用场景
  3. 数据包流向:完整的数据包处理流程
  4. 实际应用:企业网关、Web 服务器、数据库服务器的配置示例
  5. 性能优化:提高 iptables 性能的技巧和方法

本章练习

  1. 基础练习

    • 配置一个完整的 NAT 网关
    • 实现端口转发功能
    • 使用 mangle 表进行流量标记
  2. 进阶练习

    • 配置负载均衡规则
    • 实现基于时间的访问控制
    • 使用 raw 表优化性能
  3. 实战练习

    • 为 Web 服务器配置完整的防火墙
    • 实现企业级网关功能
    • 配置数据库服务器的安全访问
  4. 性能测试

    • 测试不同规则配置的性能影响
    • 优化高并发场景下的规则
    • 监控规则匹配统计

下一章我们将学习基础规则的编写方法和技巧。