Mở đầu: Tại sao chọn CentOS Stream 9 và OpenVPN?
Kể từ khi CentOS 7 chính thức “về hưu”, mình đã dành 6 tháng chạy thử nghiệm VPN cho đội ngũ 50 nhân viên remote trên nền tảng CentOS Stream 9. Kết quả thực tế rất ấn tượng: hệ thống duy trì uptime 99.9%, tiêu tốn chưa đến 200MB RAM ở trạng thái nhàn rỗi và tương thích hoàn hảo với các bản vá bảo mật mới nhất.
Thiết lập VPN cho môi trường production không chỉ dừng lại ở việc cài package. Bạn cần đặc biệt lưu ý đến xác thực chứng chỉ, quản lý firewall và cấu hình SELinux. Đa số quản trị viên thường tắt (disable) SELinux để tránh rắc rối. Tuy nhiên, mình khuyên bạn đừng làm thế. Bài viết này sẽ hướng dẫn cách cấu hình để OpenVPN và SELinux “sống chung hạnh phúc”.
Quick Start: Cài đặt OpenVPN trong 5 phút
Nếu bạn cần một server VPN dự phòng gấp, script từ cộng đồng là lựa chọn tối ưu. Script của Angristan hiện có hơn 20k stars trên GitHub, cực kỳ uy tín và sạch sẽ.
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
sudo ./openvpn-install.sh
Script sẽ tự động hỏi IP, giao thức (hãy chọn UDP) và DNS. Nó xử lý toàn bộ khâu Easy-RSA và xuất file .ovpn cho client. Để tùy biến sâu cho doanh nghiệp, hãy cùng mình đi vào các bước thủ công dưới đây.
Bước 1: Chuẩn bị môi trường và cài đặt Package
CentOS Stream 9 mặc định không có OpenVPN. Bạn cần kích hoạt repo EPEL (Extra Packages for Enterprise Linux) trước khi cài đặt. Thiếu bước này, lệnh cài đặt chắc chắn sẽ báo lỗi No package available.
sudo dnf install epel-release -y
sudo dnf update -y
sudo dnf install openvpn easy-rsa -y
Bước 2: Khởi tạo PKI với Easy-RSA
OpenVPN xác thực bằng chứng chỉ số thay vì mật khẩu thông thường để tăng tính bảo mật. Chúng ta sẽ dùng Easy-RSA để tạo Certificate Authority (CA) riêng. Mình thường lưu thư mục này tại /etc/openvpn/easy-rsa để quản lý tập trung.
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
Tiếp theo, hãy tạo chứng chỉ cho Server và các tham số Diffie-Hellman. Lưu ý: Quá trình gen-dh có thể mất vài phút tùy vào hiệu năng CPU của bạn.
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret ta.key
File ta.key (TLS-Auth) là lớp bảo vệ bổ sung. Nó giúp server từ chối các gói tin lạ ngay lập tức, chống lại các cuộc tấn công DoS và port scanning hiệu quả.
Bước 3: Cấu hình OpenVPN Server
Di chuyển các file chứng chỉ quan trọng vào thư mục thực thi của OpenVPN:
cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/
Tạo file cấu hình /etc/openvpn/server/server.conf. Ở đây mình sử dụng mã hóa AES-256-GCM. Đây là chuẩn mã hóa hiện đại, cho tốc độ xử lý nhanh hơn trên các CPU hỗ trợ tập lệnh AES-NI.
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
user nobody
group nobody
persist-key
persist-tun
verb 3
Bước 4: Cấu hình Network và Firewall
Để client có thể truy cập internet qua VPN, bạn phải bật IP Forwarding. Mình từng mất trắng một buổi sáng chỉ vì quên dòng này khi chuyển từ CentOS 7 sang bản 9.
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-openvpn.conf
sudo sysctl -p /etc/sysctl.d/99-openvpn.conf
Tiếp theo, mở port 1194 và bật tính năng NAT (Masquerade) trên Firewalld:
sudo firewall-cmd --permanent --add-port=1194/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
Bước 5: Xử lý SELinux – Đừng tắt, hãy hiểu nó!
Nếu khởi động OpenVPN ngay, bạn sẽ gặp lỗi Permission denied. Thay vì dùng setenforce 0 đầy rủi ro, hãy gán nhãn đúng context cho các file cấu hình. Việc này chỉ mất 10 giây nhưng giúp server của bạn an toàn hơn rất nhiều.
sudo chcon -R -t openvpn_etc_t /etc/openvpn/server/
sudo restorecon -Rv /etc/openvpn/server/
Khởi động và Kiểm tra
Kích hoạt dịch vụ chạy cùng hệ thống:
sudo systemctl enable --now openvpn-server@server
Dùng lệnh systemctl status openvpn-server@server để kiểm tra. Nếu thấy trạng thái active (running) màu xanh, server của bạn đã sẵn sàng phục vụ.
Kinh nghiệm thực tế từ hiện trường
1. Ưu tiên UDP thay vì TCP
TCP trong VPN thường gây ra hiện tượng “TCP Meltdown”. Khi có packet loss, tốc độ sẽ sụt giảm thê thảm do cơ chế truyền lại chồng chéo. Với UDP, độ trễ (latency) sẽ thấp hơn đáng kể, phù hợp cho cả họp online và làm việc từ xa.
2. Quản lý chứng chỉ Client chặt chẽ
Đừng bao giờ dùng chung một chứng chỉ cho nhiều người. Khi một nhân viên nghỉ việc, bạn có thể thu hồi (revoke) chứng chỉ của riêng họ mà không làm gián đoạn kết nối của toàn bộ công ty.
3. Theo dõi Log thời gian thực
Mọi vấn đề kết nối đều nằm ở /etc/openvpn/server/openvpn-status.log. Khi client báo lỗi, hãy kiểm tra log này đầu tiên để biết do sai chứng chỉ hay do firewall chặn.
CentOS Stream 9 và OpenVPN là cặp bài trùng mạnh mẽ cho doanh nghiệp. Chỉ cần chú ý một chút về SELinux, bạn sẽ có một hệ thống VPN bảo mật cấp độ cao với chi phí bản quyền bằng 0.

