NGINX Conf 反馈请求:将特定 API 端点限制为 $remote_addr(s);

NGINX Conf 反馈请求:将特定 API 端点限制为 $remote_addr(s);

我以此作为信息来源:https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-2-protecting-backend-services/#access-control

我的服务器在 nginx 后面运行一个 docker 容器。这个容器的大多数 API 端点需要保持对任何人都可用(尽管我可能会在以后考虑限制它们的速率),但需要限制两个端点。我当前的配置似乎按预期运行,如下所示:

server {
    listen 80;
    server_name sub.domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name sub.domain.com;

    ssl_certificate /etc/letsencrypt/live/sub.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sub.domain.com/privkey.pem;

    location / {

        location = /api_endpoint {
            if ($remote_addr != xxx.xxx.xxx.xxx) {
                return 403; # Forbidden
            }
            proxy_pass http://localhost:8000;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;
        }

        location = /another/api_endpoint {
            if ($remote_addr != xxx.xxx.xxx.xxx) {
                return 403; # Forbidden
            }
            proxy_pass http://localhost:8000;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;
        }

        proxy_pass http://localhost:8000;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
    }
}

我不喜欢在不知道具体发生了什么的情况下复制粘贴代码。每一段代码:

proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;

是从另一组文档中复制而来,与此 docker 容器无关。因为这些文档列出了该项目的工作配置,所以我信任它,但现在我正在调整它,我有点好奇,并仔细阅读了这一页寻求解释。但如果有人对修剪这些块有任何反馈,我都愿意倾听。

我的主要问题是,我真正想知道的是,这种方法是否可行,或者是否有更好的方法来实现将 API 端点限制到发出这些请求的特定主机的相同目标?

除了主要问题外,还有另外两个次要问题:

  1. xxx.xxx.xxx.xxx我第一次尝试时xxx.domain.com没有成功。nginx 不为此解析 DNS 名称吗?
  2. 对于我的用例来说,将这两个端点限制到一个远程主机就足够了,但是我看到允许多个主机会很有用的情况。像这样是我能找到的最接近的办法,但我还是想听听其他选择。

非常感谢您的阅读!

答案1

http://nginx.org/en/docs/http/ngx_http_access_module.html#allowif是阻止/允许 IP 地址的首选方法。由于其工作方式不直观,因此最好不惜一切代价避免使用这种方法。

相关内容