Skip to content

🆘 常见问题与排错

问题 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 规则