Việc tự host các dịch vụ trên máy chủ gia đình (home server) ngày càng trở nên phổ biến, nhưng thách thức lớn nhất thường là làm thế nào để truy cập chúng một cách tiện lợi và an toàn khi bạn không ở nhà. Nhiều người lựa chọn 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ụ xác thực như Authelia hay Authentik, hoặc chỉ dựa vào các biện pháp bảo vệ tích hợp sẵn của từng ứng dụng. Tuy nhiên, việc đưa dịch vụ ra internet tiềm ẩn rủi ro bảo mật đáng kể, và cách thứ hai thường không đủ an toàn. Giải pháp tối ưu nhất cho vấn đề này chính là sử dụng 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.
Tại 123thuthuat.com, chúng tôi luôn ưu tiên sự an toàn và tiện lợi. Với kinh nghiệm dày dặn trong việc quản lý và tối ưu hóa hệ thống máy chủ cá nhân, chúng tôi nhận thấy Tailscale là một lựa chọn vượt trội. Bài viết này sẽ đi sâu vào cách chúng tôi thiết lập và sử dụng Tailscale kết hợp với một reverse proxy để tạo ra một phương pháp truy cập từ xa vừa an toàn tuyệt đối, vừa vô cùng tiện lợi. Mặc dù chúng tôi sử dụng máy chủ xác thực chính thức của Tailscale thay vì Headscale, bạn hoàn toàn có thể cân nhắc Pangolin hoặc Tailscale với Headscale nếu muốn tự xây dựng một giải pháp hoàn toàn tự quản. Chúng tôi cũng sẽ đề cập đến việc sử dụng tên miền và reverse proxy, mặc dù bạn hoàn toàn có thể truy cập trực tiếp bằng đị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à giúp bạn tận dụng tối đa các dịch vụ tự host mà vẫn đảm bảo dữ liệu luôn được bảo vệ an toàn khỏi các mối đe dọa từ bên ngoài.
Yêu cầu Cơ bản để Truy Cập từ Xa
Để xây dựng một hệ thống truy cập dịch vụ self-hosted từ xa hiệu quả, có một số thành phần cơ bản bạn cần chuẩn bị. Những yếu tố này đóng vai trò nền tảng, đảm bảo cả tính bảo mật lẫn khả năng kết nối linh hoạt.
VPN là Điều kiện Tiên quyết
Thành phần hoàn toàn cần thiết duy nhất bạn sẽ cần là một VPN. Bạn có thể tự host một máy chủ WireGuard bằng công cụ như wg-easy, hoặc cài đặt máy chủ WireGuard hay OpenVPN trên nhiều nền tảng router khác nhau như OPNsense, pfSense, hoặc dd-wrt. Lựa chọn tốt nhất sẽ phụ thuộc vào những gì bạn có sẵn. Trước đây, chúng tôi thường 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ụ DNS Động (DDNS) cấu hình qua DuckDNS để kết nối khi ở xa. Vì nhiều địa chỉ IP tiêu dùng thường được xoay vòng định kỳ, một dịch vụ DDNS cho phép bạn cấu hình ứng dụng trên máy chủ hoặc router để liên tục kiểm tra các thay đổi IP. Khi IP của bạn thay đổi, nó sẽ tự động cập nhật bản ghi DNS để trỏ đến địa chỉ IP mới.
Phương pháp này hoạt động khá tốt, nhưng chúng tôi muốn một giải pháp tối ưu hơn. Chúng tôi đã có sẵn một tên miền và đã chuyển máy chủ tên miền (nameserver) sang Cloudflare. Mặc dù bạn cũng có thể sử dụng DDNS để cập nhật các subdomain cụ thể trỏ đến địa chỉ IP gia đình và nắm bắt các yêu cầu đó bằng reverse proxy, nhưng điều này đồng nghĩa với việc bạn đang phơi bày các dịch vụ ra internet công cộng – một rủi ro không cần thiết, dù tiện lợi. Bằng cách sử dụng Tailscale, chúng tôi đã kết hợp được những lợi ích tốt nhất của cả hai thế giới: chúng tôi có thể truy cập một subdomain cụ thể trên website của mình để vào dịch vụ self-hosted mà vẫn không hề phơi bày nó ra internet.
Reverse proxy mà chúng tôi sử dụng là Caddy, nhưng bạn cũng có thể chọn một công cụ như Nginx Proxy Manager nếu muốn một giao diện đồ họa (GUI) thay thế. Sau đó, chúng 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 cụ thể vào Cloudflare dưới dạng bản ghi A cho một subdomain, chúng tôi có thể truy cập các dịch vụ riêng lẻ bằng các địa chỉ web thông thường. Mặc dù Tailscale cũng cố gắng thiết lập kết nối trực tiếp trước khi sử dụng máy chủ trung gian để kết nối, chúng tôi còn 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 là trực tiếp khi chúng tôi đang ở cùng mạng nội bộ. Đồng thời, các dịch vụ của chúng tôi vẫn có thể truy cập qua SSL ngay cả khi Tailscale bị tắt.
Chúng tôi sẽ hướng dẫn bạn cách cấu hình mạng của mình để truy cập từ xa tiện lợi và an toàn, hy vọng nó sẽ truyền cảm hứng để bạn thực hiện điều tương tự!
Thiết lập Mạng Tailscale cho Dịch vụ Tự Host
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ắt đầu, bạn cần đăng ký một tài khoản Tailscale, sau đó đăng nhập bằng từng thiết bị mà bạn muốn thêm vào mạng.
Tạo và Quản lý Tailnet của bạn
Giao diện đăng nhập Caddy qua Tailscale, minh họa truy cập self-hosted an toàn.
Trong trường hợp của chúng tôi, Caddy reverse proxy đặt trong một vùng chứa LXC trên máy chủ Proxmox nhỏ hơn, với /dev/tun
được truyền qua và Tailscale được cài đặt bên trong để nó nhận dạng như một thiết bị riêng biệt trong Tailnet. Chúng tôi cũng cài đặt Tailscale trên máy TrueNAS, nơi lưu trữ hầu hết các dịch vụ self-hosted, và nó sử dụng network của host để Tailscale bao phủ toàn bộ máy.
Tiếp theo, chúng tôi đăng nhập vào Tailscale trên bất kỳ thiết bị nào mà chúng tôi dự định sử dụng để truy cập mạng của mình, chẳng hạn như máy tính xách tay, điện thoại và máy tính để bàn. Gói miễn phí của Tailscale cho phép tối đa 100 thiết bị và ba người dùng, quá đủ cho hầu hết mọi người. Sau khi tất cả các thiết bị đã được đăng ký, chúng 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 (Caddy) của mình. Địa chỉ này sẽ có dạng như 100.45.100.22, đây là địa chỉ IP từ không gian địa chỉ dùng chung được gọi là CGNAT. Đây là các địa chỉ IP đặ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ì địa chỉ IP bạn cần lưu ý là địa chỉ 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 truy cập (Access Controls) của Tailscale. Phần này cho phép bạn xác định 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 được 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!
Tạo Subdomain để Truy Cập Tiện Lợi
Việc tạo subdomain là một bước quan trọng giúp bạn truy cập các dịch vụ self-hosted một cách dễ dàng và ghi nhớ hơn. Chúng tôi sẽ sử dụng Cloudflare để thực hiện việc này, vì đây là một trong những phương pháp tiện lợi nhất, đồng thời cung cấp nhiều công cụ để bảo mật mạng của bạn.
Sử dụng Cloudflare để quản lý DNS
Cấu hình bản ghi A trên Cloudflare cho Tailscale IP để truy cập dịch vụ từ xa.
Chúng ta sẽ tạo một subdomain cơ bản cho TrueNAS trước tiên bằng cách tạo một bản ghi A mới và nhập tên là “truenas”. Địa chỉ IPv4 sẽ là địa chỉ IP Tailscale của reverse proxy, và chúng ta sẽ đặt trạng thái proxy thành tắt. Lý do là 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 riêng của Tailscale, cũng như không thể proxy kết nối đến host. Điều đó cũng có nghĩa là không ai khác có thể truy cập được. Bây giờ, hãy nhấp vào lưu (save), 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 đích 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 subdomain khác cho các dịch vụ mà bạn muốn truy cập. Chúng tôi có thể truy cập các phiên bản Immich, Nextcloud, Blinko, Obsidian và Jellyfin từ xa bằng phương pháp này, và bạn có thể muốn thêm nhiều hơn nữa. Quy trình này giống nhau cho mỗi dịch vụ: 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 với chế độ proxy 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 làm Reverse Proxy và Lấy Chứng chỉ SSL
Để các dịch vụ của bạn được truy cập một cách bảo mật qua HTTPS, việc cấu hình Caddy làm reverse proxy và tự động cấp chứng chỉ SSL là điều cần thiết. Caddy là một lựa chọn mạnh mẽ nhờ khả năng tự động hóa SSL vượt trội.
Thêm Hỗ trợ Cloudflare và Kích hoạt HTTPS
Lệnh xcaddy build để tích hợp module Cloudflare DNS vào Caddy.
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 thêm hỗ trợ này. Cách thứ nhất, và là cách chúng 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ực tế nó rất, rất dễ dàng. 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 tệp “caddy” mới mà bạn có thể sử dụng để thay thế tệp nhị phân “caddy” trong /usr/bin
. Sau đó, chúng ta có thể cấu hình nó để sử dụng Cloudflare làm bằng chứng 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 tự build bằng xcaddy, bạn có thể tải xuống một tệp nhị phân Caddy đã được build sẵn với module Cloudflare đã được cài đặt. Với cả hai phương pháp, việc 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.
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 API của Cloudflare. Bạn có thể tìm thấy điều 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, phát hành 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 sẽ hiển thị nó cho bạn, vì vậy hãy đảm bảo bạn có thể truy cập nó khi cần.
Quay 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 tệp “Caddyfile”. Tệp 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 cũng có thể tạo Caddyfile ở bất kỳ đâ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ễ truy cập.
Thông báo hoàn tất quá trình xây dựng Caddy bằng xcaddy.
Hiện tại, hãy chạy lệnh sau:
export CLOUDFLARE_API_TOKEN=<YOUR_CLOUDFLARE_API_TOKEN_HERE>
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 không, 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ẽ chứng minh quyền sở hữu tên miền cho 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 sau vào Caddyfile của bạn:
{
# E-mail mà Let’s Encrypt sẽ sử dụng cho các thông báo hết hạn
email [email protected]
# Tất cả tương tác ACME sử dụng Cloudflare DNS-01 với token từ biến môi trường
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
Điều này báo cho Let’s Encrypt 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 cho tên miền TrueNAS mà chúng ta đã tạo trước đó, dưới dạng truenas.example.ie
. Trong cùng một tệp, thêm đoạn sau (sau dấu ngoặc nhọn cuối cùng):
truenas.example.ie {
reverse_proxy http://192.168.1.5:81
}
Thay thế tên miền bằng tên miền thực của bạn, và địa chỉ reverse proxy bằng địa chỉ mạng nội bộ thực của máy TrueNAS của bạn. Bạn có thể sao chép phương pháp đó 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, đó sẽ là đủ thông tin, 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 chúng tôi, đây là cấu hình:
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 (để noVNC có thể được sử dụng để xem console của các dịch vụ), và cũng bỏ qua lỗi chứng chỉ tự ký (self-signed certificate error) do Caddy tạo ra khi gặp trang đăng nhập Proxmox.
Kiểm tra cấu hình Caddyfile và xác minh hoạt động của Caddy.
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ụ self-hosted của mình khi VPN Tailscale được bật.
Cách thức hoạt động của phương pháp này khá đơn giản: bạn không thể truy cập địa chỉ IP Tailscale khi không kết nối với VPN Tailscale, vì vậy khi Cloudflare hướng trình duyệt của bạn đến địa chỉ IP liên kết, trình duyệt của bạn không thể nhìn thấy gì. Khi Tailscale được bật, nó có thể kết nối, và Caddy nhận ra yêu cầu bắt nguồ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. Hơn nữa, bạn còn có được các chứng chỉ SSL hợp lệ, vì vậy không còn những cảnh báo khó chịu về chứng chỉ tự ký, và các dịch vụ yêu cầu SSL cho một số chức năng, chẳng hạn như Home Assistant, sẽ hoạt động hoàn hảo.
Bổ sung: Ghi đè DNS Cục bộ cho Truy cập Nội mạng
Để tối ưu hóa trải nghiệm truy cập các dịch vụ self-hosted khi bạn ở nhà, một giải pháp bổ sung rất hữu ích là ghi đè bản ghi DNS cục bộ. Điều này giúp bạn truy cập dịch vụ trực tiếp mà không cần bật VPN Tailscale, đồng thời vẫn duy trì tính tiện lợi của việc sử dụng các subdomain.
Lợi ích của việc Ghi đè DNS bằng Pi-hole
Cấu hình ghi đè DNS cục bộ trên Pi-hole để truy cập dịch vụ self-hosted.
Như một phần bổ sung, nếu bạn không muốn sử dụng VPN Tailscale tại 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 tính năng DNS của Tailscale trên mỗi thiết bị nếu chưa làm, để nó có thể sử dụng Pi-hole làm máy chủ DNS. Sau khi đã làm, trên Pi-hole của bạn, hãy 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.
Các 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ể chuyển tiếp kết nối vì nó nhận thấy yêu cầu đến từ truenas.example.ie
. Điều này hoàn toàn không bắt buộc, và trong hầu hết các trường hợp, Tailscale sẽ tự động nhận biết rằng có thể thiết lập kết nối trực tiếp và thực hiện điều tương tự. Tuy nhiên, việc 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ụ self-hosted 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 là Pi-hole trong cài đặt DHCP của router.
Trong khi bạn đang ở đây, nếu bạn chưa từng thử, 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 chúng tôi sẽ đưa chúng tôi thẳng đến giao diện web của Pi-hole, và chúng tôi cũng có router.home
để truy cập bảng điều khiển của router. Điều này không hề cần thiết chút nào, nhưng là một tính năng đáng có để làm mọi thứ dễ đọc và tiện lợi hơn một chút.
Có Nhiều Cách để Truy Cập Dịch vụ Từ Xa
Giải pháp chúng tôi vừa trình bày chỉ là một trong số rất nhiều cách để truy cập các dịch vụ self-hosted khi bạn đang di chuyển, và đây là phương pháp mà chúng tôi cá nhân yêu thích và thấy phù hợp nhất với trường hợp sử dụng của mình. Mục tiêu của 123thuthuat.com là mang đến những kiến thức và thủ thuật công nghệ hữu ích nhất, và chúng tôi tin rằng việc chia sẻ kinh nghiệm thực tế này sẽ giúp bạn rất nhiều.
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 hoàn toàn vào mạng nội bộ 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 kết hợp với Tailscale.
Trong trường hợp cụ thể này, chúng tôi đã chuyển sang dùng Caddy từ Nginx Proxy Manager một thời gian trước, và phải mất vài giờ để làm quen với việc chuyển đổi mọi thứ và khiến nó hoạt động. Tuy nhiên, chúng tôi rất vui vì đã làm vậy; tệp Caddyfile của chúng tôi dễ dàng sao lưu và di chuyển sang các máy chủ khác nếu cần, và rất tiện lợi để thêm và xóa dịch vụ nhanh chóng thông qua dòng lệnh. Chúng 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.
Chúng tôi thường xuyên đi công tác, và khi nói đến việc truy cập các dịch vụ self-hosted từ bất cứ đâu trên thế giới, chúng tôi rất hài lòng với giải pháp này. Mặc dù nó có thể không hoàn toàn phù hợp với mọ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. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn chia sẻ kinh nghiệm của mình, đừng ngần ngại để lại bình luận bên dưới. Hãy tiếp tục khám phá và tối ưu hóa hệ thống công nghệ của bạn cùng 123thuthuat.com!