Tận dụng tên miền và HTTPS của Tailscale cho self-host
Khi sử dụng Tailscale cho hệ thống mạng nội bộ, home-lab, self-host, chúng ta sẽ có một tài nguyên rất giá trị đó là tên miền của Tailscale. Tên miền này có đầy đủ chứng chỉ SSL/TLS, tức là chúng ta có thể sử dụng https cho tên miền này.
Và chúng ta hoàn toàn có thể tận dụng tên miền của Tailscale để sử dụng với các dịch vụ cần kết nối https, ví dụ như Bitwarden/Vaultwarden, AdguardHome, mà không cần phải mua tên miền, không cần cấu hình tên miền phức tạp với Cloudflare hay thiết lập Cloudflare Tunnel.
Bài viết này mình sẽ chia sẻ những cách sử dụng mình cho là có thể tận dụng tối đa tiềm năng của tên miền Tailscale:
- Dùng Tailscale Serve – Dành cho các dịch vụ trên 1 host, nhanh gọn – nếu nhiều dịch vụ sẽ cần chia port
- Dùng Tailscale Services kết hợp với Serve – Dành cho dịch vụ chạy trên nhiều host (backup lẫn nhau) + có thể dùng subdomain
- Dùng Tailscale Funnel – Dành cho dịch vụ muốn mở ra cho Public
- Tailscale + Proxy – Nâng cao thêm khả năng khi sử dụng proxy độc lập
Nội dung chính
Video
Bật tính năng HTTPS cho Tailscale
Đầu tiên phải bật tính năng HTTPS cho Tailscale Các bạn vào trang quản lý DNS của Tailscale và kéo xuống cuối trang:
- Bật Magic DNS
- Bật HTTPS Certificates
Cũng ở trong trang này, các bạn có thể thấy Tailnet DNS name của các bạn, thường có cấu trúc là: tail*****.ts.net
Và mỗi thiết bị cài đặt Tailscale cũng sẽ có domain name là: tên_thiết_bị.tail*****.ts.net
Như vậy là xong, chúng ta đã có thể bắt đầu sử dụng tên miền Tailscale.
Tailscale Serve
Tailscale Serve là tính năng dùng tên miền đến gán các dịch vụ trên một thiết bị, và có thể chia sẻ trong Tailnet cho mọi người cùng truy cập. Để cấu hình Tailscale Serve, các bạn sẽ cần sử dụng giao diện dòng lệnh của Tailscale.
Giả sử như trên server của mình có một dịch vụ là Vaultwarden, đang cài đặt ở IP 10.10.10.130:8080, đồng thời server đó của mình đã cài tailscale và có tên domain là: demo1.tail10ad15.ts.net và mình muốn dùng domain này để truy cập Vaultwarden
Mình chỉ cần thực hiện lệnh bên dưới, trong đó flag –bg là để chạy trong nền và –https=443 là để chỉ định nghe trên cổng 443 với giao thức https:
sudo tailscale serve --https=443 --bg http://10.10.10.130:8080
#hoặc
sudo tailscale serve --https=443 --bg localhost:8080
#hoặc
sudo tailscale serve --https=443 --bg 8080
Khi này chỉ cần truy cập https://demo1.tail10ad15.ts.net là sẽ vào được Vaultwarden thông qua link https và có khóa bảo mật màu xanh, vì Tailscale sẽ tự động lấy chứng chỉ cho tên miền này sau khi các bạn chạy lệnh serve.
Giả sử, cũng trên server đó, mình đang có một dịch vụ khác là HomeAssitant chạy ở port 8123 với IP là 10.10.10.130:8123, và cũng muốn dùng tên miền này để truy cập thông qua https. Mình có thể setup thêm 1 lệnh serve nữa như sau:
sudo tailscale serve --https=8123 --bg http://10.10.10.130:8123
#hoặc
sudo tailscale serve --https=8123 --bg localhost:8123
#hoặc
sudo tailscale serve --https=8123 --bg 8123
Vì cổng https=443 đã được sử dụng cho Vaultwarden rồi, nên khi muốn serve thêm 1 đường link nữa, chúng ta phải đổi cổng nghe thành https=8123. Lúc này chỉ cần truy cập https://demo1.tail10ad15.ts.net:8123 là sẽ vào HomeAssistant.
Cứ như vậy, bằng cách sử dụng port khác nhau, các bạn có thể serve nhiều dịch vụ sử dụng chung 1 tên miền.
Các bạn có thể kiểm tra các dịch vụ đang serve bằng lệnh:
tailscale serve status
Kết quả nhận về sẽ là
https://demo1.tail10ad15.ts.net (tailnet only)
|-- / proxy http://localhost:8080
https://demo1.tail10ad15.ts.net:8123 (tailnet only)
|-- / proxy http://localhost:8123
Để dừng serve một dịch vụ, các bạn có thể dùng lệnh:
tailscale serve --https=<port> <target> [off]
tailscale serve --https=<port> [off]
#ví dụ mình muốn dừng serve HomeAssistant, mình có thể chạy lệnh
tailscale serve --https=8123 off
Để reset toàn bộ các lệnh serve, các bạn có thể dùng lệnh
tailscale serve reset
Đây là cách nhanh nhất để các bạn có thể sử dụng Tailscale làm reverse proxy cho chính dịch vụ mà các bạn đang host trên thiết bị đó, hoặc thậm chí thiết bị khác trong mạng nội bộ, cách này có những ưu và nhược điểm sau:
- Ưu điểm: nhanh gọn, dễ setup, phù hợp nếu host ít dịch vụ, link có đầy đủ https
- Nhược điểm: không custom được sub-domain nên phải dùng port khó nhớ hơn, chưa có tính sẵn sàng cao, vì mọi thứ chỉ nằm trên 1 server
Để khắc phục nhược điểm đó, chúng ta có thể dùng Tailscale Services.
Tailscale Services
Với Tailscale Services, chúng ta có thể cấu hình 1 đường link có subdomain trên Tailnet, và sau đó có thể kết nối đến nhiều endpoint (thiết bị) khác nhau.
Ví dụ mình có 2 server AdGuard Home, cài đặt trên 2 server khác nhau trong mạng nội bộ với IP lần lượt là 10.10.10.130:3000 và 10.10.10.131:3000
Mình có thể tạo một đường link có dạng: https://adguard.tail10ad15.ts.net và trỏ về 2 server đó cùng lúc nhằm đảm bảo nếu 1 server có bị sập, server còn lại vẫn hoạt động bình thường.
Hoặc có thể tạo đường dễ nhớ dạng: https://hass.tail10ad15.ts.net hay https://vault.tail10ad15.ts.net cho các dịch vụ.
Đây là những điểm mà khi dùng thêm Tailscale Services sẽ tốt hơn chỉ dùng mỗi Tailscale Serve. Tất nhiên khi cấu hình cũng sẽ phức tạp hơn đôi chút.
Để cấu hình, yêu cầu đầu tiên là các server chạy dịch vụ (mà các bạn định cho làm endpoint) sẽ phải được gắn tag. Để làm việc này, chúng ta cần vào trang quản lý của Tailscale. Vào mục Access Controls -> Tags -> Create tag để tạo một tag mới (ví dụ: home-lab), phần name tùy chọn, phần owner các bạn có thể điền email của các bạn hoặc chọn autogroup:admin. Sau đó các bạn Save lại.
Kế tiếp, các bạn quay lại mục Machines, chọn thiết bị mà bạn sẽ dùng làm host (chính là 2 server đang ví dụ) ấn vào dấu 3 chấm và chọn Edit ACL tags… sau đó các bạn chọn tag mà các bạn đã tạo (ví dụ tag:home-lab) và lưu lại.
Tiếp theo vào mục Services, ấn Define a Service và cấu hình như sau:
- Service name: sẽ là tên dịch vụ (tương tự subdomain), ví dụ mình đặt tên dịch vụ là adguard thì domain sẽ là adguard.tail10ad15.ts.net
- Description: tùy ý
- Ports: chọn port các bạn muốn dùng, với https thì nên chọn port mặc định 443, lúc đó đường link sẽ không cần ghi port
- Service tags: chọn tag các bạn đã tạo, ví dụ tag:home-lab
Sau đó các bạn ấn Define Service để lưu lại.
Kế tiếp, các bạn truy cập vào giao diện dòng lệnh của từng server (ví dụ như ssh) và dùng lệnh sau:
tailscale serve --service=svc:adguard --https=443 localhost:3000
Kết quả trả về sẽ kèm một thông báo là bạn phải Approve dịch vụ này trên trang quản trị.
Sau đó các bạn quay lại mục Services và ấn vào dịch vụ adguard đã tạo khi nãy, lúc này bên dưới sẽ hiện lên mục Hosts, các bạn sẽ thấy 2 server mà các bạn đang sử dụng, các bạn ấn nút Approve theo thứ tự server chính trước và server phụ sau.
Vậy là kể từ lúc này khi truy cập https://adguard.tail10ad15.ts.net, các bạn có thể vào Adguard Home trên server chính. Và nếu trường hợp server chính có vấn đề, server phụ sẽ có thể làm nhiệm vụ failover cho đến khi server chính quay trở lại.
Tính đến đây, với giải pháp này, các bạn đã xử lý được hầu hết mọi trường hợp cần sử dụng https cho các dịch vụ rồi, có thể đặt tên miền phụ theo ý muốn, và có thể cấu hình nhiều endpoint để dự phòng.
Tuy nhiên, Proxy của Tailscale sẽ không có nhiều chức năng giống như một server proxy thực thụ, ví dụ như muốn cân bằng tải giữa 2 server chẳng hạn, vì thế chúng ta có thể sử dụng thêm giải pháp kết hợp tên miền của Tailscale với một proxy server, mình sẽ chia sẻ ở phần cuối của bài.
Trước khi qua phần tiếp theo. Có một lưu ý nhỏ về Tailscale Servcies các bạn nên biết. Để xem tình trạng các services đang được host trên 1 server, dùng lệnh status phải có thêm -json.
tailscale serve status -json
Để ngắt một host ra khỏi services, các bạn nên chạy lệnh drain trước để host không quảng bá service đó trên tailnet nữa
tailscale serve drain svc:<service-name>
#ví dụ
tailscale serve drain svc:adguard
Sau đó mới dùng lệnh để remove endpoint hoặc reset tất cả.
tailscale serve --https=<port> <target> [off]
tailscale serve --https=<port> [off]
#ví dụ mình muốn dừng serve HomeAssistant, mình có thể chạy lệnh
tailscale serve --https=8123 off
#hoặc reset tất cả
tailscale serve reset
Tailscale Funnel
Tất cả các giải pháp ở trên đều là để các thiết bị trong Tailnet truy cập server thông qua tên miền. Còn nếu bạn muốn mở một dịch vụ ra Internet để bất cứ ai có thể truy cập thì sao? Các bạn có thể sử dụng Tailscale funnel
Về mặt cấu trúc câu lệnh sẽ tương tự như lệnh tailscale serve. Lưu ý là sẽ không sử dụng funnel cùng Tailscalce serveices được. Ngoài ra, Funnel chỉ hỗ trợ 3 cổng là 443, 8443 và 10000
Để kích hoạt Funnel, trên server, các bạn chạy lệnh
tailscale funnel
Và sau đó sẽ có một đường link để các bạn truy cập và đồng ý sử dụng Funnel cũng như để cấp quyền cho thiết bị sử dụng Funnel.
Sau đó, các bạn dùng lệnh tương tự như khi dùng serve
Ví dụ mình có thể chạy lệnh
#ví dụ IP Vaultwarden
sudo tailscale funnel --https=443 --bg http://10.10.10.130:8080
#ví dụ IP HomeAssistant
sudo tailscale funnel --https=8443 --bg http://10.10.10.130:8123
#ví dụ IP AGH
sudo tailscale funnel --https=10000 --bg http://10.10.10.130:3000
Như vậy, các đường link như https://demo1.tail10ad15.ts.net có thể truy cập trực tiếp từ internet public mà không cần cài đặt, đăng nhập Tailscale.
Về nguyên lý, Funnel cho phép mở domain ra Public nhưng sẽ thông qua server DERP của Tailscale, mà server này không ở Việt Nam, đồng thời cũng có giới hạn băng thông, vì vậy tốc độ sẽ chậm và ping cũng khá cao. Vì vậy nếu các bạn dùng để mở các dịch vụ nhẹ nhàng thì ổn, chứ nếu dùng để share file nặng thì sẽ chậm.
Để tắt hay reset funnel các bạn cũng chỉ cần dùng lệnh:
tailscale funnel --https=8443 off
#hoặc
tailscale funnel reset
Tailscale + Proxy
Đây là một cách nâng cao hơn nữa để sử dụng tên miền Tailscale, đó là kết hợp với một proxy server. Hiện mình đang sử dụng Proxy server là Caddy. Đây là một phần mềm proxy tuy chỉ sử dụng trên giao diện dòng lệnh nhưng lại có cách sử dụng đơn giản và ưu điểm lớn nhất là đã tích hợp sẵn API của Tailscale để tự động lấy chứng chỉ tls/ssl mà người dùng không cần thao tác thủ công. Các bạn chỉ cần cài đặt Caddy lên server đang chạy Tailscale là được.
Cài đặt Caddy Proxy
Để cài đặt Caddy, các bạn có thể xem trong tài liệu của ứng dụng này, mình sẽ lấy ví dụ cho cho Debian, Ubuntu, Raspbian, các bạn chạy lần lượt lệnh sau:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Kế tiếp, các bạn cần sửa quyền cho phép caddy được lấy chứng chỉ từ Tailscale, các bạn sửa file sau:
nano /etc/default/tailscaled
Sau đó thêm vào cuối file này dòng: TS_PERMIT_CERT_UID=caddy
Và lưu lại bằng ctrl + O, Enter, ctrl + X
Tới đây là chúng ta đã cài đặt xong Caddy và đã có thể sử dụng chung với Tailscale.
Cách 1: Chỉ sử dụng tên miền, Proxy lo chứng chỉ
Với cách 1, các bạn chỉ cần sử dụng tên miền của chính thiết bị mà các bạn đã cài đặt Tailscale và Caddy, ví dụ mình cài đặt lên Server 1 có tên miền là demo1.tail10ad15.ts.net
Với cách này, các bạn không cần dùng tính năng Tailscale Serve vì chúng ta sẽ có Caddy lo việc Proxy rồi.
Các bạn mở Caddyfile để edit bằng lệnh
nano /etc/caddy/Caddyfile
Sau đó trong Caddyfile, các bạn có thể xóa các nội dung mặc định và cấu hình cho file này như sau, mình lấy ví dụ trường hợp Vaultwarden và HomeAssistant (giống ví dụ ở phần đầu Tailscale serve)
#Vaultwarden
demo1.tail10ad15.ts.net {
reverse_proxy 10.10.10.130:8080
}
#HomeAssistant
demo1.tail10ad15.ts.net:8124 {
reverse_proxy 10.10.10.130:8123
}
Sau đó các bạn lưu file lại và thoát ra bằng tổ hợp phím ctrl + O, Enter, ctrl + X.
Lưu ý: nếu các bạn chạy proxy trên chính server mà đang chạy dịch vụ mà các bạn muốn trỏ về, các bạn sẽ phải dùng 2 port khác nhau. Ví dụ, với Home Assistant, phải dùng port 8124 để hứng request từ tên miền (demo1.tail10ad15.ts.net:8124) và trỏ về IP với port 8123 (10.10.10.130:8123).
Và chạy lệnh reload Caddy:
sudo systemctl reload caddy
Vì Caddy đã có sẵn API của Tailscale để lấy chứng chỉ nên giờ khi bạn truy cập https://demo1.tail10ad15.ts.net sẽ vào thẳng Vaultwarden, hay https://demo1.tail10ad15.ts.net:8123 sẽ vào thẳng HomeAssistant, với khóa https màu xanh.
Ví dụ với trường hợp các bạn có 2 server AdGuardHome tại 2 IP là 10.10.10.130:3000 và 10.10.10.131:3000 và muốn chia đều tải vào 2 server này, các bạn có thể thêm vào caddyfile đoạn cấu hình như sau:
demo1.tail10ad15.ts.net:3001 {
reverse_proxy 10.10.10.130:3000 10.10.10.131:3000 {
lb_policy round_robin
fail_duration 30s
health_uri /dns-query
health_interval 1s
health_timeout 500ms
health_status 400
}
}
Tương tự, lưu ý sử dụng port khác để nghe.
Trong đó, lb_policy round_robin: Thuật toán cân bằng tải xoay vòng, gửi truy vấn luân phiên cho 2 server AGH. Các lệnh khác là lệnh để kiểm tra sức khỏe của server và tự động chuyển hướng nếu có server nào đó không hoạt động. Mình có chia sẻ kĩ hơn về các lệnh này trong bài viết về AdGuard Home Level 5, các bạn có thể tham khảo thêm.
Sau đó các bạn lưu file lại và chạy systemctl reload caddy.
Lúc này khi truy cập demo1.tail10ad15.ts.net:3000, mỗi lần truy cập sẽ đẩy về một server luân phiên qua lại.
Đây là ví dú khi chỉ sử dụng tên miền cùng với proxy server, nó gần tương tự với tính năng Tailscale Serve, tuy nhiên vì các bạn có toàn quyền tùy chỉnh với proxy server, nên có thể làm được nhiều điều hơn, ví dụ như cân bằng tải, hoặc cũng có thể thiết lập 2 server dạng failover, và còn nhiều tính năng khác…
Cách 2: Kết hợp Tailscale Service với Proxy
Với cách này, các bạn có thể tận dụng việc tạo subdomain của Tailscale Service, rồi trên thiết bị, các bạn dùng lệnh serve để trỏ về proxy, và từ proxy, có thể thêm cách tính năng nâng cao như cân bằng tải.
Với cách sử dụng này, để tránh việc bị những lỗi như HTTP 502, vòng lặp re-direct, chúng ta sẽ để Tailscale lo chứng chỉ, còn ở phía proxy sẽ không cần lấy chứng chỉ mà chỉ đơn thuần dùng giao thức http thay vì https.
Tương tự như phần Tailscalse Services mình đã trình bày ở trên, với dịch vụ adguard, thay vì đặt endpoint trỏ thẳng vào server AdGuard Home, chúng ta sẽ trỏ vào một cổng bất kì trên proxy với giao thức http. Lưu ý, ở đoạn này nên dùng IP loopback 127.0.0.1 thay vì localhost, ví dụ mình trỏ về port 8000 thì sẽ dùng lệnh như sau
tailscale serve --service=svc:adguard --https=443 http:127.0.0.1:8000
Và sau đó cấu hình proxy như sau, các bạn không cần ghi tên miền hay ip gì ở đây, chỉ cần ghi port :8000 để caddy hứng mọi truy cập đến cổng này.
:8000 {
reverse_proxy 10.10.10.130:3000 10.10.10.131:3000 {
lb_policy round_robin
fail_duration 30s
health_uri /dns-query
health_interval 1s
health_timeout 500ms
health_status 400
}
}
Lưu lại và reload caddy.
Như vậy khi truy cập https://adguard.tail10ad15.ts.net, Tailscale Services sẽ theo Endpoint trỏ về Caddy, và từ đây Caddy tiếp tục cân bằng tải đều ra cho 2 Server AdGuard Home 10.10.10.130 và 10.10.10.131
Đó là cách để dùng domain name của Tailscale thông qua Tailscale Service kết hợp với Proxy server ở phía sau để vừa có tên miền dễ nhớ cho từng dịch vụ mà không phải dùng port custom mà vẫn có thể cân bằng tải thông qua proxy.
Nếu trường hợp các bạn muốn public IP ra ngoài, mà phía sau có Proxy hỗ trợ, có thể kết hợp Tailscale Funnel với Proxy theo nguyên tắc tương tự.
Kết luận
Tóm lại, với Tailscale chúng ta có tên miền miễn phí, https với tls/ssl miễn phí, có thể đáp ứng gần như mọi nhu cầu trong việc sử dụng tên miền có https khi anh em chơi home-lab, self-host, lại còn được bảo vệ dưới 1 lớp VPN bảo mật thay vì phơi ra ngoài mạng công cộng. Vì vậy đây là một giải pháp đơn giản và an toàn để bắt đầu.
Nhược điểm duy nhất là anh em không được chủ động chọn tên miền mà phải sử dụng tên miền do Tailscale tạo ra, cũng như nếu dùng Funnel để public ra internet thì sẽ có giới hạn về tốc độ và băng thông.
Bài viết xin được kết thúc tại đây, chúc anh em vui vẻ và hi vọng những giải pháp trong bài sẽ giúp được anh em.
Nếu thấy nội dung bài viết hữu ích, hãy chia sẻ cho bạn bè và người thân. Đừng quên theo dõi Ngon Bổ Xẻ qua Facebook và Youtube để luôn cập nhật các nội dung mới nhất. Ngoài ra, mình cũng có lập Group FB chuyên chia sẻ các deal hời cho anh em về công nghệ, điện từ, gia dụng… các bạn cũng có thể tham gia nha. Một lần nữa, chân thành cám ơn các bạn và hẹn gặp lại trong những nội dung kế tiếp ❤️
Chia sẻ bài viết:
