Ingress官网关于block-cidrs说明

在 Kubernetes 中使用 Nginx Ingress Controller,可以实现黑名单和白名单的功能来控制哪些请求被接受或拒绝。黑名单用于禁止特定 IP 地址或 IP 地址范围的请求,而白名单用于仅允许特定 IP 地址或 IP 地址范围的请求通过。

一、配置黑名单

1.配置黑名单禁止某一个或某一段IP,需要在Nginx Ingress的ConfigMap中配置,比如将192.168.1.34(多个配置使用逗号分隔)添加至黑名单

[root@k8s-master01 ~]# cd ingress-nginx
[root@k8s-master01 ingress-nginx]# vim values.yaml
  config:
    block-cidrs: 192.168.100.34

配置黑名单-1

说明:config下面的其他配置是上面实验遗留配置

2.滚动更新 Nginx Ingress

在滚动更新之前,先测试192.168.1.34是否可以访问m.test.com,方便后面验证,观察到可以正常访问

[root@k8s-master01 ingress-nginx]# ssh k8s-node01
[root@k8s-node01 ~]# ip -4 a | grep 1.34
    inet 192.168.1.34/24 brd 192.168.1.255 scope global ens33

[root@k8s-node01 ~]# curl -H "Host:m.test.com" 192.168.1.35 -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 12:53:57 GMT
Content-Type: text/html
Content-Length: 62
Connection: keep-alive
Last-Modified: Thu, 12 Aug 2021 08:23:47 GMT
ETag: "6114da93-3e"
Accept-Ranges: bytes

接下来开始滚动更新

[root@k8s-master01 ~]# cd ingress-nginx
[root@k8s-master01 ingress-nginx]# helm upgrade ingress-nginx -n ingress-nginx .

3.再次使用 192.168.1.34 主机再次访问,发现该 IP 已经被禁止

[root@k8s-master01 ingress-nginx]# ssh k8s-node01
[root@k8s-node01 ~]# ip -4 a | grep 1.34
    inet 192.168.1.34/24 brd 192.168.1.255 scope global ens33

[root@k8s-node01 ~]# curl -H "Host:m.test.com" 192.168.1.35 -I
HTTP/1.1 403 Forbidden
Date: Mon, 31 Jul 2023 13:10:24 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

使用192.168.1.31 主机进行对比访问,发现该 IP 可以正常访问

[root@k8s-master01 ingress-nginx]# ip -4 a | grep 1.31
    inet 192.168.1.31/24 brd 192.168.1.255 scope global ens33

[root@k8s-master01 ingress-nginx]#  curl -H "Host:m.test.com" 192.168.1.35 -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 13:10:56 GMT
Content-Type: text/html
Content-Length: 62
Connection: keep-alive
Last-Modified: Thu, 12 Aug 2021 08:23:47 GMT
ETag: "6114da93-3e"
Accept-Ranges: bytes

二、配置白名单

白名单表示只允许某个 IP 可以访问,直接在 yaml 文件中配置即可(也可以通过 ConfigMap 配置),比如只允许 192.168.1.31 访问,只需要添加一个 nginx.ingress.kubernetes.io/whitelistsource-range 注释即可。

1.在192.168.1.31 和192.168.1.32主机上分别进行访问测试,观察到二者都成功访问

在192.168.1.31 主机上进行访问测试

[root@k8s-master01 ingress-nginx]# ip -4 a | grep 1.31
    inet 192.168.1.31/24 brd 192.168.1.255 scope global ens33

[root@k8s-master01 ingress-nginx]# curl -H "Host:test.com" 192.168.1.35 -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 13:16:23 GMT
Content-Type: text/html
Content-Length: 30
Connection: keep-alive
Last-Modified: Thu, 12 Aug 2021 08:21:09 GMT
ETag: "6114d9f5-1e"
Accept-Ranges: bytes

在192.168.1.32 主机上进行访问测试

[root@k8s-master01 ingress-nginx]# ssh k8s-master02
[root@k8s-master02 ~]# ip a | grep 1.32
    inet 192.168.1.32/24 brd 192.168.1.255 scope global ens33
    inet 10.0.0.1/32 scope global kube-ipvs0

[root@k8s-master02 ~]# curl -H "Host:test.com" 192.168.1.35 -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 13:18:33 GMT
Content-Type: text/html
Content-Length: 30
Connection: keep-alive
Last-Modified: Thu, 12 Aug 2021 08:21:09 GMT
ETag: "6114d9f5-1e"
Accept-Ranges: bytes

2.修改laptop-ingress.yaml文件

在原来的基础上添加如下配置:

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

配置白名单-1

添加完配置文件如下:

[root@k8s-master01 ~]# vim laptop-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.1.31
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/server-snippet: |
      set $agentflag 0;
              if ($http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle)" ){
                set $agentflag 1;
              }
              if ( $agentflag = 1 ) {
                return 301 http://m.test.com;
              }
  name: laptop
  namespace: study-ingress
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
         service:
           name: laptop
           port:
             number: 80
        path: /
        pathType: ImplementationSpecific

3.更新该 Ingress

[root@k8s-master01 ~]# kubectl replace -f laptop-ingress.yaml

4.在192.168.1.31 和192.168.1.32主机上分别进行访问测试,观察到192.168.1.31成功访问,192.168.1.32主机访问失败

[root@k8s-master01 ~]# curl -H "Host:test.com" 192.168.1.35 -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 13:24:29 GMT
Content-Type: text/html
Content-Length: 30
Connection: keep-alive
Last-Modified: Thu, 12 Aug 2021 08:21:09 GMT
ETag: "6114d9f5-1e"
Accept-Ranges: bytes

[root@k8s-master01 ~]# ssh k8s-master02
[root@k8s-master02 ~]# curl -H "Host:test.com" 192.168.1.35 -I
HTTP/1.1 403 Forbidden
Date: Mon, 31 Jul 2023 13:24:56 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive