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

