Vấn Đề Với Truy Cập Từ Xa Không Được Bảo Vệ
Mỗi lần tôi thiết lập hạ tầng cho một dự án mới, câu hỏi quen thuộc lại xuất hiện: làm thế nào để cho phép developer truy cập an toàn vào các dịch vụ nội bộ mà không phơi bày chúng ra public internet? SSH xử lý ổn với từng server riêng lẻ. Nhưng khi bạn có một database riêng tư, một dashboard nội bộ, hay môi trường staging, bạn cần thứ gì đó tạo ra một tunnel mạng thực sự — không chỉ là forward port một lần.
OpenVPN là thứ tôi luôn quay lại sử dụng. Nó đã có mặt từ năm 2001, chạy được trên hầu hết mọi nền tảng, và hoạt động ổn định trong những điều kiện mà một giải pháp cài đặt vội vàng sẽ sụp đổ. Sau khi thiết lập đúng cách, kết nối đến mạng từ xa cảm giác không khác gì đang cắm trực tiếp vào mạng nội bộ. Hướng dẫn này đi qua toàn bộ quá trình đó — từ một server Ubuntu 22.04 trống đến một VPN hoạt động hoàn chỉnh với client config sẵn sàng bàn giao.
Các Khái Niệm Cơ Bản Trước Khi Mở Terminal
Có một vài thứ đáng hiểu trước. Bỏ qua phần này và bạn sẽ mất gấp đôi thời gian debug sau này.
PKI: Tại Sao Certificate Quan Trọng
OpenVPN sử dụng Public Key Infrastructure (PKI) để xác thực cả server lẫn từng client. Mỗi thiết bị kết nối đều cần certificate riêng — không chỉ username và password. Bộ công cụ quản lý điều này được gọi là Easy-RSA, đi kèm với OpenVPN.
Các thành phần chính trong PKI của bạn:
- CA (Certificate Authority) — gốc của sự tin tưởng. Ký tất cả mọi thứ khác.
- Server certificate — chứng minh với client rằng họ đang kết nối đến server thật, không phải kẻ giả mạo.
- Client certificates — chứng minh với server rằng thiết bị đang kết nối thực sự được phép.
- Diffie-Hellman parameters — dùng để trao đổi khóa trong quá trình handshake.
- TLS Auth key (ta.key) — một lớp HMAC bổ sung loại bỏ các gói tin chưa được ký trước khi chúng tiếp cận stack xử lý của OpenVPN.
Routing vs. Bridging
Có hai chế độ: routed (TUN) và bridged (TAP). Đối với truy cập từ xa, VPN nhóm, và hạ tầng tự host, TUN là thứ bạn cần. Nó tạo ra một network interface ảo và định tuyến lưu lượng ở Layer 3. TAP bridge ở Layer 2 — hiếm khi cần thiết, phức tạp hơn để quản lý, và không được đề cập ở đây.
Hướng dẫn này sử dụng chế độ TUN trên cổng 1194 UDP — chuẩn mặc định của OpenVPN.
Thực Hành: Cài Đặt OpenVPN Server
1. Cài Đặt OpenVPN và Easy-RSA
Bắt đầu với một server Ubuntu 22.04 mới. Cập nhật, rồi cài cả hai package:
sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y
2. Xây Dựng Hạ Tầng PKI
Thiết lập thư mục Easy-RSA và khởi tạo PKI:
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
Xây dựng Certificate Authority. Bạn sẽ được yêu cầu nhập tên CA — tên ngắn gọn như tên tổ chức của bạn là ổn:
./easyrsa build-ca nopass
Tạo server certificate và key. Flag nopass bỏ qua passphrase cho server key, giúp OpenVPN có thể tự động khởi động khi boot:
./easyrsa gen-req server nopass
./easyrsa sign-req server server
Nhập yes khi được yêu cầu xác nhận. Sau đó tạo các Diffie-Hellman parameters — bước này mất từ 30 giây đến vài phút tùy vào phần cứng của bạn:
./easyrsa gen-dh
Cuối cùng, tạo TLS auth key:
openvpn --genkey secret ta.key
3. Sao Chép Certificates vào Thư Mục OpenVPN
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/
4. Cấu Hình OpenVPN Server
OpenVPN đi kèm với các config mẫu. Sao chép template server làm điểm xuất phát:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/server.conf
Mở nó để chỉnh sửa:
sudo nano /etc/openvpn/server/server.conf
Các cài đặt quan trọng cần điều chỉnh:
# Trỏ đến các file certificate
ca ca.crt
cert server.crt
key server.key
dh dh.pem
# Bật TLS auth
tls-auth ta.key 0
# AES-256-CBC hoạt động trên mọi client; OpenVPN 2.5+ cũng hỗ trợ:
# data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher AES-256-CBC
# Đẩy DNS và route mặc định đến client
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Keepalive: ping mỗi 10s, khởi động lại nếu không có phản hồi trong 120s
keepalive 10 120
# Bỏ quyền root sau khi khởi động
user nobody
group nogroup
Một lưu ý về directive redirect-gateway: nó định tuyến toàn bộ lưu lượng client qua VPN. Thường thì đây là điều bạn muốn vì lý do bảo mật, nhưng nếu bạn chỉ cần client truy cập vào các tài nguyên nội bộ, hãy xóa dòng đó và push các route cụ thể thay vào đó.
5. Bật IP Forwarding
Nếu không có điều này, VPN client sẽ bị kẹt — họ có thể đến được VPN server nhưng không thể tiếp cận bất cứ thứ gì phía sau nó. Đây là thứ đầu tiên tôi quên trong lần cài đặt đầu tiên. Đừng lặp lại sai lầm đó:
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
6. Cấu Hình Firewall và NAT
Tìm network interface chính của bạn:
ip route | grep default
Thiết lập NAT masquerading để lưu lượng VPN có thể tiếp cận internet (thay eth0 bằng tên interface thực của bạn):
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
Sau đó mở cổng OpenVPN và đảm bảo SSH vẫn có thể truy cập:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw enable
7. Khởi Động và Bật Service
sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@server
sudo systemctl status openvpn-server@server
Tìm active (running) trong output status. Bạn cũng sẽ thấy interface tun0 xuất hiện:
ip addr show tun0
8. Tạo Client Certificate
Mỗi thiết bị kết nối cần certificate riêng. Dùng tên mô tả — bạn sẽ cảm ơn bản thân khi đến lúc cần thu hồi:
cd ~/openvpn-ca
./easyrsa gen-req alice-laptop nopass
./easyrsa sign-req client alice-laptop
9. Tạo File Cấu Hình Client
Cách gọn gàng nhất là inline config — tất cả đóng gói vào một file .ovpn. Người dùng cuối không phải quản lý certificate rời rạc:
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-CBC
verb 3
key-direction 1
<ca>
# dán nội dung của ca.crt
</ca>
<cert>
# dán nội dung của alice-laptop.crt
</cert>
<key>
# dán nội dung của alice-laptop.key
</key>
<tls-auth>
# dán nội dung của ta.key
</tls-auth>
Làm thủ công một lần thì ổn. Đối với nhiều client, hãy viết một script bash ngắn tự động đọc từng file cert và nhúng vào. Đưa cho ai đó một file .ovpn duy nhất và họ kết nối được trong chưa đầy một phút — không cần hướng dẫn gì thêm.
Một Số Điều Tôi Học Được Từ Thực Tế
- Thu hồi certificate khi mất thiết bị hoặc nhân viên nghỉ việc. Easy-RSA có hỗ trợ:
./easyrsa revoke alice-laptopsau đó./easyrsa gen-crl. Thêmcrl-verify crl.pemvào server config để cert bị thu hồi thực sự bị từ chối — không có dòng đó, file CRL sẽ bị bỏ qua. - Đừng tái sử dụng tên certificate. Một khi tên đã được ký, sử dụng lại nó gây ra xung đột certificate rất khó gỡ rối. Dùng tên như
alice-laptophoặcbob-phonengay từ đầu. - UDP tốt hơn TCP cho VPN, hầu như luôn vậy. OpenVPN qua TCP tạo ra tình huống TCP-over-TCP — khi lớp TCP bên ngoài truyền lại, stack TCP bên trong cũng truyền lại, làm trầm trọng thêm tình trạng mất gói thay vì xử lý nó. UDP tránh được điều này hoàn toàn. Chỉ dùng TCP khi bạn đang ở sau firewall chặn UDP 1194.
- Kiểm tra bằng terminal trước khi import vào GUI client. Chạy
openvpn --config alice-laptop.ovpntrực tiếp. Terminal hiển thị thông báo lỗi chính xác. GUI client nuốt chúng im lặng, khiến bạn phải đoán mò.
Kết Luận
Một OpenVPN server được cấu hình đúng cách cho bạn một tunnel mã hóa ổn định mà bạn thực sự có thể tin tưởng — không phải loại bị ngắt khi điều kiện không ổn định. Thiết lập PKI trông đáng sợ khi đọc lần đầu. Nhưng đơn giản hóa xuống thì thực ra chỉ là một CA ký certificate cho cả hai phía. Khi bạn hiểu được mô hình tư duy đó, phần còn lại chỉ là các lệnh.
Các bước tiếp theo đáng cân nhắc: tự động hóa việc tạo client config bằng bash script, bật management interface để giám sát kết nối đang hoạt động theo thời gian thực, hoặc tích hợp LDAP để xác thực tập trung cho cả nhóm. Đối với hầu hết các thiết lập — đặc biệt là những thiết lập thay thế mạng lưới chắp vá của SSH tunnel — những gì bạn đã xây dựng ở đây đã đủ vững chắc để triển khai.

