Để 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:
Mục Lục
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:
- 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.
- 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.
- Mở port 80 / 443 trên Router chính, chuyển hướng về máy chủ Nginx Proxy Manager.
- 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ự:
- 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.
- 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)
- Mở port 51820 (UDP) trên Router chính, chuyển hướng về máy chủ WireGuard
- 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 eyJhIjoiYjk5YmI3M2M1ZDk2NzAxODk3NGI0NDFjZDFlOWQ0YmIiLCJ0IjoiM2NmN2JkYzktMGE5YS00MTRmLTgxOWYtNDJlYTllZjAwZGE4IiwicyI6Ill6azFaamczT1dZdE9XRm1ZUzAwWW1Ka0xUbG1PRE10TUdZNE9HRXhZemd3WlCCSSDAS9
Code 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
Vậy là xong! Chúc bạn thực hiện thành công.
Ở bài viết sau, mình sẽ hướng dẫn thêm cách thiết lập bảo mật thông qua xác thực email để ngăn chặn truy cập trái phép vào dịch vụ mạng.
Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!
Docker này hoạt động trên Raspberry Pi không anh
Cái Cloudflare Docker này không hỗ trợ ARM64, em muốn cài lên Raspberry phải cài trực tiếp: chọn muc Debian / Red Hat, chọn Architecture tương ứng và chạy dòng lệnh mà Cloudflare đưa ra.
Chạy được, nhưng nhưng nếu bạn chọn arm32 hay 64 sẽ không chạy được trên Pi.
Trên Pi là armhf, phần code cài của cloudflare bạn sửa đường dẫn như bên dưới là cài được.
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-armhf.deb &&
Em làm y như bì viết nhưng lỗi 1000, em thiếu bước nào không anh nhỉ. Có cần phải cài CF Team vào máy không anh
Không cần cài thêm gì nữa nhé. Bị lỗi thì nhiều khả năng là do Tunnel chưa kết nối được rồi.
tunnel đã báo connected rồi mà nó vẫn lỗi.
anh em xem ảnh https://i.upanh.org/2022/06/28/Access_Tunnels_-_Cloudflare_Zero_Trust.jpg
Bạn xem thử hướng dẫn ở đây xem có khắc phục được không: https://community.cloudflare.com/t/fixing-error-1000-dns-points-to-prohibited-ip/178709
Có thể lỗi là do phần Cloudflare DNS nó có gì đó trục trặc rồi.
mình mở được tunner trên win rồi, thấy có kết nối tcp và rdp liệu có thể mở được port remote desktop không ad
Tạo kết nối cho Remote Desktop RDP được nha bạn. Hướng dẫn của Cloudflare ở đây: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/use_cases/rdp/
Em kết nối thành công rồi. Mà giờ em có 2,3 dịch vụ (torrent, web,,). Mỗi dịch vụ chạy 1 port thì e phải làm 2,3 cái tunnel hay sao ạ, cũng hơi bất tiện nhỉ, có cách nào chạy 1 tunnel tới homelab, rồi thêm port tương ứng để truy cập dịch vụ ko ạ.
Cảm ơn anh
Em vào phần Tunnel đã tạo, và add thêm dịch vụ trong đó được. Không cần phải chạy 2-3 tunnel
E làm đc rồi, hay quá anh ơi, cảm ơn anh nhé
Giờ mình mới đọc thấy bài này thấy hay quá tính vô tạo thử mà tới bước bấm Purchase thì mặc dù đơn là 0$ nhưng bây giờ Cloudflare bắt nhập thẻ tín dụng mới bấm next được, còn không nhập là không thể qua bước tiếp theo. Buồn ghê, chắc do user VN xài nhiều quá nên nó hạn chế lại.
Bạn có thể đăng kí cimb bank có thẻ visa ảo. Mình dùng thẻ đó mới đăng kí xong, chỉ cần để 10k trong thẻ
Xin chào anh, em muốn hỏi dùng Cloudflare Zero Trust để làm VPN truy cập hệ thống nội bộ ở AWS được không ạ
Mình không chắc bạn nhé. Cần xem kỹ lại Điều khoản sử dụng của Cloudflare xem có được phép không.
xin chào, ban cho mình hỏi đây là lỗi gì ạ
https://upanh.tv/image/ipa3fW
Nó báo lỗi trên máy của bạn đã có cloudflared chạy sẵn rồi nên không cài thêm được nữa. Cần xóa cái cũ bằng lệnh:
cloudflared service uninstall
, sau đó cài lại.Sau khi reset máy tính và muốn kết nối lại thì gõ lệnh cmd gì
Nó dính CORS từ khi đổi sang IP localhost, có cách nào giải quyết không Thuận ơi. Dù mình đã set * header trong htaccess. Nhưng vẫn bị. Mong Thuận giúp đỡ
Mình cũng muốn giúp, nhưng không hiểu bạn đang nói gì cả :(( Mình thiết lập Tunnel, đâu thấy gì liên quan đến CORS, htaccess.
Sorry, mình fix được rồi. Thay vì ghi là 127.0.0.1:PORT, mình đổi sang localhost:port thì nó không bị block CORS nữa.
Ở step4 phần service, thay vì nhập ip, mình có thể nhập localhost ko sếp
Nếu cloudflared của bạn nằm cùng server với các dịch vụ khác thì nhập localhost chắc là ok (mình chưa thử). Mình nhập IP vì cloudflared chạy trên 1 VPS khác với VPS chạy dịch vụ mạng.
Chỗ public hostname của mình không hiện ra tên miền, làm sao để add tên miển vào cloudflaire vậy bạn
Bạn xem hướng dẫn này để thêm tên miền vào Cloudflare: https://wiki.matbao.net/kb/huong-dan-ket-noi-ten-mien-voi-cloudflare/
Chào bạn,
Cho mình hỏi thăm chút.
Ở phần số 4, nếu có nhiều services (vd như 192.168.1.100, .101, .102,…) thì cấu hình như thế nào để làm LB được ạ ?
Cám ơn bạn !
Bạn xem ở đây nha: https://thuanbui.me/cloudflare-tunnel-homelab/#comment-743
Ý mình hỏi về load banlancing đó bạn. Một services nhưng có nhiều instances.
Mình chưa có kinh nghiệm vụ load balancing này. Bạn tham khảo thử cái này: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/deploy-tunnels/deploy-cloudflared-replicas/
Mình làm theo hướng dẫn của bác, cài guacamole và mở Tunnel. Guacamole cài và sử dụng ok ở mạng local rồi nhưng khi truy cập từ bên ngoài thì bị báo Bad gateway. Cloudflare thì vẫn báo Tunnel đã được kết nối rồi. Lỗi này là do mình cài sai gì bác nhĩ. Mình không sử dụng nginx. Server mình cài là 1 cái VPS trên oracle cloud, có cần phải mở thêm port gì không nhĩ.
Bạn cần không mở port khi dùng Cloudflare Tunnel. Bạn xem lại phần cấu hình tunnel có chính xác chưa, đặc biệt theo cái hình này: https://thuanbui.me/wp-content/uploads/2022/06/cloudflare-tunnel-9.png
anh ơi e hỏi chút, e sử dung Tunnel oke dưới dạng subdomain, nhưng không sử dụng được dưới dạng path.
Vd:
adguard.domain.vn => trỏ về adguard home oke
nhưng
test.domain.vn/adguard => lỗi bad gate way code 502.
Thử bỏ phần path đi thì truy cập bình thường. đã thử HTTPS và chọn “No TLS Verify” như một số hướng dẫn trên Reddit/Cloudflare community nhưng không hiệu quả
Mình không biết sử dụng path có được ko. Để tránh phiền phức, mình luôn dùng subdomain cho tunnel.
Lỗi hình ảnh rồi bác ơi. Mình xem không load được
Lỗi ảnh là lỗi gì nhỉ? Mình thấy tất cả vẫn load bình thường.
Cho em hỏi các hình ảnh ở đầu bài viết là a tự vẽ hay tìm sẵn ở trên mạng ạ.
Nếu tự vẽ thì vẽ bằng phần mềm gì đấy ạ
https://thuanbui.me/wp-content/uploads/2022/06/cloudflare-tunnel-1.png
Hình đó là của Cloudflare. Còn khi cần vẽ mình dùng https://draw.io
em chào bác,bác cho em hỏi phần routes thì cấu hình kiểu gì ạ,em tạo tunnel xong nhưng mục routes không hiện gì
Theo hướng dẫn trong bài thì chỉ tạo Tunnel là xong rồi bạn. Không cần cấu hình thêm phần Routes.
tsk bác giải đáp,em cài tunnel lên docker trên promox,mục đích để remote proxmox từ xa,em làm theo hướng dẫn đã tạo tunnel cáo HEALTHY rồi nhưng khi truy cập qua hostname thì lại báo lỗi bad gateway ở host,trên docker proxmox có cần thao tác gì thêm không ạ.
Lỗi Bad Gateway là do chứng chỉ SSL của Proxmox không được xác thực. Bạn cần mở mục Additional application settings, và kích hoạt No TLS Verify là sẽ kết nối được.
https://tinyurl.com/28xojttn
tsk anh,em đã xử lý được rồi ạ
Mình đã kích hoạt No TLS Verify rồi. sao vẫn không thể truy cập dc con router zte của nhà mạng vậy bác, vẫn lỗi 502. trong log lỗi: failed to verify certificate: x509.
Dùng cái này kết nối SSH vào thiết bị trong nhà kiểu gì ạ ? Em xem thì có hướng dẫn thêm private network rồi dùng Warp bật ZeroTrust thì dùng như mạng LAN, nhưng có vẻ không được ạ