Dựng WireGuard VPN trên VPS trong 10 phút
WireGuard là VPN hiện đại, gọn, nhanh và dễ audit hơn nhiều so với OpenVPN hay IPsec. Nhân của nó chỉ vài nghìn dòng code, chạy trực tiếp trong kernel Linux (đã hợp nhất từ 5.6) nên throughput cao và độ trễ thấp. Bài này hướng dẫn dựng một WireGuard server hoàn chỉnh trên VPS: cài đặt, tạo key, cấu hình server và peer, bật IP forwarding cùng NAT, thêm client mới, tạo QR cho mobile và mở firewall cơ bản. Toàn bộ chạy được trong khoảng 10 phút với một VPS Ubuntu 22.04 hoặc 24.04. Một VPS có IPv4 riêng là endpoint lý tưởng để cố định điểm kết nối cho các peer.
Kiểm tra kernel và cài đặt
Trên Linux hiện đại, WireGuard đã nằm sẵn trong kernel, bạn không cần biên dịch module hay cài DKMS. Việc còn lại chỉ là cài gói user-space wireguard-tools để có lệnh wg và wg-quick. Kiểm tra kernel trước cho chắc:
uname -r
# 5.6 trở lên là đã có WireGuard in-kernel
sudo apt update
sudo apt install -y wireguard wireguard-tools
Gói wireguard là metapackage kéo theo wireguard-tools, trong đó có wg, wg-quick và service template [email protected]. Trên Debian, RHEL, Fedora hay Arch cách làm tương tự, chỉ khác trình quản lý gói.
Tạo cặp key cho server
WireGuard xác thực bằng cặp key Curve25519, không dùng username hay chứng chỉ. Mỗi peer (kể cả server) có một private key và một public key. Private key phải được bảo mật tuyệt đối. Tạo key cho server và siết quyền file:
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_private.key # private key của server
cat server_public.key # public key của server
umask 077 đảm bảo mọi file key tạo ra chỉ chủ sở hữu đọc được. Đừng bao giờ commit private key lên git hay gửi qua chat.
Cấu hình interface server (wg0.conf)
Tạo file /etc/wireguard/wg0.conf. Đây là interface tên wg0, dùng dải IP nội bộ riêng cho VPN (ví dụ 10.8.0.0/24) và lắng nghe trên UDP port 51820:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <NOI_DUNG_server_private.key>
# Bật NAT khi interface lên, gỡ khi tắt.
# Thay eth0 bằng interface WAN thật của VPS.
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Xác định interface WAN thật bằng ip route show default, cột dev chính là tên cần thay cho eth0. Nếu bạn chỉ muốn các peer nói chuyện với nhau và với server mà không cần đi ra Internet qua VPS, có thể bỏ hai dòng PostUp/PostDown và phần NAT.
Bật IP forwarding và NAT
Để VPS chuyển tiếp gói tin giữa interface VPN và Internet, phải bật IP forwarding ở tầng kernel. Cấu hình PostUp ở trên đã lo phần NAT (masquerade), nhưng forwarding cần bật riêng và cho tồn tại sau reboot:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wireguard.conf
# Nếu cần route IPv6:
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sysctl net.ipv4.ip_forward # phải trả về = 1
MASQUERADE trong PostUp viết lại địa chỉ nguồn của gói tin từ dải 10.8.0.0/24 thành IP public của VPS, để traffic client đi ra Internet và nhận phản hồi về đúng đường. Không có bước này, client kết nối được tới server nhưng không truy cập được ra ngoài.
Khởi động server và mở firewall
Dùng wg-quick để bật interface, sau đó enable service cho tự chạy khi boot. Service map theo tên interface: wg-quick@wg0 đọc /etc/wireguard/wg0.conf:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
sudo wg show # xem trạng thái interface và peer
sudo systemctl status wg-quick@wg0
Firewall phải cho phép UDP port 51820 đi vào. Với UFW:
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH # đừng tự khóa SSH của mình
sudo ufw enable
sudo ufw status
Nếu VPS còn có firewall ở tầng nhà cung cấp (security group, cloud firewall), nhớ mở cùng port UDP đó ở panel. WireGuard chạy trên UDP, mở nhầm TCP sẽ không có tác dụng.
Thêm client (peer) và tạo QR cho mobile
Mỗi client cũng cần một cặp key. Tạo key cho client rồi khai báo nó vào server. Trên máy server, sinh key client:
cd /etc/wireguard
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
Thêm block [Peer] vào wg0.conf của server. AllowedIPs ở đây là IP nội bộ mà server chấp nhận từ client này (dùng /32 cho một địa chỉ):
[Peer]
# client1
PublicKey = <NOI_DUNG_client1_public.key>
AllowedIPs = 10.8.0.2/32
Nạp lại cấu hình không cần ngắt kết nối các peer khác:
sudo wg syncconf wg0 <(wg-quick strip wg0)
Phía client, tạo file config riêng (ví dụ client1.conf). Endpoint là IP public của VPS kèm port. AllowedIPs = 0.0.0.0/0 nghĩa là route toàn bộ traffic qua VPN (full tunnel); nếu chỉ muốn truy cập dải nội bộ thì đặt 10.8.0.0/24:
[Interface]
PrivateKey = <NOI_DUNG_client1_private.key>
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public.key>
Endpoint = <IP_PUBLIC_VPS>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
PersistentKeepalive = 25 giữ kết nối sống khi client nằm sau NAT, gửi một gói giữ nhịp mỗi 25 giây. Với điện thoại, cách nhanh nhất là render config thành QR để app WireGuard chính thức quét trực tiếp, khỏi copy tay:
sudo apt install -y qrencode
qrencode -t ansiutf8 < client1.conf
Mở app WireGuard trên iOS/Android, chọn thêm tunnel bằng cách quét QR, cấp quyền VPN là kết nối được ngay. Trên desktop thì import thẳng file .conf hoặc chạy wg-quick up client1.
Kiểm tra kết nối và bảo mật cơ bản
Sau khi client bật tunnel, kiểm tra bắt tay và lưu lượng ở cả hai phía:
# Trên server
sudo wg show
# Nhìn dòng "latest handshake" và "transfer" của peer
# Trên client, xác nhận IP ra ngoài đã là IP của VPS
curl ifconfig.me
Nếu latest handshake cập nhật và curl ifconfig.me trả về IP của VPS, tunnel đã hoạt động. Vài lưu ý bảo mật nên áp dụng ngay:
- Khóa quyền file key: giữ
umask 077, mọi file trong/etc/wireguardnên là600. Private key rò rỉ đồng nghĩa peer bị giả mạo. - Mỗi client một cặp key riêng: không dùng chung config. Khi cần thu hồi một client, chỉ việc xóa block
[Peer]tương ứng và chạy lạiwg syncconf. - Giới hạn AllowedIPs ở server: chỉ cấp đúng
/32cho từng peer để tránh một client mạo IP của client khác. - Chỉ mở đúng port cần: ngoài
51820/udpvà SSH, đóng hết. WireGuard mặc định im lặng trước gói không hợp lệ nên khó bị quét dò.
Tóm lược
Dựng WireGuard trên VPS gói gọn trong sáu bước: cài wireguard-tools (kernel đã có sẵn module), tạo cặp key, viết wg0.conf với dải IP nội bộ và port UDP, bật IP forwarding cùng NAT masquerade, khởi động bằng wg-quick rồi mở firewall, cuối cùng khai báo từng peer và phát config qua QR cho mobile. Toàn bộ cấu hình nằm trong các file text ở /etc/wireguard nên dễ backup, version và tự động hóa. Khi cần thêm client, chỉ lặp lại bước tạo key và thêm một block [Peer]. Tài liệu tham khảo chính thức: wireguard.com/quickstart và wireguard.com/install.