
การเปิด Port บน Firewall เพื่อให้บริการจาก VPS เข้าถึงได้จากอินเทอร์เน็ตเป็นวิธีดั้งเดิมที่มีความเสี่ยงสูง เพราะ Port ที่เปิดไว้คือช่องทางที่แฮกเกอร์สามารถโจมตีได้โดยตรง Cloudflare Tunnel แก้ปัญหานี้ด้วยการสร้าง Encrypted Tunnel ออกจาก VPS ไปหา Cloudflare โดยไม่ต้องเปิด Inbound Port เลยแม้แต่พอร์ตเดียว
Cloudflare Tunnel คืออะไร
Cloudflare Tunnel (เดิมชื่อ Argo Tunnel) คือบริการ Zero Trust Network Access ที่ให้ VPS ของคุณสร้าง Outbound Connection ไปยัง Cloudflare Network โดยผ่าน daemon ชื่อ cloudflared เมื่อผู้ใช้ต้องการเข้าถึงบริการ คำขอจะถูกส่งผ่าน Cloudflare Edge แล้วส่งมาผ่าน Tunnel ที่สร้างไว้เข้าสู่ VPS
วิธีนี้หมายความว่า VPS ไม่จำเป็นต้องมี Public IP ที่ถูกเปิดรับการเชื่อมต่อโดยตรง และ Firewall สามารถ Block ทุก Inbound Connection ได้ 100% ทำให้ Attack Surface ลดลงอย่างมาก
ข้อดีของ Cloudflare Tunnel เทียบกับการเปิด Port ตรง
- ไม่ต้องเปิด Inbound Port — Firewall Block ทุก Port ได้ ลด Attack Surface
- ซ่อน IP จริงของ VPS — ผู้โจมตีไม่รู้ IP จริง ไม่สามารถโจมตีตรงได้
- DDoS Protection อัตโนมัติ — Cloudflare กรอง Traffic ก่อนถึง VPS
- SSL/TLS ฟรี — Cloudflare จัดการ Certificate ให้โดยอัตโนมัติ
- ไม่ต้องมี Static IP — ใช้ได้แม้ VPS มี IP เปลี่ยน (Dynamic IP)
- Access Policy — ตั้งให้เข้าได้เฉพาะ Email หรือ IP ที่กำหนด (Cloudflare Access)
ข้อควรรู้: Cloudflare Tunnel ฟรีสำหรับบัญชีทั่วไป (Free Plan) เหมาะกับการใช้งานส่วนตัวและธุรกิจขนาดเล็ก ต้องมีโดเมนที่ชี้ Nameserver มายัง Cloudflare แล้วเท่านั้น
สิ่งที่ต้องเตรียมก่อนติดตั้ง
- VPS Ubuntu 20.04 / 22.04 ที่มี Root Access
- บัญชี Cloudflare (สมัครฟรีที่ cloudflare.com)
- โดเมนที่ Nameserver ชี้มายัง Cloudflare แล้ว
- บริการที่ต้องการ Expose เช่น Web Server ที่รันบน Port 80/443 หรือ App Port ใดก็ได้
ขั้นตอนติดตั้ง cloudflared บน VPS Ubuntu
ขั้นที่ 1: ติดตั้ง cloudflared
# Download cloudflared สำหรับ Linux AMD64
curl -L --output cloudflared.deb \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
# ติดตั้ง package
sudo dpkg -i cloudflared.deb
# ตรวจสอบ version
cloudflared --version
ขั้นที่ 2: Login เข้า Cloudflare
# Login ด้วยคำสั่งนี้ จะได้ URL สำหรับ Authorize ใน Browser
cloudflared tunnel login
คำสั่งนี้จะแสดง URL ให้คุณเปิดในเบราว์เซอร์เพื่อเลือกโดเมนที่ต้องการใช้กับ Tunnel จากนั้น Cloudflare จะสร้างไฟล์ Certificate ที่ ~/.cloudflared/cert.pem โดยอัตโนมัติ
ขั้นที่ 3: สร้าง Tunnel
# สร้าง Tunnel ใหม่ (ตั้งชื่อได้ตามต้องการ)
cloudflared tunnel create my-vps-tunnel
# ดูรายการ Tunnel ที่มี
cloudflared tunnel list
ขั้นที่ 4: สร้างไฟล์ Config
# สร้างไฟล์ config
nano ~/.cloudflared/config.yml
ใส่เนื้อหาดังนี้ (แทน YOUR-TUNNEL-ID ด้วย ID จากขั้นที่ 3):
tunnel: YOUR-TUNNEL-ID
credentials-file: /root/.cloudflared/YOUR-TUNNEL-ID.json
ingress:
- hostname: app.yourdomain.com
service: http://localhost:3000
- hostname: web.yourdomain.com
service: http://localhost:80
- service: http_status:404
ขั้นที่ 5: สร้าง DNS Record
# สร้าง CNAME record ชี้ไปที่ Tunnel
cloudflared tunnel route dns my-vps-tunnel app.yourdomain.com
cloudflared tunnel route dns my-vps-tunnel web.yourdomain.com
ขั้นที่ 6: รัน Tunnel เป็น System Service
# ติดตั้ง cloudflared เป็น systemd service
sudo cloudflared --config /root/.cloudflared/config.yml service install
# เปิดใช้งานและ Start
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
# ตรวจสอบสถานะ
sudo systemctl status cloudflared
เจาะลึก cloudflared — Expose VPS โดยไม่เปิด Port (ครบทุกขั้น)
หัวใจของ Cloudflare Tunnel คือ daemon cloudflared ที่รันอยู่บน VPS แล้วเปิด Outbound Connection ขาออกไปหา Cloudflare Edge ตลอดเวลา การเชื่อมต่อนี้เป็น mTLS (mutual TLS) สองทาง เมื่อมี Request เข้ามาที่โดเมนของคุณ Cloudflare จะส่งผ่าน Connection ที่ค้างไว้นี้กลับเข้า VPS โดยที่ VPS ไม่ต้องเปิด Inbound Port แม้แต่พอร์ตเดียว แนวคิดนี้เรียกว่า "reverse tunnel" — แทนที่อินเทอร์เน็ตจะวิ่งเข้าหา VPS โดยตรง กลับเป็น VPS เป็นฝ่ายวิ่งออกไปหา Cloudflare ก่อน ผลคือ Firewall ฝั่ง Inbound สามารถปิดสนิทได้ทั้งหมด
ด้านล่างคือชุดคำสั่งติดตั้งและสร้าง Tunnel แบบ end-to-end อีกครั้งในรูปแบบรวบรัด เผื่อคุณต้องการ Copy ไปวางทีเดียวบน VPS Ubuntu ที่เพิ่งสั่งมาจาก AsiaGB:
# 1) ติดตั้ง cloudflared (Ubuntu 20.04/22.04 AMD64)
curl -L --output cloudflared.deb \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
cloudflared --version
# 2) Login เพื่อ Authorize โดเมน (เปิด URL ที่ขึ้นมาในเบราว์เซอร์)
cloudflared tunnel login
# 3) สร้าง Tunnel ใหม่ + ดูรายการ
cloudflared tunnel create my-vps-tunnel
cloudflared tunnel list
# 4) จด Tunnel ID + path ของไฟล์ credentials (.json) ไว้ใช้ใน config.yml
หลังรันขั้นที่ 3 Cloudflare จะสร้างไฟล์ Credentials เป็น ~/.cloudflared/<TUNNEL-ID>.json ซึ่งคือกุญแจลับของ Tunnel ห้ามนำไฟล์นี้ขึ้น Git สาธารณะหรือแชร์ออกไปเด็ดขาด เพราะใครก็ตามที่ได้ไฟล์นี้สามารถสวมรอยเป็น Tunnel ของคุณได้ทันที
ตั้งค่า config.yml + route DNS แบบละเอียด
ไฟล์ config.yml คือหัวใจของการกำหนดว่า Hostname ไหนจะวิ่งเข้า Service อะไรภายใน VPS ส่วน ingress จะถูกอ่านจากบนลงล่างเหมือน Routing Table โดยกฎสุดท้ายต้องเป็น catch-all http_status:404 เสมอ ไม่งั้น cloudflared จะ Error ตอน Start:
# ~/.cloudflared/config.yml
tunnel: YOUR-TUNNEL-ID
credentials-file: /root/.cloudflared/YOUR-TUNNEL-ID.json
ingress:
# เว็บแอป Node.js รันที่ port 3000
- hostname: app.yourdomain.com
service: http://localhost:3000
# เว็บไซต์หลักรันที่ port 80
- hostname: web.yourdomain.com
service: http://localhost:80
# ตัวอย่าง expose service ที่ใช้ TLS ภายใน (ข้ามตรวจ cert ภายใน)
- hostname: secure.yourdomain.com
service: https://localhost:8443
originRequest:
noTLSVerify: true
# catch-all — บังคับต้องมีเป็นกฎสุดท้าย
- service: http_status:404
เมื่อแก้ config เสร็จ ให้ตรวจ Syntax ก่อนรันจริงด้วยคำสั่ง cloudflared tunnel ingress validate เพื่อกัน YAML เพี้ยน จากนั้นจึงผูก DNS Record ของแต่ละ Hostname เข้ากับ Tunnel — Cloudflare จะสร้าง CNAME แบบพิเศษ (proxied) ให้อัตโนมัติ:
# ตรวจ config ก่อน
cloudflared tunnel ingress validate
# ผูก DNS แต่ละ hostname เข้ากับ Tunnel (สร้าง CNAME ให้อัตโนมัติ)
cloudflared tunnel route dns my-vps-tunnel app.yourdomain.com
cloudflared tunnel route dns my-vps-tunnel web.yourdomain.com
cloudflared tunnel route dns my-vps-tunnel secure.yourdomain.com
# ทดสอบรันแบบ foreground เพื่อดู log สดก่อนทำเป็น service
cloudflared tunnel run my-vps-tunnel
ถ้าเปิดหน้าเว็บแล้วยังไม่ขึ้น ให้ดู Log ที่ Terminal ว่ามี Registered tunnel connection ขึ้นหรือยัง และตรวจว่า Service ภายใน (เช่น Node.js หรือ Nginx) ฟังอยู่ที่ Port ที่ระบุใน config จริงด้วย ss -tlnp
รัน cloudflared เป็น systemd Service ถาวร
หลังทดสอบ Foreground ผ่านแล้ว ขั้นต่อไปคือทำให้ cloudflared รันเป็น Background Service ที่ Start อัตโนมัติทุกครั้งที่ VPS รีบูต ด้วย systemd ซึ่งเป็นวิธีมาตรฐานบน Ubuntu:
# ติดตั้งเป็น systemd service (อ่าน config จาก path ที่ระบุ)
sudo cloudflared --config /root/.cloudflared/config.yml service install
# เปิดใช้งานเมื่อบูต + start ทันที
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
# ตรวจสถานะ + ดู log สด
sudo systemctl status cloudflared
sudo journalctl -u cloudflared -f
เมื่อแก้ไข config.yml ในภายหลัง อย่าลืม sudo systemctl restart cloudflared เพื่อให้ค่าใหม่มีผล และถ้าต้องการให้ Tunnel ทำงานต่อเนื่องระดับ Uptime 99% ควรตั้ง Monitoring ภายนอกคอยเช็ค Service และเปิด systemctl enable ไว้เสมอ เพื่อให้ Service ฟื้นตัวเองหลัง VPS รีบูตหรือ Kernel Update
เคล็ดลับ: ถ้าต้องการ High Availability ให้รัน cloudflared หลาย Instance (หรือหลาย VPS) ที่ใช้ Tunnel ID เดียวกัน Cloudflare จะ Load-balance Connection ให้อัตโนมัติ ถ้า Instance ใด Down อีกตัวจะรับงานต่อทันที
ข้อดีด้านความปลอดภัย + Use Cases ที่เหมาะกับ Tunnel
เหตุผลหลักที่หลายองค์กรย้ายมาใช้ Cloudflare Tunnel แทนการ Forward Port ตรง คือเรื่องความปลอดภัยที่ยกระดับขึ้นทันทีโดยไม่ต้องลงทุนฮาร์ดแวร์เพิ่ม:
- ซ่อน Origin IP จริงของ VPS — ผู้โจมตีเห็นแต่ IP ของ Cloudflare ไม่รู้ IP จริงของเซิร์ฟเวอร์ จึงยิง DDoS หรือสแกน Port ตรงไม่ได้
- ไม่มี Inbound Port เปิด — Attack Surface เหลือศูนย์ในฝั่งขาเข้า bot ที่เที่ยวสแกนพอร์ต 22/80/443 ทั้งอินเทอร์เน็ตหาช่องไม่เจอ
- กรอง Traffic ที่ Edge — WAF, Rate Limiting และ DDoS Protection ของ Cloudflare ทำงานก่อนถึง VPS ลดภาระ CPU/Bandwidth ของเซิร์ฟเวอร์จริง
- เพิ่มชั้น Authentication ได้ — ผูกกับ Cloudflare Access เพื่อบังคับ Login (Google/GitHub/Email OTP) ก่อนเข้าถึงบริการภายใน
- ไม่ต้องมี Static IP — เหมาะกับ VPS ที่ IP เปลี่ยน หรือ Server หลังบ้านที่อยู่ใน NAT
Use Cases ที่ Cloudflare Tunnel เข้ามาช่วยได้ดีบน VPS Ubuntu ของ AsiaGB เช่น:
- Admin Panel / Dashboard ภายใน เช่น Portainer, Grafana, phpMyAdmin ที่ไม่ควร Public ให้คนทั้งโลกเห็น
- WordPress / เว็บ E-Commerce ที่ต้องการซ่อน IP จริงและรับ DDoS Protection ฟรีจาก Cloudflare
- Node.js / API Backend ที่รันบน Port สูง (3000/8080) โดยไม่ต้องเปิด Port นั้นออกอินเทอร์เน็ต
- Game Server / Business App ภายในทีมที่ต้องการเข้าถึงจากระยะไกลแบบปลอดภัย
- Staging / Demo site ที่อยากแชร์ให้ลูกค้าดูชั่วคราวโดยจำกัดสิทธิ์ผ่าน Access Policy
ตั้งค่า UFW Firewall หลังติดตั้ง Tunnel
หลังจาก Tunnel ทำงานได้แล้ว คุณสามารถ Block ทุก Inbound Port ได้อย่างปลอดภัย เหลือแค่ SSH สำหรับการจัดการ:
# Reset Firewall rules
sudo ufw default deny incoming
sudo ufw default allow outgoing
# อนุญาตเฉพาะ SSH (จำกัด IP ถ้าทำได้)
sudo ufw allow from YOUR_IP to any port 22
# เปิด UFW
sudo ufw enable
# ตรวจสอบ rules
sudo ufw status verbose
เคล็ดลับความปลอดภัย: ถ้ามีโอกาส ให้จำกัด SSH ให้รับเฉพาะจาก IP ของคุณเท่านั้น (ufw allow from 1.2.3.4 to any port 22) เพื่อป้องกัน Brute Force Attack ได้อีกชั้นหนึ่ง
การใช้งาน Cloudflare Access ร่วมกับ Tunnel
Cloudflare Access ช่วยเพิ่มชั้นการยืนยันตัวตนก่อนเข้าถึงบริการบน Tunnel สามารถตั้งให้ Login ด้วย Google, GitHub, หรือ Email เป็นต้น เพื่อป้องกันบริการที่ไม่ควร Public เช่น Admin Panel, Portainer, หรือ Internal Dashboard
- เข้า Cloudflare Dashboard → Zero Trust → Access → Applications
- เลือก "Add an application" → "Self-hosted"
- ระบุ Domain ที่ต้องการ Protect และเลือก Identity Provider
- ผู้ใช้จะต้อง Authenticate ก่อนเข้าถึง URL นั้น
คำถามที่พบบ่อย (FAQ)
Cloudflare Tunnel ฟรีจริงหรือไม่ มีค่าใช้จ่ายแอบแฝงไหม
ตัว Cloudflare Tunnel และ daemon cloudflared ใช้งานได้ฟรีบนแพ็กเกจ Free Plan ของ Cloudflare เพียงพอสำหรับการ Expose เว็บไซต์และบริการส่วนตัว/ธุรกิจขนาดเล็ก สิ่งที่ต้องมีคือโดเมนที่ชี้ Nameserver มายัง Cloudflare แล้วเท่านั้น ฟีเจอร์ขั้นสูงบางอย่าง (เช่น จำนวนผู้ใช้ Access จำนวนมาก) อาจต้องอัปเกรดแพ็กเกจ แต่การใช้งานพื้นฐานทั้งหมดในบทความนี้ไม่มีค่าใช้จ่าย
ถ้าใช้ Tunnel แล้วยังต้องเปิด Port 80/443 บน VPS อยู่ไหม
ไม่ต้องเลย เพราะ cloudflared เป็นฝ่ายเปิด Outbound Connection ออกไปหา Cloudflare เอง คุณสามารถตั้ง UFW ให้ deny incoming ทั้งหมด เหลือเปิดเฉพาะ Port 22 (SSH) ไว้สำหรับการจัดการ และถ้าต้องการความปลอดภัยสูงสุด สามารถ Expose SSH ผ่าน Tunnel ด้วยแล้วปิด Port 22 ภายนอกให้เหลือศูนย์ Inbound Port
ถ้า VPS รีบูต Tunnel จะกลับมาทำงานเองอัตโนมัติไหม
จะกลับมาเองอัตโนมัติถ้าคุณติดตั้ง cloudflared เป็น systemd service และรัน sudo systemctl enable cloudflared ไว้แล้ว systemd จะ Start service นี้ทุกครั้งที่ VPS บูตขึ้นมา ทำให้ Tunnel ฟื้นตัวเองหลังรีบูตหรือ Kernel Update โดยไม่ต้องเข้าไปรันคำสั่งเอง
Cloudflare Tunnel ต่างจาก VPN หรือ Port Forwarding อย่างไร
Port Forwarding เปิด Inbound Port ตรงเข้า VPS ทำให้ IP จริงและพอร์ตถูกเปิดเผยและถูกโจมตีได้ ส่วน VPN ทั่วไปต้องติดตั้ง Client และจัดการ Key เอง แต่ Cloudflare Tunnel เป็น Outbound-only ซ่อน IP จริง ไม่เปิด Inbound Port และมี WAF/DDoS Protection ของ Cloudflare คุ้มกันให้ที่ Edge โดยผู้ใช้ปลายทางเข้าผ่านโดเมนปกติได้เลยไม่ต้องลง Client
เริ่มต้นใช้ VPS ที่ปลอดภัยวันนี้
VPS Linux Ubuntu เริ่มต้น 500 บาท/เดือน พร้อม Full Root Access, SSD และ Dedicated IP ที่ตั้งเซิร์ฟเวอร์ในไทย และ สิงคโปร์
ดูแพ็กเกจ VPS