Cách Cài Đặt OpenVPN Server trên Ubuntu: Hướng Dẫn Thực Tế

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

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-laptop sau đó ./easyrsa gen-crl. Thêm crl-verify crl.pem và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-laptop hoặc bob-phone ngay 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.ovpn trự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.

Share: