强曰为道

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

第 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 iptablesfilter 表的完整文档
Red Hat Security Guide企业级防火墙配置指南
CIS Benchmarks安全基线标准

本章小结

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

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