🆘 常见问题与排错
问题 1:SSH 被自己锁在门外
**场景:**你设置了一条 iptables -P INPUT DROP,然后发现 SSH 断了……
bash
# 解法 1:用 cron 定时恢复(给自己留后路!)
# 设置规则前先跑这个:
echo "iptables -F && iptables -P INPUT ACCEPT" | \
at now + 5 minutes
# 5 分钟后自动清空规则,防止被锁
# 解法 2:写成脚本,规则写错自动回滚
#!/bin/bash
set -e # 任何命令失败就退出
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
echo "规则加载成功!"
iptables -L -v -n | head -10
# 如果脚本中断了(说明某条规则有问题),
# 手动跑:iptables -F && iptables -P INPUT ACCEPT💡 提示: 💡 黄金法则:永远先放行 SSH,最后再改默认策略。养成用
at定时恢复的习惯,相当于给自己留一条回滚通道。
问题 2:重启后规则消失
bash
# iptables 规则默认不持久化!重启就没了
# Debian/Ubuntu 安装持久化工具
apt install iptables-persistent
# 保存当前规则
netfilter-persistent save
# 实际保存到 /etc/iptables/rules.v4 和 rules.v6
# 恢复规则
netfilter-persistent reload
# CentOS/RHEL 用 iptables-services
yum install iptables-services
systemctl enable iptables
service iptables save
# 保存到 /etc/sysconfig/iptables
# 手动保存/恢复(通用方法)
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4问题 3:规则太多导致性能下降
bash
# 查看当前规则数量
iptables -L -n | wc -l
# 超过 1000 条就要考虑优化了
# 优化思路:
# 1. 用自定义链分类(前面讲过)
# 2. 高频规则放前面,低频规则放后面
# 3. 用 ipset 批量匹配 IP(比一条条加快得多)
# ipset 示例:封禁 1 万个 IP
apt install ipset
ipset create blocked_ips hash:ip hashsize 65536
ipset add blocked_ips 1.2.3.4
ipset add blocked_ips 5.6.7.8
# ... 从黑名单文件批量导入
while read ip; do ipset add blocked_ips "$ip"; done < /tmp/blacklist.txt
# 一条规则匹配整个 ipset
iptables -I INPUT -m set --match-set blocked_ips src -j DROP
# 保存 ipset
ipset save > /etc/ipset.conf
# 恢复
ipset restore < /etc/ipset.conf💡 提示: 💡 ipset vs iptables:1 万个 IP 用 iptables 需要 1 万条规则,匹配时逐条比较(O(n))。用 ipset 只需 1 条规则 + 一个哈希表,匹配是 O(1)。差 1000 倍的性能!
问题 4:容器/虚拟机之间网络不通
bash
# 虚拟机之间不通——检查 FORWARD 链
iptables -L FORWARD -v -n
Chain FORWARD (policy DROP)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
123K 5600K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
# 如果 FORWARD 策略是 DROP 且没有足够的放行规则——流量被丢弃了
# 添加放行
iptables -A FORWARD -i virbr0 -o virbr0 -j ACCEPT
iptables -A FORWARD -i virbr0 -j ACCEPT
iptables -A FORWARD -o virbr0 -j ACCEPT
# Docker 容器间通信不通——检查 DOCKER 链
iptables -L DOCKER -v -n
# 确保容器间有 ACCEPT 规则