+3

Sử dụng Argo Tunnel (Cloudflare Tunnel) đưa ứng dụng của bạn ra ngoài Internet

Mở đầu

Trong quá trình làm việc chắc hẳn một lúc nào đó bạn sẽ gặp trường hợp khi muốn đưa dịch vụ lên internet để khách hàng hay cho các bên vào testing có thể truy cập tuy nhiên lại gặp vấn đề là máy chủ không có IP WAN hoặc máy tính cá nhân không có cách nào đưa dịch vụ ra ngoài internet được. Trước đây anh em sẽ quen với giải pháp là sử dụng Ngrok, tuy nhiên ngrok dần dần bắt đầu thu phí và dịch vụ miễn phí thì không còn ngon nữa do bị giới hạn thời gian tunnel. Cùng với đó ngrok cũng có hiệu năng khá kém do chỉ có server tại US, EU và khi expose service qua ngrok thì chỉ phù hợp cho testing không phù hợp cho môi trường production (người dùng thật sử dụng). Trong bài viết này mình sẽ chia sẻ với các bạn một dịch vụ được cung cấp bởi ông lớn CloudFlare đó chính là Argo Tunnel. Argo Tunnel về cơ bản có cách thức sử dụng tương tự ngrok nhưng có nhiều tính năng hay ho hơn và được quảng cáo là sẵn sàng sử dụng cho cả môi trường production !!! 😳😳😳

Giới thiệu Argo Tunnel (Cloudflare Tunnel)

Cloudflare Tunnel cung cấp cho bạn một cách an toàn để kết nối các tài nguyên của bạn với Cloudflare mà không cần địa chỉ IP WAN. Với Tunnel, bạn không gửi lưu lượng truy cập đến một địa chỉ IP bên ngoài — thay vào đó, một daemon nhẹ trong máy chủ của bạn có tên ('cloudflared') tạo ra các kết nối chỉ đi ra tới mạng toàn cầu của Cloudflare. Cloudflare Tunnel có thể được sử dụng để kết nối các dịch vụ HTTP, SSH, RDP và các giao thức khác một cách an toàn với Cloudflare. Như vậy, các dịch vụ của bạn có thể phục vụ lưu lượng thông qua Cloudflare mà không bị ảnh hưởng bởi các cuộc tấn công bypass qua Cloudflare.

image.png

Cách hoạt động

Cloudflared thiết lập các kết nối đi ra (tunnel) giữa các dịch vụ của bạn và mạng toàn cầu của Cloudflare. Các tunnel là các đối tượng cố định, chúng định tuyến lưu lượng đến các bản ghi DNS được tạo tự động, phần này tính mình sẽ chỉ cho các bạn thấy. Trong cùng một tunnel, bạn có thể chạy nhiều tiến trình 'cloudflared' (connectors). Các tiến trình này sẽ thiết lập các kết nối với mạng toàn cầu của Cloudflare và gửi lưu lượng đến datacenter Cloudflare gần nhất để tối ưu hiệu năng. Đây cũng chính là điểm ăn đứt ngrok!

image.png

Demo expose HTTP service

Tiếp theo mình sẽ hướng dẫn các bạn cách sử dụng cloudflared để đưa ứng dụng HTTP của các bạn ra ngoài Internet nhé. Để sử dụng Cloudflare tunnel thì các bạn có 2 lựa chọn là sử dụng WARP CLI hoặc Cloudflared. Tuy nhiên WARP CLI có độ tương thích với các hệ điều hành thấp hơn nên chúng ta sẽ ưu tiên sử dụng cloudflared nhé

Cài đặt Cloudflared

Cài đặt Cloudflared

Linux (ubuntu)

curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && 

sudo dpkg -i cloudflared.deb

MacOS

brew install cloudflared

Windows

Tải xuống file cài đặt https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.msi. và chạy

Dành cho testing/thử nghiệm

Để nhanh chóng có thể expose dịch vụ của bạn trong local ra ngoài internet phục vụ cho mục đích kiểm thử hoặc chia sẻ nhanh trong thời gian ngắn thì bạn có thể sử dụng câu lệnh:

cloudflared tunnel --url localhost:8000

Sau khi chạy câu lệnh trên, process cloudflared sẽ tạo 1 tunnel đến Cloudflared để tạo 1 domain ngẫu nhiên phục vụ expose dịch vụ chạy tại máy local ở địa chỉ localhost:8000. Bạn có thể truy cập ứng dụng của mình thông qua domain được bôi đỏ ở phía dưới

image.png

Dành cho môi trường production

Để sử dụng cho môi trường production với độ ổn định cao hơn mình khuyến khích mọi người nên mua domain riêng cho bản thân sau đó chuyển nameserver về Cloudflare. Cách thức mua domain và chuyển về Cloudflare có rất nhiều bài hướng dẫn trên mạng rồi mình không hướng dẫn lại nữa nhé, trong phần này mình mặc định bạn đã có domain, account trên cloudflare rồi nhé.

Bước 1: Truy cập vào trang chủ Cloudflare của bạn. Truy cập vào mục Zero Trust

image.png

Bước 2: Tiếp tục vào phần Networks => Tunnel và chọn Add a tunnel để tạo mới tunnel

image.png

Bước 3: Chọn Cloudflared là công cụ kết nối => Đặt tên cho tunnel => Cài đặt connector (cloudflared) trên máy local Nếu bạn đã cài Cloudflared ở bước trên thì bạn chỉ cần chạy câu lệnh cloudflared service install ey.... để xác thực với tunnel đã tạo này.

Nếu connect thành công bạn sẽ thấy connector hiển thị phía dưới

image.png

Next!

Bước 4: Tại bước này ta sẽ cầu hình định tuyến cho tunnel để chọn dịch vụ bạn muốn expose.

Ví dụ dịch vụ mình đang chạy ở local là 1 dịch vụ HTTP ở cổng 8000, mình sẽ expose thông qua domain web.hoangviet.site/

image.png

Với 1 tunnel bạn có thể expose nhiều dịch vụ 1 lúc. Sau khi đã điền xong các thông tin thì ta save tunnel!

Sau khi save tunnel ta qua mục DNS record của domain đã sử dụng cũng sẽ thấy có thêm 1 record CNAME tương ứng. Và lúc này ta có thể truy cập dịch vụ ở local thông qua domain đã cấu hình.

Như vậy mình đã hướng dẫn các bạn cách thức để có thể expose một dịch vụ trong local ra ngoài internet thông qua domain của chính bản thân. Ngoài ra Cloudflare Tunnel còn rất nhiều các tính năng khác hay ho như:

  • Cho phép expose 1 số protocol khác như: SSH, RDP, SMB,..
  • Cho phép cấu hình 1 số thông số như timeout, HTTP header modify, Access control,...

Các bạn tự tìm hiểu thêm tại trang chủ của CloudFlare nhé https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/

Những điểm giới hạn

  1. Cloudflare Tunnel chỉ đảm bảo an toàn https cho các yêu cầu đi vào thông qua tunnel này, các request từ dịch vụ đi ra các API bên ngoài hay Database sẽ không có bảo mật này
  2. Một số dịch vụ dùng giao thức TCP hay UDP có thể sẽ không expose thông qua Cloudflare Tunnel được. (mình có thử với database mysql thì chưa expose được)
  3. Mỗi tunnel chỉ cấu hình được 1 server origin duy nhất, nếu muốn chạy nhiều server origin thì bạn cần tạo nhiều tunnel
  4. Độ trễ của tunnel có thể cao trong 1 số trường hợp do routing qua nhiều điểm trong mạng toàn cầu của Cloudflare
  5. Nếu mạng của Cloudflare bị tấn công, khả năng cao ứng dụng của bạn cũng sẽ bị ảnh hưởng.

Kết

Hy vọng bài viết này đã giúp ích được bạn một phần nhỏ nào đó trong công việc. Chúc bạn có một ngày vui vẻ!

Nếu thấy bài viết hay hãy Upvote và follow mình để theo dõi thêm nhiều content về DevOps, hệ thống và kỹ năng mềm hơn nhé! Thank a lot!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí