【问题标题】:Block particular path on ingress-nginx Loadbalancer在 ingress-nginx 负载均衡器上阻止特定路径
【发布时间】:2020-12-04 16:55:24
【问题描述】:

我有很多域指向入口控制器 IP。我想阻止所有域/站点的/特定路径。有没有办法做到这一点。 我可以为每个站点使用nginx.ingress.kubernetes.io/configuration-snippet: | 。但是要同时为所有站点/域/入口资源寻找方法。

使用的控制器:https://kubernetes.github.io/ingress-nginx/

【问题讨论】:

  • 为了向您提供解决方案,我们需要您提供更多详细信息,以帮助我们了解您的目标。入口的目的是允许流量,而不是阻止,所以如果你想阻止某些特定的路径,为什么还要提到它?提供你的入口配置清单也会让我们更清楚地了解你的用例。我们可以假设您使用的是 nginx 入口控制器吗?如果是,十个哪个(nginxinc 或 nginx 社区)。
  • @thomas 许多站点/域指向入口控制器。我想阻止所有站点/域/子域的路径/admin-access。有没有办法在自己的控制器上做到这一点?
  • 可能有办法,但我仍然需要测试它。完成后我会发布我的答案

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

有两种方法可以实现:

1.第一个是使用server-snippet 注释:

使用注解nginx.ingress.kubernetes.io/server-snippet它 可以在服务器配置中添加自定义配置 块。

这是我的入口对象清单:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
     nginx.ingress.kubernetes.io/server-snippet: |
          location ~* /admin-access {
              deny all;
              return 403;
            }
spec:
  rules:
  - host: domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web 
          servicePort: 80

请注意使用this 方法:

此注解每个主机只能使用一次。


2。第二个是ConfigMapsServer-snippet的用法:

你要做的就是找到你的configMap

 kubectl get pod <nginx-ingress-controller>  -o yaml

这是位于容器args:

  spec:
   containers:
   - args:
     -  /nginx-ingress-controller
     - configmap=$(POD_NAMESPACE)/nginx-loadbalancer-conf

然后只需编辑它并添加server-snippet 部分:

   apiVersion: v1 
   data:  
   server-snippet:  |
   location /admin-access {
   deny  all;
    }

此方法允许您为 Ingress 资源中定义的所有主机全局定义受限位置。


请注意,使用 server-snippet 时,您正在阻止的路径无法在入口资源对象中定义。然而,location-snippet 通过ConfigMap 有另一种方式:

location ~* "^/web/admin { 
        deny all; 
        }

对于入口对象中的每个现有路径,都会有入口规则,但它会针对特定的 uri 被阻止(在上面的示例中,当admin 出现在web 之后时,它会被阻止)。所有其他 uri 都将通过。


3。这是一个测试:

➜  curl -H "Host: domain.com"  172.17.0.4/test             
...
 "path": "/test",
 "headers": {
...
 },
 "method": "GET",
 "body": "",
 "fresh": false,
 "hostname": "domain.com",
 "ip": "172.17.0.1",
 "ips": [
   "172.17.0.1"
 ],
 "protocol": "http",
 "query": {},
 "subdomains": [],
 "xhr": false,
 "os": {
   "hostname": "web-6b686fdc7d-4pxt9"
...  

这是一个路径被拒绝的测试:

➜  curl -H "Host: domain.com"  172.17.0.4/admin-access

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

➜  curl -H "Host: domain.com"  172.17.0.4/admin-access/test
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

其他信息:Deprecated APIs Removed In 1.16。以下是您需要了解的内容:

v1.22 版本将停止提供以下已弃用的 API 支持更新和更稳定的 API 版本:

extensions/v1beta1 API 版本中的 Ingress 将不再是 送达

【讨论】:

  • 谢谢。效果很好。
【解决方案2】:

您不能阻止特定路径。您可以做的是将 ingress 内的主机路径指向默认的 backedn 应用程序,例如 404 default backedn。

【讨论】:

    【解决方案3】:

    您可以使用入口注释应用它

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        cert-manager.io/cluster-issuer: channel-dev
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/whitelist-source-range: "27.110.30.45, 68.50.85.421"
      name: dev-ingress
      namespace: development
    spec:
      rules:
      - host: hooks.dev.example.com
        http:
          paths:
          - backend:
              serviceName: hello-service
              servicePort: 80
            path: /incoming/message/
      tls:
      - hosts:
        - hooks.dev.example.com
        secretName: channel-dev
    

    路径https://hooks.dev.example.com/incoming/message/ 将只能从提到的 IP 访问,其他用户将收到 403 错误并且无法访问该 URL。

    只需在 ingress 中添加此注解

    nginx.ingress.kubernetes.io/whitelist-source-range
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2019-04-10
      相关资源
      最近更新 更多