ผมได้สร้างบริการ SSH tunnel ที่ให้ URL แบบ HTTPS ถาวรกับโลคัลเซิร์ฟเวอร์ได้โดยไม่ต้องตั้งค่าเราเตอร์
(natnest.site)ลิงก์บริการ: https://natnest.site
ซอร์สของไคลเอนต์: https://github.com/litdemon/natnest-client
สวัสดีครับ ผมได้สร้าง NatNest ซึ่งเป็นบริการที่เปิดให้โลคัลเซิร์ฟเวอร์เข้าถึงจากภายนอกได้โดยอาศัย SSH reverse tunnel
run local server 8080
natnest 8080 → https://yourname.natnest.site
ที่มาของการสร้าง
ผมมี Mac mini อยู่ที่บ้านเครื่องหนึ่งและรัน Ollama อยู่บนเครื่องนั้น
ผมอยากใช้งานจากข้างนอกด้วย แต่ต้องมาติดเรื่องการตั้งค่า port forwarding ทุกครั้ง
เลยต้องเข้าไปที่หน้าแอดมินของเราเตอร์แล้วเปิดพอร์ตเพื่อใช้งาน
ต่อมาระหว่างใช้ Dialogflow ของ Google มีงานที่ต้องลงทะเบียน Webhook (fulfillment)
มันต้องใช้ https จึงต้องเตรียมโดเมนกับใบรับรอง แล้วรัน Nginx พร้อมทำ reverse proxy เพื่อเชื่อมต่อให้เสร็จ
และนักพัฒนาคนอื่นก็ต้องทำงานแบบเดียวกับผมในสถานการณ์คล้ายกัน
ซึ่งพอจะอธิบายให้ฟังก็เลยคิดว่า
"งั้นทำขึ้นมาเองเลยดีไหม?" นั่นคือจุดเริ่มต้นของ NatNest
ไม่ได้ทำแค่ Client เท่านั้น แต่ NatNest เป็นชุดที่รวมหลายส่วนไว้ด้วยกัน เช่น Nginx + Lua, Redis, DB, API server, Tunnel-server (SSH server) เป็นต้น
พอทำไปถึงได้รู้ว่ามีบริการแบบเดียวกันนี้อยู่แล้วใน ngrok และ Cloudflare Tunnel T_T
มันทำงานอย่างไร
เมื่อไคลเอนต์ (CLI) เชื่อมต่อ SSH reverse tunnel ไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะลงทะเบียนการแมป subdomain → internal port ไว้ใน Redis จากนั้นเมื่อมีคำขอจากภายนอกเข้ามาที่ https://yourname.natnest.site OpenResty (Nginx + Lua) จะค้นข้อมูลจาก Redis แล้ว proxy ไปยังพอร์ตของ SSH tunnel ที่เกี่ยวข้อง
คำขอจากภายนอก → [Nginx + Lua] → ค้นหาใน Redis → พอร์ต SSH tunnel → โลคัลเซิร์ฟเวอร์
ฝั่งไคลเอนต์มี watchdog process ที่ทำงานอยู่เบื้องหลังเพื่อคงการเชื่อมต่อ SSH เอาไว้ ดังนั้นแม้จะปิดเทอร์มินัลหรือเครือข่ายหลุดชั่วคราว ก็จะเชื่อมต่อใหม่อัตโนมัติภายใน 5 วินาที
มันต่างจาก ngrok / Cloudflare Tunnel อย่างไร
NatNest : URL ถาวร, self-host ได้, ตัวดู log ของ webhook
Ngrok Free : URL ถาวร (❌), self-host ไม่ได้, ตัวดู log ของ webhook (Pro ขึ้นไป)
Cloudflare Tunnel : URL ถาวร (❌), Pro ขึ้นไป, ไม่มี (❌)
มันเหมาะกับคนที่คิดแบบผมว่า "อยากได้ URL ถาวรฟรี ๆ และให้ข้อมูลอยู่บนเซิร์ฟเวอร์ของตัวเอง"
ข้อดีที่ใหญ่ที่สุดคือ
มีโซลูชันที่สามารถทำบริการแบบเดียวกับ Ngrok ได้
และถ้ามีข้อเสนอแนะดี ๆ ในคอมเมนต์ของโพสต์นี้ ก็สามารถนำไปปรับใช้ได้อย่างรวดเร็ว
นี่คือก้าวแรกเพื่อใส่ฟีเจอร์ที่นักพัฒนาต้องการจริง ๆ เข้าไปในบริการ
สถานะปัจจุบันและข้อจำกัดแบบตรงไปตรงมา
ณ เวอร์ชัน v0.5.1 ฟีเจอร์ด้านล่างนี้ใช้งานได้แล้ว:
- เชื่อมต่อบัญชี Google (OAuth Device Flow) + สร้าง SSH key อัตโนมัติ
- subdomain ถาวร + ต่ออายุ Let's Encrypt HTTPS แบบ wildcard อัตโนมัติ
- เว็บแดชบอร์ด (รายการ tunnel ที่กำลังใช้งาน, log ของ webhook แบบเรียลไทม์)
- ไบนารีไคลเอนต์สำหรับ Linux (amd64·arm64), macOS, Windows
ยังมีส่วนที่ขาดอยู่เช่นกัน:
- ระบบอัตโนมัติ CI/CD สำหรับ Windows build ยังทำไม่เสร็จ (ยังเป็นการ build แบบ manual)
- เซิร์ฟเวอร์ยังเป็นเซิร์ฟเวอร์เดี่ยวที่รันจากบ้าน จึงมี latency อยู่บ้าง
- ตอนนี้ดูแลบริการคนเดียว จึงยังยากที่จะรับประกันเสถียรภาพในระดับบริการ (SLA)
ถ้าอยากลองติดตั้ง
Linux / macOS
curl -fsSL https://natnest.site/install.sh | bash
natnest setup # เชื่อมบัญชี Google
natnest 8080 # เปิดพอร์ตโลคัล 8080 ออกสู่ภายนอก
นี่เป็นครั้งแรกที่ผมเปิดให้ใช้งานจากภายนอกอย่างเป็นทางการ ถ้ามีความคิดเห็นเกี่ยวกับประสบการณ์ใช้งานหรือมีข้อเสนอว่า "ถ้ามีฟีเจอร์แบบนี้จะดีมาก" รบกวนคอมเมนต์ไว้ได้เลย ขอบคุณมากครับ
4 ความคิดเห็น
คำสั่งติดตั้งและลิงก์ GitHub ด้านบนของหน้าโฮมเพจขึ้นข้อผิดพลาด 404 ครับ
ขอบคุณสำหรับความคิดเห็นครับ ผมได้แก้ไขและอัปเดตแล้ว
ปัญหาที่ใหญ่กว่าน่าจะเป็นการเปลี่ยนดีไซน์ที่ดูแวบเดียวก็รู้เลยว่า AI เป็นคนทำ
https://github.com/anderspitman/awesome-tunneling
Awesome Tunneling - รวมทางเลือกแทน ngrok
บริการประเภท tunnel มีความต้องการสูง เลยมีเครื่องมือแนวนี้อยู่มากพอสมควรครับ/ค่ะ ลองนำไปใช้เป็นข้อมูลอ้างอิงจากบริการอื่น ๆ ดูก็น่าจะดีครับ/ค่ะ
ดูดีนะ ช่วยให้หลุดพ้นจากนรกแห่งการตั้งค่าได้