WireGuard VPN: Thiết lập mạng riêng ảo an toàn trên Ubuntu VPS

Bạn muốn tạo mạng riêng ảo (VPN) nhanh, đơn giản và hiệu năng cao mà không cần cấu hình phức tạp như OpenVPN? WireGuard là protocol VPN hiện đại với chỉ ~4,000 dòng mã, đã được nhúng vào kernel Linux từ phiên bản 5.6 — hoạt động ở tốc độ gần như băng thông gốc.

WireGuard là gì?

WireGuard là VPN protocol mã nguồn mở dùng cryptography hiện đại: ChaCha20-Poly1305 cho encryption, Curve25519 cho key exchange, BLAKE2s cho hashing. So với OpenVPN/IPsec, nó:

  • Handshake nhanh hơn ~10 lần ( Noise protocol framework )
  • Roaming mượt: giữ kết nối khi chuyển WiFi → 4G → WiFi khác
  • Code audit dễ (4k dòng) so với OpenVPN (hàng trăm nghìn dòng)
  • Hiệu năng cao hơn 20-30% so với OpenVPN trên cùng CPU
Sơ đồ mạng riêng ảo WireGuard giữa client và server

Cài đặt WireGuard trên Ubuntu VPS

1. Cài server

apt update && apt install -y wireguard
systemctl enable --now wg-quick@wg0

2. Tạo key pair

wg genkey | tee server_private.key | wg pubkey > server_public.key
wg genkey | tee client_private.key | wg pubkey > client_public.key

3. Cấu hình /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.1/24
SaveConfig = true
PrivateKey = 
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = 
AllowedIPs = 10.0.0.2/32

4. Mở firewall

ufw allow 51820/udp
# hoặc iptables
iptables -A INPUT -p udp --dport 51820 -j ACCEPT

5. Client config (Windows/Mac/Android)

[Interface]
PrivateKey = 
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = 
Endpoint = YOUR_VPS_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Trạng thái giao diện WireGuard VPN handshake thành công

So sánh WireGuard với OpenVPN và IPSec

Tiêu chí WireGuard OpenVPN IPSec (strongSwan)
Code size ~4,000 dòng ~100,000 dòng ~500,000 dòng
Kernel module Có (Linux 5.6+) Userland Kernel + userland
Crypto ChaCha20-Poly1305, Curve25519 OpenSSL (AES, RSA, …) IKEv2 + ESP
Handshake ~100 ms ~1 giây ~500 ms
Roaming Tự động, mượt Cần reconnect Khó
Config đơn giản Rất đơn giản Trung bình Phức tạp
Audit Dễ (code nhỏ) Khó Rất khó
Throughput Gần băng thông gốc Thấp hơn 20-30% Tốt
UDP only TCP/UDP UDP

Kiểm tra kết nối

# Server side
wg show
# output: interface: wg0, public key, latest handshake, transfer

# Client side
curl ifconfig.me  # phải ra IP của VPS
ping 10.0.0.1     # ping qua VPN tunnel

WireGuard + DNS riêng (Pi-hole)

Trong client config, thêm DNS = 10.0.0.1 — tất cả traffic DNS đi qua VPS. Trên VPS cài Pi-hole để chặn quảng cáo, tracker. Kết hợp WireGuard + Pi-hole = VPN ad-blocker cho toàn bộ thiết bị.

Split tunneling

Không muốn route toàn bộ traffic qua VPN? Để AllowedIPs = 0.0.0.0/0, ::/0 cho full tunnel, hoặc chỉ route mạng nội bộ:

[Peer]
PublicKey = 
Endpoint = VPS_IP:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

Split tunneling tiết kiệm băng thông VPS, phù hợp khi chỉ cần truy cập server nội bộ.

WireGuard trong Docker

Chạy WireGuard trong container với linuxserver/wireguard. Port 51820/UDP expose ra host. Lưu ý: container cần NET_ADMIN capability để tạo tunnel interface.

docker run -d 
  --name wireguard 
  --cap-add NET_ADMIN 
  --cap-add SYS_MODULE 
  -e SERVERURL=yourdomain.com 
  -e PEERS=3 
  -p 51820:51820/udp 
  -v /root/wireguard/config:/config 
  linuxserver/wireguard

Troubleshooting

  • Handshake failed: Kiểm tra public key khớp, firewall mở 51820/UDP, không có NAT blocking UDP.
  • DNS leak: Đảm bảo DNS = 10.0.0.1 trong client, không dùng DNS public bên ngoài tunnel.
  • Mất kết nối sau idle: Thêm PersistentKeepalive = 25 ở cả server và client.
  • Không ping được 10.0.0.1: Kiểm tra PostUp iptables MASQUERADE, sysctl net.ipv4.ip_forward=1.

Bảo mật best practices

  • PersistentKeepalive = 25: giữ NAT mapping sống, tránh mất kết nối sau idle
  • AllowedIPs = 0.0.0.0/0: route toàn bộ traffic qua VPN — nhớ kiểm tra DNS leak
  • Không share private key: mất private key = mất toàn bộ quyền truy cập server
  • Key rotation: đổi key pair mỗi 3-6 tháng
  • Fail2ban trên SSH: WireGuard không có password, bảo vệ SSH là bắt buộc

Khi nào dùng WireGuard?

  • Cần VPN đơn giản, nhanh, dễ audit
  • Remote access VPS/self-hosted service
  • Site-to-site VPN giữa 2 máy hoặc 2 mạng nhỏ
  • Tuân thủ compliance cần crypto hiện đại

Tài liệu tham khảo

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Giao diện FancyZones với các vùng chia màn hình được tùy chỉnh trong Windows

PowerToys trên Windows: 6 công cụ tối ưu hóa workflow developer 2025

PowerToys là gì? PowerToys là bộ công cụ mã nguồn mở do Microsoft phát triển, cung cấp hàng loạt tính năng nâng cao giúp tối ưu hóa workflow trên Windows….

Xem thêm

8 tính năng ẩn trên iPhone: Back Tap, Khóa ứng dụng, SOS khẩn cấp không cần app

iOS 18 mang đến hàng loạt tính năng mới: Apple Intelligence, màn hình khóa tùy biến, RCS, Game Mode. Nhưng bên cạnh những thay đổi lớn, nhiều “mẹo ẩn” (hidden…

Xem thêm

Justfile: Task runner đơn giản thay thế Makefile và script shell

Justfile: Task runner đơn giản thay thế Makefile và script shell Justfile (câu lệnh just) là task runner hiện đại được viết bằng Rust, thay thế Makefile, npm scripts, bash…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất