首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Nginx Proxy Manager 实战指南:配置 Web WAF 应用防火墙

  • 24-12-16 16:23
  • 3378
  • 659752
juejin.cn

Nginx Proxy Manager (NPM) 是一款功能强大的开源软件,它提供了一个用户友好的界面,让用户可以轻松地管理 Nginx 反向代理配置。通过 NPM,你可以快速搭建高性能、安全的反向代理服务器,实现负载均衡、SSL 证书自动申请、自定义配置,配置 Web 应用防火墙,防止常见的 Web 攻击等功能。

一、安装

首先,确保已经安装了 Docker 和 Docker Compose,然后通过以下步骤来启动 nginx-proxy-manager 服务。

1、创建文件

shell
代码解读
复制代码
# 创建所需的文件夹 mkdir -p /home/docker/npm # 进入安装目录 cd /home/docker/npm # 创建 docker-compose.yml 文件 vim docker-compose.yml

在文件中,添加以下配置:

yaml
代码解读
复制代码
# 默认登陆名和密码 # Email: [email protected] # Password: changeme services: app: image: 'docker.io/jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' volumes: - /home/docker/npm/data:/data - /home/docker/npm/letsencrypt:/etc/letsencrypt

配置完成后,保存并退出编辑器(按下 i 进入编辑模式,按下 Esc 退出编辑模式,输入 :wq 保存并退出)。

2、启动服务

你可以通过以下命令启动服务:

shell
代码解读
复制代码
docker-compose up -d

这样,nginx-proxy-manager 就会在后台启动,默认通过 [email protected] 和 changeme 作为登录凭证。

3、中文镜像

  • 英文镜像:jc21/nginx-proxy-manager
  • 中文镜像:chishin/nginx-proxy-manager-zh

你可以根据需求切换镜像,中文镜像为中文界面,适合中文用户。

二、配置

Nginx Proxy Manager 允许你通过挂载自定义配置文件来定制 Nginx 配置。以下是一些常见的自定义配置文件路径和使用方法:

1、配置路径

在 Nginx Proxy Manager 中,你可以在 /data/nginx/custom 文件夹中添加自定义配置文件,按需引入到主配置文件中:

bash
代码解读
复制代码
/data/nginx/custom/root_top.conf # 包含在 nginx.conf 的顶部 /data/nginx/custom/root.conf # 包含在 nginx.conf 的最末尾 /data/nginx/custom/http_top.conf # 包含在 http 块的顶部 /data/nginx/custom/http.conf # 包含在 http 块的末尾 /data/nginx/custom/events.conf # 包含在 events 块的末尾 /data/nginx/custom/stream.conf # 包含在 stream 块的末尾 /data/nginx/custom/server_proxy.conf # 包含在代理服务器块的末尾 /data/nginx/custom/server_redirect.conf # 包含在重定向服务器块的末尾 /data/nginx/custom/server_stream.conf # 包含在流服务器块的末尾 /data/nginx/custom/server_stream_tcp.conf # 包含在 TCP 流服务器块的末尾 /data/nginx/custom/server_stream_udp.conf # 包含在 UDP 流服务器块的末尾
  • 配置文件示例
nginx
代码解读
复制代码
# Nginx 主配置文件 # ========================== # 1. 全局配置:root_top.conf # ========================== # 包含全局的基础配置(如模块加载、日志路径等) include /data/nginx/custom/root_top.conf; # ========================== # 2. 事件配置:events.conf # ========================== events { include /data/nginx/custom/events.conf; } # ========================== # 3. 主 HTTP 配置块:http_top.conf 和 http.conf # ========================== http { include /data/nginx/custom/http_top.conf; server_tokens off; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; # 服务器配置 server { listen 80; server_name proxy.example.com; include /data/nginx/custom/server_proxy.conf; } server { listen 80; server_name redirect.example.com; include /data/nginx/custom/server_redirect.conf; return 301 https://$host$request_uri; } include /data/nginx/custom/http.conf; } # ========================== # 5. 主流配置:stream.conf # ========================== stream { include /data/nginx/custom/stream.conf; server { listen 3306; proxy_pass backend_tcp_servers; include /data/nginx/custom/server_stream.conf; } server { listen 3307; proxy_pass backend_tcp_servers; include /data/nginx/custom/server_stream_tcp.conf; } server { listen 53 udp; proxy_pass backend_udp_servers; include /data/nginx/custom/server_stream_udp.conf; } } # ========================== # 9. 全局配置末尾:root.conf # ========================== include /data/nginx/custom/root.conf;

2、图床配置防盗链

为了防止未经授权的外部站点直接引用你的图像资源,可以在 Nginx 配置中启用防盗链。以下是一个简单的图床防盗链配置示例:

nginx
代码解读
复制代码
location ~* \.(gif|jpg|png|bmp)$ { valid_referers none blocked mslion.top *.mslion.top ~\.google\. ~\.bing\. ~\.baidu\.; if ($invalid_referer) { return 403; } proxy_pass https://blog.mslion.top; }
  • 匹配规则:此配置会匹配所有 .gif, .jpg, .png 和 .bmp 文件。
  • 合法引用者:指定哪些来源是合法的,非法来源会返回 403 Forbidden。
  • 代理转发:符合规则的请求将被转发到 https://blog.mslion.top 进行处理。

3、防止恶意查询参数

为了增强安全性,以下是防止恶意查询参数的配置示例:

  • http_top.conf 文件中添加:
nginx
代码解读
复制代码
# 定义恶意查询模式 map $query_string $blocked { default 0; # XSS 防御 "~*(alert\(||on\w+=|javascript:| # SQL 注入防御 "~*(--|or\s1=1|union\sselect|select\s.*from|drop\s+table|insert\s+into|update\s+set|delete\s+from|;--|#|0x|char\(|unhex\()" 1; # 文件包含攻击防御 "~*(/etc/passwd|/proc/self/environ|php://input|php://filter|file\://|ftp://|http://)" 1; # 命令注入防御 "~*(\|&|\&\||;|`|exec\(|system\(|passthru\(|shell_exec\(|popen\()" 1; # Webshell 特征防御 "~*(base64_encode\(|eval\(|gzinflate\(|gzuncompress\(|assert\(|create_function\(|function_exists\()" 1; # 禁止恶意 User-Agent 或 Referer "~*(bot|spider|crawl|wget|curl|nmap|nikto|sqlmap|libwww|httrack)" 1; # 命令执行关键字防御 "~*(rm\s-rf|chmod\s777|chown\s|chgrp\s)" 1; }
  • server_proxy.conf 文件中添加:
nginx
代码解读
复制代码
if ($blocked) { return 405; }

4、限制区域

为了限制特定国家/地区的访问,你可以使用 GeoIP2 模块进行地理位置限制。以下是配置示例:

  • root_top.conf 文件中启用 GeoIP2 模块:
nginx
代码解读
复制代码
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; load_module /usr/lib/nginx/modules/ngx_stream_geoip2_module.so;
  • http_top.conf 文件中加载 GeoLite2 数据库(数据库得自已下载,并上传到对应的目录):
nginx
代码解读
复制代码
geoip2 /data/nginx/custom/GeoLite2-Country.mmdb { $geoip2_data_country_code country iso_code; $geoip2_data_country_name country names en; }
  • server_proxy.conf 文件中根据 IP 限制访问(例如仅允许中国 IP):
nginx
代码解读
复制代码
if ($geoip2_data_country_code != "CN") { return 403; }
  • 也可在 Proxy Host 面板的 Advanced 配置中,添加类似的限制:
nginx
代码解读
复制代码
if ($geoip2_data_country_code != "CN") { return 403; }

测试输出

为了确保 GeoIP2 模块和其他防护措施正常工作,可以通过配置一个测试 URL 来验证是否按预期限制了访问。以下是输出测试的示例配置:

  • root_top.conf:启用 GeoIP2 模块(已在前面配置):
nginx
代码解读
复制代码
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; load_module /usr/lib/nginx/modules/ngx_stream_geoip2_module.so;
  • http_top.conf:配置日志格式并加载 GeoLite2 数据库:
nginx
代码解读
复制代码
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$geoip2_data_country_code" "$geoip2_data_country_name"'; geoip2 /data/nginx/custom/GeoLite2-Country.mmdb { $geoip2_data_country_code country iso_code; $geoip2_data_country_name country names en; }
  • server_proxy.conf:添加一个 /show-geoip 路由,用于输出地理位置信息,仅允许来自中国的请求访问:
nginx
代码解读
复制代码
location /show-geoip { # 仅允许中国的 IP 地址访问 if ($geoip2_data_country_code != "CN") { return 403; # 如果不是中国 IP,返回 403 禁止访问 } default_type text/plain; echo "Country Code: $geoip2_data_country_code"; echo "Country Name: $geoip2_data_country_name"; }
  • 通过访问 http://your-server-ip/show-geoip,你应该能够看到类似如下的输出(如果你的请求来自中国):
yaml
代码解读
复制代码
Country Code: CN Country Name: China

如果请求来自其他国家,Nginx 会返回 403 Forbidden 错误,确保只有符合地理位置要求的用户能够访问该页面。

三、其它

除了上面的 GeoIP2 地理位置限制和恶意查询防护,Nginx 还可以通过其他措施来增强安全性。以下是一些额外的防护和优化建议:

1、禁用不必要的 HTTP 方法

nginx
代码解读
复制代码
server { listen 80; server_name example.com; if ($request_method !~ ^(GET|POST|HEAD|OPTIONS)$) { return 405; } # 其他配置... }

2、启用 HTTP 安全头

配置一些 HTTP 安全头来增强网站的安全性,防止 XSS、Clickjacking 等攻击:

nginx
代码解读
复制代码
server { listen 443 ssl; server_name example.com; # 防止 Clickjacking add_header X-Frame-Options "SAMEORIGIN" always; # 防止 XSS 攻击 add_header X-XSS-Protection "1; mode=block" always; # 防止 MIME 类型嗅探 add_header X-Content-Type-Options "nosniff" always; # 禁止缓存敏感内容 add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; # 启用严格传输安全 (HSTS) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 其他配置... }

3、限制请求速率(Rate Limiting)

为了防止暴力破解和 DDoS 攻击,可以配置请求速率限制:

nginx
代码解读
复制代码
http { # 定义一个限制规则 limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server { listen 80; server_name example.com; # 启用速率限制 limit_req zone=one burst=10 nodelay; # 其他配置... } }

这将限制每个 IP 地址每分钟最多能发起 30 次请求,超过此限制的请求将被拒绝。

4、启用 SSL/TLS 加密

确保你的 Nginx 配置启用了 SSL/TLS 加密,以确保所有流量是加密的,防止中间人攻击(MITM)。以下是启用 SSL 的基础配置:

nginx
代码解读
复制代码
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; ssl_prefer_server_ciphers on; # 强制 HTTPS 重定向 if ($scheme != "https") { return 301 https://$host$request_uri; } # 其他配置... }

四、总结

通过以上的配置和步骤,你可以有效地配置和优化你的 nginx-proxy-manager,增强系统的安全性和性能。关键步骤包括:

  • GeoIP2 限制:通过加载 GeoIP2 数据库来限制访问来源,仅允许来自特定国家的请求访问。
  • 恶意查询防护:使用 Nginx 的 map 和 if 指令,防止恶意的查询参数(如 XSS、SQL 注入等)。
  • 防盗链:配置图床防盗链,确保只有合法来源的请求能够访问你的静态资源。
  • SSL/TLS 加密:启用 HTTPS 加密流量,确保数据安全。
  • HTTP 安全头:配置 HTTP 安全头,防止常见的 Web 攻击。
  • 请求速率限制:防止暴力破解和 DDoS 攻击。

通过这些优化措施,你能够提升你的反向代理服务器的安全性,保护你的网络资产免受恶意攻击,同时提升访问性能。

原文地址

注:本文转载自juejin.cn的码手Lion的文章"https://juejin.cn/post/7448512834663448587"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

142
代码人生
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top