แก้ปัญหา 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 ที่แท้จริงของผู้เยี่ยมชมได้อย่างถูกต้อง