iptables 规则详解:Linux 防火墙完全指南
概述
iptables 是 Linux 系统中最经典、功能最强大的防火墙工具之一。它基于 Netfilter 框架,提供了包过滤、网络地址转换(NAT)和端口转发等核心功能。本文将深入讲解 iptables 规则的配置方法、最佳实践和常见应用场景。
iptables 基础架构
四大表(Tables)
iptables 包含四个内置表,每个表负责不同的功能:
| 表名 | 功能描述 |
|---|---|
| filter | 默认表,负责数据包过滤(ACCEPT/DROP/REJECT) |
| nat | 网络地址转换,用于修改源/目标地址 |
| mangle | 修改数据包服务质量(TOS)和标记 |
| raw | 用于配置数据包跟踪,实现不跟踪特定流量 |
五大连链(Chains)
每个表包含不同的链,数据包流经的顺序如下:
PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTING
↓ ↓ ↓ ↓
NAT 本地进程 转发流量 本地发出
- PREROUTING:数据包进入时首先处理的链(DNAT在此)
- INPUT:目标为本机的数据包
- FORWARD:需要转发的数据包
- OUTPUT:本机发出的数据包
- POSTROUTING:数据包离开前最后处理的链(SNAT/MASQUERADE在此)
常用命令语法
基本操作
# 查看规则
iptables -L -n -v # 列出所有规则(数字格式,显示计数)
iptables -L INPUT -n # 查看INPUT链规则
iptables -t nat -L -n # 查看NAT表规则
# 清空规则
iptables -F # 清空所有链的规则
iptables -X # 删除所有用户自定义链
iptables -Z # 清零计数器
# 设置默认策略
iptables -P INPUT DROP # INPUT链默认拒绝
iptables -P FORWARD DROP # FORWARD链默认拒绝
iptables -P OUTPUT ACCEPT # OUTPUT链默认允许
规则匹配条件
| 参数 | 说明 |
|---|---|
-p |
协议(tcp/udp/icmp) |
-s |
源IP地址 |
-d |
目标IP地址 |
--sport |
源端口 |
--dport |
目标端口 |
-i |
输入接口(eth0/wlan0) |
-o |
输出接口 |
-m state --state |
连接状态(NEW/ESTABLISHED/RELATED) |
目标动作
| 动作 | 说明 |
|---|---|
ACCEPT |
接受数据包 |
DROP |
直接丢弃(不通知发送方) |
REJECT |
拒绝并返回错误响应 |
LOG |
记录日志 |
SNAT |
源地址转换 |
DNAT |
目标地址转换 |
实战场景
1. 基础防护规则集
# 清空现有规则
iptables -F
iptables -X
iptables -Z
# 设置默认策略:拒绝入站,允许出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(端口22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许ICMP(ping)
iptables -A INPUT -p icmp -j ACCEPT
# 记录被拒绝的连接(可选)
iptables -A INPUT -j LOG --log-prefix "DROPPED: "
2. 端口范围匹配
# 允许端口范围 10000-20000
iptables -A INPUT -p tcp --dport 10000:20000 -j ACCEPT
# 使用 multiport 模块匹配多个离散端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
3. IP地址限制
# 只允许特定IP访问SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 允许整个网段
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 拒绝特定IP
iptables -A INPUT -s 10.0.0.5 -j DROP
4. 速率限制(防DDoS)
# 限制SSH连接速率:每秒最多3个新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --update --seconds 60 --hitcount 4
--name SSH -j DROP
# 限制ICMP速率
iptables -A INPUT -p icmp --icmp-type echo-request
-m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
5. NAT 配置
SNAT(源地址转换)
# 内网主机访问外网时修改源地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT
--to-source 203.0.113.50
MASQUERADE(动态SNAT)
# 适用于动态IP(如PPPoE拨号)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
DNAT(端口转发)
# 将外部访问的8080端口转发到内网服务器80端口
iptables -t nat -A PREROUTING -p tcp --dport 8080
-j DNAT --to-destination 192.168.1.10:80
# 同时需要允许转发
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
6. 自定义链
# 创建自定义链
iptables -N WEB_SERVER
# 在自定义链中添加规则
iptables -A WEB_SERVER -p tcp --dport 80 -j ACCEPT
iptables -A WEB_SERVER -p tcp --dport 443 -j ACCEPT
# 从主链跳转到自定义链
iptables -A INPUT -j WEB_SERVER
规则持久化
iptables 规则默认重启后失效,需要持久化保存:
Ubuntu/Debian
apt install iptables-persistent
netfilter-persistent save
CentOS/RHEL
yum install iptables-services
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
通用方法
# 保存当前规则
iptables-save > /etc/iptables.rules
# 恢复规则
iptables-restore < /etc/iptables.rules
调试技巧
# 启用内核日志
echo 1 > /proc/sys/net/netfilter/nf_log_all_netbios_names
# 查看内核日志
dmesg | grep -i "DROPPED"
journalctl -k | grep "iptables"
# 使用 tcpdump 抓包分析
tcpdump -i eth0 -n port 22
# 查看连接跟踪
cat /proc/net/nf_conntrack
最佳实践
- 默认拒绝原则:先设置默认DROP,再逐步添加允许规则
- 规则顺序很重要:iptables 从上到下匹配,第一条匹配的规则生效
- 使用连接状态跟踪:优先使用
-m state --state ESTABLISHED,RELATED - 限制管理端口:SSH等管理端口应限制源IP
- 定期审计规则:使用
iptables -L -n -v检查规则计数 - 备份规则集:修改前务必备份当前规则
常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 无法SSH连接 | INPUT链规则错误 | 检查SSH端口是否被允许 |
| 网页无法访问 | FORWARD链未配置 | 检查转发规则 |
| NAT不生效 | 未开启IP转发 | sysctl -w net.ipv4.ip_forward=1 |
| 规则不生效 | 规则顺序错误 | 使用 -I 插入到链头 |
总结
iptables 虽然学习曲线较陡,但功能强大且灵活。掌握其核心概念(表、链、规则匹配)后,可以应对绝大多数网络安全需求。对于更复杂的需求,可以考虑升级到 nftables(iptables 的继任者),但 iptables 在现有系统中仍然广泛使用。
提示:修改 iptables 规则时,建议先通过 SSH 测试新规则,或设置定时恢复脚本,防止锁死服务器。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END















暂无评论内容