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.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

25 Comments

  1. Quan Nguyên Phát 52 comment

    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!

    1. Việt Phương Moderator

      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

  2. Lê Tòng 1 comment

    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

  3. Caillou 6 comment

    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.

    1. Việt Phương Moderator

      Webinoly là Ubuntu + Nginx + MariaDB (MySQL) + PHP nên mình nghĩ là được thôi

      1. Caillou 6 comment

        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 🙁

        1. Việt Phương Moderator

          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 à?

          1. Việt Phương Moderator

            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)

          2. Caillou 6 comment

            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 🙂

          3. Việt Phương Moderator

            Không bạn nhé, nếu ra IP của bạn thì dùng CDN làm gì đâu

    1. Việt Phương Moderator

      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à

  4. XEM 3 comment

    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ỉ? 🙁

  5. Manh Doan 21 comment

    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,

        1. Việt Phương Moderator

          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 đi

  6. Tam 10 comment

    Trướ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 ?

    1. Việt Phương Moderator

      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