iptables防火墙完全手册|Linux内核防火墙iptables从原理到应用的全方位解析

iptables防火墙完全手册|Linux内核防火墙iptables从原理到应用的全方位解析

iptablesLinux 系统基于 netfilter 内核框架开发的经典防火墙工具,专注于 IPv4 数据包过滤与 NAT 规则配置。作为 Linux 内核内置组件,它具备高效、灵活的特点,支持状态检测、精细化流量控制等核心能力,是服务器运维网络安全管控中最常用的底层防火墙解决方案,适用于从个人主机到企业级服务器的各类场景。

一、iptables 核心简介

iptables 是 Linux 系统中基于 netfilter 框架的防火墙管理工具,核心用于配置 IPv4 数据包过滤规则和网络地址转换(NAT)规则,是 Linux 生态中最主流、最基础的防火墙解决方案。

主要特点

  • 基于包过滤机制,直接作用于内核网络栈,处理效率高
  • 支持连接状态检测(如 ESTABLISHED、NEW 状态),规则匹配更智能
  • 完整支持 NAT 功能(SNAT/DNAT/MASQUERADE),适配局域网共享上网、端口转发等场景
  • 规则配置灵活,可按 IP、端口、协议、网卡等多维度精细控制流量
  • 与 Linux 内核深度集成,无需额外依赖,兼容性强

二、iptables 核心概念

1. 表(Table)

iptables 通过不同 “表” 划分功能模块,每个表对应特定的网络处理任务,包含预设的 “链”:
表名
核心功能
常用链
filter
默认表,负责数据包过滤
INPUT(入站)、OUTPUT(出站)、FORWARD(转发)
nat
网络地址转换(地址映射
PREROUTING(路由前)、POSTROUTING(路由后)、INPUT、OUTPUT
mangle
数据包修改(TOS/TTL/ 标记)
所有链(INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING)
raw
豁免连接跟踪(提升性能)
PREROUTING、OUTPUT

2. 链(Chain)

链是数据包在系统中的必经路径,决定了数据包的处理流程:
  • INPUT:处理目标地址为本机的入站数据包
  • OUTPUT:处理本机主动发起的出站数据包
  • FORWARD:处理经过本机转发的数据包(如路由器场景)
  • PREROUTING:路由决策前处理数据包(主要用于 DNAT 端口转发)
  • POSTROUTING:路由决策后处理数据包(主要用于 SNAT 地址转换)

3. 目标(Target)

当数据包匹配规则时执行的操作(核心动作):
  • ACCEPT:允许数据包通过,继续后续流程
  • DROP:直接丢弃数据包,不返回任何响应(隐蔽性强)
  • REJECT:拒绝数据包,返回拒绝响应(如 ICMP 不可达)
  • LOG:记录数据包信息到系统日志(便于审计)
  • SNAT:源地址转换(如局域网共享公网 IP 上网)
  • DNAT:目标地址转换(如公网端口转发到内网服务器)
  • MASQUERADE:动态 SNAT(适用于公网 IP 不固定的场景,如拨号上网)

三、iptables 基本命令

1. 查看规则

# 查看 filter 表所有规则(默认表),-n 数字显示IP/端口,-v 显示详细信息
iptables -L -n -v
# 查看指定表(如 nat 表)的所有规则
iptables -t nat -L -n -v
# 查看规则及编号(便于删除/修改)
iptables -L -n --line-numbers
# 查看特定链(如 INPUT 链)的规则
iptables -L INPUT -n -v

2. 清除规则

# 清除所有表的所有规则(谨慎使用!)
iptables -F
# 清除指定表(如 nat 表)的规则
iptables -t nat -F
# 重置所有规则的匹配计数器(数据包数/字节数)
iptables -Z
# 按编号删除指定链的规则(如删除 INPUT 链第1条规则)
iptables -D INPUT 1
# 清空所有自定义链及规则
iptables -X

3. 设置默认策略

默认策略是当数据包不匹配任何规则时执行的动作,建议遵循 “最小权限” 原则:
# 设置 INPUT/FORWARD 链默认拒绝,OUTPUT 链默认允许(常用安全配置)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

四、常用规则实战示例

1. 基础安全规则(通用服务器配置)

# 1. 先设置默认策略(拒绝入站/转发,允许出站)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 2. 允许本地回环接口(lo)通信(系统内部组件依赖)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 3. 允许已建立的连接及相关连接(不中断现有网络会话)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 4. 允许 SSH 连接(22端口,服务器远程管理必备)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 5. 允许 HTTP(80端口)和 HTTPS(443端口)服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 6. 允许 ICMP ping 请求(可选,便于网络连通性测试)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

2. 访问限制规则(增强安全性)

# 只允许特定 IP(如 192.168.1.100)访问 SSH 端口
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
# 只允许特定 IP 段(如 192.168.1.0/24)访问 HTTP 端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
# 限制 SSH 连接频率(防止暴力破解:每分钟最多3个新连接)
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

3. NAT 规则示例(网关 / 路由器场景)

# 1. 启用内核 IP 转发(必须配置,否则无法转发数据包)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 2. 动态 SNAT(MASQUERADE):局域网共享公网 IP 上网(eth0 为公网网卡)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 3. 静态 SNAT:局域网(192.168.1.0/24)通过固定公网 IP(203.0.113.1)上网
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1
# 4. 端口转发:公网 80 端口转发到内网服务器(192.168.1.100:80)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

4. 日志记录规则(审计与排障)

# 记录所有被拒绝的数据包(日志前缀:IPTABLES-DROPPED,日志级别4)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
# 查看日志(默认路径:/var/log/syslog 或 /var/log/messages)
grep IPTABLES-DROPPED /var/log/syslog

五、高级功能应用

1. 状态检测强化

# 仅允许已建立的连接入站,拒绝所有新的非授权连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 仅允许 SSH 新连接,拒绝其他所有新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state NEW -j DROP

2. 速率限制(防攻击)

# 限制 SSH 新连接频率(每分钟3个,超出则拒绝)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 限制 ping 请求频率(每秒1个,避免 ping 洪水攻击)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

3. 多端口批量配置

# 允许单个规则匹配多个端口(如 80、443、8080)
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 允许多个源 IP 段访问多个端口
iptables -A INPUT -p tcp -m multiport --dports 22,3389 -s 192.168.1.0/24,10.0.0.0/8 -j ACCEPT

4. IP 集合(高效管理黑白名单)

需先安装 ipset 工具(Debian/Ubuntu:apt-get install ipset;CentOS/RHEL:yum install ipset):
# 创建 IP 黑名单集合(hash:ip 类型,存储单个 IP)
ipset create blacklist hash:ip
# 向黑名单添加 IP(支持批量添加)
ipset add blacklist 192.168.1.100
ipset add blacklist 203.0.113.5
# 应用黑名单规则(拒绝黑名单 IP 入站)
iptables -A INPUT -m set --match-set blacklist src -j DROP
# 查看黑名单集合
ipset list blacklist
# 删除黑名单中的 IP
ipset del blacklist 192.168.1.100

六、规则保存与开机自动加载

iptables 规则默认保存在内存中,重启系统后会丢失,需手动保存并配置开机加载:

1. 保存规则

# Debian/Ubuntu 系统
iptables-save > /etc/iptables.rules
# CentOS/RHEL 7+ 系统(需安装 iptables-services)
yum install iptables-services -y
systemctl enable iptables
systemctl start iptables
iptables-save > /etc/sysconfig/iptables

2. 恢复规则

# Debian/Ubuntu 系统
iptables-restore < /etc/iptables.rules
# CentOS/RHEL 系统
iptables-restore < /etc/sysconfig/iptables

3. 开机自动加载(永久生效)

# Debian/Ubuntu 系统:创建网络启动前加载脚本
cat > /etc/network/if-pre-up.d/iptables << EOF
#!/bin/sh
iptables-restore < /etc/iptables.rules
EOF
chmod +x /etc/network/if-pre-up.d/iptables
# CentOS/RHEL 系统:启用 iptables 服务(自动加载 /etc/sysconfig/iptables)
systemctl enable iptables
systemctl restart iptables

七、最佳实践

  1. 默认拒绝原则:先设置 INPUT/FORWARD 链默认 DROP,再逐步开放必要端口,最小化攻击面
  1. 允许本地回环:必须允许 lo 接口通信,否则系统内部服务(如数据库、本地进程)可能异常
  1. 保留已建立连接:优先添加 ESTABLISHED,RELATED 允许规则,避免中断现有网络会话
  1. 按需开放端口:仅开放业务必需的端口(如 Web 服务 80/443、SSH 22),禁用无用端口
  1. 限制管理访问:SSH 等管理端口尽量限制特定 IP/IP 段访问,避免全网暴露
  1. 日志审计:配置拒绝数据包日志,定期分析异常流量(如频繁尝试连接的 IP)
  1. 定期清理规则:删除过期、无用的规则,避免规则过多导致匹配效率下降
  1. 先测试后应用:修改规则前先在测试环境验证,或通过现有 SSH 会话操作(避免被锁在外)

八、故障排除

1. 被锁在服务器外(SSH 连接失败)

  • 通过服务器控制台(物理机 / 云服务器控制台)直接登录
  • 临时添加允许规则:iptables -A INPUT -p tcp --dport 22 -j ACCEPT,再排查原有规则

2. 规则不生效

  • 检查规则顺序:iptables 按规则顺序匹配,允许规则需在拒绝规则之前
  • 查看规则计数器:iptables -L -n -v,确认规则是否有匹配次数(若为 0,说明规则未命中)
  • 检查表 / 链是否正确:如 NAT 规则需在 nat 表中配置,而非 filter 表

3. NAT 转发失败

  • 确认已启用 IP 转发:cat /proc/sys/net/ipv4/ip_forward,输出 1 表示已启用(否则执行 echo 1 > /proc/sys/net/ipv4/ip_forward)
  • 检查 FORWARD 链规则:需允许转发数据包(如 iptables -A FORWARD -j ACCEPT,或更精细的转发规则)
  • 验证 nat 表规则:iptables -t nat -L -n -v,确认 PREROUTING/POSTROUTING 规则是否正确

九、替代方案

iptables 功能强大但规则配置较复杂,现代 Linux 系统提供了更易用的替代工具:
  • firewalld:CentOS/RHEL 7+ 默认防火墙,支持动态规则(无需重启服务)、区域管理
  • ufw(Uncomplicated Firewall):Ubuntu 默认防火墙,简化了 iptables 命令,适合新手
  • nftables:iptables 的下一代替代品,内核原生支持,规则语法更简洁,性能更优
但 iptables 仍是理解 Linux 网络过滤原理的核心工具,且在服务器运维、自动化脚本中仍广泛应用。
阅读剩余