Cài đặt OpenVPN trong 5 phút với script tự động
Nếu bạn cần VPN server chạy ngay mà không muốn ngồi cấu hình thủ công từng bước, script openvpn-install là lựa chọn nhanh nhất. Mình dùng script này cho các dự án staging hoặc demo cần triển khai nhanh.
# Tải và chạy script cài đặt tự động
wget https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
sudo bash openvpn-install.sh
Script hỏi bạn vài thông tin: IP server, port, DNS, tên client. Khoảng 2-3 phút sau, bạn có file .ovpn sẵn để import. Đơn giản vậy thôi.
Production thì khác chuyện. Khi cần kiểm soát cipher nào, subnet nào, log ra đâu — cài thủ công mới đủ linh hoạt. Phần dưới mình đi từng bước chi tiết.
Cài đặt thủ công OpenVPN trên Ubuntu 22.04
Bước 1: Cài đặt package
sudo apt update
sudo apt install -y openvpn easy-rsa
Bước 2: Tạo Certificate Authority (CA)
Easy-RSA 3.x (bản đi kèm Ubuntu 22.04) là bộ tool quản lý PKI khá tiện. Mình tách CA ra thư mục riêng — sau này revoke certificate hay sign thêm client mới tìm nhanh hơn, không lẫn vào config OpenVPN.
# Tạo thư mục PKI
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
# Khởi tạo PKI và tạo CA
./easyrsa init-pki
./easyrsa build-ca nopass
build-ca nopass tạo CA không có passphrase — server tự restart không bị stuck chờ nhập password. Nếu CA này quản lý nhiều service quan trọng, bỏ nopass để bảo mật hơn.
Bước 3: Tạo certificate cho server
# Tạo server certificate và private key
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# Tạo Diffie-Hellman parameters (VPS 2 vCPU mất khoảng 30-60 giây)
./easyrsa gen-dh
# Tạo TLS Auth key (chống DDoS và replay attack)
openvpn --genkey secret ta.key
Bước 4: Sao chép file vào thư mục OpenVPN
sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt /etc/openvpn/server/
sudo cp pki/dh.pem ta.key /etc/openvpn/server/
Bước 5: Tạo file cấu hình server
sudo nano /etc/openvpn/server/server.conf
Config dưới đây là phiên bản mình đang dùng thực tế, đã điều chỉnh qua nhiều lần deploy:
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/server/ta.key 0
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
Bước 6: Bật IP forwarding và khởi động service
# Bật IP forwarding
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Cấu hình iptables để forward traffic
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# Khởi động OpenVPN
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server
Tạo certificate cho client
cd ~/openvpn-ca
# Tạo certificate cho client (thay "client1" bằng tên thực)
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
Tiếp theo tạo file client1.ovpn để client import:
cat > ~/client1.ovpn << EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
verb 3
key-direction 1
<ca>
$(cat ~/openvpn-ca/pki/ca.crt)
</ca>
<cert>
$(cat ~/openvpn-ca/pki/issued/client1.crt)
</cert>
<key>
$(cat ~/openvpn-ca/pki/private/client1.key)
</key>
<tls-auth>
$(cat ~/openvpn-ca/ta.key)
</tls-auth>
EOF
Cấu hình nâng cao
Chạy OpenVPN trên port 443 TCP để bypass firewall
Mạng công ty, khách sạn, coworking space hay block UDP/1194. Chạy trên TCP/443 thì traffic trông giống HTTPS — hầu hết firewall corporate đều cho qua.
# Sửa trong server.conf
port 443
proto tcp
Đánh đổi: TCP-over-TCP tạo double overhead, latency tăng thêm 20-40ms so với UDP tùy route. Chỉ bật khi UDP thực sự bị chặn.
Giới hạn client chỉ route traffic cần thiết (Split Tunneling)
Full tunnel redirect toàn bộ traffic qua VPN — kể cả lúc nhân viên xem YouTube. Lãng phí bandwidth server và tăng latency không cần thiết. Split tunneling chỉ route traffic đến internal subnet, còn lại đi thẳng qua ISP của user.
# Bỏ dòng redirect-gateway, thay bằng route cụ thể
# push "redirect-gateway def1 bypass-dhcp" # Bỏ dòng này
push "route 192.168.1.0 255.255.255.0" # Chỉ route internal subnet
Thu hồi certificate khi nhân viên nghỉ việc
cd ~/openvpn-ca
./easyrsa revoke client1
./easyrsa gen-crl
# Copy CRL vào OpenVPN
sudo cp pki/crl.pem /etc/openvpn/server/
# Thêm vào /etc/openvpn/server/server.conf nếu chưa có
echo "crl-verify /etc/openvpn/server/crl.pem" | sudo tee -a /etc/openvpn/server/server.conf
sudo systemctl restart openvpn-server@server
Tips thực chiến từ kinh nghiệm audit
Sau khi audit hơn 10 server, pattern lặp đi lặp lại: VPN chạy được nhưng cấu hình có lỗ hổng ngay từ đầu. Checklist mình luôn đi qua khi review:
- Không dùng cipher cũ: Tránh
BF-CBC(Blowfish) hayAES-128-CBC. DùngAES-256-GCM— AEAD cipher vừa encrypt vừa authenticate data trong cùng một bước, không cần thêmauthdirective riêng. - Bật tls-auth hoặc tls-crypt:
tls-auththêm HMAC signature vào mọi packet — packet không hợp lệ bị drop trước khi decrypt.tls-cryptcòn encrypt thêm cả TLS handshake. Mình ưu tiêntls-crypt. - Dùng tls-version-min 1.2: Thêm dòng này vào server.conf để disable TLS 1.0 và 1.1.
- Firewall UFW: Đừng quên mở port và cho phép forwarding:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
# Thêm vào /etc/ufw/before.rules (trước dòng *filter)
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
- Một certificate một thiết bị: Đặt tên theo quy ước
user_device— ví dụnam_laptop,nam_phone. Khi cần block một thiết bị, thu hồi đúng certificate mà không ảnh hưởng thiết bị khác của cùng người dùng. - Monitor log thường xuyên:
/var/log/openvpn-status.loghiển thị realtime ai đang kết nối và từ IP nào. Kết hợp fail2ban để tự block IP có nhiều lần auth thất bại liên tiếp.
Kiểm tra kết nối từ client
# Linux/macOS
sudo openvpn --config client1.ovpn
# Kiểm tra IP sau khi kết nối
curl ifconfig.me
# Phải ra IP của VPN server
Windows dùng OpenVPN Connect (Microsoft Store), macOS có Tunnelblick, iOS và Android cũng có OpenVPN Connect app — tất cả import file .ovpn theo cách tương tự.
Hay quên nhất: sau khi sửa server.conf, nhớ restart service và xem log ngay để catch lỗi kịp thời.
sudo systemctl restart openvpn-server@server
sudo journalctl -u openvpn-server@server -f
VPN chạy được không có nghĩa là xong việc — đây chỉ là một lớp trong defense-in-depth. Thêm SSH key-only authentication (tắt hẳn password login), network segmentation giữa các VLAN, và alert khi có IP lạ kết nối. Kết hợp đủ ba thứ đó mới thực sự yên tâm.

