sumarsono.com
Take it with a grain of salt


Traefik V1 Ip Blocklist

Posted on

Traefik v1.7.24, ingress controller yang saat ini kupakai, tidak memiliki fitur blocklist IP Address tapi memilik fitur sebaliknya. Aneh ya. Umumnya blocklist dan allowlist ini satu paket. Sedikit konteks, aku pakai kubernetes. Ingress controller yang kupakai adalah traefik v1.7.24. Misal aku punya service chart-checkout. Aku ingin hanya IP address 140.213.59.224 yang boleh mengakses service tersebut, IP address lainnya harus di block, maka bisa pakai fitur bawaan traefik whitelist allowlist ip address. Masalahnya adalah ketika aku ingin service chart-checkout boleh diakses oleh semua IP address kecuali 140.213.59.224. Traefik gak punya fitur ip address blocklist. Sekali lagi, aneh. Btw konteks disini traefik v1.7.24 ya.

Disini harus memutar otak, untugnya traefik membawa fitur forwardAuth. Aku bisa memanfaatkan fitur traefik forwardAuth untuk blocklist ip address. Kira-kira begini alurnya:

Kira-kira begitu alur sederhananya. Langsung saja aku bikin auth servernya, dalam hal ini aku mau pakai nginx.

Pertama, aku bikin namespace untuk auth server:

kubectl create ns fwdauth

Kemudian aku siapkan dulu dua buah configmap untuk nginx yaitu blocklist.yaml dan default.yaml, di dalam blocklist aku mau block range ip 195.34.0.0/16

blocklist.yaml

apiVersion: v1
data:
  blocklist.conf: |
    # The following is a map of IP address/ranges with a value
    # that specifies if the IP address is allowed or not. 
    # 0 = Allowed (default)
    # 1 = Denied (response 403) - any number above 0 will be considered as denied.
    geo $blocked_ip {
      default        0;

      195.34.0.0/16   1;
      #192.168.1.0/24 1;
      #10.1.0.0/16    1;
    }
kind: ConfigMap
metadata:
  name: blocklist
  namespace: fwdauth

default.yaml

apiVersion: v1
data:
  default.conf: |
    server {
      listen 8080;
      location /traefik {
         add_header Content-Type "default_type text/plain";
         if ($blocked_ip) {
             return 403;
         }
         return 200 "OK";
      }
    }
    real_ip_header      X-Forwarded-For;
    set_real_ip_from    0.0.0.0/0;
kind: ConfigMap
metadata:
  name: nginx-default
  namespace: fwdauth

Note:

Aku apply dua configmap tersebut:

kubectl apply -f default.yaml -f blocklist.yaml

Selanjutnya aku bikin deployment dan service ipfilter yg isinya nginx:

ipfilter.yaml

apiVersion: v1
kind: Service
metadata:
  namespace: fwdauth
  name: ipfilter
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: ipfilter
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: fwdauth
  name: ipfilter
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ipfilter
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: ipfilter
    spec:
      containers:
      - image: "nginx:1.14.2"
        name: ipfilter
        ports:
        - containerPort: 8080
          name: http
        volumeMounts:
        - name: nginx-default
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
        - name: blocklist
          mountPath: /etc/nginx/conf.d/blocklist.conf
          subPath: blocklist.conf
      volumes:
      - name: blocklist
        configMap:
          name: blocklist
      - name: nginx-default
        configMap:
          name: nginx-default

Untuk test sangat mudah, aku tinggal exec ke salah satu pod yg punya cUrl kemudian jalankan:

curl -iL -H "X-Forwarded-For: 195.34.243.179" ipfilter.fwdauth.svc.cluster.local/traefik
HTTP/1.1 403 Forbidden
Server: nginx/1.14.2
Date: Fri, 17 Jul 2020 08:09:09 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>

IP 195.34.243.179 masuk dalam range 195.34.0.0/16 yang ada di blocklist. Sesuai harapan dia di block.

Lanjut,

curl -iL ipfilter.fwdauth.svc.cluster.local/traefik
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Fri, 17 Jul 2020 08:09:13 GMT
Content-Type: application/octet-stream
Content-Length: 2
Connection: keep-alive
Content-Type: default_type text/plain

OK

Selain ip dalam range 195.34.0.0/16 responnya 200. Sesuai harapan.

Selanjutnya tinggal konfigurasi forwardAuth di Traefik, tapi aku lanjutkan kapan-kapan, sementara sampai disini dulu

bersambung~~

Traefik V1 Ip Blocklist Part 2