阻止入口nginx负载平衡器上的特定路径



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

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

有两种方法可以实现这一点:

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

请注意,使用这种方法:

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


2。第二个是使用ConfigMaps和服务器片段:

您要做的是定位您的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时,无法在入口资源对象中定义您正在阻止的路径。然而,通过ConfigMap使用location-snippet还有另一种方法:

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

对于ingress对象中的每个现有路径,都会有ingress规则,但对于特定的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>

附加信息:1.16中删除了弃用的API。以下是您需要了解的内容:

v1.22版本将停止为以下不推荐使用的API提供服务支持更新和更稳定的API版本:

扩展/v1beta1 API版本中的入口将不再是服务

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

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

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。

只需在入口中添加此注释

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

相关内容

  • 没有找到相关文章

最新更新