openEuler 系统IP黑名单配置完整操作指南

1. 概述

在 openEuler 操作系统中,管理IP黑名单(即拒绝特定IP地址访问)主要有两种方法: 1. 使用 firewalld 防火墙(推荐):功能全面、控制力度细,适用于所有网络服务。 2. 使用 /etc/hosts.deny 文件:简单快速,但仅适用于支持 libwrap 库的传统服务(如 sshd, vsftpd)。

你可以根据以下决策树快速选择:

flowchart TD
    A[开始:需配置IP黑名单] --> B{主要保护什么?}
    B -->|SSH或FTP等传统服务| C[快速简单方案]
    B -->|Web/数据库等所有服务<br>或需复杂规则| D[通用强大方案]

    C --> E[使用 /etc/hosts.deny]
    D --> F[使用 firewalld]

    E --> G[操作:编辑文件,添加一行规则]
    F --> H[操作:使用 firewall-cmd 命令]

    G & H --> I[完成配置]

2. 方法一:使用 firewalld 防火墙(推荐)

2.1 核心概念

firewalld 是 openEuler 默认的防火墙管理器。配置黑名单的核心是使用 “富规则” ,并通过 priority 参数控制规则的优先级(数值越小,优先级越高)

2.2 操作步骤

步骤1:确认 firewalld 服务状态

sudo systemctl status firewalld

确保服务状态为 active (running)。如果未运行,使用 sudo systemctl start firewalld 启动。

步骤2:添加黑名单规则

  • 拒绝单个IPbash sudo firewall-cmd --zone=public --add-rich-rule='rule priority="-100" family="ipv4" source address="192.168.1.100" reject'
  • 拒绝一个IP段bash sudo firewall-cmd --zone=public --add-rich-rule='rule priority="-100" family="ipv4" source address="10.0.0.0/24" reject'

步骤3:配置默认允许规则

为确保黑名单外的IP能正常访问,可添加一条低优先级允许规则。

sudo firewall-cmd --zone=public --add-rich-rule='rule priority="100" family="ipv4" source address="0.0.0.0/0" accept'

注意:如果防火墙的默认策略已是 accept,此步骤可省略。

步骤4:使规则永久生效并重载

以上命令添加的规则是临时的。要永久保存,需添加 --permanent 参数,或执行:

# 将当前所有临时规则转为永久规则
sudo firewall-cmd --runtime-to-permanent
# 或直接添加永久规则(需重载)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule priority="-100" family="ipv4" source address="192.168.1.100" reject'
sudo firewall-cmd --reload

步骤5:验证规则

# 查看所有富规则
sudo firewall-cmd --zone=public --list-rich-rules
# 查看防火墙全部配置
sudo firewall-cmd --zone=public --list-all

3. 方法二:使用 /etc/hosts.deny 文件

3.1 核心概念

此方法由 TCP Wrappers 提供,检查顺序为: 1. 匹配 /etc/hosts.allow -> 允许。 2. 匹配 /etc/hosts.deny -> 拒绝。 3. 均不匹配 -> 允许

3.2 操作步骤

步骤1:编辑 hosts.deny 文件

sudo vi /etc/hosts.deny

步骤2:添加规则

在文件末尾按格式添加规则,立即生效

# 拒绝单个IP访问SSH
sshd : 192.168.1.100
# 拒绝整个网段访问所有服务
ALL : 192.168.1.0/24

步骤3:验证(可选)

# 查看特定服务是否受TCP Wrappers保护(有libwrap依赖)
ldd $(which sshd) | grep libwrap
# 查看文件内容
cat /etc/hosts.deny

4. 两种方法对比与总结

特性 /etc/hosts.deny firewalld (推荐)
控制范围 仅限使用 libwrap 库的服务 所有网络流量和连接
功能灵活性 仅能控制服务与IP 支持端口、协议、时间、连接状态等多维度
规则优先级 固定(hosts.allow > hosts.deny) 可通过数值精细控制
配置持久化 文件修改即永久生效 需明确使用 --permanent--runtime-to-permanent
管理便利性 直接编辑文件,适合简单列表 专用命令行工具,适合复杂、动态规则
系统推荐度 逐渐淘汰,用于特定场景 主流和标准方案

5. 重要注意事项

  1. 规则优先级是核心:在 firewalld 中,高优先级(数值小)的 reject 规则会先于低优先级(数值大)的 accept 规则执行。
  2. 永久生效:使用 firewall-cmd 时,如果不加 --permanent 或转换,重启后临时规则会丢失。
  3. 立即测试:添加规则后,务必从被拒绝的IP尝试访问,以验证规则是否生效。
  4. 服务依赖/etc/hosts.deny 对 Nginx、Apache(默认编译)、数据库等多数现代网络服务无效

6. 故障排查

  • 规则未生效
  • 检查 firewalld 服务状态。
  • sudo firewall-cmd --list-all 确认规则已加载。
  • 检查规则优先级是否被更高规则覆盖。
  • 误封锁自己
  • 如果是 firewalld,通过物理控制台或虚拟机控制界面登录,移除错误规则。
  • 如果是 hosts.deny,同样通过控制台编辑文件,在对应行前加 # 注释掉。

最佳实践建议:对于生产服务器,统一使用 firewalld 管理所有网络访问控制。仅在需要快速临时屏蔽某个IP访问 SSH 时,可考虑使用 /etc/hosts.deny 作为补充。