Tại sao mình bỏ OpenVPN để sang WireGuard trên CentOS Stream 9?
Vài năm trước, OpenVPN là “món ruột” của mình mỗi khi cần setup truy cập nội bộ cho team trên CentOS 7. Nhưng thật lòng, việc đánh vật với hàng tá chứng chỉ CA, Cert, Key rắc rối chưa bao giờ là trải nghiệm dễ chịu. Chưa kể, OpenVPN chạy ở tầng User-space nên tốc độ thường bị nghẽn cổ chai trên các dòng VPS yếu.
Khi chuyển sang CentOS Stream 9, mình thử nghiệm WireGuard và thực sự bị thuyết phục. Điểm ăn tiền nhất là mã nguồn của nó chỉ khoảng 4.000 dòng code, trong khi OpenVPN nặng nề với hơn 100.000 dòng. Con số này không chỉ giúp hệ thống nhẹ hơn mà còn giúp các chuyên gia bảo mật dễ dàng kiểm soát lỗ hổng. Qua đo đạc thực tế, WireGuard cho throughput cao hơn khoảng 15-20% và độ trễ thấp hơn hẳn so với các giao thức cũ.
Nếu bạn muốn một hệ thống VPN “set and forget” (cài xong là chạy) trên CentOS Stream 9, WireGuard là lựa chọn không thể bỏ qua.
So sánh thực tế: WireGuard vs Các giải pháp cũ
Đừng chọn WireGuard chỉ vì nó mới. Hãy chọn vì nó giải quyết được những vấn đề nhức nhối của các giao thức truyền thống.
- OpenVPN: Hỗ trợ cả TCP/UDP nên rất linh hoạt để vượt tường lửa. Tuy nhiên, cấu hình cực kỳ cồng kềnh và ngốn CPU khi xử lý mã hóa.
- IPsec: Độ bảo mật cao nhưng là nỗi khiếp sợ của sysadmin khi phải cấu hình thủ công. Chỉ một sai sót nhỏ trong phase 1 hoặc phase 2 là kết nối sẽ thất bại ngay lập tức.
- WireGuard: Chạy trực tiếp trong Kernel-space của Linux, sử dụng mã hóa hiện đại như ChaCha20. Việc thiết lập nó đơn giản như cách bạn thêm một public key khi dùng SSH vậy.
Bảng so sánh nhanh
| Tiêu chí | WireGuard | OpenVPN |
|---|---|---|
| Hiệu năng | Cực nhanh, ít tốn pin thiết bị di động. | Trung bình, tốn tài nguyên. |
| Mã hóa | ChaCha20, Poly1305 (Hiện đại). | Dựa trên OpenSSL (Nhiều legacy code). |
| Cấu hình | Dưới 10 dòng config cơ bản. | File config dài hàng trang giấy. |
Kinh nghiệm của mình cho thấy: trừ khi bạn bị firewall chặn đứng cổng UDP, còn lại WireGuard luôn thắng thế về mọi mặt.
Các bước triển khai WireGuard trên CentOS Stream 9
Trước khi bắt đầu, hãy chắc chắn bạn có quyền root hoặc sudo. Đừng quên chạy dnf update để hệ thống ở trạng thái ổn định nhất.
Bước 1: Cài đặt Repository và Package
CentOS Stream 9 cần repo EPEL và đôi khi là ELRepo để lấy các bản build kernel module mới nhất.
sudo dnf install epel-release elrepo-release -y
sudo dnf install kmod-wireguard wireguard-tools -y
Bước 2: Khởi tạo cặp khóa bảo mật
WireGuard dùng cơ chế Key-pair tương tự SSH. Mỗi bên (Server và Client) cần một cặp khóa riêng để định danh nhau.
mkdir -p /etc/wireguard
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
Lúc này, file privatekey là tài sản vô giá, bạn tuyệt đối không được để lộ. File publickey sẽ dùng để khai báo với các thiết bị khách.
Bước 3: Thiết lập cấu hình Server
Bạn tạo file /etc/wireguard/wg0.conf. Đây là nơi định nghĩa IP nội bộ của VPN và cổng lắng nghe.
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = <Nội_dung_privatekey_server>
# Tự động hóa việc mở port và NAT bằng Firewall-cmd
PostUp = firewall-cmd --add-port=51820/udp; firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" masquerade';
PostDown = firewall-cmd --remove-port=51820/udp; firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.0.0.0/24" masquerade';
Bước 4: Mở luồng dữ liệu (Forwarding)
Để server có thể chuyển tiếp dữ liệu từ VPN ra internet, bạn phải bật IP Forwarding trong nhân Linux. Nếu thiếu bước này, bạn sẽ kết nối được VPN nhưng không thể vào được web.
echo "net.ipv4.ip_forward = 1" | sudo tee -at /etc/sysctl.conf
sudo sysctl -p
# Cấu hình Firewall vĩnh viễn
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
Bước 5: Kích hoạt dịch vụ
Khởi động interface wg0 và cho phép nó tự chạy mỗi khi reboot server bằng lệnh sau:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
Bước 6: Kết nối từ Client
Trên máy cá nhân (Windows/macOS), bạn tạo file config tương tự. Điểm quan trọng là phần Endpoint phải trỏ đúng về IP của server và cổng 51820.
[Interface]
PrivateKey = <Private_Key_Client>
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <Public_Key_Server>
Endpoint = <IP_Server_Của_Bạn>:51820
AllowedIPs = 0.0.0.0/0
Sau đó, đừng quên quay lại server để đăng ký client này: sudo wg set wg0 peer <Public_Key_Client> allowed-ips 10.0.0.2.
3 lưu ý “xương máu” khi triển khai thực tế
Sau vài lần “ăn hành” khi triển khai cho khách hàng, mình rút ra vài kinh nghiệm nhỏ giúp bạn tiết kiệm hàng giờ debug:
- Vấn đề MTU: Nếu bạn thấy VPN kết nối tốt nhưng vào Facebook hay Youtube xoay vòng vòng, hãy thử hạ MTU xuống 1380 hoặc 1420 trong file config client. Đây là lỗi phổ biến do quá trình đóng gói gói tin bị quá kích thước cho phép của nhà mạng.
- Duy trì kết nối (Keepalive): Nếu client nằm sau các router có firewall gắt gao, kết nối thường bị ngắt sau vài phút idle. Hãy thêm
PersistentKeepalive = 25vào config client để giữ tunnel luôn mở. - SELinux: Trên CentOS Stream 9, SELinux đôi khi chặn WireGuard đọc file key. Nếu gặp lỗi
Permission denieddù đã chạy sudo, hãy kiểm tra lại context của thư mục/etc/wireguard.
WireGuard thực sự là một cuộc cách mạng về VPN. Việc cài đặt trên CentOS Stream 9 hiện tại đã rất mượt mà nhờ hỗ trợ tốt từ nhân Linux mới. Chúc các bạn thiết lập thành công hệ thống kết nối an toàn cho riêng mình!

