Triển khai Custom DERP Relay Server cho Tailscale trên Linux: Giảm độ trễ và vượt Symmetric NAT

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

So sánh các giải pháp Relay trong Mesh VPN

Tailscale dựa vào WireGuard để liên kết các máy tính giữa các mạng khác nhau. Trong điều kiện lý tưởng, kỹ thuật UDP hole punching sẽ kết nối trực tiếp hai endpoint bất kỳ. Tuy nhiên, các nhà mạng di động nghiêm ngặt (CGNAT), tường lửa doanh nghiệp và Wi-Fi khách sạn thường áp dụng Symmetric NAT. Trong những môi trường đó, các cổng public được ánh xạ sẽ thay đổi liên tục và khó đoán cho mỗi đích đến. Khi quá trình bắt tay peer-to-peer trực tiếp thất bại, lưu lượng buộc phải chuyển tiếp qua các relay server trung gian: Designated Encrypted Relay for Packets (DERP) của Tailscale.

Các đội ngũ kỹ thuật gặp phải nút thắt cổ chai về NAT traversal thường cân nhắc ba lựa chọn:

  • Các DERP Node công cộng mặc định: Tailscale duy trì hàng chục relay dùng chung trên toàn cầu và chúng hoạt động ngay mà không cần cấu hình thêm. Tuy nhiên, các bước nhảy (hop) đến những khu vực xa xôi thường cộng thêm từ 150ms đến 250ms ping, và thông lượng (throughput) thường bị giới hạn dưới 15–20 Mbps trong các khung giờ cao điểm.
  • Static Port Forwarding và UPnP: Việc mở các dải UDP cố định (như 41641/udp) trên router biên đảm bảo bắt tay trực tiếp thành công. Dẫu vậy, bạn không thể áp dụng giải pháp này trên mạng di động, cloud VPC hoặc mạng khách của doanh nghiệp nơi các upstream router bị khóa chặt.
  • Dựng riêng một Custom DERP Node: Khởi tạo một máy ảo cloud giá rẻ đặt gần người dùng để chạy daemon mã nguồn mở derper của Tailscale. Khóa WireGuard vẫn mã hóa toàn bộ dữ liệu payload đầu-cuối (end-to-end). Bạn sẽ có được thông lượng ổn định, băng thông riêng biệt và độ trễ cục bộ chỉ ở mức một chữ số.

Đánh đổi: Khi nào nên tự host Relay Server?

Một relay riêng sẽ cải thiện độ ổn định kết nối tức thì. Dù vậy, việc tự vận hành node cũng chuyển một phần gánh nặng hạ tầng sang cho đội ngũ của bạn.

Những lợi thế chính

  • Giảm độ trễ đáng kể: Nếu văn phòng của bạn ở Singapore nhưng lưu lượng lại đi qua relay công cộng tại Tokyo, độ trễ sẽ dao động khoảng 80–120ms. Đặt một DERP node cục bộ tại datacenter ở Singapore sẽ hạ ping khứ hồi xuống chỉ còn 4–12ms.
  • Thông lượng không bị bóp băng thông: Bạn tránh được tình trạng bị nghẽn do “hàng xóm ồn ào” (noisy-neighbor) trên hạ tầng dùng chung. Các tác vụ rsync lớn, đồng bộ database replica và truyền dữ liệu dung lượng lớn có thể khai thác tối đa cổng uplink 1 Gbps của máy chủ.
  • Dễ dàng chẩn đoán và theo dõi: Bạn hoàn toàn kiểm soát log của host. Khi kết nối bị gián đoạn, bạn có thể chạy tcpdump trên interface thay vì phải đoán xem điều gì đang xảy ra bên trong relay của bên thứ ba.
  • Bảo mật Zero-Trust theo thiết kế: Các instance DERP chỉ xử lý các frame WireGuard được đóng gói trong HTTPS. Vì relay không bao giờ nắm giữ private cryptographic key nên nó không thể giải mã luồng dữ liệu của bạn.

Chi phí vận hành và những đánh đổi

  • Chi phí hạ tầng: Một cloud VM riêng biệt có địa chỉ IPv4 tĩnh thường làm tăng thêm khoảng $4 đến $6 mỗi tháng vào hóa đơn máy chủ của bạn.
  • Công sức bảo trì: Bạn phải vá lỗi hệ điều hành, theo dõi các bản cập nhật mới từ upstream của derper và giám sát việc gia hạn chứng chỉ TLS.
  • Rủi ro trở thành Open Relay: Để instance mở công khai mà không có cơ chế kiểm tra client nghiêm ngặt sẽ dễ bị lạm dụng. Các bên thứ ba chưa được xác thực sẽ quét cổng 443 và biến node của bạn thành proxy miễn phí.

Yêu cầu về phần cứng và mạng

Một cấu hình máy chủ khiêm tốn cũng có thể xử lý các workload production tốt một cách đáng ngạc nhiên. Trong các thử nghiệm benchmark của chúng tôi, một node 1-core cơ bản có thể dễ dàng quản lý hàng chục tunnel đồng thời mà không hề quá tải.

Hãy chọn một máy ảo Ubuntu 22.04 hoặc Debian 12 tối giản với tối thiểu 1 vCPU và 1 GB RAM. Instance này yêu cầu:

  • Một địa chỉ IPv4 tĩnh, có thể định tuyến công khai (và IPv6 gốc nếu có).
  • Bản ghi A/AAAA trỏ FQDN về host của bạn (ví dụ: derp.example.com).
  • Cổng 80/TCP có thể truy cập được cho Let’s Encrypt HTTP-01 challenge.
  • Cổng 443/TCP mở để phục vụ lưu lượng relay DERP qua HTTPS.
  • Cổng 3478/UDP mở cho việc khám phá địa chỉ qua STUN.
  • Daemon Tailscale cục bộ đang chạy trên máy chủ để derper có thể xác thực danh tính peer thông qua cờ --verify-clients.

Hướng dẫn triển khai từng bước trên Linux

1. Chuẩn bị hệ thống và cấu hình DNS

Trỏ bản ghi DNS về IP máy chủ và kiểm tra quá trình lan truyền bằng lệnh dig +short derp.example.com. Tiếp theo, đăng nhập và cài đặt các công cụ build cơ bản:

sudo apt update && sudo apt install -y curl git ufw build-essential

2. Cài đặt Go và build Relay Daemon

Tailscale cung cấp derper như một phần trong kho Go module chính thức của mình. Hãy tải phiên bản Go mới, giải nén vào /usr/local và biên dịch file nhị phân:

# Tải xuống và giải nén Go
wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# Biên dịch binary derper
go install tailscale.com/cmd/derper@latest
sudo cp ~/go/bin/derper /usr/local/bin/derper
sudo chmod +x /usr/local/bin/derper

3. Xác thực Relay Host trên Tailnet của bạn

Tuyệt đối không chạy DERP relay như một open proxy. Khi bạn khởi chạy derper cùng với tiến trình tailscaled cục bộ, nó sẽ truy vấn socket của Tailscale trên máy. Nó sẽ tự động hủy mọi yêu cầu relay không xuất phát từ một thiết bị đã được xác thực trong tailnet của bạn.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

4. Tạo Systemd Service Unit

Tạo một thư mục lưu trữ riêng cho chứng chỉ Let’s Encrypt và chạy derper như một systemd service dưới nền:

sudo mkdir -p /var/lib/derper

Ghi file định nghĩa service vào /etc/systemd/system/derper.service. Thay thế derp.example.com bằng hostname thực tế của bạn:

sudo tee /etc/systemd/system/derper.service > /dev/null <<EOF
[Unit]
Description=Máy chủ Tailscale Custom DERP
After=network.target tailscaled.service
Wants=tailscaled.service

[Service]
Type=simple
User=root
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/derper \
  -hostname derp.example.com \
  -certmode letsencrypt \
  -certdir /var/lib/derper \
  -a :443 \
  -stun-port 3478 \
  -verify-clients

[Install]
WantedBy=multi-user.target
EOF

Khởi động daemon và kiểm tra log đầu ra để xác nhận việc cấp phát chứng chỉ TLS đã thành công:

sudo systemctl daemon-reload
sudo systemctl enable --now derper
sudo journalctl -u derper -f

5. Cấu hình quy tắc tường lửa UFW

Cho phép các cổng HTTP, HTTPS và STUN cần thiết trước khi bật tường lửa của host:

sudo ufw allow 22/tcp comment "Quản trị SSH"
sudo ufw allow 80/tcp comment "Xác thực Let's Encrypt"
sudo ufw allow 443/tcp comment "Lưu lượng relay DERP HTTPS"
sudo ufw allow 3478/udp comment "Cổng STUN Tailscale"
sudo ufw enable

6. Đăng ký Relay trong Tailscale ACL Policy

Mở Tailscale Admin Console và chọn Access Controls. Thêm node của bạn vào trong thuộc tính cấp cao nhất derpMap. Hãy chọn một ID từ 900 đến 999 để vùng tùy chỉnh của bạn tránh bị trùng lặp với số hiệu relay chính thức của Tailscale:

"derpMap": {
  "Regions": {
    "901": {
      "RegionID": 901,
      "RegionCode": "custom-sg",
      "RegionName": "DERP riêng Singapore",
      "Nodes": [
        {
          "Name": "901a",
          "RegionID": 901,
          "HostName": "derp.example.com",
          "DERPPort": 443,
          "STUNPort": 3478
        }
      ]
    }
  }
}

7. Kiểm tra định tuyến Relay và đo độ trễ

Chuyển sang một client từ xa bất kỳ trong tailnet của bạn và chạy công cụ chẩn đoán mạng:

tailscale netcheck

Báo cáo trên console sẽ liệt kê các region khả dụng kèm theo ping khứ hồi của chúng. Hãy tìm mục custom-sg của bạn và xác nhận rằng UDP STUN không bị mất gói (packet loss). Để xem relay chuyển tiếp các gói tin theo thời gian thực, hãy ping đến một node đích đang bị chặn sau Symmetric NAT:

tailscale ping --verbose 100.115.82.44

Nếu tường lửa biên chặn kỹ thuật đục lỗ NAT (NAT hole-punching) trực tiếp, bản ghi vết (trace) của lệnh ping sẽ xác nhận ngay lưu lượng được chuyển qua derp-901a. Thay vì phải chịu độ trễ khứ hồi 180ms qua hạ tầng công cộng dùng chung, lưu lượng của bạn giờ đây được định tuyến mượt mà qua instance riêng chỉ với 8ms đến 12ms.

Share: