【发布时间】:2018-08-26 21:51:34
【问题描述】:
我有一个在 localhost 上运行的 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。但我不认为这有什么不同。我也尝试在“位置/{}”范围内添加以下内容,但没有运气:
set_real_ip_from XX.XX.XX.XX;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
【问题讨论】:
-
使用
ufw并拒绝或允许 IP 地址。或为了灵活修复您的代码以检查数据库中允许的 IP 地址 -
@numb3r 感谢您的回答。我有其他 API、APP 和几个与此服务器关联的域。因此,我需要阻止此 API 的 IP,但不希望将限制应用于我设置的其他服务的其他路径。这最终都在同一个IP地址下。 ufw可以进行这样的配置吗?如果可以,你能举个例子吗?谢谢
-
ufw 不解析主机名,因此它不能根据请求的主机名进行智能防火墙。
-
看来您的 ip 解析有问题。因为我刚刚测试了你的例子。它按预期工作。让我们启用访问日志并查看它在请求中获取的 ip。在终端
tail -f /var/log/nginx/access.log中运行,然后在另一个终端或浏览器中尝试执行请求。或禁用允许拒绝规则,只需添加app.use((req, res, next) => {console.log(req.ip); next();});并捕获该真实 IP -
如果您想告诉服务器在对
foo.com的请求中使用环回接口,然后在/etc/hosts中添加这样的行:127.0.0.1 foo.com www.foo.com,这将告诉您的服务器不请求 DNS 服务器解析该主机名这将导致来自外部的请求。
标签: nginx