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

Minh họa luồng git stash: working directory lưu vào refs/stash

Git Stash: Quản lý công việc đang làm mà không cần commit

git stash là lệnh thiết yếu trong Git — cho phép lưu tạm trạng thái working directory và index khi cần chuyển sang branch khác mà không cần commit dở…

Xem thêm

Alacritty vs Kitty vs WezTerm: Terminal hiện đại so sánh chi tiết

Terminal là nơi dành nhiều thời gian nhất của developer. Một terminal emulator nhanh, nhẹ, và có khả năng tùy biến cao sẽ nâng cao năng suất đáng kể. Ba…

Xem thêm

Git Hooks: Tự động hóa kiểm tra code trước khi commit

Git Hooks: Tự động hóa kiểm tra code trước khi commit VS Code IDE with pre-commit hooks configuration on split screen Git hooks là script tự chạy ở các sự…

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