强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

iptables 完全指南 / 第 04 章:filter 表详解

第 04 章:filter 表详解

本章目标:掌握 filter 表的三大链(INPUT、OUTPUT、FORWARD)的使用场景、默认策略配置,以及在不同服务器角色下的规则编写模式。


4.1 filter 表概述

filter 表是 iptables 的默认表,也是最常用的表。它的核心功能是包过滤——决定数据包是否被放行。

特性 说明
默认表 不指定 -t 时操作的就是 filter 表
支持的链 INPUT、OUTPUT、FORWARD
核心功能 允许(ACCEPT)或拒绝(DROP/REJECT)数据包
典型用途 服务器访问控制、网络隔离、安全加固
filter 表在数据包处理中的位置:

入站 → PREROUTING → 路由决策 → [INPUT: filter] → 本机进程
                                    ↑
                              在这里做包过滤

转发 → PREROUTING → 路由决策 → [FORWARD: filter] → POSTROUTING → 出站
                                    ↑
                              在这里做转发过滤

本机 → OUTPUT: [filter] → 路由决策 → POSTROUTING → 出站
                  ↑
            在这里做出口过滤

4.2 INPUT 链

INPUT 链处理目的地址是本机的数据包。这是服务器防火墙中最核心的链。

4.2.1 INPUT 链的典型规则

# ═══════════════════════════════════════════════
# INPUT 链规则模板
# ═══════════════════════════════════════════════

# 1. 允许已建立和相关的连接(最高优先级)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 允许回环接口的通信
iptables -A INPUT -i lo -j ACCEPT

# 3. 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 允许 HTTP/HTTPS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 5. 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 6. 默认策略:拒绝所有其他入站流量
iptables -P INPUT DROP

4.2.2 INPUT 链的规则顺序优化

高频命中规则应该放在前面,减少遍历次数:

┌────────────────────────────────────────────────┐
│ 规则 1:ESTABLISHED,RELATED → ACCEPT     ← 90%+ 命中率
├────────────────────────────────────────────────┤
│ 规则 2:回环接口 → ACCEPT                ← 高频
├────────────────────────────────────────────────┤
│ 规则 3:SSH (22) → ACCEPT                ← 中频
├────────────────────────────────────────────────┤
│ 规则 4:HTTP/HTTPS (80,443) → ACCEPT     ← 中频
├────────────────────────────────────────────────┤
│ 规则 5:ICMP → ACCEPT                    ← 低频
├────────────────────────────────────────────────┤
│ 规则 6:DNS 响应 → ACCEPT                ← 低频
├────────────────────────────────────────────────┤
│ 规则 7:日志未匹配的包                    ← 仅未匹配时
├────────────────────────────────────────────────┤
│ 默认策略:DROP                           ← 兜底
└────────────────────────────────────────────────┘

4.2.3 限制 SSH 来源

# 只允许特定 IP 访问 SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

# 只允许特定网段访问 SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# 允许多个 IP 访问 SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.50 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP  # 拒绝其他

4.2.4 允许特定服务

# 允许 DNS 查询响应(UDP 53)
iptables -A INPUT -p udp --sport 53 -j ACCEPT

# 允许 NTP 时间同步(UDP 123)
iptables -A INPUT -p udp --sport 123 -j ACCEPT

# 允许 SMTP 收件(TCP 25)
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# 允许 MySQL 远程访问(仅限应用服务器)
iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT

4.3 OUTPUT 链

OUTPUT 链处理本机进程发出的数据包。默认情况下,大多数服务器的 OUTPUT 链策略是 ACCEPT。

4.3.1 何时需要控制 OUTPUT 链

场景 说明
高安全环境 限制服务器只能访问特定外部服务
合规要求 PCI-DSS 等标准要求控制出口流量
防止数据泄露 限制只有特定进程可以对外通信
容器环境 限制容器的出口访问

4.3.2 OUTPUT 链规则示例

# ═══════════════════════════════════════════════
# OUTPUT 链规则模板(严格模式)
# ═══════════════════════════════════════════════

# 1. 允许已建立的连接
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 允许回环接口
iptables -A OUTPUT -o lo -j ACCEPT

# 3. 允许 DNS 查询(TCP/UDP 53)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

# 4. 允许 HTTP/HTTPS 出站(用于系统更新)
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 5. 允许 NTP 时间同步
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

# 6. 允许 SMTP 发送邮件
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT

# 7. 允许 ICMP 出站
iptables -A OUTPUT -p icmp -j ACCEPT

# 8. 允许 SSH 出站(用于跳转管理)
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

# 9. 默认策略:拒绝其他出口流量
iptables -P OUTPUT DROP

4.3.3 按用户限制出口流量

# 只允许 root 用户的网络访问
iptables -A OUTPUT -m owner --uid-owner 0 -j ACCEPT

# 只允许特定用户的网络访问
iptables -A OUTPUT -m owner --uid-owner www-data -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner mysql -j ACCEPT

# 拒绝其他用户的网络访问
iptables -A OUTPUT -j DROP

4.4 FORWARD 链

FORWARD 链处理经过本机转发的数据包。当 Linux 主机充当路由器或网关时,需要配置此链。

4.4.1 启用 IP 转发

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

# 永久启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 验证
sysctl net.ipv4.ip_forward
# net.ipv4.ip_forward = 1

4.4.2 FORWARD 链规则示例

# ═══════════════════════════════════════════════
# FORWARD 链规则模板(网关服务器)
# ═══════════════════════════════════════════════

# 1. 允许已建立的连接
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 允许内网访问外网
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# 3. 允许 DMZ 的 Web 服务器对外提供服务
iptables -A FORWARD -i eth0 -o eth2 -p tcp --dport 80 -d 172.16.0.10 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -p tcp --dport 443 -d 172.16.0.10 -j ACCEPT

# 4. 拒绝外网主动访问内网
iptables -A FORWARD -i eth0 -o eth1 -j DROP

# 5. 默认策略:拒绝转发
iptables -P FORWARD DROP

4.4.3 三网口网关示例

               ┌──────────────────────────────────────┐
               │          Linux 网关服务器               │
               │                                       │
  Internet ────┤ eth0 (公网)                           │
               │        │                              │
               │    ┌───┴───┐                          │
               │    │路由决策 │                          │
               │    └───┬───┘                          │
               │        │                              │
               │   ┌────┼────────────┐                 │
               │   │    │            │                 │
               │   ▼    ▼            ▼                 │
               │  eth1(内网)      eth2(DMZ)            │
               │  10.0.0.1        172.16.0.1           │
               └───┬────────────────┬──────────────────┘
                   │                │
            ┌──────┴──────┐   ┌────┴───────┐
            │  内网主机     │   │ Web服务器   │
            │ 10.0.0.0/24 │   │172.16.0.10 │
            └─────────────┘   └────────────┘
# 网关 FORWARD 规则
# 允许内网访问外网
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT

# 允许外网访问 DMZ 的 Web 服务
iptables -A FORWARD -i eth0 -o eth2 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -p tcp --dport 443 -j ACCEPT

# 允许 DMZ 访问内网数据库(仅 MySQL 端口)
iptables -A FORWARD -i eth2 -o eth1 -p tcp --dport 3306 -d 10.0.0.200 -j ACCEPT

# 拒绝 DMZ 主动访问内网(除了上面允许的数据库)
iptables -A FORWARD -i eth2 -o eth1 -j DROP

# 拒绝外网主动访问内网
iptables -A FORWARD -i eth0 -o eth1 -j DROP

# 默认策略
iptables -P FORWARD DROP

4.5 默认策略配置

4.5.1 三种常见策略模式

模式一:全部开放(默认)

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

适用场景:开发环境、测试环境

模式二:入站限制

iptables -P INPUT DROP         # 入站默认拒绝
iptables -P FORWARD DROP       # 转发默认拒绝
iptables -P OUTPUT ACCEPT      # 出站默认允许

适用场景:大多数生产服务器

模式三:全面限制

iptables -P INPUT DROP         # 入站默认拒绝
iptables -P FORWARD DROP       # 转发默认拒绝
iptables -P OUTPUT DROP        # 出站默认拒绝

适用场景:高安全环境、金融系统、军工系统

4.5.2 策略选择决策树

                    ┌──────────────────┐
                    │ 服务器角色?       │
                    └────────┬─────────┘
                       ┌─────┼──────┐
                       ▼     ▼      ▼
                    Web服务器 数据库  网关/路由器
                       │     服务器     │
                       ▼     ▼      ▼
                    ┌────────┐  ┌────────┐
                    │入站限制 │  │入站限制 │
                    │出站开放 │  │转发限制 │
                    └────────┘  └────────┘
                    │               │
                    ▼               ▼
                INPUT: DROP     INPUT: DROP
                OUTPUT: ACCEPT  FORWARD: DROP
                                OUTPUT: ACCEPT

4.6 实战:不同角色的 filter 规则

4.6.1 Web 服务器

#!/bin/bash
# Web 服务器防火墙规则

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 回环接口
iptables -A INPUT -i lo -j ACCEPT

# SSH(限管理网段)
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT

# HTTP/HTTPS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 日志未匹配包
iptables -A INPUT -j LOG --log-prefix "WEB-DROP: "
iptables -A INPUT -j DROP

4.6.2 数据库服务器

#!/bin/bash
# MySQL 数据库服务器防火墙规则

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 回环接口
iptables -A INPUT -i lo -j ACCEPT

# SSH(限管理网段)
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT

# MySQL(仅限应用服务器网段)
iptables -A INPUT -p tcp --dport 3306 -s 10.0.1.0/24 -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 默认拒绝
iptables -A INPUT -j DROP

4.6.3 跳板机 / 堡垒机

#!/bin/bash
# 跳板机防火墙规则

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 回环接口
iptables -A INPUT -i lo -j ACCEPT

# SSH(仅限运维人员 IP)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.101 -j ACCEPT

# 记录所有其他连接尝试
iptables -A INPUT -j LOG --log-prefix "BASTION-DROP: "

# 默认拒绝
iptables -A INPUT -j DROP

4.7 规则监控与调试

4.7.1 查看规则命中计数

# 查看规则及计数器
iptables -L INPUT -n -v

# 输出示例:
# Chain INPUT (policy DROP 42 packets, 3360 bytes)
#  pkts bytes target  prot opt in  out  source       destination
#  1523  115K ACCEPT  all  --  *   *    0.0.0.0/0    0.0.0.0/0    ctstate RELATED,ESTABLISHED
#   156 12096 ACCEPT  tcp  --  *   *    10.0.0.0/8   0.0.0.0/0    tcp dpt:22
#  8920  536K ACCEPT  tcp  --  *   *    0.0.0.0/0    0.0.0.0/0    tcp dpt:80
#    42  3360 LOG     all  --  *   *    0.0.0.0/0    0.0.0.0/0    LOG flags 0 level 4 prefix "INPUT-DROP: "

解读pkts 列显示每条规则匹配的数据包数量。policy DROP 42 packets 表示有 42 个包命中了默认策略(即没有任何规则匹配它们)。

4.7.2 清零计数器后观察

# 清零所有计数器
iptables -Z INPUT

# 等待一段时间后再查看
sleep 60
iptables -L INPUT -n -v

4.8 注意事项

⚠️ FORWARD 链默认关闭:默认情况下 Linux 不转发数据包。如果启用转发但不配置 FORWARD 规则,等于完全开放转发。

OUTPUT 链不可忽视:在高安全环境中,必须限制 OUTPUT 链,否则攻击者可以通过反向 shell 绕过 INPUT 限制。

⚠️ 不要忘记回环接口:很多服务(如 MySQL 本地连接)依赖 lo 接口,如果忘记了 iptables -A INPUT -i lo -j ACCEPT,本地服务通信会中断。


4.9 扩展阅读

资源 说明
man iptables filter 表的完整文档
Red Hat Security Guide 企业级防火墙配置指南
CIS Benchmarks 安全基线标准

本章小结

用途 典型策略
INPUT 控制入站到本机的流量 限制来源、开放服务端口
OUTPUT 控制本机发出的流量 默认 ACCEPT 或严格限制
FORWARD 控制经过本机转发的流量 网关场景使用,默认 DROP

下一章第 05 章:NAT 表详解,将学习网络地址转换的所有用法。