Tự Host ZeroTier Network Controller với ZTNET trên Linux: Xây dựng Mạng SD-WAN P2P Riêng

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

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:

  1. Nhấp vào Create Network.
  2. 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.
  3. 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 đến 10.147.17.250.
  4. 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.

Share: