Trong thời đại số hóa, việc sở hữu một home server hoặc home lab để tự host các dịch vụ (self-hosted services) ngày càng trở nên phổ biến. Tuy nhiên, một trong những thách thức lớn nhất mà người dùng thường gặp phải là làm thế nào để truy cập các dịch vụ này một cách thuận tiện và bảo mật khi họ không ở nhà. Nhiều người lựa chọn cách phơi bày dịch vụ của mình ra internet công cộng, sử dụng các công cụ như Authelia hoặc Authentik để quản lý quyền truy cập. Một số khác lại dựa vào các lớp bảo vệ tích hợp sẵn của từng ứng dụng. Tuy nhiên, cả hai phương pháp này đều tiềm ẩn rủi ro bảo mật đáng kể, đặc biệt khi bạn không muốn bất kỳ dịch vụ nào của mình bị lộ ra bên ngoài internet. Giải pháp tối ưu nhất là sử dụng một mạng riêng ảo (VPN) như WireGuard, hoặc các hệ thống mạng lưới dựa trên WireGuard như Tailscale hoặc Pangolin.
Với tư cách là một chuyên gia về giải pháp mạng và bảo mật, tôi chọn Tailscale cho thiết lập cá nhân của mình và sẽ hướng dẫn chi tiết cách tôi tối ưu nó để phục vụ nhu cầu truy cập từ xa. Mặc dù tôi sử dụng các máy chủ xác thực chính thức của Tailscale, nếu bạn muốn xây dựng một phương pháp truy cập hoàn toàn tự chủ, các lựa chọn như Pangolin hoặc Tailscale kết hợp với Headscale là những giải pháp thay thế mạnh mẽ, đáng cân nhắc. Trong thiết lập này, tôi còn kết hợp một tên miền riêng với reverse proxy để mang lại sự tiện lợi tối đa, mặc dù bạn hoàn toàn có thể sử dụng trực tiếp địa chỉ IP của các thiết bị trong Tailnet của mình nếu muốn. Mục tiêu cuối cùng là tạo ra một kênh truy cập an toàn, tiện lợi và không làm lộ bất kỳ dịch vụ nội bộ nào ra internet.
Điều Kiện Tiên Quyết Để Thiết Lập Hệ Thống Truy Cập Từ Xa
VPN – Yếu Tố Bắt Buộc cho Mọi Kịch Bản Truy Cập Từ Xa
Thành phần hoàn toàn cần thiết duy nhất bạn sẽ cần cho giải pháp này là một VPN. Bạn có thể tự host một máy chủ WireGuard riêng biệt với các công cụ như wg-easy, hoặc cài đặt một máy chủ WireGuard hay OpenVPN trên nhiều nền tảng router phổ biến như OPNsense, pfSense, hay dd-wrt. Lựa chọn tốt nhất sẽ phụ thuộc vào tài nguyên và kinh nghiệm sẵn có của bạn. Trước đây, tôi đã sử dụng một cấu hình WireGuard đơn giản, được tạo thông qua wg-easy, kết hợp với dịch vụ Dynamic DNS (DDNS) được cấu hình qua DuckDNS để kết nối từ xa. Vì địa chỉ IP công cộng của các hộ gia đình thường thay đổi định kỳ, một dịch vụ DDNS cho phép bạn cài đặt một ứng dụng trên máy chủ hoặc router để liên tục kiểm tra sự thay đổi IP. Khi IP của bạn thay đổi, nó sẽ tự động cập nhật bản ghi DNS để trỏ về địa chỉ IP mới.
Phương pháp này hoạt động khá tốt, nhưng tôi mong muốn một giải pháp tiện lợi và an toàn hơn. Tôi đã có sẵn một tên miền và đã chuyển nameserver của nó sang Cloudflare. Mặc dù bạn có thể sử dụng DDNS để cập nhật các subdomain cụ thể trỏ về IP nhà mình và bắt các yêu cầu đó bằng reverse proxy, điều này đồng nghĩa với việc bạn đang phơi bày dịch vụ ra internet công cộng – một rủi ro không cần thiết, dù có tiện lợi đến đâu. Bằng cách sử dụng Tailscale, tôi đã kết hợp được những ưu điểm tốt nhất của cả hai thế giới: tôi có thể truy cập một subdomain cụ thể trên trang web của mình để vào dịch vụ tự host, mà vẫn đảm bảo không lộ nó ra internet.
Reverse proxy mà tôi sử dụng là Caddy, nhưng bạn cũng có thể chọn Nginx Proxy Manager nếu ưa thích một giao diện người dùng đồ họa (GUI). Sau khi cài đặt Caddy (hoặc Nginx Proxy Manager), tôi đã đăng ký các máy chủ của mình vào Tailnet. Bằng cách thêm địa chỉ IP Tailscale riêng tư của reverse proxy vào Cloudflare dưới dạng bản ghi A (A record) cho một subdomain, tôi có thể truy cập từng dịch vụ bằng các địa chỉ web thông thường. Tailscale cũng ưu tiên thử kết nối trực tiếp trước khi sử dụng các máy chủ relay của nó để kết nối. Ngoài ra, tôi đã tạo các bản ghi DNS cục bộ bằng Pi-hole để đảm bảo rằng các kết nối của tôi là trực tiếp khi tôi ở cùng mạng nội bộ, và các dịch vụ của tôi vẫn có thể truy cập qua SSL ngay cả khi Tailscale được tắt.
Tôi sẽ hướng dẫn bạn cách tôi cấu hình mạng của mình để truy cập từ xa tiện lợi và bảo mật, hy vọng nó sẽ truyền cảm hứng để bạn xây dựng một thiết lập tương tự!
Xây Dựng Mạng Tailscale (Tailnet) Cho Home Server của Bạn
Hướng Dẫn Cài Đặt và Cấu Hình Cơ Bản Phù Hợp Với Mọi Nhu Cầu
Mạng Tailscale của bạn, được gọi là Tailnet, bao gồm tất cả các thiết bị được kết nối với nó. Bạn sẽ cần đăng ký một tài khoản Tailscale, sau đó đăng nhập bằng từng thiết bị riêng lẻ. Trong trường hợp của tôi, Caddy reverse proxy hoạt động trong một vùng chứa LXC trên máy chủ Proxmox nhỏ hơn, với /dev/tun
được chuyển qua và Tailscale được cài đặt bên trong nó, để nó được nhận dạng là một thiết bị riêng biệt trong Tailnet của tôi. Tôi cũng cài đặt Tailscale trên máy TrueNAS của mình, nơi lưu trữ hầu hết các dịch vụ tự host, và nó sử dụng mạng của host để Tailscale bao trùm toàn bộ máy.
Tiếp theo, tôi đăng nhập vào Tailscale trên bất kỳ thiết bị nào tôi dự định sử dụng để truy cập mạng của mình, chẳng hạn như laptop, điện thoại và máy tính để bàn. Gói miễn phí của Tailscale cho phép 100 thiết bị và ba người dùng, con số này là quá đủ cho hầu hết mọi người. Sau khi tất cả các thiết bị của tôi được đăng ký, tôi đăng nhập lại vào giao diện web của Tailscale để ghi lại địa chỉ IP của dịch vụ reverse proxy của mình là Caddy. Địa chỉ này sẽ trông giống như 100.45.100.22
, đây là một địa chỉ IP từ không gian địa chỉ dùng chung được gọi là CGNAT (Carrier-Grade NAT). Đây là các địa chỉ IP sử dụng đặc biệt không được phơi bày ra internet công cộng và sẽ chỉ có thể truy cập được khi bạn đã kết nối với Tailnet của mình. Nếu bạn đang sử dụng Nginx Proxy Manager trên TrueNAS, thì IP bạn cần ghi lại là IP thuộc về máy TrueNAS của bạn.
Nếu bạn có ý định thêm người dùng khác vào Tailnet của mình, bạn có thể xem xét phần kiểm soát quyền truy cập (access controls) của Tailscale. Phần này cho phép bạn định nghĩa người dùng nào có thể truy cập thiết bị nào, và theo mặc định, nó sẽ cho phép mọi người truy cập mọi thứ. Nếu bạn là người dùng duy nhất trong Tailnet của mình, thì bạn không cần thay đổi hành vi mặc định. Ngược lại, bạn có thể xem hướng dẫn cú pháp ở bên phải trang để xác định cách tốt nhất để giới hạn các người dùng khác trong Tailnet của bạn.
Sau khi tất cả các dịch vụ của bạn đã kết nối và sẵn sàng, chúng ta có thể chuyển sang cấu hình quyền truy cập để có thể sử dụng tên miền của mình!
Giao diện đăng nhập Caddy sau khi truy cập qua mạng Tailscale, hiển thị kết nối thành công và bảo mật.
Tạo Subdomain Với Cloudflare Để Dễ Dàng Truy Cập
Như đã đề cập, chúng ta sẽ sử dụng Cloudflare cho bước này, vì đây là phương pháp tiện lợi nhất mà tôi tìm thấy, đồng thời cung cấp nhiều công cụ khác nhau để bảo mật mạng của bạn. Chúng ta sẽ tạo một subdomain TrueNAS cơ bản trước bằng cách tạo một bản ghi A (A record) mới và nhập tên là “truenas”. Địa chỉ IPv4 sẽ là địa chỉ IP Tailscale của reverse proxy của chúng ta, và chúng ta sẽ tắt trạng thái proxy của Cloudflare (set the proxy status to off). Điều này là do Cloudflare không phải là một phần của Tailnet của bạn và do đó không thể truy cập địa chỉ IP Tailscale riêng tư, và sẽ không thể proxy kết nối đến máy chủ. Điều đó cũng có nghĩa là không ai khác có thể truy cập được nó. Bây giờ hãy nhấp vào lưu, và trong vài phút, trình duyệt của bạn sẽ có thể nhận dạng yêu cầu đến địa chỉ đó, và sẽ đưa bạn đến trang mặc định của Caddy hoặc Nginx khi bạn đã bật VPN Tailscale.
Bây giờ chúng ta đã tạo một subdomain, hãy tạo thêm một vài cái nữa cho một số dịch vụ mà bạn muốn truy cập. Tôi có thể truy cập các phiên bản Immich, Nextcloud, Blinko, Obsidian và Jellyfin của mình từ xa bằng phương pháp này, và bạn có thể muốn thêm một số nữa. Quy trình tương tự cho mỗi cái; tạo một bản ghi A mới, chọn subdomain và đặt địa chỉ IP là địa chỉ IP Tailscale của reverse proxy của bạn với proxying được đặt thành tắt.
Phần tiếp theo là phần khó nhất, vì chúng ta sẽ cấu hình chứng chỉ SSL tự động bằng Cloudflare và Caddy, những chứng chỉ này sẽ được nhận dạng và chấp nhận bởi bất kỳ thiết bị nào tham gia Tailnet của chúng ta.
Cấu Hình Caddy Reverse Proxy và Chứng Chỉ SSL Tự Động
Tích Hợp Cloudflare DNS và Kích Hoạt HTTPS
Caddy sử dụng “module” để mở rộng chức năng của nó, và theo mặc định, nó không hỗ trợ Cloudflare. Tuy nhiên, có hai cách bạn có thể thêm hỗ trợ. Cách đầu tiên, và là cách tôi đã làm, là sử dụng xcaddy
. Công cụ này có thể build Caddy với các module (về cơ bản là plugin), và nếu thuật ngữ “build” làm bạn lo lắng, thì thực ra nó rất, rất dễ. Lệnh để build Caddy với hỗ trợ Cloudflare đơn giản là:
xcaddy build --with github.com/caddy-dns/cloudflare
Lệnh này sẽ tạo một file “caddy” mới mà bạn có thể sử dụng để thay thế binary “caddy” trong /usr/bin
, và sau đó chúng ta có thể cấu hình nó để sử dụng Cloudflare làm bằng chứng xác minh quyền sở hữu tên miền khi yêu cầu chứng chỉ SSL. Nếu bạn không muốn phải trải qua quá trình build bằng xcaddy
, bạn có thể tải xuống một binary Caddy đã được build sẵn với module Cloudflare đã được cài đặt từ trang chủ của Caddy. Với cả hai phương pháp, các bản cập nhật Caddy vẫn sẽ hoạt động (được gọi thông qua “caddy upgrade”) và sẽ nhận ra module tùy chỉnh để đảm bảo nó được bao gồm trong quá trình cập nhật.
Màn hình terminal hiển thị lệnh xcaddy build để tích hợp hỗ trợ Cloudflare DNS vào Caddy, cần thiết cho chứng chỉ SSL.
Tiếp theo, chúng ta sẽ cần lấy một token từ Cloudflare cho phép bạn sửa đổi các bản ghi DNS thông qua Cloudflare API. Bạn có thể tìm thấy phần này trong hồ sơ Cloudflare của mình, dưới mục API Tokens. Tạo một API token mới bằng cách sử dụng mẫu “Edit zone DNS”, và trong phần tài nguyên vùng (zone resources), chọn tên miền của bạn. Mọi thứ khác có thể giữ nguyên, và bạn có thể nhấp vào Continue to summary, cấp token, sau đó lưu một bản sao của token để sử dụng sau này. Đây là lần duy nhất Cloudflare hiển thị token này cho bạn, vì vậy hãy đảm bảo bạn có thể truy cập nó khi cần.
Quay trở lại Caddy, gõ lệnh sau:
cd /etc/caddy
Bây giờ bạn sẽ ở trong thư mục Caddy, nơi chứa file “Caddyfile”. File này chứa tất cả thông tin cần thiết để xây dựng các reverse proxy của chúng ta. Nếu nó chưa có ở đó, đừng lo lắng. Chúng ta có thể tạo nó, hoặc chúng ta cũng có thể tạo Caddyfile ở bất cứ đâu để sử dụng sau này. Container của bạn có thể đã tạo nó rồi, nhưng nếu chưa, hãy tạo Caddyfile ở một nơi dễ dàng truy cập.
Kết quả hoàn thành quá trình build Caddy với module Cloudflare, sẵn sàng cho việc cấu hình reverse proxy và SSL.
Hiện tại, hãy chạy lệnh sau:
export CLOUDFLARE_API_TOKEN=<YOUR_CLOUDFLARE_API_TOKEN>
Lệnh này sẽ đặt API token của Cloudflare vào biến môi trường của hệ thống bạn. Bây giờ, gõ lệnh sau:
nano Caddyfile
Lệnh trên phụ thuộc vào việc Nano đã được cài đặt hay chưa. Nếu chưa, bạn có thể sử dụng một trình soạn thảo văn bản khác.
Đầu tiên, chúng ta cần cấu hình Cloudflare DNS challenges. Vì dịch vụ sẽ không thể truy cập công khai, Caddy sẽ thay vào đó chứng minh quyền sở hữu tên miền với Let’s Encrypt (nhà cung cấp chứng chỉ) bằng cách sửa đổi một bản ghi TXT liên kết với tên miền. Thêm đoạn mã sau vào Caddyfile của bạn:
{
# E-mail that Let’s Encrypt will use for expiry notices
email [email protected]
# All ACME interactions use Cloudflare DNS-01 with the token from env-var
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
Đoạn mã này cho Let’s Encrypt biết sử dụng địa chỉ email của bạn để liên hệ trong tương lai, và sử dụng biến mà chúng ta đã xuất ra biến môi trường trước đó để xác thực. Bây giờ chúng ta có thể tạo một reverse proxy đến tên miền TrueNAS mà chúng ta đã tạo trước đó, dưới dạng truenas.example.ie
. Trong cùng file, thêm đoạn mã sau (sau dấu ngoặc nhọn cuối cùng):
truenas.example.ie {
reverse_proxy http://192.168.1.5:81
}
Hãy thay thế tên miền bằng tên miền thực tế của bạn, và địa chỉ reverse proxy bằng địa chỉ mạng nội bộ thực sự của máy TrueNAS của bạn. Sau đó, bạn có thể sao chép phương pháp này cho tất cả các subdomain khác mà bạn đã tạo. Trong hầu hết các trường hợp, bấy nhiêu thông tin là đủ, nhưng đôi khi bạn sẽ cần thêm các tham số bổ sung. Ví dụ, để truy cập giao diện web Proxmox của tôi, đây là cấu hình của tôi:
pve1.example.ie {
reverse_proxy https://192.168.1.6:8006 {
transport http {
tls_insecure_skip_verify
keepalive 60s
}
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
header_up Upgrade {http.request.header.Upgrade}
header_up Connection {http.request.header.Connection}
}
}
Nhu cầu của bạn sẽ khác nhau tùy thuộc vào các dịch vụ bạn sử dụng và những gì bạn muốn truy cập. Cấu hình trên cho Proxmox cho phép websockets hoạt động (để có thể sử dụng noVNC để xem bảng điều khiển của các dịch vụ), đồng thời bỏ qua lỗi chứng chỉ tự ký do Caddy báo khi gặp trang đăng nhập Proxmox.
Caddy đang chạy và xác minh cấu hình Caddyfile, chứng tỏ các reverse proxy và chứng chỉ SSL đang được xử lý.
Cuối cùng, chạy lệnh sau:
caddy run --config /etc/caddy/Caddyfile
Nếu Caddyfile của bạn ở một vị trí khác, hãy thay đổi đường dẫn trong lệnh trên cho phù hợp. Caddy bây giờ sẽ thực hiện một DNS challenge cho tất cả các subdomain của bạn, chứng minh quyền sở hữu thông qua Cloudflare và yêu cầu một chứng chỉ SSL hợp lệ. Giả sử không có lỗi, bạn giờ đây sẽ có thể truy cập các dịch vụ tự host của mình khi VPN Tailscale được bật.
Cách thức hoạt động này khá đơn giản: bạn không thể truy cập IP Tailscale khi không kết nối với VPN Tailscale, vì vậy khi Cloudflare yêu cầu trình duyệt của bạn đi đến địa chỉ IP liên quan, trình duyệt của bạn không thể thấy gì. Với Tailscale được bật, nó sau đó có thể truy cập được, và Caddy thấy rằng yêu cầu đến từ “truenas.example.ie”. Nó biết bạn muốn xem giao diện người dùng TrueNAS của mình, vì vậy nó mở một kết nối reverse proxy đến dịch vụ cụ thể đó và phục vụ nó cho bạn. Không có gì bị phơi bày ra internet rộng lớn, nhưng bạn vẫn nhận được tất cả sự tiện lợi như thể nó được phơi bày. Thêm vào đó, bạn thậm chí còn nhận được các chứng chỉ SSL hợp lệ, vì vậy không có cảnh báo khó chịu về chứng chỉ tự ký, và các dịch vụ yêu cầu nó cho một số chức năng, chẳng hạn như Home Assistant, sẽ hoạt động hoàn hảo.
Tối Ưu Truy Cập Nội Bộ Với Ghi Đè DNS (Pi-hole)
Tiện Ích Bổ Sung Cho Trải Nghiệm Hoàn Hảo Hơn Khi Ở Nhà
Như một phần bổ sung, nếu bạn không muốn sử dụng VPN Tailscale khi ở nhà, bạn có thể dễ dàng ghi đè bản ghi DNS cho các subdomain của mình trên mạng cục bộ bằng cách sử dụng Pi-hole. Bạn sẽ cần tắt DNS của Tailscale theo từng thiết bị nếu bạn chưa làm, để nó có thể sử dụng Pi-hole làm máy chủ DNS. Sau khi đã làm xong, trên Pi-hole của bạn, vào Settings, Local DNS records, và thêm một subdomain mà bạn muốn ghi đè, chẳng hạn như truenas.example.ie
. Thay đổi địa chỉ IP thành địa chỉ IP cục bộ của phiên bản Caddy của bạn.
Chứng chỉ SSL của bạn vẫn sẽ hoạt động, và reverse proxy của bạn vẫn có thể proxy kết nối vì nó thấy yêu cầu đến từ “truenas.example.ie”. Điều này hoàn toàn không cần thiết, và trong hầu hết các trường hợp, Tailscale sẽ nhận diện rằng một kết nối trực tiếp là có thể và sẽ tự động thực hiện điều tương tự. Tuy nhiên, điều này có nghĩa là bạn thậm chí không cần bật Tailscale khi ở nhà, và vẫn có thể truy cập tất cả các dịch vụ tự host của mình. Nó cũng rất tuyệt vời cho các thiết bị không thể sử dụng Tailscale, giả sử DNS của bạn được đặt thành Pi-hole trong DHCP của router.
Giao diện cài đặt Local DNS Records trên Pi-hole, cho phép ghi đè các bản ghi DNS để truy cập dịch vụ nội bộ mà không cần VPN.
Trong khi bạn ở đây, nếu bạn chưa từng làm trước đây, hãy thoải mái thử nghiệm với DNS cục bộ và tạo một số tên miền tiện lợi khác để sử dụng sau này. Ví dụ, “http://pi.hole” trong trình duyệt của tôi đưa tôi thẳng đến giao diện web của Pi-hole, và tôi cũng có “router.home” để truy cập bảng điều khiển của router. Nó không cần thiết một chút nào, nhưng đó là một tính năng đáng có để làm mọi thứ dễ đọc hơn và tiện lợi hơn.
Lời Kết: Linh Hoạt Lựa Chọn Giải Pháp Truy Cập Từ Xa Cho Home Server Của Bạn
Mặc dù đây là thiết lập mà tôi ưa thích, có rất nhiều cách để truy cập các dịch vụ tự host của bạn khi đang đi xa, và đây chỉ là một phương pháp cá nhân tôi yêu thích và phù hợp nhất với trường hợp sử dụng của tôi. Bạn có thể sử dụng một VPN WireGuard đơn giản nếu bạn chỉ muốn có quyền truy cập nội bộ hoàn toàn vào mạng của mình, hoặc tự host một giải pháp VPN để truy cập mạng của bạn bằng một công cụ như Pangolin hoặc Headscale với Tailscale.
Trong trường hợp cụ thể này, tôi đã chuyển sang Caddy từ Nginx Proxy Manager cách đây một thời gian, và phải mất vài giờ để làm quen với việc di chuyển mọi thứ và làm cho nó hoạt động. Tuy nhiên, tôi rất vui vì đã làm vậy; file Caddy của tôi dễ dàng được sao lưu và di chuyển sang các máy chủ khác nếu tôi cần, và rất tiện lợi khi có thể thêm và xóa dịch vụ nhanh chóng thông qua dòng lệnh nếu cần. Tôi hiện đang trong quá trình chuyển Caddy sang thiết lập OPNsense của mình, và nó đang hoạt động hoàn hảo cho đến nay.
Tôi thường xuyên đi du lịch khá nhiều, và khi nói đến việc truy cập các dịch vụ tự host của mình từ bất cứ đâu trên thế giới, tôi rất hài lòng với giải pháp này. Nó có thể không hoàn toàn phù hợp với nhu cầu của bạn, nhưng hy vọng điều này sẽ cung cấp cho bạn một số ý tưởng về cách tự mình thực hiện!