第 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 表详解,将学习网络地址转换的所有用法。