เชื่อมระบบภายใน ง่ายๆ ด้วย Node-RED และ Cloudflare Tunnel
สวัสดีครับ
โปรแกรมเมอร์อย่างพวกเรานะครับ หลายๆทีเราก็มีระบบที่ทำไว้รันในเครื่อง หรือในเครือข่ายภายในของเรา เช่น พวก Node-RED ที่เราเอาไว้ทำ Automation เล็กๆ หรือระบบหลังบ้านอื่นๆนะครับ
แต่บางทีก็มีเหตุผลที่เราอยากให้ระบบพวกนี้ สามารถเข้าถึงได้จากภายนอกใช่ไหมครับ? ไม่ว่าจะจากลูกค้า จากทีมงานที่ทำงานนอกสถานที่ หรือแค่เพื่อนๆที่อยากลองเล่นดู
ปัญหาคือ การจะเปิด Port ใน Firewall หรือตั้งค่า VPN มันก็วุ่นวายใช่ไหมครับ? ผมมีทางออกง่ายๆ มาแนะนำครับ นั่นคือ Cloudflare Tunnel นะครับ
Cloudflare Tunnel จะช่วยให้เราเชื่อมต่อระบบภายในของเราออกไปข้างนอกได้อย่างปลอดภัย โดยที่เราไม่ต้องเปิด Port อะไรเลย เป็นการเชื่อมออกไปครับ ทำให้พวก Hacker เข้ามาได้ยากขึ้นเยอะเลย
มาดูกันเลยครับว่าทำยังไงบ้าง
ขั้นแรก ติดตั้ง Cloudflare Tunnel (cloudflared)
เราต้องติดตั้งโปรแกรม cloudflared ก่อนนะครับ ลองดูตามระบบปฏิบัติการของเพื่อนๆได้เลย
# สำหรับ Linux (Debian/Ubuntu) นะครับ
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# สำหรับ Windows (PowerShell) ก็ประมาณนี้นะครับ
# Invoke-WebRequest -Uri https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe -OutFile cloudflared.exe
# จากนั้น Login เข้า Cloudflare นะครับ
cloudflared tunnel login
# แล้วก็สร้าง Tunnel ใหม่ ให้ชื่อว่า 'my-node-red-tunnel' นะครับ
cloudflared tunnel create my-node-red-tunnel
เมื่อสร้าง Tunnel เสร็จแล้ว เราจะได้ไฟล์ JSON ที่มี UUID ของ Tunnel เราเก็บไว้ในโฟลเดอร์ .cloudflared นะครับ
ขั้นที่สอง ตั้งค่า Tunnel ให้ Node-RED ของเรา
เราจะสร้างไฟล์ config.yml เพื่อบอก Cloudflare Tunnel ว่าให้เชื่อมโดเมนอะไร ไปที่ Node-RED ของเราที่รันอยู่พอร์ตไหนนะครับ
# config.yml
tunnel: my-node-red-tunnel
credentials-file: /root/.cloudflared/UUID.json # เปลี่ยน UUID ให้ตรงกับของเพื่อนๆนะครับ
ingress:
- hostname: node-red.cii3.net # สมมุติว่าเราใช้โดเมนย่อยนี้ใน Cloudflare นะครับ
service: http://localhost:1880 # Node-RED ปกติจะรันที่พอร์ต 1880 นะครับ
- service: http_status:404 # กฎสุดท้าย ถ้าไม่มีอะไรตรง ให้ตอบ 404 นะครับ
จากนั้น เราก็แค่เพิ่ม DNS Record ใน Cloudflare Dashboard ของโดเมน cii3.net นะครับ ให้ชี้ไปที่ Tunnel ของเรา โดยใช้ประเภท CNAME และค่าเป็น UUID.cfargotunnel.com นะครับ
ขั้นที่สาม รัน Tunnel และเข้าถึง Node-RED ของเรา
ตอนนี้ก็ถึงเวลาเปิด Tunnel แล้วครับ
# รัน Tunnel ของเรานะครับ
cloudflared tunnel run my-node-red-tunnel
# ส่วน Node-RED ก็รันตามปกติเลยครับ
# node-red
เท่านี้ เพื่อนๆก็สามารถเข้าถึง Node-RED ของเราได้จาก https://node-red.cii3.net แล้วนะครับ โดยไม่ต้องเปิด Port อะไรเลย
เรื่องความปลอดภัย (Best Practice)
สำหรับเรื่องความปลอดภัยนะครับ เพื่อนๆสามารถเพิ่ม Cloudflare Access เข้าไปได้เลย คือกำหนดว่าใครจะเข้าถึงได้บ้าง อันนี้จำเป็นมากนะครับ ถ้าเป็นระบบจริงจัง
ไปที่ Cloudflare Dashboard > Access > Applications นะครับ แล้วก็สร้าง Policy สำหรับโดเมนที่เราใช้
เลือกได้ว่าจะให้ใครเข้าได้บ้าง เช่น ต้องเป็นอีเมลล์จากโดเมนที่เราอนุญาต หรือ ใช้ Identity Provider อื่นๆได้เลยครับ
แบบนี้ไม่ต้องห่วงเรื่อง Security Log ด้วยครับ เพราะ Cloudflare จัดการให้หมดเลย ผมว่าอันนี้ดีมากๆเลยครับ
อยากให้ Node-RED คุยกับระบบอื่น?
ถ้าเพื่อนๆ อยากให้ Node-RED คุยกับระบบอื่น หรือรับข้อมูลจากอุปกรณ์ IoT นะครับ ลองดูพวก Message Broker อย่าง MQTT หรือ Kafka นะครับ จะช่วยให้ระบบเรายืดหยุ่นขึ้นเยอะเลยครับ เป็น Best Practice ในการเชื่อมต่อระบบให้คุยกันได้ง่ายๆเลยนะ
หวังว่าบทความนี้จะเป็นประโยชน์กับเพื่อนๆนะครับ ลองเอาไปปรับใช้กับระบบของตัวเองดูได้เลยครับ
อ้างอิง: - Cloudflare Tunnel Documentation - Node-RED Official Website - MQTT Protocol