Cloudflare Tunnel – Kết nối bảo mật vào mạng nội bộ không cần VPN, không cần mở port

Để truy cập dịch vụ mạng đang được cài đặt trên máy chủ đặt ở nhà, hiện tại mình đang sử dụng 2 phương pháp:

Truy cập bằng Nginx Proxy Manager

Cách này được áp dụng cho các trang web demo thử nghiệm, được mình thiết lập để khách hàng có thể truy cập vào duyệt thiết kế – tính năng.

Các bước thiết lập sẽ như sau:

  1. Thiết lập Dynamic DNS để tự động cập nhật IP ở nhà cho tên miền. Mình sẽ truy cập thông qua tên miền này.
  2. Cài đặt Nginx Proxy Manager trên máy chủ / máy ảo nằm trong mạng nội bộ ở nhà để làm Reverse Proxy cho các dịch vụ mạng khác.
  3. Mở port 80 / 443 trên Router chính, chuyển hướng về máy chủ Nginx Proxy Manager.
  4. Tạo Proxy Host trên Nginx Proxy Manager, chuyển hướng về dịch vụ mạng tương ứng cần được truy cập từ bên ngoài.

Lập lại bước 4 cho các dịch vụ mạng khác mình muốn truy cập từ bên ngoài.

Truy cập bằng WireGuard VPN

Đối với các dịch vụ mạng nhạy cảm, chứa thông tin cá nhân quan trọng, ví dụ Guacamole, Bitwarden,… mình sẽ không bao giờ mở cho truy cập từ bên ngoài vào để tránh rủi ro bị hack.

Thay vào đó, mình sẽ truy cập từ bên ngoài vào mạng ở nhà thông qua WireGuard VPN. Sau khi kết nối thành công, mình sẽ truy cập thông qua IP nội bộ đang thiết lập sẵn ở nhà.

Cách thiết lập cũng tương tự:

  1. Thiết lập Dynamic DNS để tự động cập nhật IP ở nhà cho tên miền. Mình sẽ truy cập thông qua tên miền này.
  2. Cài đặt WireGuard VPN lên máy chủ / máy ảo nằm trong mạng nội bộ hoặc thiết lập WireGuard lên router nếu được hỗ trợ (Mikrotik, OpenWRT)
  3. Mở port 51820 (UDP) trên Router chính, chuyển hướng về máy chủ WireGuard
  4. Tạo Peer cho client để truy cập từ bên ngoài vào WireGuard VPN Server trong nhà.

Hạn chế của NPM và VPN

Cả hai cách này có ưu điểm là thiết lập đơn giản, nhanh gọn. Nhưng cả hai đều có cùng nhược điểm:

  • Cần phải có IP tĩnh, hoặc cần phải thiết lập Dynamic DNS trong trường hợp mạng ở nhà có IP động.
  • Cần phải mở port trên Router chính: 80 / 443 khi dùng NPM hoặc 51820 khi dùng WireGuard VPN

Việc mở port trên router ở nhà luôn tiềm ẩn nhiều rủi ro nếu bạn không biết cách bảo mật mạng nội bộ. Trường hợp xui xẻo có thể bị người ngoài hack và truy cập vào mạng nội bộ để lấy cắp thông tin cá nhân.

Ngoài ra, trong nhiều trường hợp, đường mạng của bạn bị nhà cung cấp nhét vào CGNAT, khiến mạng ở nhà không có IP Public (IP hiện ra trong Router là IP nội bộ nằm trong hệ thống NAT của nhà mạng).

Lúc này việc mở port trên router đều không còn ý nghĩa, khiến cả hai cách truy câp thông qua NPM hay WireGuard VPN đều vô dụng.

Để khắc phục những hạn chế này, mình vừa mới tìm ra một giải pháp mới: truy cập vào mạng nhà thông qua Cloudflare Tunnel – dịch vụ miễn phí do Cloudflare cung cấp.

Bài viết này mình sẽ giới thiệu và hướng dẫn sử dụng Cloudflare Tunnel để kết nối vào mạng nội bộ ở nhà bảo mật và tiện lợi hơn.

Cloudflare Tunnel là gì?

Cloudflare Tunnel là một phần mềm tạo ra đường truyền mạng bảo mật, kết nối hệ thống máy chủ của Cloudflare với máy chủ trong mạng nội bộ. Mọi kết nối từ bên ngoài đều phải thông qua sự kiểm duyệt của Cloudflare trước khi được chuyển hướng đến mạng nội bộ. Nhờ vậy, bạn có thể ẩn địa chỉ IP của mạng nhà, ngăn chặn tấn công mạng từ bên ngoài.

Ưu điểm khi sử dụng Cloudflare Tunnel:

  • Chặn truy cập trực tiếp vào mạng ở nhà, không sợ bị lộ địa chỉ IP
  • Tận dụng hệ thống Firewall và chống DDoS của Tunnel để bảo vệ hệ thống mạng nội bộ.
  • Không cần mở port, không cần có IP tĩnh, cũng không cần phải thiết lập Dynamic DNS.
  • Kết hợp thêm tính năng Zero Trust của Cloudflare để xác thực tất cả truy cập vào mạng nội bộ, tối ưu bảo mật.

Nhược điểm khi dùng Cloudflare Tunnel:

  • Phụ thuộc vào hệ thống của Cloudflare. Nếu Cloudflare gặp sự cố thì nhiều khả năng sẽ không thể truy cập vào mạng nội bộ.
  • Không còn làm chủ 100% dữ liệu cá nhân vì mọi kết nối đều đi phải đi qua Cloudflare.

Hướng dẫn thiết lập Cloudflare Tunnel

Dài dòng nãy giờ đủ rồi. Giờ vô phần chính: hướng dẫn cách thiết lập Cloudflare Tunnel để truy cập vào dịch vụ mạng ở nhà.

Yêu cầu: Bạn cần phải chuyển tên miền về để Cloudflare quản lý thì mới sử dụng dịch vụ Cloudflare Tunnel.

1. Thiết lập Cloudflare Zero Trust

Tất cả các dịch vụ liên quan đến Cloudflare Tunnel được tập trung về 1 trang quản lý riêng gọi là Cloudflare Zero Trust. Ở lần đầu tiên truy cập, Cloudflare sẽ yêu cầu thiết lập các thông số cơ bản như dưới đây.

Bấm Next để tiếp tục.

Chọn tên nhóm. Bạn có thể sử dụng tên bất kỳ, và tên này có thể thay đổi được trong tương lai nếu muốn.

Dịch vụ Zero Trust của Cloudflare có nhiều mức giá khác nhau. Với nhu cầu sử dụng cá nhân. gói Free miễn phí là đủ dùng. Bấm vào Select Plan trong mục Free ($0 / user / month)

Bấm Proceed để tiếp tục.

Bấm Purchase để xác nhận bạn chọn gói Free. Tổng bill là $0.00 nên Cloudflare không yêu cầu nhập thông tin thẻ gì đâu.

2. Tạo Tunnel

Sau khi thiết lập thành công, bạn truy cập vào Tunnels (nằm trong mục Access) ở menu bên trái. Bấm vào Create a tunnel để tạo kết nối.

Đặt tên cho kết nối, và bấm Save Tunnel để tiếp tục.

2. Cài đặt cloudflared

Ở bước tiếp theo, bạn sẽ cần cài đặt công cụ cloudflared lên máy chủ nằm trong mạng nội bộ. Mình chọn cách cài đặt bằng Docker cho nhanh gọn.

Truy cập SSH vào máy chủ trong mạng nội bộ và chạy dòng lệnh hiện ra ở trên. Mình bổ sung thêm thông số -d --restart always sau docker run để chạy dưới dạng nền và luôn tự khởi động lại nếu máy chủ bị cúp điện và mở lại.

docker run -d --restart always cloudflare/cloudflared:2022.6.3 tunnel --no-autoupdate run --token eyJhIjoiYjk5YmI3M2M1ZDk2NzAxODk3NGI0NDFjZDFlOWQ0YmIiLCJ0IjoiM2NmN2JkYzktMGE5YS00MTRmLTgxOWYtNDJlYTllZjAwZGE4IiwicyI6Ill6azFaamczT1dZdE9XRm1ZUzAwWW1Ka0xUbG1PRE10TUdZNE9HRXhZemd3WlCCSSDAS9Code language: Nginx (nginx)

Sau khi chạy trên máy chủ xong, quay lại trình duyệt, bạn sẽ thấy mục Connectors hiện ra thông báo đã kết nối thành công. Mục Origin IP sẽ hiện ra địa chỉ IP của mạng ở nhà. Bấm Next để tiếp tục.

4. Điều hướng dịch vụ mạng

Ở bước route tunnel, bạn sẽ thiết lập tương tự như tạo Proxy Host trên Nginx Proxy Manager.

  • Subdomain: chọn tên miền phụ.
  • Domain: chọn tên miền.
  • Path: không bắt buộc.
  • Service: chọn loại kết nối (HTTP, HTTPS, RDP,…) và địa chỉ IP nội bộ cùng port tương ứng của dịch vụ mạng cần điều hướng.

Ở đây mình muốn tạo kết nối đến dịch vụ Guacamole, nên cần phải điền thêm guacamole vào mục Path.

Bấm Save Guacamole tunnel. Mục Tunnels giờ đã hiện ra kết nối với tên gọi Guacamole cùng trạng thái ACTIVE (đang hoạt động).

5. Truy cập vào dịch vụ mạng

Mở trình duyệt web truy cập vào địa chỉ http://remote.thuanbui.me/guacamole, mình sẽ được chuyển hướng về dịch vụ Guacamole đang được cài đặt ở nhà.

Cloudflare Tunnel đã hoạt động ngon lành!

Để có thể truy cập bằng https, mình truy cập vô mục SSL/TTS của trang quản lý tên miền, chọn Full (strict).

Sau đó, mình có thể truy cập vào Guacamole theo địa chỉ https://remote.thuanbui.me/guacamole

(nguon: thuanbui.me)