Bối cảnh & Lý do
Khi cần kết nối các máy chủ bare-metal, hệ thống home lab và các edge node nằm rải rác trên nhiều nhà cung cấp cloud khác nhau, các kỹ sư thường nghĩ ngay đến WireGuard hoặc OpenVPN. WireGuard mang lại tốc độ cực kỳ ấn tượng.
Tuy nhiên, việc duy trì các key và handshake point-to-point của WireGuard trên 40 hoặc 50 endpoint động sẽ nhanh chóng trở thành một cơn ác mộng trong quản trị. ZeroTier giải quyết triệt để vấn đề này bằng cách hoạt động như một switch ảo phân tán. Dẫu vậy, gói dịch vụ ZeroTier Central có sẵn trên đám mây lại giới hạn ở mức 25 node miễn phí, đồng thời định tuyến metadata điều phối mạng qua hạ tầng của bên thứ ba.
Tự host controller riêng giúp bạn loại bỏ cả hai rào cản trên. Bạn nắm toàn quyền kiểm soát root key của mạng, vượt qua giới hạn thành viên tùy ý và hoàn toàn không để lộ telemetry. Về bản chất, ZeroTier hoạt động ở Layer 2. Các node giao tiếp với nhau như thể chúng được cắm trực tiếp vào cùng một switch trên tủ rack. Ngay khi controller môi giới xong handshake ban đầu, các thiết bị sẽ bỏ qua controller hoàn toàn và truyền lưu lượng mã hóa trực tiếp peer-to-peer thông qua kỹ thuật UDP hole punching.
Các phiên bản ZeroTier controller nguyên bản chỉ cung cấp CLI binary và JSON API cấp thấp. Việc phê duyệt các endpoint mới hoặc ánh xạ route thủ công sẽ rất nhanh gây mệt mỏi. ZTNET xuất hiện để giải quyết bài toán đó. Nó bọc ZeroTier controller trong một stack Node.js và SQLite gọn nhẹ, chỉ tốn chưa đầy 60 MB RAM trên một VPS giá rẻ $4/tháng. Bạn sẽ có một dashboard trên trình duyệt trực quan, sạch sẽ để phê duyệt thành viên, cấp phát dải CIDR và giám sát các tunnel đang hoạt động.
Mô hình này phát huy tối đa sức mạnh khi bạn cần liên kết các cụm Kubernetes multi-cloud, các bastion IPMI out-of-band, hoặc môi trường phát triển hybrid nằm sau các lớp Carrier-Grade NAT.
Cài đặt
Triển khai ZTNET thông qua Docker Compose giúp quá trình cài đặt mang tính mô-đun cao và cô lập các dependency khỏi bản phân phối Linux gốc của bạn.
Bước 1: Cài đặt Docker và các gói phụ thuộc
Cập nhật index của kho lưu trữ cục bộ và cài đặt Docker engine cùng plugin Compose trên Debian hoặc Ubuntu:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ca-certificates gnupg lsb-release
# Cấu hình repository chính thức của Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
Bước 2: Chuẩn bị cấu trúc thư mục và file Compose
Tạo các thư mục riêng biệt trên máy host để lưu trữ identity key của controller và duy trì database SQLite:
mkdir -p ~/ztnet/zt-data ~/ztnet/ztnet-data && cd ~/ztnet
Tạo manifest Compose của bạn:
nano docker-compose.yml
Thêm cấu hình service sau đây. Hãy đặc biệt chú ý đến khối cap_add, nơi cấp quyền cho container để khởi tạo các giao diện mạng ảo tun:
services:
ztnet:
image: ztnet/ztnet:latest
container_name: ztnet-controller
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_ADMIN
devices:
- /dev/net/tun
ports:
- "3000:3000" # Giao diện Web GUI của ZTNET
- "9993:9993/udp" # Lưu lượng điều khiển ZeroTier Controller
environment:
- PORT=3000
- ZT_ADDR=127.0.0.1:9993
volumes:
- ./zt-data:/var/lib/zerotier-one
- ./ztnet-data:/app/backend/data
Bước 3: Khởi chạy Stack
Khởi chạy container chạy ngầm:
docker compose up -d
Kiểm tra output khởi động để đảm bảo daemon ZeroTier đã khởi tạo cặp public/private key thành công:
docker compose ps
docker compose logs -f
Cấu hình
Bước 1: Thiết lập thông tin quản trị viên
Mở trình duyệt và truy cập vào http://<IP_MAY_CHU_CUA_BAN>:3000. Trong lần khởi động đầu tiên, ZTNET sẽ hiển thị trình hướng dẫn cài đặt yêu cầu tạo thông tin đăng nhập quản trị viên chính. Hãy chọn một mật khẩu mạnh, sau đó đăng nhập vào dashboard.
Bước 2: Tạo mạng ảo đầu tiên của bạn
Định nghĩa một overlay mesh trực tiếp từ giao diện web:
- Nhấp vào Create Network.
- ZTNET sẽ tạo một Network ID gồm 16 ký tự thập lục phân (ví dụ:
8e02d60bc4a19f02). Hãy sao chép chuỗi này để cấu hình cho client. - Chọn một subnet IPv4 private (ví dụ:
10.147.17.0/24) và xác định dải cấp phát tự động từ10.147.17.10đến10.147.17.250. - Giữ nguyên quy tắc truy cập mạng là Private. Điều này giúp ngăn chặn các node trái phép gửi packet vào overlay của bạn.
Bước 3: Thêm các node client vào mạng tự host
SSH vào một máy client Linux từ xa (chẳng hạn như một worker backup offsite hoặc máy trạm ở nhà) và cài đặt client agent chính thức:
curl -s https://install.zerotier.com | sudo bash
Chỉ định daemon cục bộ gửi yêu cầu tham gia vào controller của bạn:
sudo zerotier-one -q join 8e02d60bc4a19f02
Terminal sẽ in ra 200 join OK. Client hiện đã được đăng ký, nhưng nó chưa thể truyền lưu lượng mạng cho đến khi được controller của bạn phê duyệt.
Bước 4: Ủy quyền cho node trong ZTNET
Làm mới dashboard ZTNET và nhấp vào chi tiết mạng của bạn. Bảng Members sẽ hiển thị một client chưa được phê duyệt với Node ID gồm 10 ký tự.
- Bật nút gạt Authorized.
- Đặt một hostname gợi nhớ (ví dụ:
db-replica-frankfurt). - ZTNET sẽ tự động cấp một địa chỉ IP từ pool bạn đã chọn (ví dụ:
10.147.17.10). Bạn cũng có thể gán một IP tĩnh cố định nếu node này chạy các dịch vụ công khai.
Xác minh & Giám sát
Kiểm tra interface và routing table trên Client
Quay trở lại terminal của client từ xa. Xác nhận rằng kernel đã khởi tạo một virtual tap interface mới (thường có tên là zt*) và đã nhận IP được cấp:
ip addr show dev $(ip -br link | awk '$1 ~ /^zt/ {print $1}')
Kiểm tra bảng định tuyến của kernel để đảm bảo lưu lượng hướng tới 10.147.17.0/24 được định tuyến qua interface ZeroTier:
ip route | grep zt
Kiểm tra kết nối Peer-to-Peer
Thêm một máy từ xa thứ hai, phê duyệt nó trong ZTNET, và lưu ý IP nội bộ của nó (ví dụ: 10.147.17.11). Gửi một lệnh ping ICMP từ máy thứ nhất:
ping -c 4 10.147.17.11
Kết quả sẽ cho thấy độ trễ round-trip bình thường. Các kết nối peer trực tiếp giữa các khu vực gần nhau thường chỉ chênh lệch khoảng 1-3 ms so với tốc độ ping bare-metal gốc.
Kiểm tra trạng thái kết nối peer và Topology
Truy vấn runtime engine của ZeroTier để kiểm tra xem các node đang kết nối trực tiếp với nhau hay phải mượn đường qua root server chuyển tiếp (relay):
sudo zerotier-one -q peers
Output sẽ báo cáo từng peer kèm theo số liệu độ trễ, loại liên kết và đường truyền đang hoạt động:
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
8e02d60bc4 1.14.0 LEAF 14 DIRECT 4 4 198.51.100.42/9993
3a88b201f9 1.14.0 LEAF 38 DIRECT 2 2 203.0.113.15/41882
Trạng thái link là DIRECT xác nhận rằng các packet đã bỏ qua các relay bên ngoài và di chuyển trực tiếp point-to-point qua các tunnel UDP được mã hóa. Nếu bạn thấy trạng thái RELAYED, hãy kiểm tra xem firewall cục bộ hoặc NAT gateway có đang chặn lưu lượng UDP outbound trên cổng 9993 hay không.
Duy trì backup cho Controller
Identity của network controller nằm bên trong thư mục ~/ztnet/zt-data. Nếu mất các file identity này, Network ID của bạn sẽ biến mất vĩnh viễn, buộc bạn phải tham gia lại thủ công trên từng endpoint một. Hãy sao lưu thư mục này thường xuyên:
sudo tar -czvf ztnet-backup-$(date +%F).tar.gz -C ~/ztnet zt-data ztnet-data
Đẩy file nén thu được lên S3 hoặc kho lưu trữ mã hóa offsite. Khi có sẵn bản sao lưu này, việc khôi phục toàn bộ mạng SD-WAN nhiều node của bạn chỉ mất chưa đầy năm phút trên một host mới.

