插件窝 干货文章 Nginx服务器如何通过ip和user_gent限制访问

Nginx服务器如何通过ip和user_gent限制访问

access Nginx Agent deny 972    来源:    2025-04-21

Nginx 通过 IP 和 User-Agent 限制访问

在 Nginx 中,您可以通过多种方式结合 IP 地址和 User-Agent 来限制访问。以下是几种实现方法:

1. 使用 if 指令结合变量

server {
    listen 80;
    server_name example.com;

    # 定义不允许的IP和User-Agent组合
    set $deny_access off;

    # 检查IP和User-Agent
    if ($remote_addr = "123.45.67.89") {
        set $deny_access "${deny_access}1";
    }

    if ($http_user_agent ~* (curl|wget|python-requests)) {
        set $deny_access "${deny_access}2";
    }

    # 如果同时匹配IP和User-Agent则拒绝访问
    if ($deny_access = "12") {
        return 403;
    }

    # 其他配置...
}

2. 使用 map 指令创建更复杂的规则

map "$remote_addr:$http_user_agent" $deny_access {
    default         0;
    "123.45.67.89:curl" 1;
    "123.45.67.89:wget" 1;
    "98.76.54.32:python-requests" 1;
}

server {
    listen 80;
    server_name example.com;

    if ($deny_access) {
        return 403;
    }

    # 其他配置...
}

3. 使用 geo 模块限制IP范围

geo $block_ip {
    default 0;
    123.45.67.89/32 1;
    98.76.54.32/24 1;
}

map "$block_ip:$http_user_agent" $deny_access {
    default         0;
    "1:curl"        1;
    "1:wget"        1;
    "1:python-requests" 1;
}

server {
    listen 80;
    server_name example.com;

    if ($deny_access) {
        return 403;
    }

    # 其他配置...
}

4. 使用单独的配置文件组织规则

创建 /etc/nginx/conf.d/block_rules.conf:

# 定义黑名单IP
geo $blacklist_ip {
    default 0;
    include /etc/nginx/conf.d/ip_blacklist.conf;
}

# 定义黑名单User-Agent
map $http_user_agent $bad_agent {
    default 0;
    include /etc/nginx/conf.d/ua_blacklist.conf;
}

# 组合规则
map "$blacklist_ip:$bad_agent" $deny_access {
    default 0;
    "1:1" 1;
}

然后在主配置中使用:

server {
    listen 80;
    server_name example.com;

    include /etc/nginx/conf.d/block_rules.conf;

    if ($deny_access) {
        return 403;
    }

    # 其他配置...
}

5. 使用 Nginx Plus 的 ngx_http_geoip_module

如果您有 Nginx Plus 或编译了 geoip 模块,可以结合地理位置限制:

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    map "$geoip_country_code:$http_user_agent" $deny_access {
        default         0;
        "CN:curl"       1;
        "RU:wget"       1;
    }

    server {
        if ($deny_access) {
            return 403;
        }
    }
}

最佳实践建议

  1. 避免过多使用 if:Nginx 的 if 指令在某些上下文中会影响性能
  2. 使用 include 分离配置:将黑名单规则放在单独文件中便于管理
  3. 定期更新规则:特别是针对恶意 User-Agent 的规则
  4. 考虑使用 fail2ban:动态更新 Nginx 的黑名单
  5. 记录被拒绝的请求:帮助分析攻击模式
server {
    # 记录被拒绝的访问
    error_log /var/log/nginx/access_denied.log;

    if ($deny_access) {
        access_log /var/log/nginx/access_denied.log main;
        return 403;
    }
}

通过以上方法,您可以灵活地根据 IP 地址和 User-Agent 组合来限制对 Nginx 服务器的访问。