เปิด VPS ปลอดภัยด้วย Cloudflare Tunnel ไม่ต้องเปิด Port

การเปิด 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 ตรง

ข้อควรรู้: Cloudflare Tunnel ฟรีสำหรับบัญชีทั่วไป (Free Plan) เหมาะกับการใช้งานส่วนตัวและธุรกิจขนาดเล็ก ต้องมีโดเมนที่ชี้ Nameserver มายัง Cloudflare แล้วเท่านั้น

สิ่งที่ต้องเตรียมก่อนติดตั้ง

ขั้นตอนติดตั้ง 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 ตรง คือเรื่องความปลอดภัยที่ยกระดับขึ้นทันทีโดยไม่ต้องลงทุนฮาร์ดแวร์เพิ่ม:

Use Cases ที่ Cloudflare Tunnel เข้ามาช่วยได้ดีบน VPS Ubuntu ของ AsiaGB เช่น:

ตั้งค่า 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

คำถามที่พบบ่อย (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