Cloudflare Tunnel: Truy cập dịch vụ nội bộ an toàn mà không cần mở cổng tường lửa

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Cuộc gọi lúc 2 giờ sáng: Truy cập ứng dụng nội bộ một cách an toàn

Đã 2 giờ sáng. Tiếng máy nhắn tin reo lên, đánh thức tôi. Nhóm phát triển vừa triển khai một bảng điều khiển giám sát nội bộ mới cực kỳ quan trọng—chẳng hạn như một phiên bản Grafana. Giờ nay, ban quản lý yêu cầu truy cập bên ngoài ngay lập tức để trình diễn với một đối tác quan trọng. Tin nhắn khẩn cấp viết: "Chỉ cần mở một cổng cho nó." Lòng tôi trùng xuống. Tôi đã từng trải qua tình huống này trước đây, và nó hiếm khi kết thúc tốt đẹp.

Việc mở trực tiếp các cổng tường lửa đến các dịch vụ nội bộ là một rủi ro bảo mật rất lớn. Đó là một lỗ hổng lớn đang chờ đợi rắc rối. Nhưng thiết lập một VPN client đầy đủ cho một buổi trình diễn nhanh chóng? Đó là quá mức cần thiết và gây khó khăn cho những người dùng không chuyên về kỹ thuật. Chúng ta cần một giải pháp nhanh chóng, mạnh mẽ và quan trọng nhất là an toàn. Một giải pháp không liên quan đến việc tạo ra các lỗ hổng trong hệ thống mạng được xây dựng cẩn thận của chúng ta.

Phân tích nguyên nhân gốc rễ: Tại sao các phương pháp truyền thống không hiệu quả

Tại sao tư duy "chỉ cần mở một cổng" lại nguy hiểm đến vậy? Và tại sao các giải pháp phổ biến khác lại không hiệu quả trong tình huống cụ thể này?

Phơi bày cổng trực tiếp: Một tấm thảm chào đón kẻ tấn công

  • Điểm yếu: Bất kỳ dịch vụ nào lắng nghe trên một cổng mở đều bị phơi bày trực tiếp ra toàn bộ internet. Mọi bot, trình quét và tác nhân độc hại đều có thể tấn công trực tiếp. Hãy quên đi WAF hoặc khả năng bảo vệ DDoS của Cloudflare – dịch vụ của bạn hoàn toàn trần trụi trước các cuộc tấn công. Chỉ riêng trong quý 4 năm 2023, Cloudflare đã giảm thiểu kỷ lục 13,7 triệu cuộc tấn công DDoS HTTP, làm nổi bật mối đe dọa thường trực mà các dịch vụ bị phơi bày phải đối mặt.
  • Ác mộng quản lý tường lửa: Bạn sẽ phải liên tục cập nhật các quy tắc tường lửa, cố gắng đảm bảo chỉ các địa chỉ IP cụ thể mới có thể truy cập dịch vụ của mình. Giải pháp thay thế? Mở rộng nó ra 0.0.0.0/0, một lựa chọn tồi tệ hơn nhiều. Điều này trở thành một trò chơi rượt đuổi không ngừng, nơi một cấu hình sai duy nhất có thể gây ra hậu quả nghiêm trọng.
  • Quản lý chứng chỉ: Nếu bạn đang sử dụng HTTPS, bạn chịu trách nhiệm quản lý chứng chỉ trên một máy chủ nội bộ. Điều này có thể liên quan đến việc phơi bày nó ra internet cho các thử thách ACME hoặc sao chép tệp thủ công. Dù bằng cách nào, nó cũng làm tăng đáng kể độ phức tạp và tiềm ẩn lỗi, thường yêu cầu gia hạn sau mỗi 90 ngày.

VPN: An toàn, nhưng không phải lúc nào cũng thực tế

VPN nổi trội trong việc cung cấp quyền truy cập an toàn vào toàn bộ mạng nội bộ của bạn cho người dùng đáng tin cậy. Tuy nhiên, chúng thường gây ra chi phí đáng kể khi bạn chỉ cần chia sẻ một ứng dụng web duy nhất:

  • Yêu cầu phần mềm client: Mọi người dùng đều cần cài đặt và cấu hình phần mềm VPN client. Đây có thể là một rào cản đối với người dùng bên ngoài, không chuyên về kỹ thuật hoặc đối với quyền truy cập nhanh, tạm thời.
  • Phức tạp trong quản lý người dùng: Quản lý tài khoản người dùng VPN, quyền hạn và đảm bảo thu hồi đúng cách có thể rườm rà, đặc biệt đối với các cộng tác viên bên ngoài.
  • Quá mức cần thiết cho các dịch vụ đơn lẻ: Đối với chỉ một ứng dụng web hoặc một phiên SSH, một VPN tunnel đầy đủ thường là một lớp phức tạp và cản trở không cần thiết.

So sánh các giải pháp: Tìm công cụ phù hợp cho công việc

Khi bạn phải đối mặt với yêu cầu lúc 2 giờ sáng để truy cập một dịch vụ nội bộ, bạn có những lựa chọn nào?

1. Phương pháp "Chỉ cần mở một cổng" (DMZ/Chuyển tiếp cổng)

  • Ưu điểm: Đơn giản về mặt khái niệm để giải thích.
  • Nhược điểm: Rủi ro bảo mật thảm khốc. Phơi bày trực tiếp trước các cuộc tấn công. Không có bảo vệ DDoS, WAF hoặc quản lý danh tính tích hợp. Yêu cầu một địa chỉ IP công cộng tĩnh hoặc DNS động. Tin tôi đi, bạn không bao giờ muốn đi theo con đường này cho bất cứ thứ gì ngoài một thử nghiệm nhanh chóng, dùng một lần. Đó là một công thức dẫn đến thảm họa.

2. Truy cập VPN

  • Ưu điểm: Cực kỳ an toàn cho người dùng nội bộ truy cập nhiều tài nguyên nội bộ. Lưu lượng được mã hóa.
  • Nhược điểm: Yêu cầu cài đặt và cấu hình phần mềm client trên thiết bị của mọi người dùng. Quản lý người dùng có thể phức tạp. Không phù hợp cho các ứng dụng web công cộng hoặc chia sẻ đơn giản. Gây khó khăn lớn cho người dùng bên ngoài, không chuyên về kỹ thuật.

3. Reverse Proxy tự host (Nginx/HAProxy trên máy chủ công cộng)

  • Ưu điểm: Tổng hợp lưu lượng, có thể xử lý kết thúc TLS, cung cấp một số cân bằng tải cơ bản. Bạn kiểm soát mọi thứ.
  • Nhược điểm: Điều này vẫn yêu cầu một máy chủ công cộng với các cổng mở (80/443). Bạn hoàn toàn chịu trách nhiệm về bảo mật, vá lỗi, bảo vệ DDoS và quản lý chứng chỉ của nó. Đó là một máy chủ khác để quản lý, một điểm lỗi tiềm ẩn khác. Về cơ bản, bạn đang xây dựng Cloudflare mini của riêng mình, điều này đòi hỏi công việc và trách nhiệm đáng kể.

4. Cloudflare Tunnel

  • Ưu điểm: Không cần mở bất kỳ cổng tường lửa inbound nào. Đây là yếu tố thay đổi cuộc chơi. Daemon cloudflared thiết lập các kết nối chỉ outbound đến mạng biên của Cloudflare, nghĩa là các dịch vụ nội bộ của bạn không bao giờ bị phơi bày trực tiếp ra internet.
  • Bảo mật nâng cao: Nó tích hợp trực tiếp với các tính năng bảo mật mạnh mẽ của Cloudflare, bao gồm WAF, bảo vệ DDoS và quản lý bot. Lưu lượng của bạn được hưởng lợi từ mạng lưới toàn cầu và thông tin tình báo về mối đe dọa của Cloudflare, bảo vệ chống lại hàng triệu mối đe dọa mạng hàng ngày.
  • TLS được quản lý: Cloudflare xử lý các chứng chỉ TLS cho hostname công cộng của bạn, đơn giản hóa việc quản lý chứng chỉ. Điều này có nghĩa là bạn tránh được rắc rối khi phải gia hạn chứng chỉ vài tháng một lần.
  • Truy cập nhận diện danh tính (Cloudflare Access): Xác định ai có thể truy cập các dịch vụ của bạn bằng cách sử dụng các nhà cung cấp danh tính hiện có như Google, Okta hoặc GitHub. Điều này bổ sung một lớp xác thực và ủy quyền bổ sung, tất cả mà không cần thiết lập VPN phức tạp.
  • Đáng tin cậy & Khả năng mở rộng: Nó sử dụng mạng lưới toàn cầu của Cloudflare, đảm bảo tính khả dụng cao và hiệu suất cho các dịch vụ của bạn.
  • Nhược điểm: Phụ thuộc vào Cloudflare. Một số tính năng nâng cao là một phần của các gói trả phí. Thiết lập ban đầu có thể cảm thấy hơi khác nếu bạn đã quen với mạng truyền thống, nhưng nó rất đáng để học hỏi.

Phương pháp tốt nhất: Cloudflare Tunnel để truy cập dịch vụ nội bộ an toàn

Để truy cập các dịch vụ nội bộ một cách an toàn mà không cần mở các cổng tường lửa inbound, Cloudflare Tunnel là phương pháp hàng đầu trong hầu hết các kịch bản hiện đại. Nó giải quyết vấn đề cốt lõi: cho phép truy cập bên ngoài mà không làm ảnh hưởng đến vành đai mạng của bạn. Khi xử lý các hệ thống sản xuất, đặc biệt là vào lúc 2 giờ sáng, sự ổn định và bảo mật là không thể thương lượng.

Hãy xem, tôi đã tự mình áp dụng phương pháp Cloudflare Tunnel này trong các môi trường sản xuất cho các bảng điều khiển nội bộ quan trọng, công cụ dành cho nhà phát triển và thậm chí cả quyền truy cập SSH. Kết quả luôn ổn định. Nó hoạt động hiệu quả và mang lại cho tôi sự yên tâm khi biết rằng các dịch vụ đó không bị phơi bày trực tiếp ra internet. Nó giống như có một con đường cao tốc an toàn, riêng tư từ mạng biên của Cloudflare trực tiếp đến dịch vụ nội bộ của bạn, bỏ qua tất cả lưu lượng truy cập độc hại.

Triển khai thực tế: Thiết lập Cloudflare Tunnel đầu tiên của bạn

Hãy cùng tìm hiểu cách thiết lập Cloudflare Tunnel để truy cập một dịch vụ web nội bộ đang chạy trên localhost:8080 và một máy chủ SSH trên localhost:22. Bạn sẽ cần một tài khoản Cloudflare và một miền đã được thêm vào Cloudflare.

Bước 1: Cài đặt cloudflared

Đầu tiên, hãy cài đặt daemon cloudflared trên máy chủ dịch vụ nội bộ của bạn. Máy này sẽ khởi tạo kết nối outbound đến mạng của Cloudflare.

Đối với các hệ thống Debian/Ubuntu:


# Thêm kho gói của Cloudflare
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-warp.list > /dev/null

# Cập nhật danh sách gói và cài đặt cloudflared
sudo apt update && sudo apt install cloudflared

Đối với các hệ điều hành khác, hãy kiểm tra tài liệu chính thức của Cloudflare.

Bước 2: Xác thực cloudflared

Tiếp theo, xác thực cloudflared với tài khoản Cloudflare của bạn. Lệnh này sẽ mở một cửa sổ trình duyệt để bạn đăng nhập và chọn miền của mình.


cloudflared login

Sau khi xác thực thành công, cloudflared sẽ tải xuống một tệp chứng chỉ (cert.pem) vào thư mục cấu hình mặc định của bạn, thường là ~/.cloudflared/. Tệp này rất quan trọng để tạo và quản lý các tunnel.

Bước 3: Tạo Tunnel

Bây giờ, hãy tạo một tunnel. Đặt cho nó một cái tên mô tả.


cloudflared tunnel create my-internal-app-tunnel

Lệnh này sẽ xuất ra một Tunnel ID (UUID) và cho bạn biết nơi nó đã lưu tệp thông tin xác thực (ví dụ: ~/.cloudflared/<YOUR_TUNNEL_UUID>.json). Hãy giữ an toàn Tunnel ID và tệp thông tin xác thực đó! Bạn sẽ cần chúng để cấu hình.

Bước 4: Cấu hình Tunnel

Tạo một tệp cấu hình cho tunnel của bạn. Tôi thường đặt tệp của mình trong ~/.cloudflared/config.yml. Hãy nhớ thay thế <YOUR_TUNNEL_UUID> bằng Tunnel ID thực tế của bạn và yourdomain.com bằng miền của bạn.


tunnel: <YOUR_TUNNEL_UUID>
credentials-file: /root/.cloudflared/<YOUR_TUNNEL_UUID>.json

ingress:
  # Quy tắc cho ứng dụng web
  - hostname: myapp.yourdomain.com
    service: http://localhost:8080
    # Tùy chọn: Bật chính sách Cloudflare Access cho hostname này (rất khuyến nghị cho môi trường sản xuất)
    # originRequest:
    #   access:
    #     required: true

  # Quy tắc cho quyền truy cập SSH
  - hostname: ssh.yourdomain.com
    service: ssh://localhost:22
    # Tùy chọn: Bật Cloudflare Access cho SSH (rất khuyến nghị cho môi trường sản xuất)
    # originRequest:
    #   access:
    #     required: true

  # Quy tắc bắt tất cả cho các yêu cầu không khớp (quan trọng về bảo mật)
  - service: http_status:404

Trong cấu hình này:

  • tunnel: Tunnel ID duy nhất của bạn.
  • credentials-file: Đường dẫn đến tệp thông tin xác thực JSON đã tạo trước đó.
  • ingress: Một danh sách các quy tắc định nghĩa cách các yêu cầu đến các hostname cụ thể sẽ được định tuyến đến các dịch vụ nội bộ của bạn.
  • http_status:404: Đây là một quy tắc bắt tất cả quan trọng. Bất kỳ yêu cầu nào không khớp với hostname đã định nghĩa sẽ nhận được mã 404, ngăn chặn việc phơi bày ngoài ý muốn.

Bước 5: Định tuyến lưu lượng DNS đến Tunnel của bạn

Tiếp theo, bạn cần yêu cầu Cloudflare gửi lưu lượng truy cập cho các hostname đã chọn của bạn thông qua tunnel. Điều này tạo ra các bản ghi CNAME trong Cloudflare DNS của bạn trỏ đến ID duy nhất của tunnel.


cloudflared tunnel route dns my-internal-app-tunnel myapp.yourdomain.com
cloudflared tunnel route dns my-internal-app-tunnel ssh.yourdomain.com

Bạn có thể xác minh các bản ghi này trong bảng điều khiển Cloudflare của mình dưới phần DNS.

Bước 6: Chạy Tunnel như một dịch vụ hệ thống

Để đảm bảo tunnel của bạn khởi động tự động và chạy ổn định, hãy cài đặt nó như một dịch vụ systemd.


sudo cloudflared --config ~/.cloudflared/config.yml service install

# Khởi động dịch vụ
sudo systemctl start cloudflared

# Bật dịch vụ để khởi động cùng hệ thống
sudo systemctl enable cloudflared

# Kiểm tra trạng thái dịch vụ
sudo systemctl status cloudflared

Bạn sẽ thấy đầu ra cho biết dịch vụ đang hoạt động và chạy.

Bước 7: Xác minh truy cập

Bây giờ, hãy thử truy cập myapp.yourdomain.com từ trình duyệt bên ngoài mạng của bạn. Bạn sẽ thấy ứng dụng web nội bộ của mình. Đối với SSH, bạn có thể thử:


ssh [email protected]

Nếu bạn đã cấu hình Cloudflare Access (rất khuyến nghị cho môi trường sản xuất), bạn sẽ được yêu cầu xác thực thông qua nhà cung cấp danh tính đã chọn trước khi được cấp quyền truy cập.

Tổng kết: An tâm lúc 2 giờ sáng

Bằng cách triển khai Cloudflare Tunnel, bạn giải quyết hiệu quả vấn đề lúc 2 giờ sáng mà không ảnh hưởng đến bảo mật. Các dịch vụ nội bộ của bạn trở nên có thể truy cập từ bên ngoài, nhưng không một cổng inbound nào trên tường lửa của bạn cần phải mở. Tất cả lưu lượng đều chảy qua mạng an toàn của Cloudflare, hưởng lợi từ các tính năng bảo mật tiên tiến của nó. Phương pháp đáng tin cậy này đảm bảo một cách ổn định và an toàn để truy cập các dịch vụ cần thiết, mang lại cho bạn sự an tâm rằng vành đai mạng của bạn vẫn nguyên vẹn.

Không còn những thay đổi quy tắc tường lửa điên cuồng, không còn phơi bày trực tiếp và không còn các thiết lập VPN phức tạp cho việc truy cập web đơn giản. Chỉ là một tunnel an toàn, đáng tin cậy, chính xác là những gì bạn cần khi bạn đang khắc phục sự cố giữa đêm khuya.

Share: