Cloudflare Tunnel: เปิดโลกในบ้านให้โลกเห็นแบบปลอดภัย
ถ้าใครที่เคยต้องทำเว็บหรือบริการอะไรเล็ก ๆ ที่รันอยู่บนเครื่องที่บ้าน หรือใน Local Network แล้วอยากให้คนข้างนอกเข้าถึงได้นะ คงจะเจอปัญหาเดิมๆ คือ ต้องไปเปิดพอร์ตบน Router ใช่ป่ะ? หรือไม่ก็ต้องหา Public IP, แล้วถ้ามันเปลี่ยนล่ะ? ก็ต้องง้อ DDNS อีก ปวดหัวโคตรๆ แถมเรื่องความปลอดภัยอีก เปิดพอร์ตเนี่ย โคตรเสี่ยงเลยบางที
ทีนี้ Cloudflare Tunnel มันมาช่วยตรงนี้ได้เยอะมาก คือมันสร้างอุโมงค์เชื่อมต่อจากเครื่องเราไปที่ Cloudflare โดยตรงเลย ไม่ต้องเปิดพอร์ตอะไรบน Router คุณเลยแม้แต่น้อย มันจะวิ่งผ่าน HTTP/HTTPS ปกติอะแหละ ไม่ต้องสนเรื่อง Firewall ที่บ้านเลย สบายสุดๆ แล้วก็ปลอดภัยด้วย เพราะทราฟฟิกมันวิ่งผ่าน Cloudflare ก่อน
มาดูวิธีตั้งค่ากันแบบเร็วๆ เลยนะ ไม่ต้องคิดมาก
ก่อนอื่นเลย ต้องติดตั้ง cloudflared CLI tool ก่อน
สำหรับ macOS (ถ้ามี Homebrew):
brew install cloudflared
ง่ายสุดๆ อันนี้
สำหรับ Linux (Debian/Ubuntu):
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
หรือจะใช้ apt ก็ได้:
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared focal main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install cloudflared
(ตัวนี้ผมชอบใช้เพราะมันจัดการอัปเดตง่ายดี)
ติดตั้งเสร็จแล้ว ก็ต้อง authenticate กับ Cloudflare Account เราก่อน:
cloudflared tunnel login
มันจะเปิด Browser ให้คุณไปล็อกอินแล้วเลือกโดเมนที่คุณต้องการใช้งาน Tunnel นะ พอเสร็จมันจะสร้างไฟล์ cert.pem ให้ใน .cloudflared directory ของ user คุณ
ต่อมาก็สร้าง Tunnel กันเลย:
cloudflared tunnel create <ชื่อ-tunnel-ของคุณ>
แทนที่ <ชื่อ-tunnel-ของคุณ> ด้วยชื่ออะไรก็ได้ที่คุณอยากจะจำได้ เช่น my-home-server พอสร้างเสร็จมันจะบอก ID ของ Tunnel มาให้ เก็บไว้ดีๆ เลย แล้วก็สร้างไฟล์ config มาให้เราด้วย ปกติชื่อ config.yml หรือถ้าคุณอยากให้มันอยู่ในโฟลเดอร์เดียวกันกับ cert.pem ก็ได้ ลองดู
ทีนี้มาส่วนสำคัญ คือไฟล์ config.yml นี่แหละ. สมมุติว่าคุณมีเว็บที่รันอยู่บน localhost:8000 (เช่น Django หรือ Next.js dev server) แล้วคุณมีโดเมน yourdomain.com ที่ผูกกับ Cloudflare อยู่แล้วนะ เราอยากให้ home.yourdomain.com ชี้มาที่ localhost:8000 ของเรา
สร้างไฟล์ config.yml (หรือจะเอาที่มันสร้างให้ก็ได้) แบบนี้:
tunnel: <ID-tunnel-ของคุณ> # เอา ID ที่ได้จากตอนสร้าง Tunnel มาใส่
credentials-file: /home/youruser/.cloudflared/<ID-tunnel-ของคุณ>.json # อันนี้ระบุ path เต็มๆ นะ สำคัญมาก!
ingress:
- hostname: home.yourdomain.com
service: http://localhost:8000
- service: http_status:404 # ถ้าไม่ตรง hostname ข้างบน ให้ขึ้น 404
ระวังตรง credentials-file! หลายคนพลาดตรงนี้แหละ ชอบลืมระบุ path เต็มๆ หรือไม่ก็เข้าใจผิดว่ามันอยู่ตรงไหน ถ้ามันหาไฟล์ json นี้ไม่เจอ Tunnel จะไม่ยอมรันให้เลยนะ
พอ config พร้อมแล้ว ก็รัน Tunnel เลย:
cloudflared tunnel run <ชื่อ-tunnel-ของคุณ>
มันจะเริ่มเชื่อมต่อแล้ว ถ้าทุกอย่างถูกต้อง คุณควรจะเห็น log ว่ามัน connected to LAX, connected to ORD อะไรแบบนี้ คือมันเชื่อมไปหลายๆ จุดทั่วโลกเพื่อความเสถียร
สิ่งสุดท้ายที่ต้องทำคือการสร้าง DNS record! ไปที่ Cloudflare Dashboard ของโดเมน yourdomain.com นะ แล้วไปที่แท็บ DNS เพิ่ม CNAME record ใหม่: * Type: CNAME * Name: home (อันนี้คือ Subdomain ที่เราใช้ใน config.yml ไง) * Target: <ชื่อ-tunnel-ของคุณ>.cfargotunnel.com * เช่น ถ้าชื่อ tunnel คุณคือ my-home-server ก็ใส่ my-home-server.cfargotunnel.com * Proxy status: ให้เป็น "Proxied" (เมฆสีส้ม)
แค่นี้ก็เรียบร้อยแล้ว ลองเข้า home.yourdomain.com ดูดิ้! จะเห็นเว็บที่คุณรันอยู่บน localhost:8000 แล้ว! โคตรเจ๋งปะล่ะ
ข้อดีที่ผมชอบโคตรๆ เลยนะ: 1. ไม่ต้องเปิดพอร์ต: อันนี้คือ MVP เลย ชีวิตดีขึ้นเยอะ 2. ความปลอดภัย: ทราฟฟิกวิ่งผ่าน Cloudflare ได้ประโยชน์จาก WAF, DDoS Protection ฟรีๆ 3. สะดวก: ตั้งค่าทีเดียวจบ ไม่ต้องยุ่งกับ Router เลย
ข้อสังเกตเล็กๆ น้อยๆ: บางทีตอนรัน cloudflared tunnel run ถ้ามันไม่ขึ้น connected ซักทีนะ ลองเช็ค config.yml ดีๆ โดยเฉพาะ credentials-file path อ่ะ บางทีก็งงเองว่าไฟล์ json มันไปอยู่ไหน (เพราะตอน login มันเอาไปวางไว้ใน .cloudflared ใน home dir ซึ่งเราชอบลืม)
อีกอย่างคือถ้าคุณรันบน Docker นะ จะมีเรื่อง network mode นิดหน่อย แต่หลักการก็คล้ายๆ กัน แค่ต้องแน่ใจว่าคอนเทนเนอร์มันเห็น localhost:8000 ของโฮสต์ได้
ประมาณนี้แหละ ลองเอาไปใช้ดูดิ ชีวิตดีขึ้นเยอะจริงๆ สำหรับคนอยากโชว์ของแต่ไม่อยากวุ่นวายเรื่อง Infra เยอะๆ อ่ะ