Tự xây dựng một 'Ngrok Alternative' không giới hạn băng thông bằng Rathole hoặc Frp trên VPS 2$
Giới thiệu: Bài toán chia sẻ ứng dụng từ Local và hạn chế của Ngrok
Đối với các nhà phát triển phần mềm (Developers) và kỹ sư hệ thống (DevOps), việc chia sẻ một ứng dụng đang chạy ở môi trường local (máy tính cá nhân, mạng nội bộ) ra ngoài Internet là nhu cầu diễn ra hàng ngày. Cho dù bạn cần webhook từ Stripe, GitHub gửi về máy để debug, hay muốn demo nhanh một tính năng cho khách hàng xem, bạn đều cần một giải pháp mạng ổn định.
Trong nhiều năm qua, Ngrok đã trở thành công cụ quốc dân nhờ sự tiện lợi. Chỉ với một dòng lệnh, bạn đã có ngay một public URL để truy cập vào port local. Tuy nhiên, khi nhu cầu sử dụng tăng lên, phiên bản miễn phí của Ngrok bộc lộ rất nhiều hạn chế:
- Giới hạn băng thông và tốc độ: Khiến việc truyền tải file lớn hoặc streaming video bị nghẽn.
- URL ngẫu nhiên bị thay đổi: Mỗi lần khởi động lại, bạn phải cập nhật lại URL cấu hình ở phía đối tác (ví dụ: Facebook Webhook), gây mất thời gian.
- Chi phí nâng cấp cao: Các gói trả phí của Ngrok không hề rẻ đối với các nhà phát triển độc lập hoặc startup nhỏ.
Giải pháp tối ưu nhất lúc này là tự xây dựng một hệ thống Reverse Proxy riêng. Chỉ với một chiếc VPS giá rẻ tầm 2$/tháng (như tại Hathet, OVH, DigitalOcean, hoặc Vietnix) có IP public cố định, kết hợp cùng các công cụ mã nguồn mở mạnh mẽ như Frp (Fast Reverse Proxy) hoặc Rathole, bạn sẽ sở hữu một hệ thống 'Ngrok Alternative' với băng thông không giới hạn, toàn quyền kiểm soát và bảo mật tuyệt đối.
---Tại sao lại chọn Frp hoặc Rathole?
Trên thị trường mã nguồn mở hiện nay có khá nhiều công cụ hỗ trợ SSH Tunneling hoặc Reverse Proxy, nhưng Frp và Rathole nổi lên như hai ứng cử viên xuất sắc nhất nhờ vào hiệu năng và độ ổn định.
1. Frp (Fast Reverse Proxy)
Frp là một dự án cực kỳ phổ biến được viết bằng Go. Nó có hệ sinh thái tính năng rất phong phú:
- Hỗ trợ đa dạng giao thức: TCP, UDP, HTTP, HTTPS, và cả gRPC.
- Tích hợp sẵn Dashboard giao diện web để theo dõi lưu lượng, trạng thái các kết nối (connections).
- Hỗ trợ tính năng multiplexing (ghép kênh) giúp tối ưu hóa kết nối giữa Client và Server.
- Có khả năng tự động mã hóa và nén dữ liệu khi truyền tải.
2. Rathole
Nếu Frp là một gã khổng lồ đa năng thì Rathole là một chiến binh tinh nhuệ được viết bằng Rust. Rathole tập trung tối đa vào hiệu năng thuần túy và tiết kiệm tài nguyên:
- Siêu nhẹ: Tiêu thụ CPU và RAM cực kỳ ít, cực kỳ phù hợp với các VPS cấu hình thấp (1 vCPU, 512MB RAM).
- Tốc độ vượt trội: Nhờ vào thế mạnh quản lý bộ nhớ của Rust, Rathole cho throughput cao và độ trễ (latency) thấp hơn đáng kể trong các bài test tải cao.
- Cấu hình bằng file TOML rất tường minh và hiện đại.
Lời khuyên: Nếu bạn cần một hệ thống có dashboard trực quan, hỗ trợ nhiều tính năng nâng cao, hãy chọn Frp. Nếu bạn tối ưu hóa cho VPS cấu hình yếu nhất và cần tốc độ tối đa cho kết nối TCP, hãy chọn Rathole.---
Kiến trúc hoạt động của hệ thống Tự xây dựng
Để dễ hình dung, hệ thống này sẽ bao gồm hai thành phần chính hoạt động theo mô hình Client - Server:
- Server (VPS): Đóng vai trò là điểm tiếp nhận yêu cầu công cộng. VPS có một IP tĩnh (ví dụ:
1.2.3.4) và mở một cổng mở công khai (ví dụ: port8080) để người dùng bên ngoài truy cập, đồng thời mở một port quản lý (ví dụ: port7000) để lắng nghe kết nối từ máy local của bạn. - Client (Máy Local): Chạy ứng dụng của bạn (ví dụ: Web Server chạy ở port
3000). Máy local sẽ chạy phần mềm Client (Frpc hoặc Rathole Client) để chủ động kết nối 'xuyên tường lửa' lên Server (VPS) thông qua port quản lý.
Khi có một request từ Internet gửi tới 1.2.3.4:8080, VPS sẽ chuyển tiếp (tunnel) traffic đó qua kết nối có sẵn về thẳng port 3000 trên máy local của bạn một cách mượt mà.
Hướng dẫn cài đặt chi tiết với Frp (Fast Reverse Proxy)
Trong phần này, chúng ta sẽ tiến hành cấu hình chi tiết với Frp. Giả định VPS của bạn đang chạy Ubuntu Server.
Bước 1: Cấu hình trên Server (VPS)
Tải phiên bản Frp mới nhất từ GitHub Releases về VPS của bạn:
Sau khi giải nén, bạn truy cập vào thư mục và chỉnh sửa file cấu hình server frps.toml:
[common]
bind_port = 7000
vhost_http_port = 8080
auth.token = "Chuoi_Bao_Mat_Cua_Ban_Ở_Day"Trong đó, bind_port là cổng để client kết nối tới, vhost_http_port là cổng công khai để duyệt web, và auth.token là mật khẩu xác thực giữa client và server nhằm tránh người lạ dùng ké VPS của bạn.
Chạy thử nghiệm Server bằng lệnh: ./frps -c ./frps.toml
Bước 2: Cấu hình trên Client (Máy Local)
Tải phiên bản Frp tương ứng với hệ điều hành máy local của bạn (Windows, macOS, hoặc Linux). Chỉnh sửa file cấu hình client frpc.toml:
[common]
server_addr = "1.2.3.4" # Thay bằng IP VPS của bạn
server_port = 7000
auth.token = "Chuoi_Bao_Mat_Cua_Ban_Ở_Day"
[[proxies]]
name = "web-local"
type = "http"
local_port = 3000
custom_domains = ["1.2.3.4"]Khởi chạy client bằng lệnh: ./frpc -c ./frpc.toml. Giờ đây, khi bạn truy cập vào địa chỉ [http://1.2.3.4:8080](http://1.2.3.4:8080) từ bất kỳ đâu trên Internet, request sẽ được dẫn thẳng về ứng dụng đang chạy tại port 3000 trên máy của bạn.
Hướng dẫn cài đặt chi tiết với Rathole (Lựa chọn siêu nhẹ)
Nếu bạn muốn sử dụng Rathole để tiết kiệm tài nguyên tối đa cho VPS 2$, các bước thực hiện cũng tương tự nhưng file cấu hình sử dụng định dạng TOML phân cấp rất rõ ràng.
Bước 1: Cấu hình Rathole Server
Tạo file cấu hình server.toml trên VPS:
[server]
bind_addr = "0.0.0.0:2333" # Port lắng nghe Client
[server.services.my_web_app]
token = "MatKhauSieuBaoMatRathole"
bind_addr = "0.0.0.0:8080" # Port công khai ra InternetChạy rathole server bằng lệnh: rathole --server server.toml
Bước 2: Cấu hình Rathole Client
Tạo file cấu hình client.toml tại máy local của bạn:
[client]
remote_addr = "1.2.3.4:2333" # IP của VPS và port quản lý
[client.services.my_web_app]
token = "MatKhauSieuBaoMatRathole"
local_addr = "127.0.0.1:3000" # Ứng dụng local của bạnChạy rathole client bằng lệnh: rathole --client client.toml. Ngay lập tức, đường truyền tunnel hiệu năng cao bằng Rust đã được thiết lập thành công.
Tối ưu hóa: Biến ứng dụng thành Service chạy ngầm độc lập
Để đảm bảo hệ thống tự chạy lại mỗi khi VPS bị khởi động lại hoặc khi bạn vô tình tắt cửa sổ terminal, việc cấu hình chúng thành một systemd service trên Linux là bắt buộc.
Tạo một file service mới bằng lệnh:sudo nano /etc/systemd/system/frps.service với nội dung sau:[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/duong/dan/den/frps -c /duong/dan/den/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.targetKích hoạt và khởi chạy dịch vụ chạy ngầm vĩnh viễn:
sudo systemctl enable frps.service
sudo systemctl start frps.service---Các lưu ý quan trọng về Bảo mật (Security)
Khi mở toang một cổng trên VPS ra ngoài Internet công cộng, bạn đang đối mặt với các nguy cơ bị scan bot tấn công. Hãy luôn ghi nhớ các nguyên tắc bảo mật sau:
- Luôn sử dụng Token mạnh: Không sử dụng các chuỗi ký tự đơn giản cho
auth.token. Hãy dùng các chuỗi sinh ngẫu nhiên dài để tránh bị dò quét (brute-force). - Sử dụng Tường lửa (Firewall): Trên VPS, chỉ mở các port thực sự cần thiết (như port 8080, port quản lý). Sử dụng
ufwtrên Ubuntu để giới hạn các port không dùng tới. - Cấu hình HTTPS: Bạn nên kết hợp thêm Nginx và Let's Encrypt trên VPS để làm lớp Proxy ngược phía trước Frp/Rathole. Việc này giúp mã hóa toàn bộ dữ liệu từ trình duyệt người dùng đến VPS bằng chứng chỉ SSL/TLS miễn phí, nâng cao tính chuyên nghiệp và an toàn dữ liệu.
Kết luận
Việc thay thế Ngrok bằng giải pháp tự build trên VPS 2$ không chỉ là bài toán tiết kiệm chi phí, mà còn là cơ hội tuyệt vời để bạn hiểu sâu hơn về kiến trúc mạng, cách thức hoạt động của proxy và quản trị hệ thống Linux. Với Frp giàu tính năng hoặc Rathole tối ưu tốc độ, bạn hoàn toàn làm chủ hạ tầng của mình mà không còn lo lắng về bất kỳ giới hạn băng thông nào từ các nhà cung cấp dịch vụ bên thứ ba.
Chúc các bạn cấu hình thành công hệ thống lab của riêng mình!
