Hướng dẫn · 19/09/2026

Hướng dẫn cài WireGuard VPN trên Ubuntu Server an toàn từ A-Z

WireGuard là một VPN hiện đại, gọn và đa nền tảng, phù hợp để nhân viên truy cập an toàn vào server hoặc mạng nội bộ từ xa. Bài này xây dựng mô hình peer-to-site trên Ubuntu Server: mỗi thiết bị có một cặp khóa riêng, server định tuyến lưu lượng VPN và quyền được giới hạn bằng firewall.

Hướng dẫn cài WireGuard VPN trên Ubuntu Server an toàn từ A-Z

WireGuard là một VPN hiện đại, gọn và đa nền tảng, phù hợp để nhân viên truy cập an toàn vào server hoặc mạng nội bộ từ xa. Bài này xây dựng mô hình peer-to-site trên Ubuntu Server: mỗi thiết bị có một cặp khóa riêng, server định tuyến lưu lượng VPN và quyền được giới hạn bằng firewall.

VPN không thay thế phân quyền ứng dụng. Người dùng kết nối được vào mạng vẫn chỉ nên truy cập đúng dịch vụ cần thiết.

Mô hình và thông số ví dụ

  • Ubuntu Server có IP public hoặc được router NAT cổng UDP tới.
  • Interface Internet của server: eth0 (hãy thay bằng tên thực tế).
  • Mạng WireGuard: 10.66.66.0/24.
  • Server VPN: 10.66.66.1; client đầu tiên: 10.66.66.2.
  • Cổng UDP: 51820.

Kiểm tra interface bằng ip route get 1.1.1.1. Nếu server nằm sau router, chuyển tiếp UDP 51820 tới IP LAN của server và nên cố định IP đó bằng DHCP reservation. Với CGNAT, port forwarding thông thường sẽ không hoạt động; cần public IP, IPv6 phù hợp, VPS trung gian hoặc tunnel khác.

1. Cập nhật hệ thống và cài WireGuard

sudo apt update
sudo apt upgrade
sudo apt install wireguard qrencode
sudo mkdir -p /etc/wireguard
sudo chmod 700 /etc/wireguard

qrencode chỉ cần nếu muốn thêm cấu hình vào điện thoại bằng QR. Trước khi sửa firewall từ xa, giữ một phiên SSH thứ hai đang mở hoặc có console của nhà cung cấp để tránh tự khóa quyền quản trị.

2. Tạo khóa riêng cho server

sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
sudo cat /etc/wireguard/server.pub

Private key phải chỉ root đọc được và không được gửi qua chat, email hoặc commit vào Git. Public key có thể chia sẻ cho peer. Mỗi client cần một cặp khóa riêng để có thể thu hồi từng thiết bị mà không ảnh hưởng toàn hệ thống.

3. Bật IP forwarding

Nếu client chỉ truy cập dịch vụ chạy ngay trên server, forwarding có thể không cần. Nếu server đóng vai trò gateway tới Internet hoặc mạng LAN, tạo cấu hình:

sudo tee /etc/sysctl.d/70-wireguard-routing.conf > /dev/null <<'EOF'
net.ipv4.ip_forward = 1
EOF
sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf

Xác nhận bằng sysctl net.ipv4.ip_forward; kết quả phải là 1. Chỉ bật IPv6 forwarding khi đã thiết kế địa chỉ và firewall IPv6 đầy đủ, không sao chép máy móc cấu hình IPv4.

4. Tạo cấu hình server

Mở /etc/wireguard/wg0.conf và điền:

[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

# Client laptop
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.66.66.2/32

Thay placeholder bằng nội dung khóa thực tế, sau đó chạy sudo chmod 600 /etc/wireguard/wg0.conf. Trong WireGuard, AllowedIPs vừa chọn peer cho lưu lượng đi ra, vừa giới hạn địa chỉ nguồn peer được phép dùng khi nhận. Không gán cùng một IP /32 cho hai client.

Có thể tránh đặt private key trực tiếp trong file chính bằng cách dùng PostUp = wg set %i private-key /etc/wireguard/server.key, như tài liệu Ubuntu minh họa. Dù chọn cách nào, hãy bảo vệ file khóa và cấu hình bằng quyền hệ thống tệp.

5. Cấu hình UFW và NAT

Cho phép SSH trước, rồi mở cổng WireGuard:

sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw route allow in on wg0 out on eth0 from 10.66.66.0/24
sudo ufw route allow in on eth0 out on wg0 to 10.66.66.0/24

Để client dùng server làm cổng ra Internet, thêm khối NAT ở đầu /etc/ufw/before.rules, trước các bảng *filter hiện có:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.66.66.0/24 -o eth0 -j MASQUERADE
COMMIT

Trong /etc/default/ufw, đặt DEFAULT_FORWARD_POLICY="ACCEPT", sau đó:

sudo ufw enable
sudo ufw reload
sudo ufw status verbose

Thay eth0 bằng interface Internet thật. Nếu chỉ cần truy cập mạng nội bộ và router LAN có route quay về 10.66.66.0/24, định tuyến thuần không NAT giúp log giữ được IP client; cấu hình route và firewall theo kiến trúc thực tế.

6. Tạo client đầu tiên

Tạo khóa trên chính client là lựa chọn tốt nhất vì private key không rời thiết bị. Trên Linux:

umask 077
wg genkey > client.key
wg pubkey < client.key > client.pub

Thêm public key của client vào block [Peer] trên server. File cấu hình client:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.66.66.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = vpn.example.com:51820
AllowedIPs = 10.66.66.0/24
PersistentKeepalive = 25

PersistentKeepalive = 25 hữu ích khi client nằm sau NAT và cần giữ ánh xạ, nhưng không bắt buộc cho mọi peer. Dùng hostname động nếu IP public của server thay đổi.

7. Chọn split tunnel hoặc full tunnel

Cấu hình trên là split tunnel: chỉ mạng 10.66.66.0/24 đi qua VPN. Nếu cần truy cập LAN, thêm subnet LAN, ví dụ 192.168.10.0/24, vào AllowedIPs của client và mở đúng rule forwarding.

Với full tunnel, đặt AllowedIPs = 0.0.0.0/0 (và ::/0 chỉ khi đã cấu hình IPv6). Toàn bộ Internet của client sẽ đi qua server, vì vậy phải có forwarding, NAT, DNS và đủ băng thông. Full tunnel bảo vệ lưu lượng trên Wi-Fi công cộng nhưng tăng tải, độ trễ và trách nhiệm vận hành.

8. Khởi động và kiểm tra

sudo wg-quick up wg0
sudo wg show
ip address show wg0
sudo systemctl enable wg-quick@wg0

Kết nối client rồi kiểm tra ping 10.66.66.1, truy cập dịch vụ nội bộ và quan sát latest handshake, transfer trong sudo wg show. Nếu dùng full tunnel, kiểm tra IP public và DNS của client để chắc chắn lưu lượng đi đúng đường.

Để nạp thêm peer mà ít gián đoạn, có thể dùng sudo systemctl reload wg-quick@wg0. Một số thay đổi về địa chỉ, route hoặc hook vẫn cần restart đầy đủ.

9. Thêm điện thoại bằng QR an toàn

qrencode -t ansiutf8 < phone.conf

Trong ứng dụng WireGuard trên điện thoại, chọn tạo tunnel từ QR rồi quét trực tiếp trong phiên quản trị riêng tư. QR chứa private key nên phải được xem như mật khẩu: không chụp màn hình, không lưu vào ticket và xóa file tạm an toàn sau khi cấp thiết bị.

10. Thu hồi một thiết bị

Xóa block [Peer] tương ứng khỏi server và reload dịch vụ. Không tái sử dụng khóa cho thiết bị thay thế. Nếu server private key bị lộ, tạo cặp khóa server mới và cập nhật public key trên tất cả client; chỉ đổi một peer khi private key của peer đó bị lộ.

Xử lý lỗi thường gặp

  • Không có handshake: kiểm tra UDP 51820, port forwarding, public IP/CGNAT, Endpoint và cặp public key.
  • Có handshake nhưng không ping: kiểm tra AllowedIPs, IP trùng, UFW và route bằng ip route.
  • Truy cập server được nhưng không vào LAN/Internet: kiểm tra IP forwarding, rule FORWARD, NAT hoặc route quay về.
  • Truy cập IP được nhưng tên miền lỗi: kiểm tra DNS trong client và resolver có thể đi qua tunnel.
  • Một số website treo: thử giảm MTU, chẳng hạn MTU = 1380, sau khi xác nhận có vấn đề path MTU.
  • Kết nối di động không ổn định: dùng PersistentKeepalive = 25 ở peer nằm sau NAT.
sudo wg show
sudo journalctl -u wg-quick@wg0
ip route
sudo ufw status verbose
sudo ss -lunp | grep 51820

Checklist bảo mật và vận hành

  1. Mỗi thiết bị có khóa và địa chỉ VPN riêng.
  2. Private key và file cấu hình có quyền hạn chế.
  3. Firewall chỉ cho phép subnet VPN tới đúng dịch vụ cần dùng.
  4. Không mở SSH public nếu có thể quản trị qua VPN.
  5. Ghi lại chủ sở hữu peer, ngày cấp và ngày thu hồi.
  6. Sao lưu cấu hình server dưới dạng mã hóa, tách khỏi máy chủ.
  7. Cập nhật Ubuntu định kỳ và theo dõi handshake bất thường.
  8. Kiểm thử thu hồi peer và khôi phục cấu hình.

Kết luận

Một WireGuard VPN tốt không chỉ là tunnel có handshake. Cấu hình cần khóa riêng cho từng thiết bị, AllowedIPs chính xác, firewall giới hạn quyền, routing/NAT có chủ đích và quy trình thu hồi rõ ràng. Hãy bắt đầu bằng split tunnel nhỏ, xác minh từng luồng rồi mới mở rộng sang LAN hoặc full tunnel.

Nguồn tham khảo

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.