常用 Linux iptables 规则速查原创
# 常用 Linux iptables 规则速查
版本说明
本文基于 CentOS/RHEL 7+ 和 Ubuntu 18.04+ 测试。
如系统已切换至原生 nftables,规则需用 nft 语法改写。
# 1. iptables 基础概念
# 1.1 四大表
| 表 | 用途 |
|---|---|
filter | 包过滤(默认表) |
nat | 网络地址转换 |
mangle | 修改包头部字段 |
raw | 连接跟踪前处理 |
# 1.2 五链
| 链 | 处理时机 |
|---|---|
INPUT | 入站流量,到达本机 |
OUTPUT | 出站流量,从本机发出 |
FORWARD | 转发流量 |
PREROUTING | 路由前 DNAT |
POSTROUTING | 路由后 SNAT |
# 1.3 基本工作流程
入站包 → PREROUTING → 路由判断 → INPUT → 本机进程
↓
转发包 → PREROUTING → FORWARD → POSTROUTING → 出站
↓
出站包 → OUTPUT → POSTROUTING → 出站
1
2
3
4
5
2
3
4
5
# 2. 基础操作命令
# 2.1 查看与删除
# 查看当前规则(精简)
iptables -L -n
# 查看详细规则(含序号)
iptables -L -n -v --line-numbers
# 删除所有规则
iptables -F
# 删除用户自定义链
iptables -X
# 清空计数器
iptables -Z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.2 默认策略
# 设置默认策略为 DROP(推荐生产环境)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 恢复默认策略
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2.3 增删规则
# 追加规则(末尾)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则(指定位置)
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 删除规则(按内容)
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 按序号删除
iptables -D INPUT 3
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.4 保存与恢复
# Debian/Ubuntu
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
# CentOS/RHEL
sudo iptables-save > /etc/sysconfig/iptables
# 恢复规则
sudo iptables-restore < /etc/iptables/rules.v4
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 常见规则示例
# 3.1 SSH 安全
# 允许 SSH(新连接 + 已建立)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 仅允许特定网段 SSH
iptables -A INPUT -p tcp -s <TRUSTED_NETWORK> --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# 限制 SSH 连接速率(防暴力破解)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 3.2 Web 服务
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 多端口合并
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3.3 基础网络
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 允许 DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 3.4 IP 黑白名单
# 禁止特定 IP
iptables -A INPUT -s <INTERNAL_IP_1>0 -j DROP
# 仅允许特定 IP 段
iptables -A INPUT -s <INTERNAL_NETWORK> -j ACCEPT
iptables -A INPUT -j DROP
# 禁止 IP 范围
iptables -A INPUT -m iprange --src-range <INTERNAL_IP_1>-192.0.2.20 -j DROP
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 4. NAT 与端口转发
# 4.1 SNAT(源地址转换)
# 开启 IP 转发
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 内网共享上网(MASQUERADE 自动获取出口 IP)
iptables -t nat -A POSTROUTING -s <LAN_SUBNET> -o eth0 -j MASQUERADE
# 固定 IP 的 SNAT
iptables -t nat -A POSTROUTING -s <LAN_SUBNET> -o eth0 -j SNAT --to-source 203.0.113.10
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 4.2 DNAT(目的地址转换)
# 端口转发:外部 3306 → 内部 MySQL
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination <GATEWAY_IP>0:3306
iptables -A FORWARD -p tcp --dport 3306 -d <GATEWAY_IP>0 -j ACCEPT
# 端口转发:422 → 22
iptables -t nat -A PREROUTING -p tcp --dport 422 -j DNAT --to <GATEWAY_IP>:22
# 流量分发(负载均衡示例)
iptables -t nat -A PREROUTING -p tcp --dport 443 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination <GATEWAY_IP>:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination <INTERNAL_PREFIX>.11:443
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5. DDoS 防护规则
# 5.1 连接速率限制
# 限制每 IP 80 端口并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT
# 限制 HTTP 请求速率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
1
2
3
4
5
6
2
3
4
5
6
# 5.2 SYN Flood 防护
# 限制 SYN 包速率
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
1
2
3
2
3
# 5.3 ICMP 防护
# 限制 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
1
2
3
2
3
# 6. 日志记录
# 6.1 记录丢弃的包
# 创建日志链
iptables -N LOGGING
iptables -A INPUT -j LOGGING
# 记录日志(带前缀,限制速率)
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP
# 查看日志
tail -f /var/log/messages | grep IPTales
# 或
journalctl -k | grep -i iptables
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 6.2 自定义日志级别
# 记录但不丢弃
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP-Request: " --log-level 6
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
1
2
3
2
3
# 7. 高级用法
# 7.1 基于时间的规则
# 工作时间(9:00-18:00)允许访问
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
# 凌晨拒绝所有 TCP
iptables -A INPUT -p tcp -m time --timestart 02:00 --timestop 03:00 -j DROP
1
2
3
4
5
2
3
4
5
# 7.2 基于 MAC 地址
# 仅允许特定 MAC 访问
iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
1
2
2
# 7.3 连接状态扩展
# 允许相关/已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 阻止无效连接
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
1
2
3
4
5
2
3
4
5
# 7.4 端口集合
# 允许多个端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,443,3306 -j ACCEPT
# 允许端口范围
iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT
1
2
3
4
5
2
3
4
5
# 8. 坑与边界
默认策略为 ACCEPT 时慎用
-F:清空规则后,所有流量将直接放行。生产环境务必先设DROP默认策略。规则顺序很重要:iptables 按顺序匹配,第一条符合条件的规则生效。限制性规则应放在前面。
OUTPUT 默认 ACCEPT 的隐患:如果本机被入侵,恶意程序可以随意外发数据。建议生产环境 OUTPUT 也设为 DROP 或严格控制。
SSH 规则放错位置的后果:如果先 DROP 所有 INPUT,再插入 SSH 规则时位置在 DROP 之后,SSH 将无法连接。建议先用
iptables -I插入到最前面,或在 DROP 规则中排除 SSH 端口。NAT 与 filter 表的执行顺序:数据包先经过 nat 表(做地址转换),再经过 filter 表(做过滤)。因此 filter 规则中的源/目的 IP 已经是转换后的 IP。
保持连接状态:重启 iptables 后已建立的连接会中断。如需持久保存规则,使用
iptables-save并配合 systemd 服务开机加载。与 Firewalld 冲突:两者不能同时使用。CentOS 7+ 默认启用 Firewalld,如需使用 iptables,需先停用 Firewalld:
systemctl stop firewalld; systemctl disable firewalld; yum install iptables-services。
# 9. 可复用要点
快速初始化脚本模板:
#!/bin/bash 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 conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行 SSH(务必确认 IP 段) iptables -A INPUT -p tcp -s <YOUR_IP> --dport 22 -j ACCEPT # 保存 iptables-save > /etc/sysconfig/iptables1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17生产环境检查清单:
- 默认策略是否为 DROP
- SSH 规则是否限制来源 IP
- 是否开启连接状态跟踪
- 规则是否已持久化
调试技巧:
- 使用
-v查看匹配的包数量 - 使用
--line-numbers定位规则位置 - 使用
-C测试规则是否存在:iptables -C INPUT -p tcp --dport 22 -j ACCEPT
- 使用
上次更新: 9/11/2026