如果使用Cloudflare取IP的問題和解決方法
由於網路發展的快速,越來越多開發者為了避免使用者等待網頁讀取時間過長而使用CDN,而CloudFlare是如今網站常用的CDN服務供應商,專門提供網站加速與安全防護的服務。
最近遇到了一個有使用CloudFlare專案的需求是記錄使用者的IP方便確認哪些是惡意攻擊的使用者以方便封鎖。但因為這個專案是有使用CloudFlare,取到的IP都是從CloudFlare出來的,無法確認真正的使用者是從哪裡來。
以下就要來介紹的是在使用CloudFlare時取得使用者真實IP的方法。
一般沒有使用CloudFlare的網站,以NGINX和PHP為例,取使用者IP的順序會是以下列表的順序
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_X_CLUSTER_CLIENT_IP
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- REMOTE_ADDR
但是網站有使用CloudFlare的話,是無法利用以上的參數取得使用者真實IP,只會拿到從CloudFlare反向代理出來的IP。
而CloudFlare有提供設定的方法去到這個檔案“/etc/nginx/conf.d/nginx-cloudflase-realip.conf"
貼上以下設定
set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2c0f:f248::/32; set_real_ip_from 2a06:98c0::/29; #use any of the following two real_ip_header CF-Connecting-IP; #real_ip_header X-Forwarded-For;
貼上後並重啟nginx,最後在PHP中就可以取得$_SERVER[“HTTP_CF_CONNECTING_IP"]
在尚未被CloudFlare轉址前的IP。
參考資料
https://devco.re/blog/2014/06/19/client-ip-detection/
https://stackoverflow.com/questions/43689588/how-to-set-up-realip-module-in-nginx
以上就是本篇的分享呦!大家都知道該如何做了嗎?喜歡歐斯瑞文章的讀者們,記得追蹤我們的Facebook粉絲團及IG,也別忘了訂閱電子報,隨時掌握第一手消息喔!若有任何問題,歡迎隨時聯繫我們~
我要留言