客观的
我想阻止数据库访问 URL,例如https://example.com/web/database/selector或者https://example.com/web/database/manager,在 Odoo 部署中,针对所有外部流量,但有几个特定的 IP。
为了避免鼓励人们通过“访问被拒绝”或“未经授权的访问”消息进行更深入的探索,我想使用 404 页面未找到错误消息来做到这一点,并且对于 404,使用 Odoo 的 404 错误模板而不是 Nginx 模板。
我尝试过并且知道的
我知道最简单的拒绝方式是添加这样的位置块:
# Odoo Server #
upstream odoo {
server 127.0.0.1:8069;
}
# HTTP Web Server
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Block Database Manager/Selector Access via URL except for us
location ~* /web/database/* {
allow ###.###.###.###;
deny all;
proxy_pass http://odoo;
}
# Reverse Proxy Invocation for Odoo Server #
location / {
proxy_pass http://odoo;
}
这个功能很完美,除了它会启动一个 Nginx 模板 403 禁止消息,而我的目标是一个 404 页面未找到错误消息,它也没有样式、格式或任何东西,所以它也不是 Odoo 404 模板。
我也尝试过以下位置块:
# Odoo Server #
upstream odoo {
server 127.0.0.1:8069;
}
# HTTP Web Server
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Block Database Manager/Selector Access via URL except for us
location ~* /web/database/* {
if ($remote_addr != ###.###.###.###) {
return 404;
proxy_pass http://odoo;
}
}
# Reverse Proxy Invocation for Odoo Server #
location / {
proxy_pass http://odoo;
}
这个会给我 404 Page Not Found 错误消息,但是,它是 Nginx 模板,而不是 Odoo 的模板,并且限制不起作用,即使调用来自 IP ###.###.###.###,我也会收到 404 错误。
但是,如果我将 更改!=
为 a =
,并且为了测试也将返回更改为 444,它会识别 IP ###.###.###.###,因为我现在收到“ERR_EMPTY_RESPONSE”消息。
我已经阅读过关于使用IF
在位置块内使用的内容,包括如果是邪恶的文章nginx.com但它应该能够在操作上顺利运行return
。
# Odoo Server #
upstream odoo {
server 127.0.0.1:8069;
}
# HTTP Web Server
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Block Database Manager/Selector Access via URL except for us
location ~* /web/database/* {
if ($remote_addr = ###.###.###.###) {
return 444;
proxy_pass http://odoo;
}
}
# Reverse Proxy Invocation for Odoo Server #
location / {
proxy_pass http://odoo;
}
我研究过
似乎可以通过 Rewrite 来实现这一点,只需将其保存在 Web 应用程序和使用的 URL 中即可,我甚至找到了一个关于如何在 Apache 上实现它的示例,但是我尝试理解它或为 Nginx 设置它的所有尝试都失败了,它如下所示:
#Block database manager
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/web/database/manager [NC]
RewriteCond %{REMOTE_ADDR} !^##1\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##2\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##3\.###\.###\.###
RewriteRule ^ - [F]
#Block database selector
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/web/database/selector [NC]
RewriteCond %{REMOTE_ADDR} !^##1\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##2\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##3\.###\.###\.###
RewriteRule ^ - [F]
我还发现这个部署有我想要实现的功能,试试这个关联
当前 Nginx 配置文件
这是我当前的 Nginx 配置文件,所有内容(包括应用程序的每个功能)目前均正常运行,但当不是来自 IP ###.###.###.### 时,我确实收到了不需要的 403 禁止访问 Nginx 模板消息
我正在使用 Ubuntu 20.04、Odoo V15 和 Nginx 版本 1.22.0
# ============================================================================ #
# Web Server NGINX Configuration for Example.com #
# ============================================================================ #
# ============================================================================ #
# 1. Services #
# ============================================================================ #
# #
# Odoo Server #
upstream odoo {
server 127.0.0.1:8069;
}
# Longpolling Server (A must for Workers > 0 in the odoo.conf and for Chat) #
upstream longpolling {
server 127.0.0.1:8072;
}
# --------------------------------------------------------------- End Services #
# ============================================================================ #
# 2. HTTP Web Server #
# ============================================================================ #
# #
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
# Redirect to HTTPS #
location / {
return 301 https://example.com$request_uri;
}
}
# ------------------------------------------------------------ End HTTP Server #
# ============================================================================ #
# 3. HTTPS Web Server #
# ============================================================================ #
# #
server {
listen 443 ssl http2 default_server;
listen [::]:443;
server_name example.com www.example.com;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
access_log /var/log/nginx/example.com.ssl.access.log;
error_log /var/log/nginx/example.com.ssl.error.log;
# Certificate and Key Path #
ssl_certificate /path/to/chained.crt;
ssl_certificate_key /path/to/private.key;
# Proxy Performance Settings #
proxy_buffers 16 64k;
proxy_buffer_size 128k;
# Proxy Security Settings #
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Odoo-dbfilter "TEST";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
# Block Database Manager/Selector Access via URL except for us
location ~* /web/database/* {
allow ###.###.###.###;
deny all;
proxy_pass http://odoo;
}
# Reverse Proxy Invocation for Odoo Server #
location / {
proxy_pass http://odoo;
}
# Reverse Proxy Invocation for Longpolling #
location /longpolling {
proxy_pass http://longpolling;
proxy_redirect off;
}
# Reverse Proxy Invocation for Web Assets #
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
# Reverse Proxy Invocation for Web Images #
location ~* /website/image/ir.attachment/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
# Access to Common gzip files #
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;
}
# ####################### End NGINX Configuration File ####################### #
我还设置了 default.conf 来防止直接通过 IP 访问:
# ============================================================================ #
# Web Server NGINX Configuration for Defaukt #
# ============================================================================ #
# ============================================================================ #
# 1. HTTP and HTTPS Web Server to Block Access by IP #
# ============================================================================ #
# #
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 default_server;
ssl_reject_handshake on;
server_name _;
return 444;
}
# ####################### End NGINX Configuration File ####################### #
我很高兴能得到正确的指导,或者告诉我遗漏了什么或者做错了什么。
谢谢。
答案1
解决了!
谢谢djdomi我解决了我遇到的问题,并得到了我需要的解决方案,回答他提到。
我所做的是在我的 default.conf 中添加自定义错误重定向:
error_page 403 /error/403;
由于allow
和deny
参数按预期工作但显示基本的 Nginx 403 错误,通过定义自定义错误重定向到它,现在显示 Odoo 404 错误模板并且用户使用的 URL 仍然存在,我认为这是因为example.com/error/403
在应用程序中不存在,因此就此而言,请随意为 Odoo 使用一个您确定在您的部署中不存在的 URL 和一个您永远不会使用的 URL。
这是完整的 default.conf,以防有人需要它,它与我在问题中发布的 example.com.conf 完美配合:
# ============================================================================ #
# Web Server NGINX Configuration for Default #
# ============================================================================ #
# ============================================================================ #
# 1. HTTP and HTTPS Web Server to Block Access by IP #
# ============================================================================ #
# #
# Custom Error to replace Nginx Error
error_page 403 /error/403;
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 default_server;
ssl_reject_handshake on;
server_name _;
return 444;
}
# ####################### End NGINX Configuration File ####################### #
谢谢,希望这对其他人有帮助。