Cloudflare

แก้ปัญหา Real IP ไม่แสดงเมื่อใช้ Cloudflare กับ DE Cloud VPS

เผยแพร่ · แก้ไขล่าสุด

เมื่อใช้ Cloudflare ร่วมกับ VPS การแสดง Real IP (IP ที่แท้จริงของผู้เยี่ยมชม) มักจะมีปัญหา เนื่องจาก Cloudflare ทำหน้าที่เป็น Proxy ซึ่งทำให้เซิร์ฟเวอร์เห็นเฉพาะ IP ของ Cloudflare แทนที่จะเห็น IP ของผู้ใช้งานจริง บทความนี้จะสอนวิธีการแก้ไขปัญหานี้อย่างถูกต้องและเข้าใจง่าย

ทำไม Real IP จึงมีความสำคัญ

Real IP เป็นสิ่งสำคัญในหลายด้าน เช่น:

  • WAF Rules และ Rate Limiting: Cloudflare ใช้ Real IP ในการตัดสินใจสำหรับกฎความปลอดภัย
  • Analytics และ Logging: เซิร์ฟเวอร์ของคุณต้องทราบ IP ที่แท้จริงเพื่อบันทึกข้อมูลที่ถูกต้อง
  • การจัดการการเข้าถึง: การกำหนดสิทธิ์การเข้าถึงต้องอาศัย IP ที่แท้จริงของผู้เยี่ยมชม
  • Anti-Spam และ Anti-DDoS: ระบบป้องกันต้องรู้ IP แท้จริงเพื่อระบุตัวตน

หากไม่มีการกำหนด Real IP ที่ถูกต้อง ระบบของคุณจะเห็นเฉพาะ IP ของ Cloudflare ซึ่งจะนำไปสู่การตัดสินใจที่ไม่แม่นยำ

ตั้งค่า Real IP บน Apache (httpd)

สำหรับเซิร์ฟเวอร์ Apache ให้ทำตามขั้นตอนต่อไปนี้:

ขั้นที่ 1: เปิดใช้งาน mod_headers

a2enmod headers
systemctl restart apache2

ขั้นที่ 2: แก้ไข Virtual Host Configuration

<IfModule mod_headers.c>
    SetEnvIfNoCase ^CF-Connecting-IP$ ([0-9.]+)$ CF_CLIENT_IP=$1
    SetEnvIfNoCase ^CF-IPCountry$ ([A-Z]{2})$ CF_CLIENT_COUNTRY=$1
</IfModule>

ขั้นที่ 3: บันทึกและรีสตาร์ท Apache

systemctl restart apache2

ตั้งค่า Real IP บน Nginx

สำหรับเซิร์ฟเวอร์ Nginx ให้เพิ่มการตั้งค่าต่อไปนี้ในไฟล์ nginx.conf หรือ server block:

# IP Ranges ของ Cloudflare
set_real_ip_from 173.245.48.0/20;
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 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# IPv6
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 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

real_ip_header CF-Connecting-IP;

หลังจากทำการเปลี่ยนแปลง ให้ทำการเทสการกำหนดค่า และ reload Nginx:

nginx -t
systemctl reload nginx
  • Cloudflare Real IP: ติดตั้งจากการตั้งค่า wp-config.php
  • WP Cloudflare Super Page Cache: Plugin ที่รวมการจัดการ Real IP พร้อม Caching

หรือแก้ไข wp-config.php เพื่อเพิ่มการรับรู้ Real IP:

// Cloudflare Real IP
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}

การตรวจสอบ Real IP

เพื่อตรวจสอบว่าการกำหนด Real IP สำเร็จหรือไม่ ให้ทำตามขั้นตอนต่อไปนี้:

วิธีที่ 1: ตรวจสอบไฟล์ Log ของเซิร์ฟเวอร์

# สำหรับ Apache
tail -f /var/log/apache2/access.log

# สำหรับ Nginx
tail -f /var/log/nginx/access.log

วิธีที่ 2: สร้าง PHP Test File

<?php
echo "Your Real IP: " . $_SERVER['REMOTE_ADDR'] . "\n";
echo "Cloudflare IP: " . (isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : 'N/A') . "\n";
echo "Country: " . (isset($_SERVER['HTTP_CF_IPCOUNTRY']) ? $_SERVER['HTTP_CF_IPCOUNTRY'] : 'N/A') . "\n";
?>

เยี่ยมชมไฟล์ PHP นี้ผ่าน Cloudflare และตรวจสอบว่า IP ที่แสดงตรงกับ IP จริงของคุณหรือไม่

Best Practices สำหรับการจัดการ Real IP

  • อัปเดต IP Ranges ของ Cloudflare: Cloudflare เปลี่ยนแปลง IP Ranges เป็นระยะ ตรวจสอบจากหน้า Cloudflare IP Ranges เป็นประจำ
  • ทดสอบหลังจากการเปลี่ยนแปลง: เสมอทดสอบการเชื่อมต่อหลังจากทำการแก้ไขการตั้งค่า
  • ตรวจสอบ Logs เป็นประจำ: ดูไฟล์ Log เพื่อตรวจสอบว่า Real IP ถูกบันทึกอย่างถูกต้อง
  • ใช้ SSL/TLS: ตรวจสอบว่า Cloudflare SSL Mode ถูกตั้งค่าเป็น "Full" หรือ "Full (strict)"

สรุป

การแก้ไขปัญหา Real IP ที่ไม่แสดงเมื่อใช้ Cloudflare กับ VPS ไม่ได้เป็นเรื่องยาก เพียงแค่ติดตั้งการตั้งค่าที่ถูกต้องบนเซิร์ฟเวอร์ (Apache หรือ Nginx) และตรวจสอบว่าทำงานถูกต้อง ด้วยวิธีนี้ WordPress และแอปพลิเคชันอื่น ๆ ของคุณบน VPS จะสามารถบันทึกและใช้ IP ที่แท้จริงของผู้เยี่ยมชมได้อย่างถูกต้อง

แท็กCloudflare