[英]Allow only a single specific IP address on Nginx under reverse proxy
我有一個在本地主機上運行的 api。 為了允許外部訪問特定域路徑下的 API,我設置了一個反向代理。 這部分工作正常。 現在我正在嘗試過濾訪問並只允許一個 IP 連接到 API,換句話說,拒絕除特定 IP 之外的所有 IP 連接。
通過下面的配置,所有 IP 都被成功阻止,但它也阻止了我想要允許的一個 IP。 我已經研究並嘗試了幾個修復程序,我懷疑我需要在反向代理下獲取 real_IP,但還沒有設法使其適用於我的特定情況。 感謝所有幫助。 這是我在站點可用的 nginx 配置文件的代碼:
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name foo.com www.foo.com;
location / {
allow XX.XX.XX.XX;
#allow 127.0.0.1;
deny all;
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/foo.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/foo.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
XX.XX.XX.XX 是我想要允許的 IP,它實際上是服務器的實際 IP。 但我不認為這有什么不同。 我還嘗試在“location /{ }”范圍內添加以下內容,但沒有運氣:
set_real_ip_from XX.XX.XX.XX;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
我認為將該控制置於 Web 服務器級別並不是一個好主意。
授予訪問權限是更具防火牆性的任務。
但是在某些情況下,當您想在不重新啟動或配置某些內容的情況下動態授予對已注冊主機的訪問權限時 - 最好在應用程序級別創建保護方法。
現在我可以推薦以下之一:
1) 將防火牆放在 app 或 nginx 前面。 你可以使用ufw
2)將訪問控制置於應用程序級別。 如果是 nodejs 應用程序編寫中間件:
middlewares/allowByIp.js
:
'use strict';
cons db = require('../database'); // mongoose models abstraction
const AllowedHosts = db.model('AllowedHost');
module.exports = async (req, res, next) => {
const isAllowed = await AllowedHosts.findOne({ip: req.ip});
if (!isAllowed) {
res.status(403).send('Forbidden');
}
next();
};
或者 :
'use strict';
cons allowedHosts = [... ip listing ...]; // take care of graceful restarting of Your app when You'll modify this array
module.exports = async (req, res, next) => {
const isAllowed = allowedHosts.includes(req.ip);
if (!isAllowed) {
res.status(403).send('Forbidden');
}
next();
};
在app.js
:
const express = require('express');
const app = express();
const ipFirewall = require('middlewares/allowByIp');
app.use(ipFirewall);
...
app.listen(3000);
我已經檢查了您的 nginx 示例,它按預期工作。
所以我懷疑nginx得到了不同的ip。 檢查/var/log/nginx/access.log
以獲取當源部分請求目標時您的 nginx 獲得的真實 IP 地址。
但是,如果你想在內部限制訪問,告訴服務器在對foo.com
請求中使用環回接口,然后在/etc/hosts
文件中添加這樣的行:
127.0.0.1 foo.com www.foo.com
它會告訴您的服務器不要請求 DNS 服務器來解析該主機名,這將提供全局 ip 並導致來自外部的請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.