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 เยอะๆ อ่ะ

Read more

ณัฐวุฒิ วงศ์เนียม: ไขทุกข้อสงสัย บาร์โค้ดบัตรเลือกตั้ง ไม่ใช่เรื่องลับ ไม่ใช่โมฆะ

ณัฐวุฒิ วงศ์เนียม: ไขทุกข้อสงสัย บาร์โค้ดบัตรเลือกตั้ง ไม่ใช่เรื่องลับ ไม่ใช่โมฆะ

ดร.ณัฏฐ์ ณัฐวุฒิ วงศ์เนียม ผู้เชี่ยวชาญกฎหมายมหาชน ชี้แจงกรณีบาร์โค้ดบัตรเลือกตั้งไม่ละเมิดความลับ ชี้ 'สภาโจ๊ก' สร้างความปั่นป่วน ท้าทายให้มีหลักฐานจริง

By ทีมงาน devdog
Sidus Space (SIDU): หุ้นดาวรุ่งในอุตสาหกรรมอวกาศ? เจาะลึกปัจจัยที่คุณควรรู้

Sidus Space (SIDU): หุ้นดาวรุ่งในอุตสาหกรรมอวกาศ? เจาะลึกปัจจัยที่คุณควรรู้

ค้นพบหุ้น Sidus Space Inc (SIDU) กับการวิเคราะห์ปัจจัยพื้นฐาน สถานะทางการเงิน และโอกาสการลงทุนในอุตสาหกรรมอวกาศและการป้องกันประเทศ

By ทีมงาน devdog
พยากรณ์อากาศวันนี้: กรมอุตุฯ เตือนภัย "พายุฤดูร้อน" ถล่มไทย 16-20 เม.ย. 69 เตรียมรับมือ!

พยากรณ์อากาศวันนี้: กรมอุตุฯ เตือนภัย "พายุฤดูร้อน" ถล่มไทย 16-20 เม.ย. 69 เตรียมรับมือ!

กรมอุตุฯ เตือน "พายุฤดูร้อน" ถล่มไทย 16-20 เม.ย. 69 มีทั้งฝนฟ้าคะนอง ลมกระโชกแรง ลูกเห็บตก! เช็กพื้นที่เสี่ยงและเตรียมรับมือที่นี่

By ทีมงาน devdog
Google ส่ง Gemini ลง Mac แบบ Native พร้อมตัวช่วย AI สุดล้ำ ยกระดับงานเดสก์ท็อป

Google ส่ง Gemini ลง Mac แบบ Native พร้อมตัวช่วย AI สุดล้ำ ยกระดับงานเดสก์ท็อป

Google เปิดตัว Gemini เวอร์ชัน Native บน Mac พร้อมฟีเจอร์ AI ล้ำสมัย ช่วยเพิ่มประสิทธิภาพการทำงาน ปลดล็อกความคิดสร้างสรรค์ และเชื่อมต่อข้อมูลส่วนตัวได้อย่างชาญฉลาด

By ทีมงาน devdog