阻止 ingress-nginx 负载均衡器上的特定路径
Block particular path on ingress-nginx Loadbalancer
我有很多域指向 Ingress Controller IP。我想阻止所有 domains/sites 的 /particular-path。有没有办法做到这一点。
我可以为每个站点使用 nginx.ingress.kubernetes.io/configuration-snippet: |
。但是正在寻找一次处理所有 sites/domains/Ingress 资源的方法。
您可以使用入口注释应用它
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
您不能阻止特定路径。您可以做的是将入口内主机的路径指向一个默认的 backedn 应用程序,例如 404 default backedn。
有两种方法可以实现:
1.第一个是使用 server-snippet
注释:
Using the annotation nginx.ingress.kubernetes.io/server-snippet
it
is possible to add custom configuration in the server configuration
block.
这是我的入口对象清单:
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 方法:
This annotation can be used only once per host.
2。第二个是使用 ConfigMaps and Server-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。这是您需要知道的:
The v1.22 release will stop serving the following deprecated API
versions in favor of newer and more stable API versions:
Ingress in the extensions/v1beta1 API version will no longer be
served
我有很多域指向 Ingress Controller IP。我想阻止所有 domains/sites 的 /particular-path。有没有办法做到这一点。
我可以为每个站点使用 nginx.ingress.kubernetes.io/configuration-snippet: |
。但是正在寻找一次处理所有 sites/domains/Ingress 资源的方法。
您可以使用入口注释应用它
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
您不能阻止特定路径。您可以做的是将入口内主机的路径指向一个默认的 backedn 应用程序,例如 404 default backedn。
有两种方法可以实现:
1.第一个是使用 server-snippet
注释:
Using the annotation
nginx.ingress.kubernetes.io/server-snippet
it is possible to add custom configuration in the server configuration block.
这是我的入口对象清单:
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 方法:
This annotation can be used only once per host.
2。第二个是使用 ConfigMaps and Server-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。这是您需要知道的:
The v1.22 release will stop serving the following deprecated API versions in favor of newer and more stable API versions:
Ingress in the extensions/v1beta1 API version will no longer be served