引言:你的服务器真的“安全”吗?iptables 是最后一道防线

在日益复杂的网络环境中,防火墙是系统安全的第一道也是最后一道防线。而 iptables,作为 Linux 内核 Netfilter 框架的核心组件,正是这道防线的“指挥官”。

它不仅能精确控制进出流量,还能实现网络地址转换(NAT),构建企业级网络型防火墙。然而,许多运维人员仍停留在“临时封 IP”的初级阶段,对 iptables 的强大功能知之甚少。

本文将带你深入 iptables 的底层机制,全面解析:

  • 🔍 Filter 表与链式规则处理
  • 🧩 扩展匹配模块(state, multiport, string 等)
  • 🛡️ 构建企业级网络型防火墙
  • 🔄 NAT 原理与 SNAT 实战配置

无论你是系统管理员、网络安全工程师,还是正在备考 RHCE/LPIC 的技术人,本文都将成为你掌握 iptables 的终极指南。


一、iptables 核心架构:Netfilter 与四表五链

1.1 Netfilter:内核级数据包处理引擎

iptables 并非独立进程,而是用户空间工具,用于与内核中的 Netfilter 框架交互。Netfilter 在数据包流经网络协议栈的关键节点插入“钩子”(Hooks),实现拦截、修改、丢弃等操作。

数据包流转路径
本地交付
转发
外部网络
PREROUTING Hook
NAT 表: DNAT
路由决策
INPUT Hook
Filter 表: INPUT
本地进程
FORWARD Hook
Filter 表: FORWARD
POSTROUTING Hook
NAT 表: SNAT
外部网络

五链(Chains)

  • PREROUTING:进入本机前(可用于 DNAT)
  • INPUT:进入本机(目标为本机的服务)
  • FORWARD:经过本机转发(网关/路由器场景)
  • OUTPUT:本机发出的数据包
  • POSTROUTING:离开本机前(可用于 SNAT)

1.2 四大规则表(Tables)

表名 功能 典型用途
filter 数据包过滤 开放/封锁端口、IP
nat 网络地址转换 SNAT、DNAT、端口映射
mangle 修改数据包头部 QoS、TTL 调整
raw 跳过连接追踪 提高性能

本文重点filter 表与 nat 表。
阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c


二、Filter 表:构建坚不可摧的安全屏障

2.1 基础语法与规则管理

# 语法结构
iptables -[A|I|D|L] chain -j target [match...]

# 常用命令
iptables -L                              # 列出所有规则
iptables -F                              # 清空规则(慎用!)
iptables -P INPUT DROP                   # 默认策略设为 DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # 允许 SSH

2.2 三类核心动作(Targets)

动作 说明
ACCEPT 放行数据包
DROP 静默丢弃(不回复)
REJECT 拒绝并返回错误(如 ICMP-port-unreachable)

安全建议:生产环境推荐使用 DROP,避免泄露端口信息。


2.3 实战:最小化安全策略模板

#!/bin/bash
# secure-firewall.sh

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

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

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

# 4. 开放必要端口
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

# 5. 防止 Ping Flood(可选)
# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

echo "防火墙策略已应用"

🔐 执行后验证

iptables -L -n -v

阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c

三、扩展匹配模块:iptables 的“超能力”

基础匹配(如 -p, --dport)只能满足简单需求。真正的灵活性来自扩展匹配模块

3.1 state 模块:基于连接状态过滤

# 允许已建立或相关的连接(关键!)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

为什么重要?否则即使开放了 80 端口,客户端也无法收到响应(返回包被 DROP)。


3.2 multiport 模块:批量端口匹配

# 同时开放多个端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT

# 或指定源端口范围
iptables -A OUTPUT -p udp -m multiport --sports 1024:65535 -j ACCEPT

3.3 iprange 模块:IP 范围匹配

# 允许特定 IP 段访问 SSH
iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

3.4 string 模块:内容关键字匹配

# 阻止包含恶意关键词的请求(如 SQL 注入特征)
iptables -A INPUT -p tcp --dport 80 -m string --string "union select" --algo bm -j DROP

⚠️ 注意:性能开销较大,仅用于关键防护。


3.5 time 模块:基于时间的访问控制

# 仅允许工作时间访问管理后台
iptables -A INPUT -p tcp --dport 8080 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

3.6 扩展匹配模块对比表

模块 匹配条件 典型场景
state 连接状态 放行已建立连接
multiport 多个端口 批量开放服务
iprange IP 范围 内网段访问控制
string 数据包内容 防御应用层攻击
time 时间窗口 定时访问策略
mac MAC 地址 物理层准入控制

四、构建网络型防火墙:iptables 的高级应用场景

4.1 什么是网络型防火墙?

不同于主机防火墙(保护本机),网络型防火墙部署在网络边界(如网关),负责转发并过滤整个子网的流量

典型角色:Linux 路由器 / NAT 网关

架构图
Internal Network
PC-01
PC-02
Internal Server
Internet
Linux Firewall

4.2 关键配置:启用 IP 转发

# 1. 开启内核转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

# 2. 验证
cat /proc/sys/net/ipv4/ip_forward  # 应输出 1

4.3 Filter 表在 FORWARD 链的应用

# 允许内网访问外网 HTTP/HTTPS
iptables -A FORWARD -i eth1 -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT

# 允许 DNS 查询
iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 53 -j ACCEPT

# 反向:允许响应包返回
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# 阻止 P2P 流量(基于端口)
iptables -A FORWARD -p tcp -m multiport --dports 6881:6999 -j DROP

eth0:外网接口(如公网 IP)
eth1:内网接口(如 192.168.1.0/24)
阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c


五、NAT 原理深度解析:解决 IPv4 地址枯竭的基石

5.1 什么是 NAT?

网络地址转换(Network Address Translation)允许多个设备共享一个公网 IP 访问互联网,是家庭路由器和企业网关的核心功能。

NAT 类型对比
类型 英文 功能
SNAT Source NAT 修改源 IP(出站)
DNAT Destination NAT 修改目标 IP(入站)
MASQUERADE 伪装 动态 SNAT(适合拨号上网)
REDIRECT 重定向 将流量导向本地端口

5.2 SNAT 工作原理

当内网主机访问外网时,防火墙将数据包的源 IP 从私有地址(如 192.168.1.100)替换为公网 IP

PC Firewall WebServer Src=192.168.1.100:1234 Dst=8.8.8.8:80 Src=203.0.113.10:5000 Dst=8.8.8.8:80 Resp to 203.0.113.10:5000 Resp to 192.168.1.100:1234 PC Firewall WebServer

连接追踪:iptables 使用 conntrack 模块维护 NAT 映射表。


六、实战:配置 SNAT 实现共享上网

6.1 环境准备

设备 接口 IP 地址 作用
Linux 防火墙 eth0 203.0.113.10 (公网) 外网出口
eth1 192.168.1.1 (内网) 内网网关
内网 PC - 192.168.1.100 客户端

6.2 配置步骤

# 1. 确保 IP 转发已开启(见 4.2)
# 2. 添加 SNAT 规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10

# 解释:
# -t nat         : 操作 nat 表
# -A POSTROUTING : 在 POSTROUTING 链添加规则
# -s 192.168.1.0/24 : 匹配内网网段
# -o eth0        : 从 eth0 发出
# -j SNAT        : 执行 SNAT 动作
# --to-source    : 替换为指定公网 IP

6.3 使用 MASQUERADE(动态 SNAT)

如果公网 IP 是动态获取(如 PPPoE),应使用 MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

优势:自动获取出口接口的当前 IP,无需硬编码。


6.4 验证 SNAT 是否生效

# 1. 在内网 PC 上访问公网
curl ifconfig.me

# 2. 在防火墙上查看 NAT 表
iptables -t nat -L -n -v
# 输出应包含:
# pkts bytes target     prot opt in     out     source               destination
#    5   300 SNAT       all  --  *      eth0    192.168.1.0/24       0.0.0.0/0           to:203.0.113.10

# 3. 查看连接追踪
conntrack -L | grep 192.168.1.100
# 输出示例:
# ipv4     2 tcp      6 431992 ESTABLISHED src=192.168.1.100 dst=8.8.8.8 ...
#                               [ASSURED] mark=0 use=1

阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c


七、综合案例:企业级边界防火墙配置

7.1 需求分析

  • 内网网段:192.168.10.0/24
  • 公网接口:eth0
  • 内网接口:eth1
  • 开放服务:Web(80/443)、SSH(22)
  • 禁止外网直接访问内网
  • 允许内网共享上网

7.2 完整脚本

#!/bin/bash
# enterprise-firewall.sh

WAN_IF="eth0"
LAN_IF="eth1"
WAN_IP="203.0.113.20"
LAN_NET="192.168.10.0/24"

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

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

# 3. 允许回环
iptables -A INPUT -i lo -j ACCEPT

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

# 5. 开放本机服务
iptables -A INPUT -i $WAN_IF -p tcp --dport 22 -j ACCEPT   # SSH
iptables -A INPUT -i $WAN_IF -p tcp --dport 80 -j ACCEPT   # Web
iptables -A INPUT -i $WAN_IF -p tcp --dport 443 -j ACCEPT  # HTTPS

# 6. 允许内网访问外网(SNAT + FORWARD)
iptables -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source $WAN_IP
iptables -A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT

# 7. 可选:限制内网某些行为
# iptables -A FORWARD -i $LAN_IF -p tcp --dport 80 -m time --timestart 18:00 --timestop 22:00 -j DROP

echo "企业级防火墙策略已部署"

八、高级技巧与最佳实践

8.1 规则持久化

# CentOS/RHEL
service iptables save
# 或
iptables-save > /etc/iptables/rules.v4

# Ubuntu/Debian
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4

8.2 使用自定义链(Custom Chains)

# 创建自定义链
iptables -N LOGGING

# 将匹配的包跳转到 LOGGING 链
iptables -A INPUT -p tcp --dport 22 -j LOGGING

# 在 LOGGING 链中记录并放行
iptables -A LOGGING -j LOG --log-prefix "SSH_ATTEMPT: "
iptables -A LOGGING -j ACCEPT

优势:日志集中管理,便于审计。
阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c

8.3 性能优化建议

  • ❌ 避免在高流量链上使用 string 匹配
  • ✅ 将最常匹配的规则放在前面
  • ✅ 使用 ipset 管理大量 IP 列表
# 使用 ipset 提升性能
ipset create blocked hash:net
ipset add blocked 1.2.3.0/24
iptables -A INPUT -m set --match-set blocked src -j DROP

结语:iptables 不是古董,而是永恒的基石

尽管 nftables 正在逐步取代 iptables,但在绝大多数生产环境中,iptables 依然是稳定、可靠、功能完备的选择。

通过本文,你已掌握:

  • Filter 表:构建主机与网络防火墙
  • 扩展匹配:实现精细化流量控制
  • SNAT/NAT:搭建企业级网关

记住,安全不是功能,而是持续的过程。定期审查规则、监控日志、更新策略,才能真正守住你的数字疆域。

📚 延伸阅读

  • 《Linux Firewalls》 by Michael Rash
  • Netfilter 官方文档:https://www.netfilter.org
  • iptables man page (man iptables)

阿里云38元每年起:https://www.aliyun.com/minisite/goods?userCode=ifzmrq1c

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐