k8s Ingress 配置黑白名单

一、黑白名单用途

黑名单能有效防止某个IP恶意攻击或者拒绝特定IP的访问(黑名单以外的IP都能通过);白名单则只允许特定IP的访问(白名单以外的IP都不能通过)。

二、Ingress黑白名单配置

Ingress部署可以参考我之前的文章进行配置 EKS Ingress+ALB如何突破白名单数量限制?

2.1 配置黑名单

ingress 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: nginx.qa.service.com
namespace: qa
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |
set_real_ip_from 10.0.0.0/8; #上一级代理的IP地址或者IP段,可以写多行。
real_ip_header X-Forwarded-For; #从哪个header头检索出需要的IP地址。
real_ip_recursive on; #递归的去除所配置中的可信IP。
access_log /var/log/nginx/nginx.access.log upstreaminfo;
deny 192.168.208.88;
allow all;
spec:
rules:
- host: nginx.qa.service.com
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
  • nginx.ingress.kubernetes.io/server-snippet:在nginx 的 server 配置块中添加自定义配置;
  • nginx.ingress.kubernetes.io/whitelist-source-range:允许的客户端IP源范围,该值是逗号分隔的CIDR列表,例如10.0.0.0/24,172.10.0.1

测试白名单

192.168.208.88 这台电脑上访问

1
2
3
4
5
6
7
$ curl -Ik http://nginx.qa.service.com
HTTP/1.1 403 Forbidden
Date: Thu, 28 Jun 2021 06:07:30 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
Server: nginx/1.17.8

2.2 配置白名单

ingress 配置

获取客户端IP,添加白名单地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: nginx2.qa.service.com
namespace: qa
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |
set_real_ip_from 10.0.0.0/8; #上一级代理的IP地址或者IP段,可以写多行。
real_ip_header X-Forwarded-For; #从哪个header头检索出需要的IP地址。
real_ip_recursive on; #递归的去除所配置中的可信IP。
access_log /var/log/nginx/nginx2.access.log upstreaminfo;
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.208.88/32
spec:
rules:
- host: nginx2.qa.service.com
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80

测试白名单

192.168.208.88 这台电脑上访问

1
2
3
4
5
6
7
8
9
10
11
12
$ curl -Ik http://nginx2.qa.service.com
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2021 06:20:43 GMT
Content-Type: text/html
Content-Length: 1241
Connection: keep-alive
Server: nginx/1.17.8
Vary: Accept-Encoding
Last-Modified: Thu, 10 Jun 2021 09:39:53 GMT
ETag: "60c1dde9-4d9"
Cache-Control: no-store, no-cache, private
Accept-Ranges: bytes

获取客户端IP 方式二

还有一种更简单获取客户端IP的方式,在ingress configmap配置文件data下添加 use-forwarded-headers: 'true'

1
2
3
4
5
6
7
8
9
10
11
12
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: gray-01
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
data:
compute-full-forwarded-for: 'true'
forwarded-for-header: X-Forwarded-For
use-forwarded-headers: 'true'

这个在每个ingress上只需要使用 nginx.ingress.kubernetes.io/whitelist-source-range 添加白名单地址就可以了

全局白名单配置

配置 ingressconfigmap 配置 nginx-configuration

1
2
3
4
5
6
7
8
9
10
11
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: gray-01
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
data:
whitelist-source-range: 192.168.208.1/24
block-cidrs: 192.168.208.1

该配置对所在 namespace 下的所有 ingress 都生效,实际使用则非常少见,了解就行了

-------------本文结束感谢您的阅读-------------