插件窝 干货文章 如何使用Nginx实现IP黑名单

如何使用Nginx实现IP黑名单

Nginx 配置 blacklist 使用 966    来源:    2025-04-20

使用Nginx实现IP黑名单

Nginx可以通过几种方式实现IP黑名单功能,阻止特定IP地址访问您的网站或服务。以下是几种常用的方法:

方法一:使用Nginx的deny指令

在Nginx配置文件中,可以使用deny指令来拒绝特定IP的访问:

http {
    server {
        listen 80;
        server_name example.com;

        # 允许所有IP访问
        allow all;

        # 拒绝特定IP
        deny 123.45.67.89;
        deny 192.168.1.100;

        # 拒绝IP段
        deny 10.0.0.0/8;

        location / {
            # 您的其他配置
        }
    }
}

方法二:使用单独的配置文件管理黑名单

  1. 创建黑名单文件(如/etc/nginx/blacklist.conf):
deny 123.45.67.89;
deny 192.168.1.100;
deny 10.0.0.0/8;
  1. 在主配置文件中包含这个文件:
http {
    include /etc/nginx/blacklist.conf;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 您的其他配置
        }
    }
}

方法三:使用Geo模块

对于大量IP地址的管理,可以使用Nginx的Geo模块:

http {
    geo $blacklist {
        default 0;
        123.45.67.89 1;
        192.168.1.100 1;
        10.0.0.0/8 1;
    }

    server {
        listen 80;
        server_name example.com;

        if ($blacklist) {
            return 403;
        }

        location / {
            # 您的其他配置
        }
    }
}

方法四:动态黑名单(结合fail2ban)

  1. 安装fail2ban:
sudo apt-get install fail2ban  # Debian/Ubuntu
sudo yum install fail2ban      # CentOS/RHEL
  1. 配置fail2ban来监控Nginx日志并自动更新黑名单:
# /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
  1. 配置Nginx使用fail2ban生成的规则:
http {
    include /etc/fail2ban/nginx-ban.conf;

    server {
        # 其他配置
    }
}

方法五:使用Lua脚本(需要OpenResty或ngx_http_lua_module)

http {
    lua_shared_dict ip_blacklist 1m;

    init_by_lua_block {
        local blacklist = ngx.shared.ip_blacklist
        blacklist:set("123.45.67.89", true)
        blacklist:set("192.168.1.100", true)
    }

    server {
        listen 80;

        access_by_lua_block {
            local blacklist = ngx.shared.ip_blacklist
            if blacklist:get(ngx.var.remote_addr) then
                ngx.exit(ngx.HTTP_FORBIDDEN)
            end
        }

        location / {
            # 其他配置
        }
    }
}

验证和重载配置

每次修改Nginx配置后,执行以下命令:

sudo nginx -t        # 测试配置是否正确
sudo systemctl reload nginx  # 重载配置(不影响现有连接)
# 或
sudo service nginx reload

注意事项

  1. 对于大型黑名单,Geo模块或Lua方法性能更好
  2. 使用fail2ban可以实现动态黑名单,自动封禁恶意IP
  3. 在生产环境中,建议结合多种方法使用
  4. 定期审查和更新黑名单
  5. 考虑使用CDN或WAF服务来增强IP过滤能力

以上方法可以根据您的具体需求和安全要求进行选择和组合使用。