nginx proxy manager (npm) 是一款功能强大的开源软件,它提供了一个用户友好的界面,让用户可以轻松地管理 nginx 反向代理配置。通过 npm,你可以快速搭建高性能、安全的反向代理服务器,实现负载均衡、ssl 证书自动申请、自定义配置,配置 web 应用防火墙,防止常见的 web 攻击等功能。
一、安装
首先,确保已经安装了 docker 和 docker compose,然后通过以下步骤来启动 nginx-proxy-manager
服务。
1、创建文件
# 创建所需的文件夹 mkdir -p /home/docker/npm # 进入安装目录 cd /home/docker/npm # 创建 docker-compose.yml 文件 vim docker-compose.yml
在文件中,添加以下配置:
# 默认登陆名和密码 # email: admin@example.com # 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、启动服务
你可以通过以下命令启动服务:
docker-compose up -d
这样,nginx-proxy-manager
就会在后台启动,默认通过 admin@example.com
和 changeme
作为登录凭证。
3、中文镜像
- 英文镜像:
jc21/nginx-proxy-manager
- 中文镜像:
chishin/nginx-proxy-manager-zh
你可以根据需求切换镜像,中文镜像为中文界面,适合中文用户。
二、配置
nginx proxy manager 允许你通过挂载自定义配置文件来定制 nginx 配置。以下是一些常见的自定义配置文件路径和使用方法:
1、配置路径
在 nginx proxy manager 中,你可以在 /data/nginx/custom
文件夹中添加自定义配置文件,按需引入到主配置文件中:
/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 主配置文件 # ========================== # 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 配置中启用防盗链。以下是一个简单的图床防盗链配置示例:
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 文件中添加:
# 定义恶意查询模式 map $query_string $blocked { default 0; # xss 防御 "~*(alert\(|<script>|</script>|on\w+=|javascript:|<img\s+src=|<svg\s+οnlοad=)" 1; # 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 文件中添加:
if ($blocked) { return 405; }
4、限制区域
为了限制特定国家/地区的访问,你可以使用 geoip2 模块进行地理位置限制。以下是配置示例:
- root_top.conf 文件中启用 geoip2 模块:
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 数据库(数据库得自已下载,并上传到对应的目录):
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):
if ($geoip2_data_country_code != "cn") { return 403; }
- 也可在 proxy host 面板的 advanced 配置中,添加类似的限制:
if ($geoip2_data_country_code != "cn") { return 403; }
测试输出
为了确保 geoip2 模块和其他防护措施正常工作,可以通过配置一个测试 url 来验证是否按预期限制了访问。以下是输出测试的示例配置:
- root_top.conf:启用 geoip2 模块(已在前面配置):
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 数据库:
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
路由,用于输出地理位置信息,仅允许来自中国的请求访问:
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
,你应该能够看到类似如下的输出(如果你的请求来自中国):
country code: cn country name: china
如果请求来自其他国家,nginx 会返回 403 forbidden
错误,确保只有符合地理位置要求的用户能够访问该页面。
三、其它
除了上面的 geoip2 地理位置限制和恶意查询防护,nginx 还可以通过其他措施来增强安全性。以下是一些额外的防护和优化建议:
1、禁用不必要的 http 方法
server { listen 80; server_name example.com; if ($request_method !~ ^(get|post|head|options)$) { return 405; } # 其他配置... }
2、启用 http 安全头
配置一些 http 安全头来增强网站的安全性,防止 xss、clickjacking 等攻击:
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 攻击,可以配置请求速率限制:
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 的基础配置:
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 攻击。
通过这些优化措施,你能够提升你的反向代理服务器的安全性,保护你的网络资产免受恶意攻击,同时提升访问性能。
到此这篇关于nginx proxy manager配置web waf应用防火墙的文章就介绍到这了,更多相关nginx proxy manager配置防火墙内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论