iptables防火墙完全手册|Linux内核防火墙iptables从原理到应用的全方位解析
iptables 是 Linux 系统基于 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
# 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
七、最佳实践
- 默认拒绝原则:先设置 INPUT/FORWARD 链默认 DROP,再逐步开放必要端口,最小化攻击面
- 保留已建立连接:优先添加 ESTABLISHED,RELATED 允许规则,避免中断现有网络会话
- 按需开放端口:仅开放业务必需的端口(如 Web 服务 80/443、SSH 22),禁用无用端口
- 限制管理访问:SSH 等管理端口尽量限制特定 IP/IP 段访问,避免全网暴露
- 日志审计:配置拒绝数据包日志,定期分析异常流量(如频繁尝试连接的 IP)
- 定期清理规则:删除过期、无用的规则,避免规则过多导致匹配效率下降
- 先测试后应用:修改规则前先在测试环境验证,或通过现有 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 网络过滤原理的核心工具,且在服务器运维、自动化脚本中仍广泛应用。
阅读剩余
网站声明
本站内容可能存在水印或引流等信息,请擦亮眼睛自行鉴别;以免上当受骗;
本站提供的内容仅限用于学习和研究目的,不得将本站内容用于商业或者非法用途;
