nginx设置黑名单,批量拦截不友好访问ip

如果网站受到攻击,先收集一波访问的ip

/**
 * 【可选】记录IP到指定文件(去重版,同一IP只存一次)
 * @param string $targetFile 要写入的文件路径
 * @return bool
 */
function writeIpToFileUnique($targetFile) {
    // 获取IP
    $ip = '未知IP';
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
    } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $ip = trim($ip === '::1' ? '127.0.0.1' : $ip);

    // 检查IP是否已存在
    if (file_exists($targetFile)) {
        $existingIps = file($targetFile, FILE_IGNORE_NEW_LINES);
        if (in_array($ip, $existingIps)) {
            return true; // 已存在,无需写入
        }
    }

    // 写入文件
    try {
        $fileDir = dirname($targetFile);
        if (!is_dir($fileDir)) {
            mkdir($fileDir, 0755, true);
        }
        file_put_contents($targetFile, $ip . PHP_EOL, FILE_APPEND | LOCK_EX);
        return true;
    } catch (Exception $e) {
        //error_log("[IP写入失败(去重版)] 文件:{$targetFile},错误:{$e->getMessage()}");
        return false;
    }
}

记录好IP后,在nginx配置文件 加入

http
{
    # ...... 省略原有配置 ......

    server_tokens off;
    
    # ========== 新增:引入IP黑名单文件 ==========
    include /www/server/nginx/conf/ip_blacklist.conf;
    allow all;
    # =============================================

    access_log off;

    # ...... 后续server块不变 ......
}

这个ip_blacklist.conf文件的格式为:

deny 192.168.1.100;
deny 203.0.113.88;
deny 10.0.0.0/8;
deny 172.16.0.0/12;

文件里面的ip 就会收获403

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?