Mục lục bài viết

VPN

Hướng Dẫn Toàn Diện: Cài Đặt Và Cấu Hình WireGuard VPN Trên Linux

phongdh
phongdh
Chia sẻ:
Zalo
Hướng Dẫn Toàn Diện: Cài Đặt Và Cấu Hình WireGuard VPN Trên Linux

WireGuard là một phần mềm mạng riêng ảo (VPN) hiện đại, mã nguồn mở, được thiết kế với mục tiêu mang lại tốc độ cực nhanh, tính đơn giản cao và bảo mật vượt trội so với các giao thức cũ như IPsec hay OpenVPN.

Giải thích kỹ thuật (Technical Explanation):

Khác với các VPN truyền thống có hàng trăm ngàn dòng code, WireGuard chỉ có khoảng 4.000 dòng code. Sự tinh gọn này giúp hệ thống chạy nhanh hơn, tốn ít tài nguyên hơn và đặc biệt là dễ dàng kiểm toán bảo mật (security auditing). Nó sử dụng các công nghệ mật mã học tiên tiến nhất hiện nay bao gồm: Curve25519 (trao đổi khóa), ChaCha20 (mã hóa đối xứng), Poly1305 (xác thực dữ liệu), SipHash24 (khóa băm) và BLAKE2s (băm mật mã). WireGuard hoạt động hoàn toàn ở Layer 3 (Network Layer) và được tích hợp trực tiếp vào nhân (Kernel) của Linux.

Dưới đây là hướng dẫn chi tiết từng bước cài đặt WireGuard trên các bản phân phối Linux phổ biến.

Bước 1: Cài Đặt WireGuard Trên Máy Chủ Linux

WireGuard hỗ trợ hầu hết các hệ điều hành Linux. Tùy thuộc vào bản phân phối bạn đang sử dụng, hãy chạy các lệnh tương ứng.

1. Ubuntu / Debian

WireGuard đã có sẵn trong kho lưu trữ (repository) mặc định của Ubuntu (từ 20.04 trở lên) và Debian (từ 11 trở lên).

sudo apt update
sudo apt install wireguard

2. CentOS / RHEL / Rocky Linux / AlmaLinux

Với các hệ điều hành thuộc họ RedHat, bạn cần cài đặt thêm kho lưu trữ EPEL (Extra Packages for Enterprise Linux) trước khi cài đặt công cụ WireGuard.

sudo dnf install epel-release -y
sudo dnf install wireguard-tools

3. Arch Linux / Manjaro

sudo pacman -S wireguard-tools

Ghi chú về Kernel: WireGuard đã được sáp nhập chính thức vào Linux Kernel từ phiên bản 5.6. Nếu máy chủ của bạn chạy Kernel cũ hơn, trình quản lý gói sẽ tự động cài đặt thêm module wireguard-dkms để biên dịch hỗ trợ vào nhân hệ điều hành.

Bước 2: Khởi Tạo Cặp Khóa (Key Generation)

WireGuard hoạt động dựa trên cơ chế khóa bất đối xứng (Asymmetric Cryptography), tương tự như SSH. Mỗi thiết bị trong mạng VPN (được gọi là một Peer) sẽ cần một cặp khóa: Khóa riêng tư (Private Key) và Khóa công khai (Public Key).

Để tránh việc các file khóa này bị người dùng khác trên máy chủ vô tình đọc được, chúng ta cần thiết lập quyền (umask) trước khi tạo:

# Di chuyển vào thư mục cấu hình của WireGuard
cd /etc/wireguard/

# Thiết lập umask để giới hạn quyền file được tạo ra
umask 077

# Tạo Private Key và Public Key cho Server
wg genkey | tee server_private_key | wg pubkey > server_public_key

Giải thích câu lệnh:

  • Lệnh umask 077 đảm bảo rằng các file tạo ra sau đó chỉ có chủ sở hữu (root) mới có quyền Đọc/Ghi.
  • Lệnh wg genkey tạo ra khóa bí mật. Chuỗi này được truyền (pipe) qua lệnh tee để lưu vào file server_private_key, đồng thời truyền tiếp tới wg pubkey để dẫn xuất ra khóa công khai và lưu vào server_public_key.

Bước 3: Cấu Hình Tương Tác Mạng WireGuard (Interface)

WireGuard tạo ra các card mạng ảo (thường được đặt tên là wg0, wg1…). Chúng ta sẽ tạo file cấu hình cho card wg0.

Mở file /etc/wireguard/wg0.conf bằng trình soạn thảo (vi, nano):

vi /etc/wireguard/wg0.conf

Dán đoạn cấu hình sau vào file. Lưu ý: Bạn cần copy nội dung file server_private_key đã tạo ở Bước 2 và dán vào mục PrivateKey.

  • Xem lại nội dung file server_private_key đã tạo ở Bước 2 và dán vào mục PrivateKey.
cat /etc/wireguard/server_private_key
cat /etc/wireguard/server_public_key
[Interface]
Address = 10.10.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = <ĐIỀN_NỘI_DUNG_SERVER_PRIVATE_KEY_VÀO_ĐÂY>

# Các quy tắc Tường lửa (Firewall)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE

Giải thích chi tiết các thông số trong block [Interface]:

  • Address: Địa chỉ IP ảo cấp cho máy chủ WireGuard trong mạng VPN. Ở đây dùng subnet 10.10.0.1/24.
  • SaveConfig: Khi đặt là true, bất kỳ Client (Peer) nào được thêm vào hệ thống qua dòng lệnh (CLI) sẽ tự động được lưu cập nhật vào file wg0.conf này khi dịch vụ khởi động lại.
  • ListenPort: Cổng UDP mà máy chủ sẽ lắng nghe kết nối. 51820 là cổng mặc định của WireGuard.
  • PrivateKey: Khóa bảo mật của máy chủ.
  • PostUp / PostDown: Đây là các script thực thi tự động khi VPN bật lên (Up) hoặc tắt đi (Down). Cụ thể, các lệnh iptables này tạo quy tắc NAT (Masquerade) để cho phép các Client kết nối vào VPN có thể mượn IP của server để truy cập ra Internet. (Lưu ý: Thay thế ens18 bằng tên card mạng thật của máy chủ bạn, có thể kiểm tra bằng lệnh ip a).

Bước 4: Kích Hoạt Chuyển Tiếp IP (IP Forwarding)

Ghi chú cực kỳ quan trọng: Theo mặc định, Linux cấm việc chuyển tiếp gói tin giữa các card mạng khác nhau (ở đây là giữa card ảo wg0 và card thật ens18). Nếu không bật tính năng này, Client của bạn có thể kết nối được tới Server nhưng sẽ không thể truy cập Internet (không có mạng).

Thêm cấu hình vào file sysctl:

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf

Áp dụng cấu hình ngay lập tức:

sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

Bước 5: Cấu Hình Tường Lửa (Firewall)

Máy chủ cần cho phép các gói tin UDP trên cổng 51820 đi qua.

Nếu dùng UFW (Ubuntu/Debian):

sudo ufw allow 51820/udp

Nếu dùng Firewalld (CentOS/Rocky/AlmaLinux):

sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --reload

Bước 6: Khởi Động Dịch Vụ WireGuard

Dùng công cụ wg-quick để bật Interface mạng:

sudo wg-quick up wg0

Thiết lập dịch vụ chạy tự động cùng hệ thống khi khởi động lại máy chủ:

sudo systemctl enable wg-quick@wg0

Giải thích: Hậu tố @wg0 nói cho systemd biết rằng nó cần đọc cấu hình từ file /etc/wireguard/wg0.conf. Nếu bạn có nhiều mạng VPN, bạn có thể tạo wg1.conf và gọi wg-quick@wg1.

Bước 7: Cấu Hình Máy Khách (Client)

Mỗi máy khách (Laptop, Điện thoại, hoặc Server khác) cũng cần một cặp khóa riêng. Bạn có thể tạo khóa này ngay trên máy Client hoặc tạo trên Server rồi gửi cho Client.

Tạo khóa cho Client:

wg genkey | tee client_private_key | wg pubkey > client_public_key

Tạo file cấu hình cho Client (ví dụ client.conf):

vi client.conf

Giải thích thông số Client:

  • [Interface]: Thông tin của chính máy khách.
  • Address: IP ảo cấp cho Client (phải thuộc dải /24 của server, ở đây cấp 10.10.0.2/32 nghĩa là 1 IP tĩnh duy nhất).
  • DNS: Máy chủ phân giải tên miền. Tránh lộ lọt truy vấn mạng.
  • [Peer]: Thông tin của máy chủ VPN mà Client muốn kết nối tới.
  • Endpoint: Địa chỉ IP Public (IP WAN) của máy chủ kèm theo port.
  • AllowedIPs: Đây là thông số quan trọng nhất quyết định luồng định tuyến (Routing).
    • Nếu đặt 0.0.0.0/0: Toàn bộ lưu lượng internet của thiết bị sẽ đi qua VPN (Full Tunnel).
    • Nếu đặt 10.10.0.0/24: Chỉ những kết nối tới mạng nội bộ của VPN mới đi qua đường hầm này (Split Tunnel). Internet thông thường vẫn dùng mạng của nhà mạng.
  • PersistentKeepalive: Nếu client nằm sau Router có NAT (ví dụ ở nhà), việc gửi gói tin rỗng (keepalive) mỗi 25 giây sẽ giúp duy trì đường hầm VPN không bị ngắt kết nối bởi Router.

Bước 8: Thêm Client Vào Server

Máy chủ WireGuard mặc định sẽ từ chối mọi kết nối nếu nó không biết thiết bị đó là ai. Bạn cần khai báo Khóa công khai của Client cho Server.

Chạy lệnh sau trên Server (Thay thế các trường viết hoa):

sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> allowed-ips 10.10.0.2/32

Kiểm tra lại xem Server đã nhận Peer chưa:

sudo wg show

Vì chúng ta đã thiết lập SaveConfig = true ở Bước 3, thay đổi này sẽ tự động được ghi vào file wg0.conf khi interface tắt hoặc khi bạn chạy lệnh lưu thủ công:

sudo wg-quick save wg0

Ghi chú: Nếu không muốn dùng lệnh wg set, bạn hoàn toàn có thể mở file /etc/wireguard/wg0.conf trên server và thêm thủ công block sau vào cuối file, sau đó khởi động lại dịch vụ (systemctl restart wg-quick@wg0):

[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.10.0.2/32

Bước 9: Kết Nối Và Kiểm Tra

Bạn đưa file client.conf sang thiết bị cần dùng (Windows, macOS, Mobile) và import vào ứng dụng WireGuard Client.

Hướng dẫn Cài đặt và Kết nối VPN với WireGuard trên Windows Chi tiết nhất: Tại đây

Trên máy Server, khi Client kết nối và có lưu lượng dữ liệu chạy qua, lệnh wg show sẽ hiển thị dòng latest handshake (lần bắt tay cuối cùng) và transfer (dung lượng đã truyền).

interface: wg0
  public key: xyz123...
  private key: (hidden)
  listening port: 51820

peer: abc987...
  endpoint: 198.51.100.2:45321
  allowed ips: 10.10.0.2/32
  latest handshake: 2 seconds ago
  transfer: 4.20 KiB received, 5.11 KiB sent

Giải thích (Troubleshooting cơ bản): Nếu bạn bật Client mà không vào được mạng, đồng thời trên server gõ wg show KHÔNG nhìn thấy dòng latest handshake, điều đó có nghĩa là các gói tin UDP đang bị chặn bởi tường lửa của máy chủ, hoặc bạn điền sai IP Public/Cổng trong mục Endpoint của Client. Không có Handshake = Không có kết nối.



Bước 10: Cài Đặt Và Tạo Mã QR Cho Thiết Bị Di Động (Mobile Clients)

Để kết nối VPN trên điện thoại (iOS/Android), việc copy file .conf vào điện thoại khá mất thời gian. Cách chuyên nghiệp và nhanh nhất là tạo mã QR ngay trên Terminal của Server và dùng ứng dụng WireGuard trên điện thoại để quét.

1. Cài đặt công cụ qrencode:

  • Trên Ubuntu/Debian:
sudo apt install qrencode -y
  • Trên CentOS/Rocky/AlmaLinux:
sudo dnf install qrencode -y

2. Tạo mã QR từ file cấu hình:

Giả sử file cấu hình của máy khách bạn tạo ở Bước 7 là client.conf, hãy chạy lệnh:

qrencode -t ansiutf8 < client.conf

Bước 11: Cách Thêm Nhiều Máy Khách Khác (Multiple Clients)

Hệ thống mạng VPN thường có nhiều người dùng. Khi thêm máy khách thứ 2 (Client 2), máy khách thứ 3 (Client 3)… bạn lặp lại quy trình ở Bước 7 và Bước 8, nhưng bắt buộc phải lưu ý 2 điểm sau:

  1. Khóa phải tạo mới hoàn toàn: Mỗi Client phải có một cặp Private Key và Public Key riêng biệt.
  2. Địa chỉ IP phải duy nhất: Nếu Client 1 dùng 10.10.0.2/32, thì Client 2 phải dùng 10.10.0.3/32, Client 3 là 10.10.0.4/32

Quy trình chuẩn để thêm Client 2:

# 1. Tạo cặp khóa mới cho Client 2
wg genkey | tee client2_private_key | wg pubkey > client2_public_key

# 2. Báo cho Server biết sự tồn tại của Client 2 (Cấp IP 10.10.0.3)
sudo wg set wg0 peer <ĐIỀN_CLIENT2_PUBLIC_KEY> allowed-ips 10.10.0.3/32

# 3. Lưu lại cấu hình Server
sudo wg-quick save wg0

Sau đó, bạn tạo file client2.conf với IP 10.10.0.3/32 và Private Key mới tương tự như Bước 7 để gửi cho người dùng thứ 2.

Bước 12: Cách Xóa Một Máy Khách Khỏi Server (Revoke Access)

Nếu một nhân viên nghỉ việc hoặc thiết bị bị mất, bạn cần thu hồi quyền truy cập VPN của họ ngay lập tức để đảm bảo an toàn.

Bạn chỉ cần xóa Public Key của Client đó khỏi interface wg0:

sudo wg set wg0 peer <ĐIỀN_PUBLIC_KEY_CỦA_CLIENT_CẦN_XÓA> remove

Lưu lại thay đổi để cấu hình không bị phục hồi khi khởi động lại máy:

sudo wg-quick save wg0

Ghi chú: Ngay khi lệnh chạy xong, thiết bị chứa Public Key đó sẽ bị ngắt kết nối lập tức và không thể truy cập vào mạng VPN được nữa.

Bước 13: Quản Lý Dịch Vụ WireGuard Bằng Systemd

Là một quản trị viên hệ thống, bạn sẽ cần các lệnh này để kiểm soát trạng thái hoạt động của WireGuard thông qua systemctl:

  • Kiểm tra trạng thái (Status): Xem WireGuard có đang chạy không và xem các log lỗi gần nhất.
sudo systemctl status wg-quick@wg0
WireGuard
  • Khởi động lại (Restart): Cần thiết khi bạn sửa file /etc/wireguard/wg0.conf bằng tay và muốn áp dụng thay đổi.
sudo systemctl restart wg-quick@wg0
  • Dừng dịch vụ (Stop): Tắt hoàn toàn mạng VPN.
sudo systemctl stop wg-quick@wg0
  • Hủy tự động chạy (Disable): Ngăn không cho WireGuard tự khởi động cùng hệ điều hành.
sudo systemctl disable wg-quick@wg0

Bước 14: Xử Lý Khắc Phục Sự Cố Chuyên Sâu (Advanced Troubleshooting)

Trong quá trình vận hành thực tế, bài viết gốc cũng đề cập đến một số trường hợp lỗi mà quản trị viên thường gặp phải:

1. Vấn đề MTU (Maximum Transmission Unit)

Hiện tượng: Client kết nối thành công (có handshake), ping được IP nhưng khi vào web thì bị treo (loading mãi không xong) hoặc SSH vào server nội bộ bị đứng hình.

Nguyên nhân: Kích thước gói tin của WireGuard cộng thêm phần header mã hóa đã vượt qua giới hạn MTU của mạng vật lý.

Cách sửa: Mở file wg0.conf của Client (và cả Server nếu cần), thêm dòng MTU vào block [Interface] và giảm thông số xuống (mặc định là 1420, hãy thử hạ xuống 1360 hoặc 1280):

[Interface]
Address = 10.10.0.2/32
PrivateKey = ...
MTU = 1360

2. Kiểm tra log của Kernel

Vì WireGuard chạy ẩn trong Kernel (nhân) của Linux, nhiều khi lệnh systemctl status không hiển thị đủ lỗi. Bạn có thể dùng lệnh dmesg để xem log mạng sâu hơn:

sudo dmesg | grep wireguard

3. Lỗi “Address already in use”

Hiện tượng: Không thể start được wg-quick up wg0.

Cách sửa: Cổng 51820 đang bị một dịch vụ khác hoặc chính một tiến trình WireGuard bị kẹt chiếm giữ. Chạy lệnh sau để tìm thủ phạm:

sudo ss -lunp | grep 51820

Sau đó kill tiến trình đang chiếm giữ port và khởi động lại WireGuard.

Tổng kết

Đến đây là trọn vẹn 100% nội dung từ cài đặt cơ bản, quản lý vận hành (thêm/xóa/mã QR) cho đến gỡ lỗi chuyên sâu theo đúng tinh thần của bài viết gốc. Cảm ơn bạn đã góp ý để mình hoàn thiện bài hướng dẫn này! Nếu bạn gặp vướng mắc ở câu lệnh nào trong quá trình thực hành, cứ phản hồi lại nhé.

Chia sẻ:
Zalo
phongdh

phongdh

Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận

0 bình luận cho bài viết này

* Địa chỉ email của bạn sẽ được bảo mật và không hiển thị công khai.

Chưa có bình luận nào

Hãy là người đầu tiên chia sẻ góc nhìn của bạn về bài viết này nhé!

Zalo

Nhập từ khóa để tìm kiếm...

0 kết quả

CHUYÊN MỤC LIÊN QUAN