Cài đặt Headscale trên VPS: Tự tạo mạng VPN Mesh riêng tư, miễn phí trọn đời (2026)
Trong bối cảnh làm việc từ xa (Remote Work) và quản lý hạ tầng phân tán ngày càng phổ biến, nhu cầu kết nối an toàn đến các máy chủ nội bộ là yếu tố thiết yếu đối với mọi hệ thống CNTT. Bạn muốn tận dụng sức mạnh và sự tiện lợi của giao thức WireGuard thông qua Tailscale, nhưng lại e ngại về chi phí cho các gói doanh nghiệp, giới hạn số lượng thiết bị, hoặc muốn tự chủ hoàn toàn dữ liệu điều hướng?
Giải pháp tối ưu nhất hiện nay chính là Headscale.
Bài viết này sẽ hướng dẫn bạn chi tiết cách cài đặt Headscale trên VPS Linux sử dụng Docker. Chúng ta sẽ cùng nhau xây dựng một hệ thống VPN Mesh (mạng lưới) bảo mật, hiệu suất cao, hỗ trợ kết nối đa nền tảng và hoàn toàn miễn phí.
Headscale và mạng Mesh VPN: Giải pháp thay thế hoàn hảo
Để hiểu rõ giá trị của hệ thống này, trước tiên chúng ta cần phân biệt mô hình VPN truyền thống (như OpenVPN) và mô hình Mesh VPN hiện đại.
Headscale là phiên bản mã nguồn mở (Open Source), tự lưu trữ (Self-hosted) của máy chủ điều phối Tailscale (Control Server). Hệ thống hoạt động dựa trên cơ chế tách biệt thông minh:
- Control Plane (Headscale): Máy chủ này chỉ chịu trách nhiệm xác thực người dùng, trao đổi khóa mã hóa (Public Keys) và cập nhật bản đồ mạng (Network Map) cho các thiết bị.
- Data Plane (WireGuard): Dữ liệu thực tế được truyền tải trực tiếp giữa các thiết bị (Peer-to-Peer) thông qua giao thức WireGuard. Điều này đảm bảo dữ liệu KHÔNG đi qua máy chủ Headscale, giúp giảm độ trễ và tăng cường bảo mật.
Tại sao IT Admin chọn Headscale?
| Đặc điểm | Tailscale (Gói Free/Personal) | Headscale (Tự lưu trữ) |
| Chi phí | Miễn phí (giới hạn tính năng) | Miễn phí trọn đời |
| Giới hạn thiết bị | Tối đa 100 thiết bị | Không giới hạn |
| Số lượng User | Tối đa 3 users | Không giới hạn |
| Quyền riêng tư | Metadata đi qua server Tailscale | Kiểm soát 100% dữ liệu và Logs |
| Tên miền mạng | Bắt buộc dùng đuôi .ts.net |
Tùy chỉnh theo tên miền riêng |
Chuẩn bị hạ tầng và cấu hình firewall
Để mạng Mesh hoạt động trơn tru và tối ưu tốc độ P2P, việc chuẩn bị môi trường và mở đúng Port trên tường lửa (Firewall) là bước khởi đầu bắt buộc.
Yêu cầu hệ thống
Headscale rất nhẹ và không tiêu tốn nhiều tài nguyên hệ thống.
- VPS: Khuyên dùng Ubuntu 22.04/24.04 LTS hoặc Debian 12.
- Cấu hình: 1 Core CPU, 1GB RAM, 20GB SSD là đủ để vận hành mạng lưới cho hàng trăm thiết bị.
- Tên miền: Một tên miền phụ (ví dụ:
vpn.congtycua.com) đã trỏ về địa chỉ IP Public của VPS.
Cấu hình firewall (Quan trọng)
Bạn cần cấu hình tường lửa (UFW hoặc Security Group của nhà cung cấp Cloud) để mở các port sau. Việc này đảm bảo các thiết bị có thể tìm thấy nhau và thiết lập kết nối trực tiếp.
- TCP 80 & 443: Dùng cho Web Server (Nginx) và cấp chứng chỉ SSL Let’s Encrypt.
- UDP 41641: Dùng cho giao thức WireGuard. Đây là đường hầm dữ liệu trực tiếp (Direct P2P) giữa các thiết bị. Mở port này giúp kết nối nhanh hơn và ổn định hơn.
- UDP 3478: Dùng cho giao thức STUN. Giúp các thiết bị nằm sau NAT (như mạng gia đình, văn phòng) tìm thấy địa chỉ IP công khai của nhau.
Lưu ý bảo mật: Chúng ta sẽ không mở port 8080 (API của Headscale) ra Internet. Port này chỉ được truy cập nội bộ thông qua Reverse Proxy để đảm bảo an toàn tuyệt đối.
Quy trình cài đặt Headscale trên VPS (Sử dụng Docker)
Chúng ta sử dụng Docker Compose để quản lý container. Phương pháp này giúp môi trường cài đặt gọn gàng, dễ dàng cập nhật và sao lưu dữ liệu sau này.
Nếu VPS của bạn chưa có môi trường này, hãy thực hiện theo bài hướng dẫn cài đặt Docker trên VPS Linux trước khi tiếp tục các bước dưới đây.
Bước 1: Cài đặt Docker
Đầu tiên, hãy cài đặt Docker Engine và Docker Compose lên VPS.
Cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y
Tải và cài đặt Docker tự động:
curl -fsSL https://get.docker.com -o get-docker.sh
Thực thi script cài đặt:
sudo sh get-docker.sh
Thêm user hiện tại vào nhóm Docker (để chạy lệnh không cần sudo):
sudo usermod -aG docker $USER
(Sau bước này, bạn hãy thoát SSH và đăng nhập lại để áp dụng quyền).
Bước 2: Thiết lập thư mục và file cấu hình
Tạo cấu trúc thư mục để lưu trữ cấu hình và cơ sở dữ liệu (Database) cho Headscale.
Tạo thư mục:
mkdir -p ~/headscale/config ~/headscale/data
Di chuyển vào thư mục làm việc:
cd ~/headscale
Tải file cấu hình mẫu chuẩn từ mã nguồn:
wget -O config/config.yaml https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml
Chỉnh sửa file config/config.yaml:
Sử dụng trình soạn thảo nano để chỉnh sửa:
nano config/config.yaml
Bạn cần thay đổi các thông số dưới đây để khớp với hạ tầng của mình. Hãy chú ý cấu trúc YAML phải chính xác:
# 1. URL của Server (Bắt buộc phải là HTTPS và domain của bạn)
server_url: https://vpn.congtycua.com
# 2. Địa chỉ lắng nghe trong Container (Headscale lắng nghe mọi IP trong container)
listen_addr: 0.0.0.0:8080
# 3. Dải IP mạng ảo (Overlay Network) sẽ cấp cho các thiết bị
ip_prefixes:
- 100.64.0.0/10
# 4. Tên miền cơ sở (Bắt buộc để định danh máy trong mạng)
base_domain: noibo.local
# 5. Cấu hình DNS và MagicDNS
# Giúp bạn truy cập thiết bị bằng tên (VD: may-chu-web) thay vì IP
dns:
magic_dns: true
nameservers:
- 1.1.1.1
- 8.8.8.8
Bước 3: Triển khai Docker Compose
Tạo file docker-compose.yml tại thư mục ~/headscale. Chúng ta sẽ áp dụng kỹ thuật Security Hardening bằng cách chỉ cho phép kết nối tới API từ chính máy chủ (localhost).
Tạo file:
nano docker-compose.yml
Dán nội dung sau:
version: '3.8'
services:
headscale:
image: headscale/headscale:latest
container_name: headscale
restart: unless-stopped
volumes:
- ./config:/etc/headscale
- ./data:/var/lib/headscale
ports:
# Chỉ bind port 8080 vào localhost (127.0.0.1)
# Điều này buộc mọi kết nối phải đi qua Nginx (SSL/TLS)
- "127.0.0.1:8080:8080"
- "127.0.0.1:9090:9090"
command: headscale serve
cap_add:
- NET_ADMIN
- SYS_MODULE
Khởi chạy hệ thống:
docker compose up -d
Kiểm tra trạng thái container (phải ở trạng thái Up):
docker compose ps
Cấu hình reverse proxy với Nginx (Hỗ trợ WebSockets)
Giao thức điều khiển của Tailscale (Tailscale Control Protocol) sử dụng WebSockets để duy trì kết nối liên tục giữa Client và Server. Nếu cấu hình Nginx thiếu các header hỗ trợ WebSockets, kết nối sẽ không ổn định.
Cài đặt Nginx và Certbot
sudo apt install nginx certbot python3-certbot-nginx -y
Tạo cấu hình Virtual Host
Tạo file cấu hình mới cho tên miền VPN:
sudo nano /etc/nginx/sites-available/headscale
Dán nội dung cấu hình chuẩn sau (đã bao gồm tối ưu cho WebSockets):
# Block map để xử lý header Upgrade cho WebSockets
map $http_upgrade $connection_upgrade {
default keep-alive;
'websocket' upgrade;
}
server {
listen 80;
server_name vpn.congtycua.com;
location / {
# Chuyển tiếp request vào cổng 8080 nội bộ của Docker
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
# Các Header BẮT BUỘC cho WebSockets hoạt động
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# Các Header định danh client
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Tắt Buffering để đảm bảo tương tác thời gian thực
proxy_buffering off;
# Tăng timeout để tránh ngắt kết nối khi đường truyền nhàn rỗi
proxy_read_timeout 86400;
}
}
Kích hoạt SSL và website
Tạo liên kết tượng trưng (Symlink) để kích hoạt cấu hình:
sudo ln -s /etc/nginx/sites-available/headscale /etc/nginx/sites-enabled/
Kiểm tra lỗi cú pháp Nginx:
sudo nginx -t
Khởi động lại Nginx:
sudo systemctl restart nginx
Cấp chứng chỉ SSL miễn phí từ Let’s Encrypt:
sudo certbot --nginx -d vpn.congtycua.com
Đến bước này, việc cài đặt Headscale trên VPS về mặt hạ tầng đã hoàn tất. Server của bạn đã sẵn sàng tiếp nhận kết nối an toàn qua HTTPS.
Hướng dẫn kết nối Client vào mạng Headscale
Headscale quản lý thiết bị dựa trên User (Người dùng). Trước khi kết nối thiết bị, bạn cần tạo ít nhất một User.
Bước 1: Tạo User trên server
Chạy lệnh sau trên VPS để tạo User (ví dụ: admin-team):
docker exec headscale headscale users create admin-team
Bước 2: Cài đặt và kết nối từ thiết bị Client
Bạn tải và cài đặt ứng dụng Tailscale chính thức (Official Client) cho các nền tảng, sau đó thực hiện cấu hình đăng nhập như sau:
Đối với Windows / Linux (Giao diện dòng lệnh)
Sau khi cài đặt xong, mở PowerShell (Windows) hoặc Terminal (Linux) và chạy lệnh đăng nhập trỏ về server riêng:
tailscale login --login-server https://vpn.congtycua.com
Đối với macOS (Giao diện GUI)
Tailscale trên macOS hỗ trợ thay đổi server ngay trên giao diện mà không cần dùng lệnh:
- Giữ phím Option (Alt) trên bàn phím và click vào biểu tượng Tailscale trên thanh Menu bar.
- Rê chuột vào menu Debug (Menu này chỉ hiện khi giữ phím Option).
- Chọn mục Custom Login Server > Add Account….
- Nhập URL Server:
https://vpn.congtycua.comvà nhấn Add Account.
Đối với Android (Giao diện cài đặt chuẩn)
- Mở ứng dụng Tailscale.
- Nhấn vào biểu tượng Avatar (hoặc Menu) ở góc trên bên phải -> Chọn Accounts.
- Nhấn vào dấu 3 chấm dọc (Kebab menu) ở góc trên bên phải màn hình Accounts.
- Chọn Use alternate server.
- Nhập URL:
https://vpn.congtycua.comvà nhấn Save.
Bước 3: Phê duyệt thiết bị (Node Registration)
Khi Client thực hiện kết nối, nó sẽ hiện ra thông báo đang chờ phê duyệt. Bạn quay lại VPS để cấp quyền.
Xem danh sách các thiết bị đang chờ:
docker exec headscale headscale nodes list
Duyệt thiết bị (Sử dụng Node Key từ danh sách trên):
docker exec headscale headscale nodes register --user admin-team --key nodekey:abc123xyz...
(Thay nodekey:... bằng key thực tế hiển thị trên màn hình).
Ngay lập tức, thiết bị Client sẽ chuyển sang trạng thái “Connected”.
Khai thác tính năng nâng cao: Exit node và Subnet routing
Đây là hai tính năng mạnh mẽ nhất biến Headscale thành một giải pháp mạng doanh nghiệp thực thụ.
Exit Node (VPN Gateway)
Tính năng này cho phép bạn định tuyến toàn bộ lưu lượng internet của Client đi qua VPS. Rất hữu ích khi bạn dùng Wifi công cộng không an toàn và muốn ẩn mình sau IP của VPS.
Trên Client (thiết bị muốn làm Exit Node, ví dụ chính VPS):
tailscale up --login-server https://vpn.congtycua.com --advertise-exit-node
Trên Server Headscale (Phê duyệt):
Lấy ID của route (thường là 0.0.0.0/0 và ::/0):
docker exec headscale headscale routes list
Kích hoạt route:
docker exec headscale headscale routes enable -r <ID_ROUTE>
Subnet Routing (Truy cập mạng LAN)
Giả sử bạn có một máy chủ nội bộ hoặc máy in (IP: 192.168.1.100) tại văn phòng. Bạn muốn truy cập nó từ nhà thông qua VPN.
Trên máy tính tại văn phòng (đã cài Tailscale):
Quảng bá dải mạng LAN lên Headscale:
tailscale up --login-server https://vpn.congtycua.com --advertise-routes=192.168.1.0/24
Trên Server Headscale:
Kích hoạt route tương tự như Exit Node:
docker exec headscale headscale routes enable -r <ID_ROUTE>
Câu hỏi thường gặp (FAQ)
1. Headscale khác gì Tailscale?
Headscale là phiên bản tự host (Self-hosted) miễn phí của Tailscale. Khác biệt cốt lõi: Tailscale là dịch vụ có sẵn (SaaS) giới hạn thiết bị/user ở gói miễn phí. Headscale cho phép bạn tự cài đặt server riêng, không giới hạn số lượng thiết bị và người dùng, đồng thời bạn nắm toàn quyền kiểm soát dữ liệu.
2. Headscale có an toàn không?
Có. Headscale là phần mềm mã nguồn mở (Open Source), minh bạch về code. Dữ liệu truyền tải giữa các thiết bị được mã hóa đầu cuối (E2EE) bằng giao thức WireGuard siêu bảo mật. Tuy nhiên, độ an toàn của hệ thống phụ thuộc vào việc bạn bảo vệ VPS của mình tốt đến đâu (hãy dùng Firewall và SSH Key).
3. Tôi có thể sử dụng ứng dụng Tailscale chính thức trên điện thoại/máy tính không?
Có. Headscale tương thích hoàn toàn với mọi Client Tailscale chính thức (Windows, macOS, iOS, Android, Linux). Bạn chỉ cần đổi Login Server URL trong cài đặt ứng dụng trỏ về VPS của bạn là xong.
4. Dữ liệu truy cập mạng có đi qua VPS Headscale không?
Không (trong đa số trường hợp). Headscale chỉ làm nhiệm vụ xác thực và cấp khóa. Dữ liệu truyền tải (như copy file) đi trực tiếp giữa các thiết bị (Peer-to-Peer). Dữ liệu chỉ đi qua VPS khi bạn bật tính năng Exit Node (Fake IP) hoặc khi kết nối trực tiếp bị chặn bởi mạng công ty (lúc này sẽ dùng Relay).
5. Tại sao tốc độ kết nối giữa các máy bị chậm?
Khả năng cao là kết nối trực tiếp (P2P) bị chặn và đang phải đi vòng qua Relay. Giải pháp: Hãy mở port UDP 41641 trên Firewall của VPS để đảm bảo đường hầm WireGuard được thông suốt.
6. Headscale có giao diện quản lý trên Web (Web UI) không?
Mặc định là Không. Headscale dùng dòng lệnh (CLI) để tối ưu hiệu năng. Nếu muốn giao diện web trực quan, bạn có thể cài thêm dự án cộng đồng Headscale-UI (chạy song song qua Docker).
7. Tôi có cần cấu hình lại Client khi IP của VPS thay đổi không?
Có. Nếu IP VPS đổi, tên miền VPN sẽ ngừng hoạt động. Hãy luôn sử dụng Cloud VPS có IP tĩnh để đảm bảo hệ thống vận hành ổn định, không lo mất kết nối.
Kết luận
Với các bước hướng dẫn trên, bạn đã hoàn tất việc cài đặt Headscale trên VPS một cách chuẩn chỉnh và bảo mật nhất. Bạn hiện đang sở hữu một hệ thống VPN Mesh riêng tư với các ưu điểm vượt trội:
- Bảo mật: API được bảo vệ sau lớp Nginx SSL và chỉ lắng nghe nội bộ.
- Ổn định: Cấu hình WebSockets và Timeout giúp duy trì kết nối bền bỉ.
- Tốc độ cao: Các port P2P được tối ưu hóa để dữ liệu truyền đi nhanh nhất.
Đây là nền tảng vững chắc để bạn mở rộng mạng lưới kết nối cho doanh nghiệp hoặc các dự án cá nhân mà không phụ thuộc vào bất kỳ bên thứ ba nào.







