ใช้ Cloudflare Tunnel กับ Homelab อย่างไรให้ปลอดภัยขึ้น

Cloudflare Tunnel ช่วยลดการเปิดพอร์ตเข้าบ้านได้มาก แต่ไม่ได้แปลว่าระบบปลอดภัยเองทันที บทความนี้ชวนตั้งค่า tunnel, firewall, Access policy, network scope และ monitoring ให้เหมาะกับ homelab ที่ดูแลได้จริง

ภาพประกอบ homelab ที่ปิดทางเข้าตรงจากอินเทอร์เน็ตและใช้ tunnel outbound ผ่าน cloud gateway

พอทำ homelab ไปสักพัก ความต้องการที่ตามมามักไม่ใช่แค่ "รัน service ได้" แต่เป็น "อยากเข้าจากข้างนอกได้โดยไม่ต้องเปิดบ้านกว้างเกินไป" เช่น อยากดู dashboard ตอนอยู่นอกบ้าน อยากเข้า NAS เฉพาะบางหน้า อยากเปิด Git server ส่วนตัว หรืออยากให้ webhook บางตัวเข้ามาถึง service ในบ้านได้

วิธีดั้งเดิมคือ port forwarding จาก router เข้ามาที่เครื่องด้านใน แต่วิธีนี้มีข้อเสียชัดมาก คือ service ในบ้านเริ่มถูกมองเห็นจากอินเทอร์เน็ตโดยตรง ถ้าตั้งค่าผิด ลืมอัปเดต หรือเปิด admin UI ไว้กว้างเกินไป ความเสี่ยงก็เพิ่มขึ้นทันที

Cloudflare Tunnel เป็นหนึ่งในทางเลือกที่ช่วยลดการเปิดพอร์ต inbound ได้ดี เพราะ cloudflared ในฝั่งเราเป็นฝ่ายเชื่อมต่อ outbound ไปยัง Cloudflare แล้ว traffic จึงวิ่งผ่าน tunnel กลับเข้ามายัง origin ภายในบ้าน แต่สิ่งที่ต้องย้ำก่อนคือ tunnel ไม่ใช่เวทมนตร์ ถ้าเปิด policy กว้างเกินไป หรือให้ tunnel เห็นทั้ง LAN โดยไม่จำเป็น ความเสี่ยงก็ยังอยู่ เพียงแต่ย้ายตำแหน่งไปอยู่ที่การตั้งค่า tunnel และ identity แทน

สาระตั้งต้นจากแหล่งอ้างอิง

ก่อนเรียบเรียงเป็นบทความ ผมสรุปแก่นจากแหล่งข้อมูลที่ใช้จริงไว้ก่อน:

  1. Cloudflare อธิบายว่า Cloudflare Tunnel ช่วยเชื่อม resource เข้ากับ Cloudflare โดยไม่ต้องมี public routable IP ที่ origin และใช้ cloudflared สร้าง outbound-only connection ไปยัง Cloudflare global network
  2. เมื่อ tunnel ทำงานแล้ว traffic สามารถวิ่งสองทางผ่าน connection นั้นได้ และสามารถตั้ง firewall ให้ allow เฉพาะ outbound ที่จำเป็น พร้อม block inbound ไปยัง origin
  3. เอกสาร firewall ของ Cloudflare ระบุว่า tunnel operation ต้อง allow outbound ไปยัง Cloudflare บน port 7844 สำหรับ TCP/UDP ตาม protocol ที่ใช้ เช่น http2 หรือ quic
  4. Cloudflare Access ใช้ policy เพื่อกำหนดว่าใครเข้าถึง application ได้ โดยมี Include, Exclude และ Require rules และมีตัวอย่าง misconfiguration ที่ทำให้ "ใครก็เข้าได้" เช่น Include Everyone
  5. Cloudflare มี tunnel notification สำหรับ health หรือ deployment status และแนะนำให้ monitor tunnel health พร้อมพิจารณา replica หรือ load balancer เมื่อเหมาะสม

ถ้าแปลเป็นภาษาคนทำ homelab แก่นคือ Cloudflare Tunnel ช่วยลด surface จากการเปิด port ตรง แต่ความปลอดภัยจริงขึ้นอยู่กับว่าเราเปิด service อะไร ผ่าน hostname ไหน ใครเข้าได้ backend ยังถูกเข้าตรงได้หรือไม่ และเรารู้ตัวเร็วแค่ไหนถ้า tunnel มีปัญหา

Cloudflare Tunnel ช่วยแก้โจทย์อะไร

โจทย์หลักของ tunnel คือทำให้ service ภายในบ้านถูกเข้าถึงผ่าน Cloudflare ได้โดยไม่ต้อง expose IP หรือ port ของบ้านโดยตรง ในทางปฏิบัติ นี่ช่วยลดปัญหาหลายอย่าง:

  1. ไม่ต้องเปิด port forwarding ที่ router สำหรับทุก service
  2. ลดโอกาสที่ scanner จากอินเทอร์เน็ตจะเห็น origin ตรง
  3. ใช้ hostname และ TLS ผ่าน Cloudflare ได้เป็นระบบกว่า IP บ้าน
  4. วาง Cloudflare Access เป็น identity layer หน้า service ที่ไม่ควร public
  5. ใช้กับบาง protocol เช่น HTTP, SSH หรือ RDP ได้ตาม use case ที่รองรับ

สำหรับ homelab สิ่งนี้เหมาะกับ service ที่เราอยากเข้าจากนอกบ้าน แต่ไม่อยากให้ public กว้าง เช่น dashboard, internal wiki, Git UI, admin panel บางตัว หรือ app ส่วนตัวที่มีผู้ใช้จำกัด

แต่ถ้า service นั้นตั้งใจ public จริง เช่น blog หรือ portfolio ก็ยังต้องคิดเรื่อง web security ปกติอยู่ดี Tunnel ช่วยเรื่องเส้นทางเข้าถึง origin แต่ไม่ได้แก้ช่องโหว่ใน application, authentication ที่อ่อน, dependency เก่า, หรือข้อมูลที่ app เปิดเผยผิดทาง

ภาพประกอบ: การปิด port forwarding ที่ไม่จำเป็นและใช้เส้นทาง outbound tunnel เพียงเส้นทางเดียว

สิ่งแรกที่ควรทำ: ปิดทางเข้าตรงให้จริง

ข้อผิดพลาดที่เจอบ่อยคือย้าย service มาอยู่หลัง tunnel แล้ว แต่ port เดิมยังเปิดอยู่ที่ router หรือ firewall แบบนี้ tunnel กลายเป็นแค่ทางเข้าอีกทาง ไม่ได้ลด exposure ตามที่ตั้งใจ

หลักที่ควรทำคือหลังย้าย service เข้า tunnel แล้ว ให้ตรวจสอบว่า origin ยังถูกเข้าตรงจากอินเทอร์เน็ตได้หรือไม่ เช่น:

  1. ปิด port forwarding ที่ไม่จำเป็นบน router
  2. ให้ backend bind เฉพาะ localhost หรือ private interface ที่จำเป็น
  3. ใช้ firewall ในเครื่องหรือ VLAN rule เพื่อรับ traffic เฉพาะจาก connector หรือ network ที่ตั้งใจ
  4. แยก public app ออกจาก admin app อย่า route ทุกอย่างผ่าน wildcard แบบไม่ทบทวน
  5. ถ้า service ยังต้องเปิด port ภายใน LAN ให้จำกัดว่าใครใน LAN เห็นได้บ้าง

จุดนี้สำคัญเพราะ tunnel จะมีประโยชน์เต็มที่ก็ต่อเมื่อมันเป็นเส้นทางที่ตั้งใจไว้ ไม่ใช่แค่ชั้นใหม่ที่วางทับ port forwarding เดิม

อย่าใช้ Tunnel เป็นทางเข้าทั้ง LAN โดยไม่จำเป็น

Cloudflare Tunnel ใช้ได้ทั้งแบบ published application และ private network access ซึ่งฟังดูสะดวกมาก แต่สำหรับ homelab ต้องระวังเรื่อง scope

ถ้าเป้าหมายคือให้เข้าถึง service เดียว เช่น photos.example.com หรือ git.example.com ควร publish เฉพาะ service นั้น ไม่ควรเริ่มจากการ route subnet ใหญ่ทั้งบ้านเพียงเพราะทำได้ เพราะ subnet ใหญ่แปลว่าใครหรืออุปกรณ์ที่ผ่าน policy ได้อาจมองเห็นอะไรได้มากกว่าที่ตั้งใจ

แนวทางที่ practical คือแบ่ง use case:

  1. Web app ส่วนตัว ใช้ hostname แยก และวาง Access policy หน้า app
  2. Admin UI สำคัญ ใช้ policy เข้มกว่า app ทั่วไป เช่น จำกัด email, MFA, device posture หรือ country ตามความเหมาะสม
  3. SSH หรือ RDP ใช้แนวทางเฉพาะ protocol และอย่าเปิดให้ทุกคนในบัญชีเดียวกัน
  4. Private network route ใช้เฉพาะเมื่อจำเป็นจริง และ route ให้แคบที่สุดเท่าที่งานต้องใช้

หลักเดียวกับ Zero Trust คืออย่าให้การเข้าถึงเกิดจากคำว่า "อยู่หลัง tunnel แล้ว" แต่ให้เกิดจาก policy ที่อธิบายได้ว่าใคร ต้องเข้าอะไร เพื่ออะไร และควรเห็นแค่ไหน

Cloudflare Access คือส่วนที่ไม่ควรมองข้าม

ถ้า tunnel คือเส้นทาง Cloudflare Access คือด่านตรวจคนเข้า service สำหรับ homelab ที่เปิด dashboard หรือ admin UI ผ่าน tunnel ผมมองว่า Access policy ไม่ใช่ optional แต่เป็นส่วนสำคัญของการออกแบบ

ตัวอย่าง policy ที่ควรคิด:

  1. Include เฉพาะ email หรือกลุ่มที่ต้องใช้จริง
  2. Require MFA หรือ device posture สำหรับ service สำคัญ
  3. Exclude บัญชีหรือ domain ที่ไม่ควรมีสิทธิ์
  4. ตั้ง session duration ให้เหมาะกับความเสี่ยง
  5. อย่าใช้ Include Everyone กับ app ภายใน
  6. อย่าใช้ wildcard hostname แบบกว้างโดยไม่รู้ว่ามี service อะไรตามมา
ภาพประกอบ: policy gate ที่ตรวจ identity, MFA, device posture และ least privilege ก่อนเข้า service ภายใน

สำหรับบ้านที่มีหลายคนหรือทีมเล็ก ถ้าให้คนอื่นเข้า service ใน homelab ผ่าน tunnel ควรแยก account ตามคน ไม่ควรแชร์บัญชีเดียว เพราะเวลาต้อง revoke access หรือดู log จะได้รู้ว่าใครเข้าระบบเมื่อไร

ตั้งค่า connector ให้ดูแลได้จริง

cloudflared คือ connector ที่อยู่ฝั่งเรา ถ้ามันหยุด service ที่พึ่ง tunnel ก็เข้าไม่ได้ ดังนั้นต้องคิดเรื่อง operation ไม่ใช่แค่ติดตั้งครั้งแรกให้ผ่าน

อย่างน้อยควรทำสิ่งเหล่านี้:

  1. รัน cloudflared เป็น service หรือ container ที่ restart อัตโนมัติ
  2. เก็บ tunnel token หรือ credential ให้ปลอดภัย ไม่วางไว้ใน repo หรือ shared folder กว้าง ๆ
  3. จำกัดสิทธิ์เครื่องที่รัน connector ให้เข้าถึง backend เท่าที่จำเป็น
  4. อัปเดต cloudflared ตามรอบที่เหมาะสม
  5. ถ้า service สำคัญมาก ให้มี connector replica บนเครื่องคนละตัวหรืออย่างน้อยคนละ failure point
  6. ตั้ง alert เมื่อ tunnel health เปลี่ยนหรือ connector หายไป

สำหรับ homelab ที่ใช้ mini PC เครื่องเดียวรันทุกอย่าง replica อาจยังไม่คุ้ม แต่ถ้ามี NAS, Proxmox node หรือเครื่องสำรองอยู่แล้ว การวาง connector อีกตัวอาจช่วยให้ remote access ไม่หายทั้งชุดเมื่อเครื่องหลัก reboot

Firewall ฝั่งบ้านยังสำคัญ

หลายคนคิดว่าใช้ tunnel แล้ว firewall ฝั่งบ้านไม่ต้องคิดมาก ซึ่งไม่จริงครับ Firewall ยังเป็นตัวบอกว่าเครื่อง connector ออกไปหา Cloudflare ได้อย่างไร และ backend รับ traffic จากใครได้บ้าง

ตามเอกสาร Cloudflare ฝั่ง egress สำหรับ tunnel ต้อง allow port 7844 ไปยังปลายทาง Cloudflare ที่กำหนด โดย protocol ขึ้นกับการใช้ quic หรือ http2 ถ้า firewall ในบ้านทำ outbound filtering จริง ควรตั้งให้ชัด ไม่ใช่เปิด outbound ทั้งหมดแบบไม่มีเหตุผล

อีกด้านที่สำคัญกว่าคือ ingress ภายในบ้านจาก connector ไป backend ตัวอย่างเช่น ถ้า connector อยู่ใน Docker host เดียวกับหลาย service อย่าให้มันเข้าถึง NAS share, database, management interface หรือ subnet อื่น ๆ ได้หมดโดยไม่จำเป็น ให้มันเห็นเฉพาะ service และ port ที่ tunnel ต้อง route จริง

พูดง่าย ๆ คือ Cloudflare Tunnel ลดความจำเป็นในการเปิด inbound จากอินเทอร์เน็ต แต่ไม่ได้ยกเลิกหลัก least privilege ระหว่างระบบภายในบ้าน

ต้องมีทางสำรองเมื่อ Tunnel เข้าไม่ได้

ถ้า remote access ทั้งหมดผูกกับ Cloudflare Tunnel อย่างเดียว วันหนึ่งถ้า Cloudflare account มีปัญหา, identity provider ใช้ไม่ได้, tunnel token เสีย, connector ล่ม, DNS config ผิด หรือ internet บ้านมีปัญหา เราอาจเข้าไปแก้ระบบไม่ได้จากข้างนอก

สำหรับ homelab ผมแนะนำให้มี break-glass path ที่จำกัดและปลอดภัยพอสมควร เช่น:

  1. VPN ส่วนตัวที่ปิดไว้และเปิดใช้เฉพาะจำเป็น
  2. Tailscale, NetBird หรือ WireGuard overlay ที่แยกจาก Cloudflare
  3. SSH ผ่าน management network ที่ allow เฉพาะ key และ source ที่ไว้ใจ
  4. วิธีเข้าหน้า router หรือ hypervisor เมื่ออยู่ในบ้าน
  5. เอกสารสั้น ๆ ว่าถ้า tunnel เข้าไม่ได้ต้องเช็กอะไรตามลำดับ

ทางสำรองไม่ควรกลายเป็นรูใหญ่กว่า tunnel ถ้าสร้าง backup access แล้วเปิดกว้างตลอดเวลา ก็เท่ากับเอาความเสี่ยงเดิมกลับมา เพียงแต่ตั้งชื่อใหม่

ภาพประกอบ: การดูแล tunnel ด้วย log, alert, health check, replica และ backup access ที่จำกัด

Checklist ก่อนเปิด Service ผ่าน Tunnel

ก่อนเอา service ใน homelab ออกผ่าน Cloudflare Tunnel ผมจะถามตามนี้:

  1. Service นี้ต้องเข้าจากนอกบ้านจริงไหม
  2. เป็น public app หรือ private app
  3. ถ้าเป็น private app มี Access policy แล้วหรือยัง
  4. Policy จำกัดคนเข้าจริง หรือเผลอ Include Everyone
  5. Origin ยังเข้าตรงผ่าน IP หรือ port forwarding ได้ไหม
  6. Backend bind เฉพาะ interface ที่จำเป็นหรือไม่
  7. Connector เห็นเฉพาะ service ที่ต้อง route หรือเห็นทั้ง LAN
  8. Credential ของ tunnel ถูกเก็บในที่ปลอดภัยหรือไม่
  9. มี log และ alert เมื่อ tunnel health เปลี่ยนไหม
  10. ถ้า tunnel ล่ม มีทางเข้าแก้ระบบที่ไม่เปิดกว้างเกินไปหรือไม่
  11. Service ที่เปิดผ่าน tunnel อัปเดตและมี authentication ของตัวเองหรือไม่
  12. มี backup ของ config สำคัญ เช่น tunnel config, DNS record, firewall rule และ Access policy หรือไม่

ถ้าตอบคำถามเหล่านี้ไม่ได้ ยังไม่ควรรีบเปิด service นั้น เพราะความสะดวกของ tunnel อาจทำให้เรา publish service ได้เร็วเกินกว่าที่จะทบทวนความเสี่ยงทัน

อ่านต่อที่เกี่ยวข้อง

สรุป

Cloudflare Tunnel เป็นเครื่องมือที่ดีมากสำหรับ homelab เพราะช่วยลดการเปิด port ตรง และทำให้เราเอา identity, policy และ logging มาควบคุมทางเข้าได้เป็นระบบขึ้น แต่ความปลอดภัยไม่ได้เกิดจากการติดตั้ง tunnel เพียงอย่างเดียว

สิ่งที่สำคัญกว่าคือปิดทางเข้าตรงให้จริง จำกัด scope ของ tunnel ให้แคบ ใช้ Access policy ให้เหมาะกับความเสี่ยง จำกัดสิทธิ์ connector ดูแล firewall ฝั่งบ้าน ตั้ง monitoring และมีทางสำรองที่ไม่กลายเป็นช่องโหว่ใหม่

ถ้าทำแบบนี้ Cloudflare Tunnel จะเป็นด่านควบคุมที่มีประโยชน์ ไม่ใช่แค่ทางลัดให้ service ในบ้านออกสู่อินเทอร์เน็ตเร็วขึ้นโดยไม่มี guardrail

แหล่งอ้างอิง