CloudFlare hoạt động như một reverse proxy, do đó toàn bộ kết nối tới server của bạn sẽ hiển thị với IP của CloudFlare.
Nếu server của bạn cấu hình có sử dụng đến IP, như dùng firewall, log file… thì bắt buộc phải điều chỉnh thêm vài thao tác nữa để có thể hoạt động ổn định.
Địa chỉ IP gốc của người dùng được lưu trong header X-Forwarded-For
hoặc header CF-Connecting-IP
, bạn dùng header nào cũng được.
Lấy IP gốc client khi dùng CloudFlare với Nginx
Mở file cấu hình Nginx, thường có đường dẫn /etc/nginx/nginx.conf
và đặt đoạn cấu hình Nginx real IP module sau trong block http { }
.
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/12; 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 199.27.128.0/21; 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;
Danh sách IP được update tại CloudFlare IP Ranges
Ngoài ra, bạn cần điều chỉnh lại log_format để sử dụng tham số $http_cf_connecting_ip
hoặc $http_x_forwarded_for
như sau:
log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
Reload lại Nginx để sử dụng cấu hình mới là xong.
Danh sách IP này thỉnh thoảng cần được update, bạn có thể lấy IP mới nhất ở đây.
Lấy IP gốc client khi dùng CloudFlare với Apache
Nếu dùng Apache Webserver, bạn có thể sử dụng package có sẵn mod_cloudflare.
1. Cài đặt package cần thiết
– Red Hat/Fedora:
sudo yum install httpd-devel libtool git
– Debian/Ubuntu:
sudo apt-get install apache2-dev libtool git
2. Clone code mod_cloudflare mới nhất
git clone https://github.com/cloudflare/mod_cloudflare.git && cd mod_cloudflare
3. Compile thành module
Red Hat/Fedora/Debain/Ubuntu:
apxs -a -i -c mod_cloudflare.c
4. Restart webserver và kiểm tra lại module đã được active
– Red Hat/Fedora:
service httpd restart && httpd -M|grep cloudflare
– Debian/Ubuntu:
sudo apachectl restart; apache2ctl -M|grep cloudflare
5. Nếu web server của bạn sử dụng load balancer thì cần add thêm dòng sau vào file cấu hình Apache:
CloudFlareRemoteIPTrustedProxy 123.123.123.123
Xem thêm thông tin chi tiết tại đây, hướng dẫn sử dụng CloudFlare và cấu hình cho WordPress, Joomla…
Chúc bạn thành công.
Mình xem trong file/etc/nginx/nginx.conf mặc định đã có sẵn dòng này:
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
Nhưng hơi khác dòng của bạn trong bài viết. Như thế có được không? Hay mình sửa theo dòng như trong bài viết?
Cảm ơn bạn!
Nếu như bạn đã lấy được IP thật rồi thì không cần sửa gì nhé. Vì phần log_format là chỉnh cách hiển thị trên Log thôi
Chào mọi người mình là người dùng Server Windows mình cũng vừa chuyển qua dùng Linux một thời gian nên cũng chưa rành. Mình đã làm đọc bài viết của admin và làm rất nhiều lần nhưng vẫn không thể lấy được ip thật của người dùng. Ai có thể liên hệ và cấu hình giúp mình, mình xin hậu tạ.
skype: thanhtong.max
Xin cảm ơn rất nhiều
Các bác ơi e muốn sử dụng SSL của Cloudflare nhưng muốn hiện IP thật của Host được không các bác? Em dùng Webinoly + Ubuntu 18.
Webinoly là Ubuntu + Nginx + MariaDB (MySQL) + PHP nên mình nghĩ là được thôi
Thank bác, nhưng phải làm cách nào mới đc ạ, e đã làm theo hướng dẫn trên nhưng không được 🙁
Nginx Conf của bạn như thế nào? Bạn sửa đã restart chưa? Bạn xem qua log access vẫn IP CloudFlare à?
Em đã restart rồi bác, em ping vẫn là IP của CloudFlare bác à 🙁
File config của em, bác xem giúp e nhé! https://pastebin.com/wHBwRWUU
Thank bác nhiều!
Hình như bạn hiểu nhầm mục đích bài viết rồi. Việc bạn ping domain bạn ra IP Cloudflare là bạn đang dùng CDN của CF (đám mây vàng)
Vậy mình có cách nào sử dụng CF (đám mây vàng) mà ping vẫn ra IP hosting của mình ko bác 🙂
Không bạn nhé, nếu ra IP của bạn thì dùng CDN làm gì đâu
Thank bác đã thông cho em. Hehe
Nếu lấy được ip thế này thì dễ bị ddos à admin
Không. Đây là góc độ người quản trị cần lấy danh sách IP của người truy cập mà
Em xài nginx + cloudflare và chạy mã nguồn xenforo, khi detect IP của user toàn ra 127.0.0.1 chứ không ra IP của user, không biết em có làm sai gì không nhỉ? 🙁
Đây là 2 file: 1 file nginx.conf và 1 file domain.com.nginx
https://pastebin.com/uS03Rq8d
https://pastebin.com/nUTCZYz2
Bạn chưa sửa real_ip_header và log_format
bạn ơi mình chạy lệnh nginx -t thì ra như thế này:
[root@vultr home]# nginx -t
nginx: [emerg] “real_ip_header” directive is duplicate in /etc/nginx/nginx.conf:74
nginx: configuration file /etc/nginx/nginx.conf test failed
Không biết sửa như thế nào nhỉ?
Cám ơn bạn,
Cho mình full nội dung file đó của bạn
Mình gửi bạn nhé: https://pastebin.com/6hfMicdw
Dòng 21 và 73 của bạn đều có
real_ip_header
nên nó duplicate. Bạn cần dùng như thế nào thì xóa 1 trong 2 cái điTrước kia mình có cài trên centos 7. Khi mà ip nó qua cloudfare thì k nó vào host nhưng khi mình không trỏ qua cloudfare thì nó vào host. Vậy có phải cái bài này giải quyết vấn đề đó không ad ?
Bản chất vẫn là truy cập, chỉ là khi bạn qua Cloudfare thì IP hiện IP Cloudfare nên bạn cần cấu hình như vậy để hiện ip thật
Mình tưởng các IP cloudflare thay đổi theo user người dùng chứ nhỉ?
Đúng rồi bạn. Tùy vị trí user mà ip. cdn của CF có thể thay đổi. Đó là danh sách các IP của Cloudfare