AWS
HEAD
TAIL
T3 Headscale
cluster • mesh • nginx

Dùng EC2 t3.micro, Headscale và Tailscale cho homelab

Dùng EC2 t3.micro làm host Headscale, nối nhiều PC bằng Tailscale và thêm Nginx để reverse proxy hoặc public app khi cần.

11 phút đọc16/06/2026

Nếu bạn có nhiều PC ở nhiều nơi khác nhau và muốn gom chúng thành một mạng riêng để:

  • SSH qua lại
  • truy cập app nội bộ
  • chia sẻ service
  • dựng homelab phân tán

thì một hướng rất thực dụng là dùng:

  • một máy AWS EC2 t3.micro
  • cài Headscale
  • cho các máy client dùng Tailscale

Sau đó nếu muốn public thêm một số web app, bạn có thể đặt Nginx ở phía trước để reverse proxy theo domain riêng.

Kết luận nhanh

Nếu bạn muốn một công thức gọn:

  1. dùng t3.micro làm coordination server nhỏ cho Headscale
  2. dùng Tailscale client trên từng PC để join vào cùng mạng riêng
  3. coi toàn bộ các máy đó như một “cluster” private để SSH, chạy app, monitor hoặc self-host
  4. nếu cần public web UI hay một vài app, thêm Nginx để reverse proxy

Bài toán bài này giải quyết

Bạn có thể đang có:

  • 1 PC ở nhà
  • 1 mini PC ở văn phòng
  • 1 máy test
  • 1 laptop dev
  • 1 VPS nhỏ hoặc EC2

Những máy này không cùng LAN, thậm chí nhiều máy ở sau NAT hoặc CGNAT, nhưng bạn vẫn muốn chúng nhìn thấy nhau như một mạng riêng thống nhất.

Đây là chỗ Headscale + Tailscale rất đáng dùng.

Vì sao chọn AWS t3.micro?

Theo AWS, T3 là dòng burstable general purpose, hợp với workload mức vừa và có lúc spike ngắn.

Nguồn:

Với vai trò:

  • coordination server
  • control plane nhỏ
  • reverse proxy nhẹ
  • DNS / ACL / management cơ bản

thì t3.micro thường là điểm bắt đầu hợp lý nếu số lượng node chưa quá lớn và traffic relay không quá nặng.

Nói ngắn gọn:

  • rẻ
  • dễ triển khai
  • đủ để bắt đầu

Nhưng cũng cần hiểu:

  • đây không phải cấu hình để relay traffic rất nặng
  • nếu bật nhiều thứ cùng lúc hoặc dùng embedded DERP nhiều, bạn phải theo dõi tài nguyên

Headscale là gì?

Headscale là coordination server tự host, tương thích với Tailscale clients.

Theo tài liệu chính thức của Headscale, node phải đăng ký với Headscale để dùng nó như coordination server thay cho control plane mặc định.

Nguồn:

Hiểu thực dụng:

  • Tailscale là client trên máy người dùng
  • Headscale là máy chủ bạn tự host để quản lý mạng đó

Điểm này rất hợp nếu bạn muốn:

  • tự giữ control plane
  • gom các máy của mình vào cùng mạng riêng
  • quản lý user, node, preauth key, route theo ý mình

“Cluster” trong bài này nên hiểu như thế nào?

Ở đây mình dùng chữ “cluster” theo nghĩa thực tế của homelab:

  • nhiều máy cùng nằm trong một private mesh network
  • có thể gọi nhau qua IP / DNS nội bộ
  • có thể chia vai trò app, storage, monitor, backup

Nó không có nghĩa bạn bắt buộc phải dựng Kubernetes ngay.

Bạn có thể bắt đầu rất đơn giản:

  • một máy chạy app
  • một máy chạy database
  • một máy lưu file
  • một máy làm gateway / proxy

Kiến trúc đơn giản

Flow dễ hiểu nhất là:

  1. tạo 1 EC2 t3.micro
  2. cài Ubuntu trên EC2
  3. cài Headscale trên EC2
  4. cài Tailscale trên từng PC client
  5. join các PC đó vào Headscale bằng --login-server
  6. nếu cần web proxy, cài thêm Nginx trên EC2 hoặc trên một node riêng

Kết quả là bạn có:

  • một control node trên AWS
  • nhiều node PC ở nhiều nơi
  • một private network xuyên NAT

Những cổng quan trọng cần nhớ

Với mô hình này, tối thiểu bạn nên lưu ý:

  • 80/tcp
  • 443/tcp

Nếu chạy Headscale sau reverse proxy thì thường:

  • Nginx nhận 80/443
  • Headscale chạy phía sau ở port nội bộ, ví dụ 8080

Theo docs reverse proxy chính thức của Headscale:

  • reverse proxy phải hỗ trợ WebSockets

Nguồn:

Nếu bật embedded DERP của Headscale, docs cũng ghi cần thêm:

  • 3478/udp cho STUN

Nguồn:

Cài Headscale trên EC2

Theo docs chính thức, cách nên dùng trên Ubuntu/Debian là package .deb chính thức.

Nguồn:

Nếu bạn thích cách gọn và dễ control hơn cho homelab, bạn cũng có thể chạy bằng container.

Docs container:

Trong bài toán t3.micro, cả 2 hướng đều dùng được.
Nếu bạn đã quen Docker, container thường dễ backup và di chuyển hơn.

Một cấu hình Headscale tối giản nên có gì?

Ít nhất bạn cần:

  • server_url là domain public của Headscale
  • listen_addr cho port nội bộ
  • tắt TLS trong Headscale nếu để Nginx terminate TLS phía trước

Docs reverse proxy của Headscale đưa ví dụ kiểu:

server_url: https://headscale.example.com
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
tls_cert_path: ""
tls_key_path: ""

Ý tưởng là:

  • Headscale chỉ nghe local/internal port
  • Nginx đứng trước làm HTTPS public

Cài Nginx để reverse proxy Headscale

Đây là bước rất đáng làm nếu bạn muốn:

  • dùng domain đẹp
  • gom nhiều app dưới cùng EC2
  • chủ động public thêm service khác

Theo docs reverse proxy của Headscale, Nginx cần bật:

  • proxy_http_version 1.1
  • Upgrade
  • Connection
  • proxy_buffering off

vì Headscale cần WebSockets để Tailscale clients giao tiếp đúng.

Nói ngắn gọn:

  • không cấu hình WebSocket đúng -> client có thể lỗi

Dùng Tailscale client để join vào Headscale

Theo Getting Started chính thức của Headscale, ở client Linux/BSD bạn có thể dùng:

tailscale up --login-server <YOUR_HEADSCALE_URL>

Hoặc nếu muốn join non-interactive bằng preauth key:

tailscale up --login-server <YOUR_HEADSCALE_URL> --authkey <YOUR_AUTH_KEY>

Nguồn:

Phía server, bạn có thể:

  • tạo user
  • tạo preauth key
  • gán node vào user tương ứng

Ví dụ từ docs:

headscale users create <USER>
headscale preauthkeys create --user <USER_ID>

Kéo nhiều PC thành một mạng riêng kiểu cluster

Sau khi nhiều máy join xong, bạn sẽ có một mesh network riêng để:

  • SSH giữa các máy
  • gọi API nội bộ
  • mount service riêng
  • chạy monitoring
  • chia tách vai trò từng máy

Ví dụ:

  • PC số 1: chạy Docker app
  • PC số 2: lưu trữ hoặc backup
  • PC số 3: test service
  • EC2: control plane + reverse proxy

Chỉ với mô hình này thôi, bạn đã có một “cluster” homelab rất đáng giá để học và dùng thật.

Nginx trong mô hình này dùng để làm gì?

Có 2 hướng dùng Nginx rất hợp:

1. Reverse proxy cho chính Headscale

Mục tiêu:

  • public headscale.example.com
  • giữ Headscale ở port nội bộ
  • xử lý TLS ở Nginx

Đây là use case gần như mặc định khi bạn muốn domain đẹp.

2. Proxy public thêm các app web khác

Ví dụ bạn có:

  • Grafana trên một PC trong tailnet
  • app nội bộ trên một máy khác
  • dashboard tự viết

Bạn có thể dùng Nginx để:

  • map theo subdomain
  • route về đúng node hoặc service
  • public chọn lọc thứ nào cần public

Nhưng ở đây cần tách rất rõ:

  • private mesh traffic của Tailscale / Headscale
  • public HTTP traffic qua Nginx

Không nên nhầm hai lớp này là một.

Ưu điểm của mô hình t3.micro + Headscale + Tailscale + Nginx

1. Rất hợp cho homelab phân tán

Bạn không cần mọi máy phải cùng một chỗ.

Chỉ cần:

  • có Internet outbound
  • cài client
  • join vào Headscale

là các máy ở nhiều vị trí khác nhau vẫn thành một mạng chung.

2. Tự host được control plane

Đây là điểm quan trọng nếu bạn muốn tự nắm quyền hơn ở tầng coordination.

3. Không cần mở port trên từng PC

Bạn không phải đi mở port router cho từng máy ở nhà hay văn phòng chỉ để kết nối nội bộ.

4. Dễ mở rộng dần

Bạn có thể bắt đầu từ:

  • 2 máy
  • 3 máy
  • vài app nhỏ

rồi tăng dần.

Nhược điểm và lưu ý

1. t3.micro là điểm bắt đầu, không phải cấu hình “cứ thế scale mãi”

T3 là burstable. Nếu:

  • nhiều node
  • nhiều request control plane
  • bật thêm nhiều service
  • relay nhiều traffic

thì t3.micro có thể nhanh chạm ngưỡng.

2. Reverse proxy cho Headscale cần cấu hình đúng WebSocket

Theo docs chính thức, đây là yêu cầu bắt buộc.

Làm sai phần này rất dễ sinh lỗi kết nối client.

3. Nếu dùng embedded DERP, cần mở thêm UDP

Docs Headscale nêu rõ 3478/udp cho STUN nếu bật embedded DERP.

4. Không nên public bừa mọi app qua Nginx

Mô hình này rất dễ khiến người dùng hứng lên rồi public tất cả dashboard nội bộ.

Nên tách rõ:

  • cái gì chỉ private trong tailnet
  • cái gì thực sự cần public

Khi nào mô hình này rất đáng làm?

Mô hình này đặc biệt đáng làm nếu bạn:

  • có nhiều PC ở nhiều nơi
  • muốn gom chúng lại thành mạng riêng
  • muốn học self-host / homelab thật sự
  • muốn có một điểm điều phối nhỏ trên cloud
  • muốn tuỳ ý public thêm vài app web bằng Nginx

Checklist triển khai nhanh

Nếu muốn đi nhanh, flow nên là:

  1. tạo EC2 t3.micro
  2. gắn Elastic IP hoặc domain public ổn định
  3. cài Headscale
  4. tạo domain như headscale.example.com
  5. đặt Nginx phía trước
  6. tạo user và preauth key
  7. cài Tailscale client trên từng PC
  8. join node bằng --login-server
  9. kiểm tra các máy ping / SSH / gọi nhau được
  10. chỉ public những app web thật sự cần thiết

Kết luận

Một AWS EC2 t3.micro hoàn toàn có thể là điểm bắt đầu rất tốt để làm host cho:

  • Headscale
  • mạng Tailscale riêng giữa nhiều PC
  • một homelab phân tán kiểu cluster
  • và cả Nginx để reverse proxy hoặc public web app khi cần

Đây là một mô hình rất thực dụng vì:

  • chi phí đầu vào thấp
  • dễ học
  • dễ mở rộng dần
  • dùng được cho cả nhu cầu lab và nhu cầu thật ở quy mô nhỏ

Điểm quan trọng nhất là:

  • dùng Headscale để điều phối private mesh
  • dùng Tailscale để kéo node vào mạng
  • dùng Nginx để public có chọn lọc

Làm đúng 3 lớp đó, bạn sẽ có một hệ khá mạnh dù bắt đầu chỉ từ một t3.micro.