Tutorial

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

By - 05 เมษายน 2024

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

ปกติหากเราต้องการจะเปิดเว็บสักเว็บ เราจำเป็นต้องมี Web Server ตั้งอยู่ที่ไหนสักที่หนึ่ง ที่มี Static Public IP เพื่อให้คนภายนอกเชื่อมต่อเข้ามาหาได้ แต่แน่นอนว่า การที่เราจะมี IP ลักษณะนี้มันต้องจ่ายเงินเยอะพอสมควร และ ไม่มีในบริการในบ้านแน่นอน หรือถ้ามี เราต้องจัดการเรื่อง Security อีกมากมายเช่นการตั้งค่า Firewall ยังไม่นับเรื่องการ Expose IP Address ของเราออกไปอีก แต่ถ้าเราบอกว่า ปัญหาที่เราว่ามาจะหมดมันจะดีขนาดไหน ด้วย Cloudflare Tunnel วันนี้เราจะมาเล่าวิธีการ Config และ การใช้งานกัน

Cloudflare Tunnel ทำงานอย่างไร ?

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที
Source Cloudflare

การทำงานของ Cloudflare Tunnel เข้าใจง่ายมาก เหมือนกับเราสร้างหลุมดำที่เชื่อมต่อระหว่างเรากับตัว Cloudflare เอง เราเรียกว่า Tunnel และค่อยออกผ่าน Cloudflare ไปสู่ Public Internet อีกทีนึง

เมื่อผู้ใช้ต้องการเข้าถึง เขาจะต้องทำการเชื่อมต่อกับ Cloudflare จากนั้นมันจะวิ่งไปอีกด้านของอุโมง เพื่อขอข้อมูลที่ต้องการตามที่เรากำหนดไว้ภายใน Local Network แล้ววิ่งกลับไปแล้วค่อย Serve ข้อมูลกลับไปให้ผู้ใช้อีกทีหนึ่ง

นั่นทำให้ เราไม่จำเป็นต้องมี Public Static IP Address เพื่อจะ Serve Website ของเราเลย เพราะเราใช้ทางออกของ Cloudflare เอง และยังทำให้เราไม่ต้อง Expose IP Address ของเราออกไป หากเราจัดการปิด Port หรือตั้ง Firewall ไม่ดี มันจะกลายเป็น Attack Surface อันโอชะให้กับเหล่าผู้ไม่ประสงค์ดีได้อีก ยังไม่นับว่าเขามีพวก WAF (Web Application Firewall) ใส่มาให้เราอีก ทำให้เราได้ระบบรักษาความปลอดภัยพื้นฐานโดยที่เราไม่ต้อง Config หรือลงทุนซื้ออุปกรณ์เพิ่มเติมแต่อย่างใด

ที่สำคัญ Cloudflare เขามี Server ตั้งอยู่ทั่วโลก ทำให้เราไม่ต้องกังวลเลยว่า หากเราวิ่งผ่าน Cloudflare แล้วจะทำให้ Service ทำงานได้ช้าลง เขามี Edge Server อยู่ทั่วโลกเลยทีเดียว และแน่นอนว่า เขามี Edge Server อยู่ในไทยด้วย ทำให้ Performance ไม่ตก เพราะ Cloudflare แน่นอน

สร้าง Tunnel บน Cloudflare

เริ่มต้นการติดตั้งด้วยการ Register Domain Name ของเราเข้ากับ Cloudflare ก่อนนะ ไปดูในคู่มือของเขาได้ จากนั้นให้เราเข้าไปที่ Zero Trust > Networks > Tunnels แล้วให้เรากด Create Tunnel

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

มันจะถามเราว่า เราจะใช้ Tunnel แบบไหน ณ วันที่เขียน เขามีให้เลือก 2 แบบ Cloudflared และ WRAP ทั้งสองตัวมีความแตกต่างกันอยู่พอสมควร แต่วันนี้ขอเลือกเป็น Cloudflared ก่อน (WRAP จะมาเล่าในตอนหน้า มันมีรายละเอียดเยอะอยู่) แล้วกด Next

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

ขั้นตอนต่อไปจะให้เราตั้งชื่อ Tunnel แนะนำให้ตั้งว่า Tunnel นี้มันไปไหน หากอนาคต เรามีหลาย ๆ เครื่อง เราจะได้รู้ว่า Tunnel อันนี้มันเป็นของใครไปไหน พอจะเดาได้ว่า มันรัน Service อะไร และอย่าลืมกด Save Tunnel ด้วย

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

จนถึงตอนนี้เราสร้าง Tunnel กับ Cloudflare เรียบร้อยแล้ว ขั้นตอนต่อไป เราจะต้องเชื่อมต่อเครื่องของเราเข้ากับ Tunnel ที่สร้างไว้ โดย Cloudflare เอง เขาเตรียมตัวเลือกให้เราหลายช่องทาง ทั้งการติดตั้งตรง ๆ ลงบน Linux และ OS อื่น ๆ แต่วิธีการที่เราคิดว่าง่ายที่สุดคือ การทำผ่าน Docker เอา ให้เรากดเลือก Docker มันจะขึ้นเป็นคำสั่งขึ้นมา ให้เรา Copy เอาไว้

docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <token>

ตัวอย่างเป็นแบบด้านบน หากใครใช้ Docker เป็นอยู่แล้ว เราจะเห็นว่า มันเป็นคำสั่งสำหรับการสร้าง Container ตามปกติ ถ้าเรารันไปมันควรจะทำงานได้แหละ แต่ว่า Service พวกนี้ เราต้องการให้มันทำงานอยู่ตลอดเวลา

docker run  --name cf_tunnel --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <token>

ทำให้เราเพิ่ม Argument ที่บอกว่า ไม่ให้มัน Stop เว้นแต่เราจะสั่งซะเอง พร้อมกับเพิ่ม Arugment ตั้งชื่อ Container ไว้ด้วย เวลาดูจะได้ง่ายหน่อย เมื่อเราสั่งรันไป ให้เรากลับไปที่หน้า Cloudflare เลื่อนลงไปด้านล่าง เราจะเห็น Section ที่เขียนว่า Connectors เราจะต้องรอให้มี Connection ขึ้นมาจาก Container ที่เราสร้างเอาไว้ เมื่อขึ้นมาแล้วก็ให้กด Next เป็นอันเรียบร้อย

สำหรับคนที่เกิดคำถามว่า การรัน cloudflared ทำให้เกิด Footprint มากเท่าไหร่ เราลองเช็คจาก Docker เอง ทดลองโหลดใส่ กับตอน Idle พบว่ามันไม่ได้กินเครื่องหนักอะไรมาก กิน Memory อยู่ราว ๆ 25-29 MB เท่านั้น และ เมื่อโหลดหนัก ๆ มีคนเข้าเว็บ CPU รันอยู่ 1-2% เท่านั้นเอง (ทำงานบน Synology DS1621+)

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

เมื่อเรากลับมาที่หน้าแรกของ Tunnel ควรจะมี Tunnel ที่เราสร้างขึ้นมา พร้อมสถานะ Healthy สีเขียว แปลว่า ตอนนี้เครื่องของเราเชื่อมต่อกับ Tunnel ไปที่ Cloudflare เรียบร้อยแล้ว

สำหรับใน Tutorial ที่เราเอามาเล่านี้ เราใช้เป็น Command Line แต่ถ้าใครใช้ Container Management ตัวไหนก็ลองอ่านคำสั่งแล้วไปสั่งในโปรแกรมที่เราใช้งานกันได้เลย

Exposing Service

เมื่อเราได้อุโมงเชื่อมแล้ว เราจะต้อง Expose Service ออกไปเพื่อให้เราสามารถเข้าถึง Service ต่าง ๆ จากข้างนอกได้ ตัวอย่างที่เราจะสร้างคือ การ Expose Home Assistant หรือระบบ Smart Home ของเราออกไป

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

ให้เรากลับไปที่หน้า Tunnel กดเลือก Tunnel ที่เราสร้างไว้ แล้วกด Configure มันจะเข้ามาที่หน้าการตั้งค่าของ Tunnel ให้เรากด Tab ที่เขียนว่า Public Hostname แล้วกดที่ Add a public hostname เราจะได้หน้าสำหรับการสร้าง Hostname ขึ้นมา

ในหน้านี้ เราจะต้องกรอกข้อมูลสำหรับการเชื่อม Service เราเข้าไป ตั้งแต่ Hostname ที่ต้องการ โดยเราสามารถใส่ Subdomain เข้าไปได้ หรือหากเป็น Root ของ Domain Name ของเรา สามารถเว้นช่อง Subdomain ไว้ได้เลย หากในช่อง Domain ไม่มี Domain Name ของเรา ให้ไปเช็คก่อนว่า เราได้ทำการเพิ่ม Domain Name เข้ามาใน Cloudflare Account ของเราหรือยัง

จากนั้น ช่องด้านล่างที่เขียนว่า Service ให้เราเลือก Type หรือประเภทของ Protocol ที่ให้มันเชื่อมต่อ ให้เราดูได้เลยว่า จากเครื่องที่เราติดตั้ง Tunnel เราเรียก Service นั้นอย่างไร ด้วย Protocol แบบไหน และ URL อะไร ให้เรากรอกเข้าไปได้เลย เช่น Home Assistant เรา เลือกเป็น HTTP และ URL เป็น 192.168.88.151:8123 อะไรแบบนั้น และกด Save hostname

สิ่งที่เจ๋งอยู่ใน Protocol หากเราลองเลื่อน ๆ ดู เราจะเห็นว่า มันไม่ได้รองรับแค่ HTTP และ HTTPS เท่านั้น แต่มันยังมี SSH และ RDP ให้เราเลือกอีก แปลว่าเราสามารถ SSH เข้าไปหาเครื่องที่เราต้องการใช้ข้างนอกได้ด้วยนะ

สำหรับ Service ไหนที่มันบังคับให้เราเรียกเป็น HTTPS และเป็น Self-Signed Certificate โดยค่าเริ่มต้น Cloudflare จะไม่ยอม เช่น UniFi Controller เรา มันจะบอกว่า Host Error

วิธีการแก้ไขคือ ให้เราเลือกปิด Additional Application Settings > TLS > NO TLS Verify ซะ เป็นการบอก Cloudflared ฝั่งเราว่า ไม่ต้องเช็คความถูกต้องของ Certificate ใด ๆ ให้ผ่านไปได้เลย แต่ไม่ต้องกังวลเรื่องความปลอดภัยมาก เพราะสุดท้ายการเชื่อมต่อตรงนี้จะเกิดขึ้นกับ เครื่องที่รัน Cloudflared และ Service ที่อยู่ใน Local Network เดียวกันเท่านั้น ยังไงการเชื่อมต่อระหว่าง Cloudflare ยังคงใช้ Secure Tunnel เหมือนเดิม

เท่านี้ก็เป็นอันเสร็จเรียบร้อย ให้เราลองเข้าไปตาม URL ที่เรากำหนดไว้ได้เลย มันควรจะใช้งานได้ละ

หากเราเข้าไปดูที่หน้า DNS เราจะเห็นว่า สิ่งที่ Cloudflare ทำคือ การสร้าง CNAME ขึ้นมา หาก DNS Query มาที่ Service URL มันจะวิ่งต่อไปที่ Tunnel ของ Cloudflare ให้เลย พร้อมกับมีการ Proxy ทำ Caching ให้เราเรียบร้อย

ข้อจำกัด

มาถึงตอนนี้หลาย ๆ คนอาจจะสงสัยว่า เห้ย เขาให้เราใช้ฟรีจริงเหรอวะ มันต้องมีข้อจำกัดอะไรบางอย่างสิ แต่เอาเข้าจริง Cloudflare ไม่ได้จำกัด Bandwidth หรือ Traffic อะไรมาเลย เหมือนเขาให้ใช้ฟรีไปเลย แต่มันมีเขียนอยู่ในข้อตกลงในการใช้งานอยู่ว่า เขาให้สำหรับการ Serve HTML Content เท่านั้น ไม่อนุญาติให้ Serve Content ประเภทอื่น ๆ มากจนเกินไป แต่ปัญหาคือ เขาไม่ได้บอกด้วยนะว่า มากเกินไป คือเท่าไหร่

SMB · Cloudflare Zero Trust docs
The Server Message Block (SMB) protocol allows users to read, write, and access shared resources on a network. Due to security risks, firewalls and …

นอกจากนั้นใน Document ของ Cloudflare เอง ยังมี Document ที่บอกวิธีการสำหรับการใช้ SMB ผ่าน Tunnel ซึ่งถ้าใช้งานจริง ๆ SMB เรา Exchange File กันฉ่ำ

สรุป

การใช้งาน Cloudflare Tunnel นั้นทำให้เราสามารถเข้าถึง Service หรือ Resource ของเราจากที่ไหนก็ได้อย่างปลอดภัย โดยไม่จำเป็นต้องเปิดเผยที่อยู่ของ Service ทั้งหมด รวมไปถึงการมีระบบป้องกัน DDoS Attack และ WAF ทำให้เรามั่นใจได้เลยว่า Service ของเราจะได้รับความปลอดภัยสูง ขั้นตอนทั้งหมดที่เราเล่ามา เราใช้เวลาทำครั้งแรก ไม่เกิน 10 นาทีเท่านั้นเอง ต่างจากช่วงแรก ๆ ที่ออกมาลิบลับ ตอนนั้นเราใช้เวลาหลักชั่วโมงค่อย ๆ อ่านค่อย ๆ ทำ ตอนนี้คือ เขามี Command มาให้เรารันตาม ๆ ไปเรื่อย ๆ ก็ใช้งานได้แล้ว ถือว่า เริ่ดมาก ๆ

Read Next...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...