Hướng dẫn cấu hình WireGuard VPN trên VPS CentOS 9

Trong bối cảnh an toàn thông tin là ưu tiên hàng đầu, việc sở hữu một máy chủ Mạng riêng ảo (VPN) mang lại khả năng kiểm soát và bảo mật vượt trội. WireGuard®, một giao thức VPN hiện đại, đang nhanh chóng trở thành tiêu chuẩn mới nhờ hiệu năng ấn tượng và cấu trúc cực kỳ tinh gọn. So với các giải pháp truyền thống như OpenVPN, WireGuard cung cấp tốc độ kết nối cao hơn, sử dụng các thuật toán mã hóa tiên tiến và có quy trình cấu hình đơn giản hơn đáng kể.

Mục tiêu của bài viết này là hướng dẫn bạn từng bước cấu hình WireGuard VPN server trên VPS CentOS 9 một cách toàn diện, chính xác và chuyên nghiệp, giúp bất kỳ ai cũng có thể làm chủ công nghệ mạnh mẽ này.

Tại sao WireGuard là lựa chọn vượt trội?

Trước khi đi vào phần kỹ thuật, hãy cùng phân tích những lý do khiến WireGuard trở thành giải pháp thay thế OpenVPN hiệu quả.

  • Hiệu suất và tốc độ: WireGuard hoạt động ở tầng Kernel của hệ điều hành, giúp giảm độ trễ và tăng thông lượng mạng một cách đáng kể. Kết hợp với việc sử dụng các thuật toán mã hóa hiệu suất cao như ChaCha20, WireGuard mang lại trải nghiệm kết nối nhanh và mượt mà hơn.
  • Bảo mật hiện đại: Giao thức này sử dụng một bộ các thuật toán mã hóa được công nhận rộng rãi về tính an toàn và hiệu quả, bao gồm Curve25519 cho trao đổi khóa, ChaCha20 để mã hóa và Poly1305 để xác thực dữ liệu.
  • Sự đơn giản: Với chỉ khoảng 4,000 dòng code so với hàng trăm ngàn dòng của OpenVPN hay IPsec, mã nguồn của WireGuard rất dễ để các chuyên gia bảo mật kiểm toán (audit). Điều này giúp giảm thiểu đáng kể bề mặt tấn công và các lỗ hổng tiềm ẩn.
  • Tính ổn định: WireGuard quản lý kết nối một cách thông minh, cho phép người dùng duy trì phiên làm việc liền mạch ngay cả khi thay đổi mạng kết nối (ví dụ, chuyển đổi giữa Wi-Fi và mạng di động 4G).

Cài đặt và cấu hình WireGuard Server

Chúng ta sẽ bắt đầu các bước kỹ thuật để triển khai WireGuard trên VPS CentOS 9.

Yêu cầu

  • Một máy chủ ảo (VPS) đang chạy hệ điều hành CentOS 9.
  • Quyền truy cập vào tài khoản root hoặc một người dùng có quyền sudo.

Bước 1: Cài đặt WireGuard Tools

Trên CentOS 9, cũng như Red Hat Enterprise Linux 9, module WireGuard đã được tích hợp sẵn vào Linux Kernel. Bạn chỉ cần cài đặt gói công cụ wireguard-tools để quản lý nó. Để thực hiện việc này, chúng ta cần cài đặt kho lưu trữ EPEL (Extra Packages for Enterprise Linux) theo phương pháp chính thức.

1. Kích hoạt kho lưu trữ CodeReady Builder (CRB)

Đây là bước chuẩn bị quan trọng để đảm bảo tất cả các gói phụ thuộc cần thiết đều có sẵn. Kho CRB chứa các công cụ xây dựng và thư viện phát triển mà nhiều gói trong EPEL phụ thuộc vào, giúp ngăn ngừa các lỗi về gói phụ thuộc.

# Kích hoạt kho lưu trữ CRB
sudo dnf config-manager --set-enabled crb

Ví dụ Output:

Enabled the 'crb' repository

2. Cài đặt kho lưu trữ EPEL 9 từ URL chính thức

Sử dụng liên kết do Fedora Project cung cấp đảm bảo bạn đang cài đặt phiên bản mới nhất và đáng tin cậy nhất cho các bản phân phối tương thích RHEL 9, bao gồm CentOS 9.

# Cài đặt gói epel-release trực tiếp từ Fedora Project
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

Ví dụ Output:

epel-release-latest-9.noarch.rpm                      18 kB/s |  23 kB     00:01
Dependencies resolved.
================================================================================
 Package        Arch    Version        Repository                        Size
================================================================================
Installing:
 epel-release   noarch  9-7.el9        @commandline                      23 k

Transaction Summary
================================================================================
Install  1 Package

Installed:
  epel-release-9-7.el9.noarch

Complete!

3. Cài đặt WireGuard Tools

Giờ đây hệ thống đã có quyền truy cập vào kho EPEL, bạn có thể cài đặt gói công cụ WireGuard. Công cụ dnf sẽ tìm kiếm gói trong tất cả các kho lưu trữ đã được kích hoạt và tự động xử lý các gói phụ thuộc cần thiết.

# Cài đặt gói công cụ của WireGuard từ kho EPEL
sudo dnf install -y wireguard-tools

Ví dụ Output:

Dependencies resolved.
================================================================================
 Package            Arch     Version             Repository               Size
================================================================================
Installing:
 wireguard-tools    x86_64   1.0.20210914-2.el9   epel                     27 k

Installing dependencies:
 qrencode-libs      x86_64   4.1.1-5.el9          appstream               56 k

Transaction Summary
================================================================================
Install  2 Packages

Installed:
  wireguard-tools-1.0.20210914-2.el9.x86_64
  qrencode-libs-4.1.1-5.el9.x86_64

Complete!

4. Kiểm tra Module Kernel

Cuối cùng, kiểm tra lại để chắc chắn module wireguard của kernel đã được nạp.

# Liệt kê các module đang được nạp và lọc theo tên "wireguard"
sudo lsmod | grep wireguard

Ví dụ Output (nếu module đã được tự động nạp hoặc bạn đã chạy modprobe wireguard trước đó):

wireguard             106086  0
curve25519_x86_64      94208  1 wireguard
libchacha20poly1305     16384 1 wireguard
ip6_udp_tunnel         16384 1 wireguard
udp_tunnel             20480 1 wireguard

Nếu bạn thấy kết quả có dòng wireguard, nghĩa là module đã sẵn sàng hoạt động.

Bước 2: Tạo cặp khóa cho Server

WireGuard xác thực các bên kết nối bằng mật mã khóa công khai.

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

# Đặt umask để các file tạo ra chỉ có chủ sở hữu mới có quyền đọc/ghi
umask 077

# Tạo cặp khóa cho server
wg genkey | tee server_private.key | wg pubkey > server_public.key

Việc chạy lệnh umask 077 trước khi tạo khóa sẽ giúp thiết lập quyền truy cập an toàn cho các tệp sắp được tạo. Cụ thể, nó đảm bảo rằng file khóa riêng tư (server_private.key) sẽ được tạo ra với quyền hạn chế tối đa, chỉ cho phép người dùng sở hữu (root) có quyền đọc và ghi.

Khóa công khai (server_public.key) sẽ được dùng để chia sẻ cho các client.

Bước 3: Cấu hình Server (tập tin wg0.conf)

File cấu hình WireGuard tuân theo định dạng INI với hai section chính là [Interface][Peer]. Hãy tạo và chỉnh sửa file cấu hình cho server:

sudo nano /etc/wireguard/wg0.conf

Dán nội dung sau vào file và chỉnh sửa các giá trị cho phù hợp:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <NỘI_DUNG_FILE_SERVER_PRIVATE.KEY>
SaveConfig = true
  • [Interface]: Section này định nghĩa các tham số cho giao diện mạng WireGuard trên chính máy chủ.
    • Address: Địa chỉ IP nội bộ và subnet mask của server trong mạng VPN. 10.10.0.1/24 có nghĩa là server có IP 10.10.0.1 và quản lý dải mạng từ 10.10.0.0 đến 10.10.0.255.
    • ListenPort: Cổng UDP mà server sẽ lắng nghe kết nối từ các client. 51820 là cổng mặc định.
    • PrivateKey: Khóa riêng tư của server, được tạo bởi lệnh wg genkey. Đây là tham số bắt buộc. Bạn có thể dùng lệnh cat /etc/wireguard/server_private.key để xem nội dung và sao chép.
    • SaveConfig: Một tham số của wg-quick, cho phép tự động lưu lại cấu hình vào file nếu có thay đổi được thực hiện qua dòng lệnh (ví dụ: wg set ...).

Bước 4: Kích hoạt IP Forwarding

Để server có thể chuyển tiếp (forward) gói tin từ các client VPN ra Internet, bạn cần bật tính năng IP Forwarding trong kernel. Thực hành tốt nhất trên các hệ thống hiện đại là tạo một file cấu hình riêng biệt trong thư mục /etc/sysctl.d/ để giữ cho hệ thống có tổ chức và dễ quản lý.

# Tạo một file cấu hình sysctl riêng để bật IP forwarding
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard-forward.conf

# Tải và áp dụng các thiết lập từ tất cả các file cấu hình hệ thống
sudo sysctl --system

Lệnh sysctl --system là phương pháp chuẩn để tải các file .conf từ thư mục /etc/sysctl.d/. Bạn sẽ thấy kết quả hiển thị rằng file 99-wireguard-forward.conf đã được áp dụng thành công.

Ví dụ Output:

* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /etc/sysctl.d/99-wireguard-forward.conf ...
net.ipv4.ip_forward = 1

Bước 5: Cấu hình Firewall (sử dụng firewalld)

firewalld quản lý các quy tắc bằng cách gán chúng vào các “vùng” (zones). Chúng ta sẽ áp dụng các quy tắc vào vùng public, là vùng mặc định cho các kết nối mạng trên một VPS thông thường.

1. Thêm các quy tắc tường lửa

# Mở cổng WireGuard (51820/udp) trong vùng "public" một cách vĩnh viễn
sudo firewall-cmd --zone=public --permanent --add-port=51820/udp

# Bật tính năng masquerade trong vùng "public" để cho phép NAT
sudo firewall-cmd --zone=public --permanent --add-masquerade

Việc chỉ định rõ ràng --zone=public là thực hành tốt nhất để đảm bảo quy tắc được áp dụng đúng nơi. Tham số --permanent lưu quy tắc vĩnh viễn, và tính năng masquerade là cần thiết để “che giấu” các máy client trong mạng VPN khi chúng truy cập Internet bằng địa chỉ IP của server.

2. Áp dụng các thay đổi

Sau khi thêm các quy tắc vĩnh viễn, bạn cần tải lại firewalld để chúng có hiệu lực ngay lập tức.

# Tải lại cấu hình firewall để áp dụng các thay đổi
sudo firewall-cmd --reload

Lệnh này sẽ áp dụng các cấu hình vĩnh viễn vào trạng thái đang chạy (runtime) mà không làm gián đoạn các kết nối hiện có.

Bước 6: Khởi động và kiểm tra Server

Sử dụng systemctl, công cụ quản lý dịch vụ tiêu chuẩn trên CentOS 9, để khởi động dịch vụ WireGuard.

# Kích hoạt (tự chạy khi boot) và khởi động ngay lập tức dịch vụ cho giao diện wg0
sudo systemctl enable --now wg-quick@wg0

Công cụ wg-quick là một trình bao (wrapper) tiện lợi, giúp tự động hóa việc thực thi các lệnh cấp thấp như ipwg để thiết lập giao diện mạng. Việc sử dụng wg-quick thông qua systemd là phương pháp tiêu chuẩn để quản lý dịch vụ WireGuard.

Sau khi khởi động, bạn cần kiểm tra để đảm bảo dịch vụ đã hoạt động thành công.

1. Kiểm tra trạng thái dịch vụ (khuyến nghị)

Sử dụng systemctl status là cách kiểm tra đáng tin cậy nhất.

# Kiểm tra trạng thái chi tiết của dịch vụ wg-quick@wg0
sudo systemctl status [email protected]

Lệnh này cung cấp một cái nhìn toàn diện: dòng Active sẽ hiển thị active (running) màu xanh lá nếu thành công, và các dòng log ở cuối là thông tin gỡ lỗi quan trọng nhất nếu dịch vụ gặp sự cố.

Ví dụ Output:

[email protected] - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled; preset: disabled)
     Active: active (exited) since Tue 2025-06-24 11:52:34 +07; 5s ago
       Docs: man:wg-quick(8)
             man:wg(8)
             https://www.wireguard.com/
             https://www.wireguard.com/quickstart/
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
    Process: 1234 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 1234 (code=exited, status=0/SUCCESS)

Jun 24 11:52:34 localhost systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Jun 24 11:52:34 localhost wg-quick[1234]: [#] ip link add wg0 type wireguard
Jun 24 11:52:34 localhost wg-quick[1234]: [#] wg setconf wg0 /dev/fd/63
Jun 24 11:52:34 localhost wg-quick[1234]: [#] ip -4 address add 10.10.0.1/24 dev wg0
Jun 24 11:52:34 localhost wg-quick[1234]: [#] ip link set mtu 1420 up dev wg0
Jun 24 11:52:34 localhost wg-quick[1234]: [#] iptables -A FORWARD -i wg0 -j ACCEPT
Jun 24 11:52:34 localhost wg-quick[1234]: [#] iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Jun 24 11:52:34 localhost systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

Lưu ý: Trạng thái active (exited) là hoàn toàn bình thường đối với dịch vụ wg-quick@. Điều này có nghĩa là kịch bản wg-quick đã chạy thành công để thiết lập giao diện mạng, sau đó thoát ra. Giao diện wg0 vẫn đang hoạt động trong kernel.

2. Kiểm tra giao diện WireGuard

Sau khi xác nhận dịch vụ đã chạy, bạn có thể dùng lệnh wg show để xem thông tin cụ thể về giao diện.

# Hiển thị thông tin cấu hình của giao diện WireGuard đang chạy
sudo wg show

Kết quả sẽ hiển thị khóa công khai của server và cổng đang lắng nghe (listening port).

Ví dụ Output (nếu chỉ có server chưa có client nào kết nối):

interface: wg0
  public key: y+z4N8Ygr6f8MGOCurZzRbgRXhC0bF6DhsTrQ5khsz8=
  private key: (hidden)
  listening port: 51820

Ví dụ Output (nếu đã có client):

interface: wg0
  public key: y+z4N8Ygr6f8MGOCurZzRbgRXhC0bF6DhsTrQ5khsz8=
  private key: (hidden)
  listening port: 51820

peer: z3tN5UeOXzT8oJNR7AhhBHHypIb0gDL7vfjth63gE3s=
  endpoint: 203.113.45.89:45321
  allowed ips: 10.10.0.2/32
  latest handshake: 12 seconds ago
  transfer: 38.2 KiB received, 27.1 KiB sent
  persistent keepalive: every 25 seconds

Cấu hình Client kết nối

Để kết nối vào VPN, mỗi client (máy tính, điện thoại) cần có file cấu hình riêng.

  1. Trên máy Client, cài đặt ứng dụng WireGuard và tạo cặp khóa riêng cho client.
  2. Trên máy Client, tạo một file cấu hình (ví dụ: client.conf):
[Interface]
PrivateKey = <NỘI_DUNG_KHÓA_RIÊNG_CỦA_CLIENT>
Address = 10.10.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = <NỘI_DUNG_KHÓA_CÔNG_KHAI_CỦA_SERVER>
Endpoint = <ĐỊA_CHỈ_IP_CÔNG_KHAI_CỦA_VPS>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
  • Address = 10.10.0.2/32: Cấp một địa chỉ IP duy nhất cho client. Khác với mạng LAN truyền thống, trong mô hình điểm-nối-điểm của WireGuard, việc dùng /32 để chỉ định chính xác một host là cách làm chuẩn và hiệu quả nhất, giúp việc định tuyến rõ ràng và nhất quán với cấu hình trên server.
  • DNS = 1.1.1.1: Chỉ định một máy chủ DNS (ví dụ: của Cloudflare) để đảm bảo các truy vấn DNS cũng đi qua VPN, ngăn chặn rò rỉ DNS.
  • AllowedIPs = 0.0.0.0/0: Định tuyến toàn bộ lưu lượng của client đi qua đường hầm VPN.
  • PersistentKeepalive = 25: Tùy chọn này rất quan trọng để duy trì kết nối ổn định khi client ở sau tường lửa hoặc NAT. Nó yêu cầu client gửi một gói tin nhỏ đến server mỗi 25 giây, giúp “giữ mở” phiên kết nối trong bảng trạng thái của thiết bị mạng trung gian.
  1. Trên Server, thêm client vào file /etc/wireguard/wg0.conf với tư cách là một [Peer].
sudo nano /etc/wireguard/wg0.conf

Thêm đoạn sau vào cuối file:

[Peer]
PublicKey = <NỘI_DUNG_KHÓA_CÔNG_KHAI_CỦA_CLIENT>
AllowedIPs = 10.10.0.2/32
  • [Peer]: Mỗi section [Peer] định nghĩa một máy client sẽ kết nối đến server.
  • PublicKey: Khóa công khai của client, dùng để xác thực. Đây là tham số bắt buộc.
  • AllowedIPs: Tham số này có vai trò kép:
    • (1) Bảo mật: Chỉ cho phép các gói tin có IP nguồn là 10.10.0.2 đi vào server từ peer này.
    • (2) Định tuyến: Khi server cần gửi gói tin đến 10.10.0.2, nó sẽ mã hóa và gửi qua tunnel đến peer này.
  1. Trên Server, khởi động lại dịch vụ để áp dụng: sudo systemctl restart wg-quick@wg0. Giờ đây bạn có thể dùng file client.conf trên ứng dụng WireGuard để kết nối.

Tối ưu và bảo mật nâng cao

  • Thay đổi cổng mặc định: Sử dụng một cổng UDP khác 51820 trong cấu hình server và firewall có thể giúp tránh bị các công cụ quét tự động phát hiện.
  • Tinh chỉnh MTU: Trong một số trường hợp, việc đặt MTU (Maximum Transmission Unit) thấp hơn có thể cải thiện độ ổn định. Thêm MTU = 1420 vào mục [Interface] của cả server và client.
  • Sử dụng Pre-Shared Key (PSK) để tăng cường bảo mật:
    • Mục đích: Việc thêm một khóa chia sẻ trước (Preshared Key) sẽ bổ sung một lớp mã hóa khóa đối xứng vào hệ thống mã hóa khóa công khai đã có sẵn, nhằm mục đích kháng lại các cuộc tấn công từ máy tính lượng tử trong tương lai (post-quantum resistance).
    • Cách thực hiện:
      1. Trên server, tạo khóa PSK: wg genpsk > psk.key
      2. Thêm dòng PresharedKey = <Nội dung file psk.key> vào section [Peer] của client trên file cấu hình server (wg0.conf).
      3. Thêm chính dòng PresharedKey đó vào section [Peer] trên file cấu hình của client (client.conf).

Kết luận

Việc triển khai WireGuard trên CentOS 9 là một quy trình kỹ thuật rõ ràng và mang lại lợi ích to lớn về tốc độ, bảo mật và sự đơn giản trong quản lý. Bằng cách làm theo hướng dẫn này, bạn đã xây dựng thành công một máy chủ VPN hiện đại, tuân thủ các thực hành tốt nhất về quản trị hệ thống và bảo mật.

Triển khai ngay một máy chủ VPN hiệu suất cao với WireGuard trên nền tảng VPS CentOS 9 mạnh mẽ và ổn định từ ZingServer để bảo vệ dữ liệu và tối ưu hóa kết nối của bạn.

Tài liệu tham khảo

  1. Quản lý gói phần mềm với DNF (dnf):
  2. Kho lưu trữ EPEL (Extra Packages for Enterprise Linux):
  3. Công cụ WireGuard (wg, wg-quick):
  4. Cấu hình Kernel Runtime (sysctl):
  5. Quản lý Firewall (firewalld, firewall-cmd):
  6. Quản lý Dịch vụ (systemctl):
Chia sẻ bài viết:

Đánh giá

0/5 - (0 Bình chọn)

Chưa có đánh giá.