Vấn đề thực tế: Khi VPN trở thành một “hộp đen”
Khoảng một năm trước, mình quản lý cụm WireGuard VPN cho team dev 30 người làm remote. Mọi thứ ban đầu chạy rất mượt vì WireGuard vốn nhẹ và nhanh. Tuy nhiên, rắc rối bắt đầu khi anh em than phiền mạng lag, ping nhảy lên 500ms hoặc thỉnh thoảng mất kết nối hoàn toàn.
Lúc đó, mình chỉ biết SSH vào server rồi gõ wg show liên tục. Nhìn mớ thông số nhảy loạn xạ trên màn hình đen ngòm, mình thực sự bế tắc vì không biết:
- Tổng traffic đang là bao nhiêu? Card mạng 1Gbps có đang bị nghẽn không?
- User nào đang “kéo” torrent hoặc sync data nặng làm ảnh hưởng người khác?
- Lần cuối user đó active là khi nào? Hay họ đã nghỉ việc mà mình quên thu hồi key?
- Lịch sử sử dụng 24h qua có biến động gì bất thường không?
Việc thiếu số liệu khiến mình mất cả buổi sáng chỉ để tìm nguyên nhân mỗi khi có sự cố. Mình nhận ra mình đang quản lý hệ thống theo kiểu “đoán mò”.
Tại sao chỉ dùng lệnh wg show là chưa đủ?
WireGuard được thiết kế theo triết lý tối giản nên công cụ đi kèm cũng rất cơ bản. Lệnh wg chỉ hiển thị dữ liệu tức thời (snapshot) và bộc lộ rõ 3 điểm yếu:
- Mất dấu vết lịch sử: Bạn không thể biết lúc 3 giờ sáng băng thông cao điểm là bao nhiêu để scale tài nguyên.
- Khó quản lý tập trung: Nếu có 3-5 server VPN, việc SSH vào từng cái để check là một cực hình đúng nghĩa.
- Thiếu cơ chế cảnh báo: Không có cách nào để Telegram tự nổ thông báo khi một peer dùng quá 50GB data/ngày.
Để chuyên nghiệp hóa, chúng ta cần đưa các con số này vào một cơ sở dữ liệu chuỗi thời gian (Time-series database) như Prometheus để dễ dàng theo dõi và vẽ biểu đồ.
Cân nhắc các giải pháp giám sát
Dưới đây là 3 hướng đi phổ biến mà mình từng cân nhắc:
- Cách 1: Script tự chế. Viết Python parse output từ
wg show dumprồi đẩy về log. Cách này nhanh nhưng dễ lỗi khi format output thay đổi và rất khó bảo trì. - Cách 2: Netdata. Dashboard cực đẹp, hiển thị real-time từng giây. Tuy nhiên, Netdata tốn RAM và việc gom dữ liệu từ nhiều server về một nơi khá rắc rối.
- Cách 3: WireGuard Exporter + Prometheus. Đây là chuẩn công nghiệp (Cloud-native). Nó tách biệt việc thu thập, lưu trữ và hiển thị, cực kỳ ổn định cho hệ thống lớn.
Triển khai WireGuard Exporter + Prometheus
Mình chọn bộ combo Exporter – Prometheus – Grafana vì tính module hóa cao. Dưới đây là các bước biến server VPN của bạn thành một hệ thống có khả năng “thấu thị”.
Bước 1: Cài đặt WireGuard Exporter
WireGuard Exporter đóng vai trò như một thông dịch viên. Nó đọc dữ liệu từ WireGuard và chuyển sang định dạng Prometheus có thể hiểu được. Dùng Docker là cách nhàn nhất.
Hãy tạo file docker-compose.yml:
version: '3'
services:
wireguard-exporter:
image: mindflavor/prometheus-wireguard-exporter
container_name: wireguard-exporter
privileged: true # Bắt buộc để đọc thông tin interface mạng
network_mode: "host"
restart: always
volumes:
- /etc/wireguard:/etc/wireguard:ro
Mẹo nhỏ: Việc mount /etc/wireguard giúp exporter tự động khớp Public Key với tên user (alias). Dashboard của bạn sẽ hiện tên người dùng thay vì một dãy ký tự vô nghĩa.
Khởi động exporter bằng lệnh: docker-compose up -d. Bạn có thể kiểm tra tại http://IP-SERVER:9586/metrics. Nếu thấy các dòng wireguard_sent_bytes_total hiện ra là ổn.
Bước 2: Cấu hình Prometheus
Tại server giám sát, bạn cần khai báo để Prometheus định kỳ sang server VPN lấy dữ liệu. Thêm job sau vào file prometheus.yml:
scrape_configs:
- job_name: 'wireguard-vps'
static_configs:
- targets: ['<IP_SERVER_VPN>:9586']
scrape_interval: 15s
Tần suất 15 giây là đủ để theo dõi traffic mà không gây tải cho CPU server.
Bước 3: Hiển thị Dashboard trên Grafana
Đừng tốn thời gian tự vẽ dashboard. Cộng đồng đã làm sẵn những mẫu rất xịn. Mình khuyên dùng template ID 11280.
- Vào Grafana, chọn Import.
- Nhập ID
11280vào ô tìm kiếm. - Chọn Data Source là Prometheus vừa cấu hình.
Lúc này, mọi thứ sẽ hiện lên trực quan: Tổng dung lượng In/Out, danh sách user đang online và dung lượng tiêu thụ của từng người.
Bước 4: Thiết lập cảnh báo tự động
Thay vì ngồi dán mắt vào màn hình, hãy để Prometheus làm việc đó. Mình thường đặt cảnh báo nếu traffic vượt ngưỡng 80Mbps liên tục trong 5 phút. Đây là dấu hiệu của việc lạm dụng hoặc server bị tấn công.
Rule mẫu cho Prometheus:
groups:
- name: wireguard_alerts
rules:
- alert: HighVPNTraffic
expr: sum(rate(wireguard_sent_bytes_total[5m])) > 10000000 # ~80Mbps
for: 2m
labels:
severity: warning
annotations:
summary: "Băng thông VPN tăng đột biến trên {{ $labels.instance }}"
Thành quả đạt được
Từ khi áp dụng hệ thống này, công việc vận hành nhàn hơn rất nhiều. Mỗi khi có phản hồi chậm, mình chỉ cần liếc qua Dashboard. Nếu CPU thấp nhưng traffic cao, mình biết ngay có ông đang kéo file nặng. Nếu latest_handshake của một peer quá lâu, mình biết ngay client đó đang lỗi config.
Giám sát không chỉ để sửa lỗi. Nó cung cấp số liệu thực tế để bạn tự tin đề xuất nâng cấp server khi user tăng trưởng. Chúc anh em triển khai thành công!

