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:
- Request yang masuk ke traefik diteruskan ke auth server, jika ip address dalam request tersebut ada di blocklist maka kirim respon 403 dan request tidak diteruskan ke service chart-checkout.
- Request yang masuk ke traefik diteruskan ke auth server, jika ip address dalam request tersebut tidak ada di blocklist maka kirim respon 200 dan request akan diteruskan ke service chart-checkout.
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:
- real_ip_header diambil dari X-Forwarded-For karena Traefik ini dibelakang metallb
- set_real_ip_from best practicenya cuma allow dari IP LB yang ada di depan traefik, aku allow semua krn masih test.
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~~