ตั้งเซิร์ฟเวอร์บ้านๆ ออกเน็ตง่ายๆ ด้วย Cloudflare Tunnel
Cloudflare Tunnel เนี่ยนะ คือตัวช่วยชีวิตเลยสำหรับคนอยากเปิดบริการอะไรในบ้านออกเน็ต
ปกติเราต้องไปเซ็ต Port Forwarding บนเราเตอร์ใช่มะ? แล้วไหนจะเรื่อง Dynamic DNS อีก ถ้า IP ไม่นิ่ง ผมเคยปวดหัวกับไอ้พวกนี้ประจำ โดยเฉพาะตอนจะทำเดโมให้เพื่อนดู หรือรัน Home Assistant ให้แม่บ้านใช้จากข้างนอก
แต่ Cloudflare Tunnel มันโคตรง่ายอ่ะ! ไม่ต้องยุ่งกับเราเตอร์เลยซักนิดเดียว มันสร้าง Tunnel วิ่งทะลุไฟร์วอลล์ออกไปหา Cloudflare โดยตรงเลย แล้ว Cloudflare ก็จัดการเรื่อง DNS, SSL ให้หมด โคตรคูล!
มันทำงานยังไงนะ?
หลักการมัน simple มาก คือเราจะติดตั้ง cloudflared agent บนเซิร์ฟเวอร์ในบ้านเรา
ไอ้ตัว agent เนี่ย มันจะไปเชื่อมต่อกับ Cloudflare network ผ่าน outbound connection (HTTPS ปกติ) แล้วเมื่อมีคนเข้าเว็บเราผ่าน Cloudflare (ที่ผูกกับ DNS ของเรา) ทราฟฟิกนั้นจะถูกส่งผ่าน Tunnel ที่สร้างขึ้นมานี่แหละ กลับมาที่เซิร์ฟเวอร์ในบ้านเราเลย
มาลองทำกันเลยดีกว่า
สมมติผมมี Ubuntu Server อยู่ที่บ้านนะ
1. ติดตั้ง cloudflared
โค้ดนี้สำหรับ Ubuntu/Debian นะฮะ:
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
# ถ้าอยากให้มันเป็น service systemd
sudo cloudflared service install
บางทีถ้าลืม sudo ตอน service install มันจะบ่นๆหน่อยนะ ว่าไม่มีสิทธิ์ ต้องรันใหม่นะฮะ
2. เข้าสู่ระบบ (Authenticate)
เปิด Terminal พิมพ์:
cloudflared tunnel login
มันจะเปิดหน้า Browser ให้เราไป Log In กับ Cloudflare Account ของเรา พอ Login เสร็จ มันจะสร้าง certificate file ไว้ที่ ~/.cloudflared/
3. สร้าง Tunnel ใหม่
ตั้งชื่อ Tunnel ของเรา:
cloudflared tunnel create my-home-server-tunnel
เสร็จแล้วมันจะสร้าง Tunnel ID มาให้เราด้วยนะ หน้าตาประมาณ a1b2c3d4-e5f6-7890-abcd-ef0123456789 จดไว้หน่อยก็ดี หรือมันจะอยู่ใน output อยู่แล้ว
4. ตั้งค่า Config File
เราต้องบอก cloudflared ว่าจะให้ Tunnel นี้เชื่อมต่อไปที่ไหน สร้างไฟล์ config.yml ขึ้นมา เช่น:
# ~/.cloudflared/config.yml หรือจะเก็บไว้ที่อื่นก็ได้นะ แค่ตอนรันต้องบอกพาธถูก
tunnel: a1b2c3d4-e5f6-7890-abcd-ef0123456789 # เปลี่ยนเป็น Tunnel ID ของคุณ
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef0123456789.json # อันนี้ก็เปลี่ยนตามพาธและชื่อไฟล์ของคุณ
ingress:
- hostname: myapp.yourdomain.com # เปลี่ยนเป็น Domain ของคุณ
service: http://localhost:8000 # ชี้ไปที่บริการในบ้านเรา เช่นเว็บที่รันบน port 8000
- service: http_status:404 # ถ้าไม่ตรงกับ hostname ด้านบน ให้ตอบ 404
Important: พาธของ credentials-file ต้องถูกนะฮะ บางทีลืมเปลี่ยนนี่คือรันไม่ขึ้นเลย
5. สร้าง DNS Record
ไปที่หน้า Cloudflare Dashboard ของ Domain ที่เราจะใช้ (เช่น yourdomain.com) เพิ่ม DNS Record แบบ CNAME: * Type: CNAME * Name: myapp (หรืออะไรก็ได้ที่เรากำหนดใน hostname ด้านบน) * Target: a1b2c3d4-e5f6-7890-abcd-ef0123456789.cfargotunnel.com (เอา Tunnel ID ของเรามาใส่ แล้วต่อด้วย .cfargotunnel.com) * Proxy status: Proxied (เปิดเมฆส้ม)
6. รัน Tunnel!
สุดท้ายก็สั่งให้มันทำงาน:
cloudflared tunnel run my-home-server-tunnel --config ~/.cloudflared/config.yml
ถ้าทุกอย่างถูกต้อง มันจะขึ้นว่า "Tunnel is running" อะไรประมาณนั้น ถ้าจะรันเป็น service ก็ใช้ systemctl start cloudflared ได้เลย
ข้อควรระวังและคิดเห็นส่วนตัว
- เรื่องความปลอดภัย: เออ มันดีนะ เพราะมันไม่ได้เปิด Port อะไรเลย แต่ก็ต้องมั่นใจว่าปลายทางในบ้านเราปลอดภัยพอ
- ประสิทธิภาพ: สำหรับใช้งานส่วนตัว หรือพวก PoC นี่คือเหลือๆ แต่ถ้าเป็น Production ที่ทราฟฟิกมหาศาล อาจจะต้องดูเคส by เคสไป
- ฟรีแค่ไหน?: ถ้าใช้แค่ Tunnel ปกติคือฟรี แต่ถ้ามีฟีเจอร์ Enterprise อันนั้นก็เสียเงินตามปกติ
ผมโคตรชอบ Cloudflare Tunnel เลยนะ บอกเลยว่าชีวิตดีขึ้นเยอะ ไม่ต้องมานั่งงมกับ Router ตั้ง Port Forwarding ให้เสียเวลา เหมาะกับพวกชอบลองของ หรือรันอะไรนิดๆ หน่อยๆ ที่บ้านสุดๆ
ลองใช้ดูนะ ไม่ผิดหวังหรอก!