Tôi đã tạo một dịch vụ SSH tunnel gắn URL HTTPS cố định vào server cục bộ mà không cần cấu hình router
(natnest.site)Liên kết dịch vụ: https://natnest.site
Mã nguồn client: https://github.com/litdemon/natnest-client
Xin chào. Tôi đã tạo NatNest, một dịch vụ mở server cục bộ ra bên ngoài dựa trên SSH reverse tunnel.
run local server 8080
natnest 8080 → https://yourname.natnest.site
Lý do tôi làm ra nó
Tôi có một chiếc Mac mini ở nhà và đang chạy Ollama trên đó.
Tôi muốn dùng nó cả khi ở bên ngoài, nhưng việc phải cấu hình port forwarding mỗi lần luôn là trở ngại.
Tôi phải vào trang quản trị router, mở cổng rồi mới dùng được.
Sau đó, khi dùng Dialogflow của Google, tôi có việc phải đăng ký Webhook (fulfillment).
Nó yêu cầu https, nên tôi phải chuẩn bị domain và chứng chỉ, chạy Nginx, rồi tạo reverse proxy và nối mọi thứ lại với nhau.
Các developer khác cũng phải làm đúng những công việc như tôi trong cùng hoàn cảnh. Tôi còn phải giải thích lại cho họ nữa, nên rồi tôi bắt đầu nghĩ rằng
"Hay là tự làm luôn nhỉ?" và NatNest bắt đầu từ đó.
Không chỉ làm mỗi client. NatNest là một hệ thống được ghép lại từ nhiều thành phần như Nginx + Lua, Redis, DB, API server, Tunnel-server (SSH server), v.v.
Trong lúc làm tôi mới biết là ngrok và Cloudflare Tunnel đã có dịch vụ tương tự rồi T_T.
Nó hoạt động như thế nào
Khi client (CLI) kết nối SSH reverse tunnel tới server, server sẽ đăng ký mapping giữa subdomain và cổng nội bộ vào Redis. Sau đó, khi có request từ bên ngoài đi vào https://yourname.natnest.site, OpenResty (Nginx + Lua) sẽ tra Redis và proxy tới cổng SSH tunnel tương ứng.
Request bên ngoài → [Nginx + Lua] → tra Redis → cổng SSH tunnel → server cục bộ
Client có tiến trình watchdog chạy nền để duy trì kết nối SSH, nên ngay cả khi đóng terminal hoặc mạng bị ngắt tạm thời, nó vẫn sẽ tự động kết nối lại trong vòng 5 giây.
Khác gì với ngrok / Cloudflare Tunnel
NatNest : URL cố định, self-hosting, trình xem log webhook
Ngrok Free : URL cố định (❌), không self-hosting, trình xem log webhook (từ Pro trở lên)
Cloudflare Tunnel : URL cố định (❌), Pro trở lên, không có (❌)
Nó phù hợp với những ai giống tôi, muốn có "URL cố định miễn phí, dữ liệu nằm trên chính server của mình".
Ưu điểm lớn nhất là
Tôi đang có trong tay một giải pháp có thể cung cấp dịch vụ kiểu như Ngrok,
và sự nhanh nhạy để có thể áp dụng ngay các ý tưởng hay từ những bình luận ở đây vào dịch vụ.
Đây thực sự là bước đầu tiên để đưa vào sản phẩm những tính năng mà developer thật sự mong muốn.
Trạng thái hiện tại và những giới hạn thẳng thắn
Tính đến v0.5.1, các tính năng dưới đây đang hoạt động:
- Kết nối tài khoản Google (OAuth Device Flow) + tự động tạo SSH key
- Subdomain cố định + tự động gia hạn HTTPS Let's Encrypt wildcard
- Web dashboard (danh sách tunnel đang hoạt động, log webhook thời gian thực)
- Binary client cho Linux (amd64·arm64), macOS, Windows
Vẫn còn một số điểm chưa hoàn thiện:
- Tự động hóa CI/CD cho bản build Windows هنوز chưa hoàn tất (hiện vẫn build thủ công)
- Server đang chạy trên một máy đơn lẻ tại nhà nên có độ trễ
- Dịch vụ hiện do một mình tôi vận hành nên khó đảm bảo mức ổn định cấp dịch vụ (SLA)
Nếu muốn thử cài đặt
Linux / macOS
curl -fsSL https://natnest.site/install.sh | bash
natnest setup # Liên kết tài khoản Google
natnest 8080 # Công khai cổng 8080 cục bộ ra bên ngoài
Đây là lần đầu tôi công khai nó ra bên ngoài, nên nếu bạn có trải nghiệm sử dụng hoặc ý kiến kiểu như "sẽ tốt hơn nếu có tính năng này", tôi sẽ thật sự rất biết ơn nếu bạn để lại bình luận.
4 bình luận
Lệnh cài đặt và liên kết GitHub ở đầu trang chủ đều đang báo lỗi 404.
Cảm ơn bạn đã bình luận. Tôi đã cập nhật bản sửa đổi.
Vấn đề lớn hơn có lẽ là thay đổi thiết kế trông rõ ràng như do AI tạo ra.
https://github.com/anderspitman/awesome-tunneling
Awesome Tunneling - bộ sưu tập các lựa chọn thay thế cho ngrok
Có vẻ nhu cầu với các loại tunnel khá cao nên có rất nhiều dịch vụ kiểu này. Có lẽ tham khảo thêm từ các dịch vụ khác cũng sẽ hữu ích.
Có vẻ ổn đấy. Thoát khỏi địa ngục cấu hình.