Skip to content

🆘 常见问题与排错

问题 1:SSH 被锁门外

bash
# ===== UFW 场景 =====
# 通过控制台(VNC/iDRAC/云厂商Web终端)登录,然后:
ufw disable
ufw status

# 或者直接编辑规则文件
# /etc/ufw/user.rules —— 删掉 SSH 相关的 DROP 行

# ===== firewalld 场景 =====
# 通过控制台登录,然后:
firewall-cmd --state
firewall-cmd --list-all
# 查看 SSH 是否在允许列表中
firewall-cmd --add-service=ssh
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload

# 黄金法则:永远先放行 SSH,再改默认策略!
ufw allow 22/tcp && ufw enable

问题 2:防火墙与 Docker 冲突

bash
# Docker 启动时会绕过 UFW/firewalld,直接操作 iptables
# 导致你以为封了端口,实际上 Docker 容器的端口仍然可达

# 验证:查看 iptables 中 Docker 插入的规则
iptables -L DOCKER -v -n

# 不推荐作为常规方案:禁用 Docker 的 iptables 管理
# 只有你准备自己维护 NAT、转发和容器互通规则时才考虑
cat > /etc/docker/daemon.json << 'EOF'
{
  "iptables": false
}
EOF
systemctl restart docker
# ⚠️ 这可能导致端口映射、容器出网和容器间通信异常

# 推荐方案:用 DOCKER-USER 链控制
# 先允许可信网段,再丢弃其他来源
iptables -I DOCKER-USER 1 -i eth0 -p tcp --dport 8080 -s 10.0.0.0/8 -j ACCEPT
iptables -I DOCKER-USER 2 -i eth0 -p tcp --dport 8080 -j DROP

# 备选方案:host 网络模式
docker run --network host myapp
# 这样端口直接绑定在宿主机上,UFW/firewalld 能控制它
# 代价是失去容器网络隔离和端口映射能力,生产环境要谨慎评估

问题 3:firewalld 规则不生效

bash
# 检查清单:

# 1. firewalld 是否在运行?
systemctl status firewalld

# 2. 查看当前区域和规则
firewall-cmd --get-active-zones
firewall-cmd --list-all

# 3. 规则是否加到了正确的区域?
firewall-cmd --get-default-zone    # 默认区域
firewall-cmd --get-zone-of-interface=eth0  # 网卡绑定的区域

# 4. 是否忘了 --permanent?
firewall-cmd --list-all              # 临时规则
firewall-cmd --permanent --list-all  # 永久规则

# 5. 修改了 permanent 规则后是否 reload?
firewall-cmd --reload

# 6. 检查日志
journalctl -u firewalld --since "5 minutes ago"
dmesg | grep -i drop

问题 4:UFW 与 firewalld 冲突

bash
# Ubuntu 默认用 UFW,CentOS/RHEL 默认用 firewalld
# 两者不能同时运行!

# 检查当前用的是哪个
ufw status 2>/dev/null && echo "UFW is active"
firewall-cmd --state 2>/dev/null && echo "firewalld is active"

# 如果要切换:
# 从 UFW 切换到 firewalld(Ubuntu)
ufw disable
apt install firewalld
systemctl enable --now firewalld

# 从 firewalld 切换到 UFW(CentOS)
systemctl disable --now firewalld
yum install ufw
ufw enable

# ⚠️ 切换前先备份当前规则!
ufw status verbose > /tmp/ufw-backup.txt
firewall-cmd --list-all > /tmp/firewalld-backup.txt