Nginx 安全防护与 HTTPS 部署实战

Nginx 安全防护实战

1.隐藏 Nginx 版本号

nginx 复制代码
# nginx 配置文件 /etc/nginx/nginx.conf
http {
	server_tokens off;
}

2.防 CC 攻击 / 限流

nginx 复制代码
http {
	limit_req_zone $binary_remote_addr zone=cc:10m rate=10r/s;
}

server {
    limit_req zone=cc burst=20 nodelay;
}
  • rate=10r/s:限制并发数,每个 IP 每秒最多 10 个请求
  • burst=20:允许突发 20 个请求,多余的请求会立即返回 503
  • limit_req_zone:定义共享内存区
  • $binary_remote_addr:是一个内置变量,用于表示客户端 IP 地址的二进制格式
  • zone=cc:10m:创建名为cc的共享内存区,大小为 10m,用来存储客户端 IP
  • nodelay:立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立即返回 503

压力测试

bash 复制代码
# 安装 ab 测试工具
dnf install httpd-tools -y

# 发起300个请求,每次发起30个
ab -n 300 -c 30 http://yourdomain.com

# 查看日志
tail -300 /var/log/nginx/access.log | grep -c 503

3.防盗链

nginx 复制代码
location ~* \.(jpg|jpeg|png|gif|js|css)$ {
    valid_referers none blocked server_names *.yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}

1. location ~* \.(jpg|jpeg|png|gif|js|css)$

  • location:Nginx 匹配请求路径的指令

  • ~*不区分大小写的正则匹配(大写 JPG/PNG 也能匹配)

  • \.(jpg|jpeg|png|gif|js|css)$:匹配后缀为这些格式的所有文件

    作用:只给图片、JS、CSS这类静态资源加防盗链,不影响网页接口

2. valid_referers none blocked server_names *.yourdomain.com;

这是防盗链核心,定义哪些「来源」是合法的:

参数 含义
none 允许直接访问(无来源页,比如浏览器地址栏直接打开图片)
blocked 允许浏览器隐藏来源的请求(正常用户访问)
server_names 允许你自己的域名(配置里的 server_name
*.yourdomain.com 允许所有子域名(如 img.你的域名.comwww.你的域名.com

3. if ($invalid_referer) { return 403; }

  • $invalid_referer:Nginx 内置变量,来源不合法时为真
  • return 403:直接返回 403 Forbidden(拒绝盗链请求)

反盗链原理

HTTP 请求头里有一个 Referer 字段,标识当前请求是从哪个网页来的:

  1. 你自己的网页访问图片 → Referer 是你的域名 → 合法 → 正常显示
  2. 别人的网站盗用你的图片 → Referer 是别人的域名 → 非法 → 返回 403

4.只允许安全请求方法

nginx 复制代码
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

5. 原生 Nginx 动态黑名单

创建黑名单配置文件

bash 复制代码
# 创建存放黑名单的目录
mkdir -p /etc/nginx/blacklist

# 创建空的 IP 黑名单文件
touch /etc/nginx/blacklist/ip_blacklist.conf

修改 Nginx 主配置文件,加载黑名单

bash 复制代码
vim /etc/nginx/nginx/conf

http {} 块最顶部加入这一行(引入黑名单)

nginx 复制代码
http {
    # 加载动态黑名单文件
    include /etc/nginx/blacklist/ip_blacklist.conf;
    
    server_tokens off;
    ...
}

写入拦截规则

向黑名单文件写入默认规则:

bash 复制代码
echo 'deny 127.0.0.2;' > /etc/nginx/blacklist/ip_blacklist.conf

检查配置 + 重启成效

bash 复制代码
# 检查配置是否正确(无报错即可)
nginx -t

# 重启 Nginx 生效
systemctl restart nginx

动态管理,实时生效

封禁一个

bash 复制代码
# 封禁 IP 192.168.1.100
echo "deny 192.168.1.100;" >> /etc/nginx/blacklist/ip_blacklist.conf

# 重载 Nginx(毫秒级生效,不中断业务)
nginx -s reload

解封一个

bash 复制代码
# 编辑黑名单文件,删除对应 IP 行
vi /etc/nginx/blacklist/ip_blacklist.conf

# 重载生效
nginx -s reload

openEuler 原生自动封禁脚本,自动检测恶意 IP,自动加入黑名单:

bash 复制代码
vi /root/auto_blacklist.sh
bash 复制代码
#!/bin/bash
# 自动检测Nginx恶意请求,动态加入黑名单
LOG_FILE="/var/log/nginx/access.log"
BLACK_LIST="/etc/nginx/blacklist/ip_blacklist.conf"

# 1分钟内请求数超过100次 → 判定为CC攻击,自动封禁
tail -n 1000 $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -nr | awk '$1>100 {print $2}' | while read IP
do
    if ! grep -q "deny $IP;" $BLACK_LIST; then
        echo "deny $IP;" >> $BLACK_LIST
        echo "已封禁恶意IP:$IP"
    fi
done

# 重载Nginx生效
nginx -s reload

添加执行权限 + 定时执行(每分钟检测一次):

bash 复制代码
chmod +x /root/auto_blacklist.sh
echo "* * * * * /root/auto_blacklist.sh" >> /etc/crontab
systemctl restart crond
相关推荐
yydbjx2 小时前
KACHIE发圈更隐蔽,博容安可的侧键推杆是不是不如它?
安全·求救器·防身
小五传输2 小时前
自主可控建设指南:Serv-u替代方案,实现平滑迁移业务不中断
大数据·运维·安全
chexus3 小时前
21. 深入 Nginx HTTP 缓存源码:CDN功能
nginx·http·缓存
HuiJingJiTuanIM3 小时前
[特殊字符]企业级IM即时通讯系统优势|稳定、安全、灵活扩展
安全·实时互动·私有化部署·私域·极光鸟·灰鲸
天天进步201513 小时前
UI-TARS 源码解析 #10:parse_action 源码解析:如何用 AST 安全解析模型生成的函数调用?
安全·ui
大耳朵-小飞象15 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
wuhanzhanhui17 小时前
视觉革命与主动安全:2026武汉汽车电子展会定档,看芯片如何定义驾驶
安全·汽车
王维同学19 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
国科安芯21 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
栩栩云生1 天前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程