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:
- dùng
t3.microlàm coordination server nhỏ choHeadscale - dùng
Tailscaleclient trên từng PC để join vào cùng mạng riêng - coi toàn bộ các máy đó như một “cluster” private để SSH, chạy app, monitor hoặc self-host
- 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:
Tailscalelà client trên máy người dùngHeadscalelà 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à:
- tạo 1 EC2
t3.micro - cài Ubuntu trên EC2
- cài
Headscaletrên EC2 - cài
Tailscaletrên từng PC client - join các PC đó vào Headscale bằng
--login-server - nếu cần web proxy, cài thêm
Nginxtrê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/tcp443/tcp
Nếu chạy Headscale sau reverse proxy thì thường:
Nginxnhận80/443Headscalechạ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/udpcho 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_urllà domain public của Headscalelisten_addrcho port nội bộ- tắt TLS trong Headscale nếu để
Nginxterminate 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.1UpgradeConnectionproxy_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à:
- tạo EC2
t3.micro - gắn Elastic IP hoặc domain public ổn định
- cài Headscale
- tạo domain như
headscale.example.com - đặt Nginx phía trước
- tạo user và preauth key
- cài Tailscale client trên từng PC
- join node bằng
--login-server - kiểm tra các máy ping / SSH / gọi nhau được
- 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
Tailscaleriê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.