Image default
Máy Tính

Hướng Dẫn Truy Cập Dịch Vụ Homelab Từ Xa An Toàn Với Tailscale & Caddy

Đối với những người đam mê tự host các dịch vụ trên server tại nhà, việc lựa chọn phương pháp tiện lợi nhất để truy cập tất cả dịch vụ khi đi xa có thể là một thách thức. Một số người chọn cách expose trực tiếp các dịch vụ của mình ra internet công cộng và sử dụng các công cụ như Authelia hoặc Authentik để quản lý truy cập. Trong khi đó, những người khác lại 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 riêng lẻ. Cá nhân tôi không muốn expose bất kỳ dịch vụ nào ra internet, và việc dựa vào bảo vệ từng ứng dụng là một cách làm khá không an toàn. Lựa chọn tốt nhất là sử dụng một VPN như WireGuard, hoặc một hệ thống mesh VPN dựa trên WireGuard như Tailscale hay Pangolin.

Trong trường hợp của tôi, tôi sử dụng Tailscale và tôi sẽ hướng dẫn chi tiết cách thiết lập cụ thể của mình để mọi thứ hoạt động hiệu quả. Tôi sử dụng các server xác thực chính thức của Tailscale thay vì Headscale, nhưng nếu bạn muốn tự xây dựng một phương pháp truy cập hoàn toàn tự host, Pangolin hoặc Tailscale kết hợp với Headscale cũng là những giải pháp mạnh mẽ và hiệu quả. Trong quá trình này, tôi cũng sử dụng một domain với reverse proxy, mặc dù bạn hoàn toàn có thể sử dụng địa chỉ IP trực tiếp của các thiết bị trong Tailnet của mình nếu muốn. Mục tiêu cốt lõi là đảm bảo kết nối Homelab từ xa an toàn, tiện lợi, và tránh mọi rủi ro không cần thiết khi tiếp xúc với internet.

Các Yêu Cầu Cơ Bản Để Bắt Đầu

VPN Là Yếu Tố Tối Thiểu và Cần Thiết

Thành phần hoàn toàn cần thiết duy nhất mà bạn sẽ cần là một VPN. Bạn có thể tự host server WireGuard của riêng mình với một công cụ như wg-easy, và bạn cũng có thể host server WireGuard hoặc 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 hoàn toàn vào những gì bạn có sẵn. Trước đây, tôi đã từng sử dụng một cấu hình WireGuard đơn giản, được tạo thông qua wg-easy, cùng với Dynamic DNS (DDNS) được cấu hình qua DuckDNS để kết nối khi tôi vắng nhà. Vì nhiều địa chỉ IP tiêu dùng được xoay vòng theo một chu kỳ nhất định, một dịch vụ DDNS cho phép bạn cấu hình một ứng dụng trên server hoặc router của mình để liên tục thăm dò các thay đổi IP. Khi IP của bạn thay đổi, nó có thể cập nhật DNS để trỏ đến địa chỉ IP mới của bạn.

Phương pháp này hoạt động khá tốt, nhưng tôi muốn một giải pháp tốt hơn. Tôi đã có một domain riêng và đã đổi nameserver của nó 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 tại nhà của mình và xử lý các yêu cầu đó bằng reverse proxy, điều này đồng nghĩa với việc bạn đang expose các dịch vụ ra internet công cộng, vốn là một rủi ro không cần thiết, ngay cả khi nó mang lại sự tiện lợi. Bằng cách sử dụng Tailscale, tôi đã kết hợp 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, truy cập dịch vụ tự host, mà vẫn không expose nó ra internet rộng lớn.

Reverse proxy mà tôi sử dụng là Caddy, nhưng bạn cũng có thể sử dụng một công cụ như Nginx Proxy Manager nếu bạn thích một giải pháp có giao diện người dùng đồ họa (GUI). Sau đó, tôi đã đăng ký các server của mình vào Tailnet, và bằng cách thêm địa chỉ IP Tailscale cụ thể vào Cloudflare dưới dạng một bản ghi A (A record) cho một subdomain, tôi có thể truy cập các dịch vụ riêng lẻ bằng cách sử dụ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 các server relay của nó để kết nối, tôi cũng đã 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, và các dịch vụ của tôi vẫn có thể truy cập qua SSL ngay cả khi Tailscale bị 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à an toàn, và hy vọng nó có thể truyền cảm hứng để bạn làm điều tương tự!

Thiết Lập Mạng Tailscale (Tailnet)

Các Bước Cấu Hình Tailscale Tùy Thuộc Vào Hệ Thống Của Bạn

Màn hình đăng nhập Caddy đang chạy trên Tailscale, minh họa giao diện điều khiển.Màn hình đăng nhập Caddy đang chạy trên Tailscale, minh họa giao diện điều khiển.

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ị một. Trong trường hợp của tôi, reverse proxy Caddy của tôi chạy trong một LXC trên host 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 diện như 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 hầu hết các dịch vụ tự host của tôi đang chạy, và nó sử dụng mạng host để Tailscale bao phủ 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 đị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 cá nhâ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, 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 tôi, Caddy. Địa chỉ này sẽ trông giống như 100.45.100.22, là một địa chỉ IP từ không gian địa chỉ chia sẻ được gọi là CGNAT. Đây là các địa chỉ IP sử dụng đặc biệt, không được expose ra internet công cộng và chỉ có thể truy cập khi kết nối vào Tailnet của bạn. Nếu bạn đang sử dụng Nginx Proxy Manager trên TrueNAS, thì IP mà bạn cần ghi lại là IP thuộc về máy TrueNAS của bạn.

Nếu bạn định thêm những 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 định nghĩa người dùng nào có thể truy cập thiết bị nào, và theo mặc định, 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ể muốn 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 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 truy cập để có thể sử dụng domain của mình!

Tạo Subdomain Với Cloudflare

Tôi Thích Sử Dụng Cloudflare Cho Việc Này

Cấu hình A record trong Cloudflare DNS để trỏ subdomain đến IP Tailscale của reverse proxy, cho phép truy cập từ xa.Cấu hình A record trong Cloudflare DNS để trỏ subdomain đến IP Tailscale của reverse proxy, cho phép truy cập từ xa.

Như đã đề cập, chúng ta sẽ sử dụng Cloudflare cho việ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 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 trạng thái proxy thành tắt. Đ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 host. Điều đó cũng có nghĩa là không ai khác có thể truy cập 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 diện 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 subdomain 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ố dịch vụ khác nữa. Quá trình này là 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 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 diện 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 & Nhận Chứng Chỉ SSL

Thêm Hỗ Trợ Cloudflare và Bật HTTPS

Màn hình terminal hiển thị lệnh xcaddy build --with github.com/caddy-dns/cloudflare để biên dịch Caddy với module hỗ trợ Cloudflare DNS.Màn hình terminal hiển thị lệnh xcaddy build –with github.com/caddy-dns/cloudflare để biên dịch Caddy với module hỗ trợ Cloudflare DNS.

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 đầu tiên, và cách tôi đã làm, là sử dụng xcaddy. Công cụ này có thể biên dịch Caddy với các module (về cơ bản là plugin), và nếu thuật ngữ “biên dịch” (build) làm bạn lo lắng, thì thực ra nó thực sự rất dễ dàng. Lệnh để biên dịch Caddy với hỗ trợ Cloudflare đơn giản như sau:

xcaddy build --with github.com/caddy-dns/cloudflare

Lệnh này tạo một tệp “caddy” mới mà bạn có thể sử dụng để thay thế tệp 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 sở hữu domain khi yêu cầu chứng chỉ SSL. Nếu bạn không muốn phải tự biên dịch bằng xcaddy, bạn có thể tải xuống một tệp binary Caddy đã được biên dịch 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 diện module tùy chỉnh, đảm bảo rằng 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 Cloudflare API. Bạn có thể tìm thấy token 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 zone resources, chọn tên domain 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 sẽ hiển thị token 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 tệp “Caddyfile” sinh sống. 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ó, nhưng chúng ta cũng có thể tạo một 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 không, hãy thoải mái tạo Caddyfile của bạn ở bất cứ đâu dễ dàng truy cập.

Kết quả đầu ra của lệnh xcaddy build sau khi biên dịch Caddy thành công với các module tùy chỉnh.Kết quả đầu ra của lệnh xcaddy build sau khi biên dịch Caddy thành công với các module tùy chỉnh.

Hiện tại, chạy lệnh sau:

export CLOUDFLARE_API_TOKEN=

Lệnh này sẽ đặt API token Cloudflare vào các 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 sẽ cần cấu hình các DNS challenge của Cloudflare. Vì dịch vụ sẽ không thể truy cập công khai, Caddy sẽ chứng minh quyền sở hữu domain 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 domain. 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ả các tương tác ACME đều sử dụng Cloudflare DNS-01 với token từ biến môi trường
 acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}

Phần 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 đã export trước đó vào các biến môi trường để xác thực. Bây giờ chúng ta có thể tạo một reverse proxy cho domain TrueNAS mà chúng ta đã tạo trước đó, dưới dạng truenas.example.ie. Trong cùng 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ế domain bằng domain 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. 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, thông tin đó sẽ đủ, 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 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 nó gặp trang đăng nhập Proxmox.

Terminal hiển thị quá trình xác minh và chạy Caddy với tệp Caddyfile đã cấu hình, cấp chứng chỉ SSL.Terminal hiển thị quá trình xác minh và chạy Caddy với tệp Caddyfile đã cấu hình, cấp chứng chỉ SSL.

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 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 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ế hoạt động của điều 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 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ể thấy gì. Với Tailscale được bật, nó có thể đi qua, 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 bạn, 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ì được expose 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 expose. 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 cảnh báo gây phiền nhiễ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.

Thêm Quy Tắc Ghi Đè DNS Cho Truy Cập Nội Bộ

Tối Ưu Hóa Trải Nghiệm Truy Cập Tại Nhà Với Pi-hole

Giao diện cấu hình Local DNS records trên Pi-hole, cho phép ghi đè DNS để truy cập nội bộ các dịch vụ homelab.Giao diện cấu hình Local DNS records trên Pi-hole, cho phép ghi đè DNS để truy cập nội bộ các dịch vụ homelab.

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 một Pi-hole. Bạn sẽ cần tắt DNS của Tailscale trên mỗi thiết bị nếu bạn chưa làm, để nó có thể sử dụng Pi-hole của bạn làm server DNS. Sau khi đã làm, 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 instance 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 rằng 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ẽ 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 bạn ở 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.

Trong khi bạn đang ở đây, nếu bạn chưa làm điều đó trước đây, hãy thoải mái thử nghiệm với DNS cục bộ và tạo một số domain 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. Điều này không hề cần thiết, nhưng đó là một tính năng bổ sung thú vị để làm cho 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

Tìm Ra Giải Pháp Phù Hợp Nhất Cho Bạn

Mặc dù đây là thiết lập mà tôi ưa thích, nhưng có rất nhiều cách để truy cập các dịch vụ tự host của bạn khi đi xa, và đây chỉ là một cách mà cá nhân tôi 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 để vào 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, tôi đã chuyển từ Nginx Proxy Manager sang Caddy một thời gian trước, 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 điều đó; tệp Caddy của tôi dễ dàng sao lưu và di chuyển sang các host khác nếu tôi cần, và rất tiện lợi để có thể thêm và xóa dịch vụ nhanh chóng thông qua dòng lệnh khi cần thiết. Hiện tại tôi đang trong quá trình chuyển Caddy sang thiết lập OPNsense của mình, và cho đến nay nó hoạt động hoàn hảo.

Tôi đi lại 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 điều đó! Hãy chia sẻ ý kiến của bạn về giải pháp này hoặc các phương pháp truy cập homelab từ xa mà bạn đang sử dụng!

Related posts

Cloudflare Tunnel và VPN: Giải pháp nào tối ưu cho truy cập Home Lab từ xa?

Administrator

Tự Lưu Trữ Đa Phương Tiện Với Docker: Xây Dựng Thư Viện Giải Trí Cá Nhân Hoàn Hảo

Administrator

Microsoft To Do: Vì sao vẫn là ứng dụng quản lý công việc tối ưu cho năng suất của bạn?

Administrator