เชื่อมต่อ VPS กับ Cloudflare: CDN + DDoS Protection
การใช้ Cloudflare เป็น reverse proxy หน้า VPS ของคุณเป็นหนึ่งในวิธีที่คุ้มค่าที่สุดในการได้รับ CDN, DDoS Protection ระดับองค์กร, Web Application Firewall (WAF) และ SSL Certificate ฟรี — โดยไม่ต้องเสียค่าใช้จ่ายเพิ่มเติม บทความนี้จะพาคุณตั้งค่าตั้งแต่ต้นจนจบแบบ step-by-step
Cloudflare ทำงานอย่างไรกับ VPS
เมื่อเปิดใช้ Cloudflare proxy (ไอคอนเมฆสีส้ม) DNS ของโดเมนจะชี้ไปที่ IP ของ Cloudflare แทน IP จริงของ VPS ทราฟฟิกทุกชิ้นจะวิ่งผ่าน Cloudflare ก่อน แล้วค่อยส่งต่อมายัง VPS ของคุณ ผลที่ได้คือ:
- IP จริงของ VPS ถูกซ่อน ผู้โจมตีไม่รู้ปลายทาง
- Cloudflare รองรับ DDoS ได้ระดับ Tbps โดยไม่ผ่านมาถึง VPS เลย
- Static assets (รูป, CSS, JS) ถูก cache ที่ edge ลด bandwidth บน VPS
- SSL/TLS จัดการที่ Cloudflare — ไม่จำเป็นต้องติดตั้ง Let's Encrypt บน VPS ก็ได้
ขั้นตอนที่ 1 — สมัครและเพิ่มโดเมนเข้า Cloudflare
- ไปที่ dash.cloudflare.com แล้วสมัครบัญชีฟรี
- คลิก "Add a Site" แล้วพิมพ์ชื่อโดเมนของคุณ (เช่น
example.com) - เลือก Plan Free แล้วคลิก Continue
- Cloudflare จะ scan DNS records เดิมของโดเมนให้อัตโนมัติ ตรวจสอบว่า A record ชี้ไป IP ของ VPS ถูกต้อง
- คัดลอก Nameserver 2 ตัวที่ Cloudflare กำหนดให้ (เช่น
ada.ns.cloudflare.comและbob.ns.cloudflare.com) - เข้าไปที่ Registrar ที่คุณซื้อโดเมน แล้วเปลี่ยน Nameserver เป็นของ Cloudflare
ขั้นตอนที่ 2 — ตั้งค่า DNS Records และเปิด Proxy
หลัง Nameserver ถ่ายโอนสำเร็จ ให้เข้าไปที่แท็บ DNS ใน Dashboard และตรวจสอบ records ดังนี้:
- A record ชื่อ
@→ IP ของ VPS → เปิด Proxy (เมฆสีส้ม) - A record ชื่อ
www→ IP ของ VPS → เปิด Proxy (เมฆสีส้ม) - Records อื่นที่ไม่ต้องการ Proxy (เช่น Mail server) → ปล่อยเป็นเมฆสีเทา (DNS Only)
ขั้นตอนที่ 3 — ตั้งค่า SSL/TLS Mode
ไปที่ SSL/TLS → Overview แล้วเลือก Mode ที่เหมาะกับสถานการณ์:
Flexible SSL
Cloudflare เชื่อมต่อกับ Browser ผ่าน HTTPS แต่เชื่อมกับ VPS ผ่าน HTTP ธรรมดา ใช้ได้ถ้า VPS ยังไม่มี SSL Certificate ติดตั้ง เหมาะสำหรับการทดสอบเบื้องต้น
Full SSL (แนะนำ)
เชื่อมต่อกับ VPS ผ่าน HTTPS ด้วย แต่ Cloudflare ไม่ตรวจสอบว่า Certificate บน VPS Valid หรือไม่ ต้องมี SSL Certificate บน VPS (Self-signed ก็ได้)
Full (Strict) — ปลอดภัยที่สุด
เหมือน Full แต่ Cloudflare ตรวจสอบว่า Certificate บน VPS ต้องเป็น Certificate ที่ Valid จริง (Let's Encrypt หรือ Cloudflare Origin Certificate)
ขั้นตอนที่ 4 — ติดตั้ง Cloudflare Origin Certificate บน VPS
Origin Certificate คือ Certificate ที่ Cloudflare ออกให้ใช้กับ VPS โดยเฉพาะ อายุสูงสุด 15 ปี และใช้ได้เฉพาะเมื่อ Traffic ผ่าน Cloudflare เท่านั้น
- ใน Cloudflare Dashboard ไปที่ SSL/TLS → Origin Server
- คลิก "Create Certificate"
- เลือก Hostnames ที่ต้องการ (เช่น
example.comและ*.example.com) - เลือกอายุ Certificate (แนะนำ 15 ปีเพื่อไม่ต้อง renew บ่อย)
- คัดลอก Origin Certificate และ Private Key แล้วบันทึกลงใน VPS
SSH เข้า VPS แล้วสร้างไฟล์ Certificate:
ssh root@YOUR_VPS_IP
# สร้างโฟลเดอร์เก็บ Certificate
mkdir -p /etc/ssl/cloudflare
# บันทึก Origin Certificate
nano /etc/ssl/cloudflare/cert.pem
# วาง Certificate ที่คัดลอกจาก Cloudflare แล้วกด Ctrl+X, Y, Enter
# บันทึก Private Key
nano /etc/ssl/cloudflare/key.pem
# วาง Private Key แล้วกด Ctrl+X, Y, Enter
# จำกัดสิทธิ์ไฟล์
chmod 600 /etc/ssl/cloudflare/key.pem
chmod 644 /etc/ssl/cloudflare/cert.pem
ตั้งค่า Nginx ให้ใช้ Origin Certificate
nano /etc/nginx/sites-available/example.com
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/cloudflare/cert.pem;
ssl_certificate_key /etc/ssl/cloudflare/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
# ทดสอบ config
nginx -t
# รีโหลด Nginx
systemctl reload nginx
ตั้งค่า Apache ให้ใช้ Origin Certificate
nano /etc/apache2/sites-available/example.com-ssl.conf
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/cloudflare/cert.pem
SSLCertificateKeyFile /etc/ssl/cloudflare/key.pem
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
a2enmod ssl
a2ensite example.com-ssl
systemctl reload apache2
ขั้นตอนที่ 5 — ตั้งค่า Firewall ให้รับ Traffic เฉพาะจาก Cloudflare
เพื่อป้องกันไม่ให้ผู้โจมตีเข้าถึง IP จริงของ VPS โดยตรง ให้ Block Port 80/443 จากทุกที่ ยกเว้น IP ของ Cloudflare:
# ดาวน์โหลด IP ranges ของ Cloudflare
curl -s https://www.cloudflare.com/ips-v4 -o /tmp/cf_ipv4.txt
curl -s https://www.cloudflare.com/ips-v6 -o /tmp/cf_ipv6.txt
# Reset กฎ iptables เดิมสำหรับ port 80/443
iptables -D INPUT -p tcp --dport 80 -j ACCEPT 2>/dev/null
iptables -D INPUT -p tcp --dport 443 -j ACCEPT 2>/dev/null
# อนุญาตเฉพาะ Cloudflare IPv4
while read ip; do
iptables -I INPUT -p tcp --dport 80 -s "$ip" -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -s "$ip" -j ACCEPT
done < /tmp/cf_ipv4.txt
# Block ทุก IP อื่นที่ไม่ใช่ Cloudflare
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j DROP
# บันทึกกฎ (Debian/Ubuntu)
apt-get install -y iptables-persistent
netfilter-persistent save
ขั้นตอนที่ 6 — ตั้งค่า WAF และ Security Rules
ไปที่ Security → WAF ใน Cloudflare Dashboard:
เปิด Managed Rules (Free Plan)
- เปิด Cloudflare Managed Ruleset — ป้องกัน SQLi, XSS, RCE และ attack patterns ทั่วไป
- เปิด Cloudflare OWASP Core Ruleset — ป้องกันตาม OWASP Top 10
ตั้งค่า Security Level
ไปที่ Security → Settings แล้วปรับ Security Level:
- Low — ท้าทาย IP ที่มีประวัติโจมตีเท่านั้น เหมาะกับเว็บที่ต้องการ User Experience ราบรื่น
- Medium — แนะนำสำหรับเว็บทั่วไป
- High — ท้าทาย Traffic ที่น่าสงสัยมากขึ้น เหมาะช่วงถูกโจมตี
- Under Attack! — เปิดเมื่อกำลังถูก DDoS โจมตีจริง ทุก visitor จะเห็น Challenge page
ขั้นตอนที่ 7 — ตั้งค่า Caching สำหรับ Static Assets
ไปที่ Caching → Configuration:
- ตั้ง Caching Level เป็น "Standard"
- ตั้ง Browser Cache TTL เป็น 4 ชั่วโมง หรือมากกว่าสำหรับ Assets ที่ไม่ค่อยเปลี่ยน
สร้าง Page Rule สำหรับ Cache Static Files ทั้งหมด:
- ไปที่ Rules → Page Rules แล้วคลิก "Create Page Rule"
- URL pattern:
example.com/static/* - Setting: Cache Level → Cache Everything
- Edge Cache TTL: 1 เดือน
ขั้นตอนที่ 8 — ตั้งค่า Always Use HTTPS และ HSTS
ใน Cloudflare Dashboard ไปที่ SSL/TLS → Edge Certificates:
- เปิด Always Use HTTPS — redirect HTTP ทุกคำขอเป็น HTTPS อัตโนมัติ
- เปิด Automatic HTTPS Rewrites — แก้ Mixed Content issues อัตโนมัติ
- เปิด HTTP Strict Transport Security (HSTS) — บอก Browser ว่าโดเมนนี้ใช้ HTTPS เท่านั้น (ตั้ง max-age อย่างน้อย 6 เดือน)
การตรวจสอบว่าตั้งค่าถูกต้อง
หลังตั้งค่าครบแล้ว ทดสอบด้วยคำสั่งเหล่านี้:
# ตรวจสอบว่า Response Header มี "cf-ray" จาก Cloudflare
curl -sI https://example.com | grep -E "cf-ray|server|x-cache"
# ตรวจสอบ SSL Certificate ที่ได้รับ
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -dates
# ตรวจสอบว่า HTTP redirect ไป HTTPS
curl -sI http://example.com | grep location
ผลลัพธ์ที่ถูกต้องจะเห็น Header cf-ray: ใน Response และ Issuer ของ Certificate จะเป็น Cloudflare Inc ECC CA-3 หรือ CloudFlare Origin CA
การแก้ปัญหาที่พบบ่อย
Error 521 — Web server is down
Cloudflare เชื่อมต่อ VPS ไม่ได้ ตรวจสอบ:
- Nginx/Apache กำลังทำงานอยู่:
systemctl status nginx - Firewall ไม่ได้ Block IP ของ Cloudflare
- VPS ฟัง Port 443 อยู่:
ss -tlnp | grep 443
Error 525 — SSL Handshake Failed
Certificate บน VPS มีปัญหา ตรวจสอบ:
- ไฟล์ cert.pem และ key.pem ตรงกัน
- SSL Mode ใน Cloudflare ตั้งเป็น Full หรือ Full (Strict) ไม่ใช่ Flexible
- Nginx/Apache config ไม่มี syntax error:
nginx -t
Redirect Loop (ERR_TOO_MANY_REDIRECTS)
เกิดจาก SSL Mode เป็น Flexible แต่ VPS ก็ redirect HTTP→HTTPS ด้วย แก้ไขโดยเปลี่ยน SSL Mode เป็น Full หรือปิด redirect บน VPS
สรุปขั้นตอนทั้งหมด
การตั้งค่า Cloudflare หน้า VPS ให้ครบถ้วนประกอบด้วยขั้นตอนหลักดังนี้:
- สมัคร Cloudflare และเพิ่มโดเมน จากนั้นเปลี่ยน Nameserver ที่ Registrar
- ตั้งค่า DNS A Records และเปิด Proxy (เมฆสีส้ม) สำหรับโดเมนหลัก
- เลือก SSL Mode เป็น Full (Strict) เพื่อความปลอดภัยสูงสุด
- สร้าง Origin Certificate จาก Cloudflare และติดตั้งบน Nginx/Apache
- ตั้ง Firewall ให้รับ Traffic Port 80/443 เฉพาะจาก Cloudflare IP Ranges
- เปิด WAF Managed Rules เพื่อป้องกัน OWASP Top 10
- ตั้งค่า Caching สำหรับ Static Assets เพื่อลด Load บน VPS
- เปิด Always Use HTTPS และ HSTS
ตรวจสอบว่า Cloudflare ทำงานถูกต้อง
# ตรวจสอบว่า Response Header มี cf-ray จาก Cloudflare
curl -sI https://example.com | grep -i "cf-ray\|server\|x-cache"
# ตรวจสอบ Issuer ของ SSL Certificate (ควรเป็น Cloudflare)
echo | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -issuer -dates
# ตรวจสอบว่า HTTP redirect ไป HTTPS ถูกต้อง
curl -sI http://example.com | grep -i location
# ตรวจสอบ IP ที่ DNS resolve มา (ควรเป็น IP ของ Cloudflare ไม่ใช่ VPS)
dig +short A example.com
cf-ray: xxxxxxxx-BKK และ Issuer เป็น E6 หรือ Cloudflare Inc ECC CA-3 แปลว่า traffic ผ่าน Cloudflare ถูกต้องแล้วแก้ปัญหาเพิ่มเติมที่พบบ่อย
Error 522 — Connection timed out
ต่างจาก 521 (Web server is down) ตรงที่ Cloudflare เชื่อมต่อ TCP ได้แต่ไม่ได้รับ response ในเวลา — มักเกิดจาก Firewall บล็อก Cloudflare IP
# ตรวจสอบว่า Cloudflare IP ถูก block
iptables -L INPUT -n | grep -E "80|443"
# ตรวจสอบว่า Nginx ฟัง port อยู่
ss -tlnp | grep -E "80|443"
# ดาวน์โหลด IP ranges ล่าสุดของ Cloudflare แล้วเพิ่มกฎ
curl -s https://www.cloudflare.com/ips-v4 | head
Cache ไม่อัพเดท — ผู้ใช้เห็นเนื้อหาเก่า
Cloudflare cache ไฟล์ Static ไว้ที่ Edge ต้องสั่ง purge เมื่อเนื้อหาเปลี่ยน
# Purge cache ทั้งหมดผ่าน Dashboard:
# Caching → Configuration → Purge Everything
# หรือ Purge เฉพาะ URL ผ่าน API
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" \
-H "Authorization: Bearer API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"files":["https://example.com/style.css"]}'
WebSocket ไม่ทำงานผ่าน Cloudflare
Cloudflare รองรับ WebSocket แต่ต้องเปิดใช้งานก่อน
# เปิดใน Dashboard:
# Network → WebSockets → On
# ตรวจสอบว่า Nginx config รองรับ WebSocket upgrade
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Real IP ของ Visitor ไม่ถูกต้องใน Log (เห็นแต่ Cloudflare IP)
ต้องตั้งค่า Nginx ให้ใช้ Header CF-Connecting-IP แทน
# เพิ่มใน nginx.conf ส่วน http {}
set_real_ip_from 103.21.244.0/22; # Cloudflare IP ranges
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 173.245.48.0/20;
real_ip_header CF-Connecting-IP;
sudo nginx -t && sudo systemctl reload nginx
คำถามที่พบบ่อย
ใช้ Cloudflare Free Plan เพียงพอสำหรับเว็บทั่วไปไหม?
เพียงพอสำหรับเว็บขนาดกลาง Free Plan ให้ DDoS Protection ไม่จำกัด CDN ทั่วโลก WAF พื้นฐาน SSL ฟรี และ Analytics เบื้องต้น สิ่งที่ต้องอัพเกรดเป็น Pro+ คือ Advanced WAF Rules, Image Optimization, Real-time Analytics และ Priority Support
Cloudflare เห็น HTTPS traffic ของเราได้ไหม?
ได้ เพราะ Cloudflare เป็น middleman ที่ decrypt SSL แล้ว re-encrypt ก่อนส่งไปยัง VPS (SSL Termination at Edge) ข้อมูล request/response จะผ่านมือ Cloudflare แม้จะใช้ Full (Strict) mode ก็ตาม ถ้าต้องการ End-to-End Encryption ที่ Cloudflare ไม่เห็น ต้องใช้ Cloudflare Tunnel หรือไม่ใช้ Cloudflare proxy
Origin Certificate ของ Cloudflare ใช้กับเว็บอื่นได้ไหม?
ไม่ได้ Origin Certificate ที่ Cloudflare ออกให้ใช้ได้เฉพาะเมื่อ traffic ผ่าน Cloudflare เท่านั้น Browser จะแสดง Warning ถ้าพยายามเข้าถึง VPS โดยตรง (bypass Cloudflare) เพราะ Certificate นี้ไม่ได้รับการ Trust จาก Browser CA Store ทั่วไป