Aşağıdaki topolojiyi inceleyebilirsiniz. İhtiyaç duyulan şartlar;
- Cloudflare dışında direkt erişim sağlanılamasın,
- CF Proxy kullanılsın + real ip alınabilsin.
Öncelikle ingress’in servisine(ingress-nginx-controller) “externalTrafficPolicy: Local” olarak değiştiriyoruz.
spec: clusterIP: x.x.x.x externalTrafficPolicy: Local internalTrafficPolicy: Cluster
Sonrasında ingress-nginx’in configmap’ini editliyoruz.
apiVersion: v1 data: allow-snippet-annotations: "true" whitelist-source-range: "173.245.48.0/20, 103.21.244.0/22, 103.22.200.0/22, 103.31.4.0/22, 141.101.64.0/18, 108.162.192.0/18, 190.93.240.0/20, 188.114.96.0/20, 197.234.240.0/22, 198.41.128.0/17, 162.158.0.0/15, 104.16.0.0/13, 104.24.0.0/14, 172.64.0.0/13, 131.0.72.0/22, 2400:cb00::/32, 2606:4700::/32, 2803:f800::/32, 2405:b500::/32, 2405:8100::/32, 2a06:98c0::/29, 2c0f:f248::/32" log-format-upstream: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id $http_x_forwarded_for $http_x_real_ip $http_cf_connecting_ip
Whitelist-source : Cloudflare’in ip adreslerini ekliyoruz.
Log-format-upstream: ingress’in logunda real ip adresini de alabilmek için $http_x_real_ip
ve $http_cf_connecting_ip
ekliyoruz. Cloudflare HTTP request headers · Cloudflare Fundamentals docs
Test
Host dosyama dış bacağı ekleyerek deneme yapıyorum. 403 aldığımı görebilirsiniz.
Host dosyamı eski haline getiriyorum. Erişebildiğimi gözlemliyorum. Gelen logu incelediğimde;
172.69.199.141 (Cloudflare client ip) - - [16/Jan/2024:10:25:49 +0000] "GET /?asda HTTP/1.1" 308 164 "-" "curl/8.1.2" 324 0.000 [foo-test-foo-test-http] [] - - - - 5e3d49fac2d68f959004391ee2443f9b x.x.x.x(Real ip) - x.x.x.x(Real ip)
İstenilen bir T anında CF arkasından dönmeden de sitelerin erişilebilir olduğununun testi;
Whitelist ve proxy modunu kapattığımızda ise erişim devam etmekte, CF adresi yerine real ip gözükmektedir. (Romanya’dan vpn yapılarak test edilmiştir.)
162.158.171.29 - - [16/Jan/2024:14:58:04 +0000] "GET /?asfjklsahjkgasdaf HTTP/2.0" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0" 823 0.001 [foo-test-foo-test-http] [] 10.42.0.10:80 615 0.001 200 7a26c8d7075ba0ece3ae845e3469926b 89.187.163.154 - 89.187.163.154