NỘI DUNG
Tiếp theo nội dung Bảo mật kết nối VPN – Phần 3: Thiết lập cấu hình cho OpenVPN server, kỳ này tôi sẽ chuyển sang xử lý OpenVPN client. Các nội dung giới thiệu trong kỳ này bao gồm:
- Thiết lập cơ sở để sản xuất client configuration;
- Khởi tạo client configuration;
- Cài cắm OpenVPN client trên Ubuntu 22.04 và kết nối đến OpenVPN server;
- Thu hồi Client Certificate.
Lưu ý: Nội dung kỳ này có thể xem là phần cập nhật của bài Hướng dẫn tạo VPN Server miễn phí từ A đến Z – Phần 6: Các bước tạo Client Config trên VPN Server và cài đặt phần mềm VPN trên VPN Client.
#1. Thiết lập cơ sở để sản xuất công nghiệp client configuration
Với trường hợp một mình – một server – một thiết bị, bạn có thể bỏ qua bước chuẩn bị này. Trường hợp có kế hoạch sử dụng nhiều hơn 1 thiết bị, bạn sẽ cần chuẩn bị 2 thứ:
- File cấu hình chứa các thiết lập cơ sở (conf) cho các client configuration;
- Script để khởi tạo client configuration (sh).
#1.1 Thiết lập cấu hình cơ sở – base.conf
Với file thiết lập cơ sở base.conf, ở lần đầu thiết lập, như mọi khi, tôi sẽ đi chôm hàng mẫu về chỉnh sửa lại cho đỡ tốn công. Trước hết tôi sẽ tạo nơi chứa hàng.
mkdir -p ~/client-configs/files
Sau đó tuồn hàng vào vị trí với command:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Và sau đó kiểm tra để xác nhận hàng đã về đúng nơi đúng chỗ.
ls -l ~/client-configs/

Tiếp theo, tôi sẽ mở file base.conf để tiến hành mông má lại cái OpenVPN server IP và port như sau.
nano ~/client-configs/base.conf
remote 192.168.64.132 1194

Ở chỗ này bạn cần lưu ý điều chỉnh cái IP (đây là public IP address của OpenVPN server) và port tương ứng với giá trị đã thiết lập tương ứng trên VPN server trước đó. Ngoài ra, bạn cũng sẽ cần kiểm tra (và cập nhật – nếu cần) ở một số vị trí khác bao gồm:
proto udp # Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
cipher AES-256-GCM
auth SHA256
key-direction 1
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
Ở đây, tôi thấy có một số điểm cần lưu ý:
- Cái proto, user, group, cipher và auth phải khớp với thông tin đã thiết lập trên OpenVPN server;
- Đám ca, cert, key và tls-auth tạm thời sẽ được comment với “;“. Phần này sẽ được xử lý ở mục tiếp theo;
- Cái key-direction sẽ được thiết lập là 1 cho VPN client;
- Hai phần còn lại nhằm phục vụ cho DNS resolution của Linux based VPN client (tương ứng với 2 phương án sử dụng resolvconf và systemd-resolved). Các nội dung này tạm thời cũng sẽ đều được comment với “;“. Lý do đám này được đưa vào là nhằm để triển nhanh việc cấu hình cho đám Linux based VPN client khi cần.
#1.2 Script khởi tạo client configuration – make_config.sh
Tiếp theo, tôi tiến hành chuẩn bị cái script make_config.sh để hỗ trợ việc cấu hình client configuration cho nhanh gọn lẹ. Cụ thể, con hàng này sẽ lấy đầu vào là đám key/cert đã chuẩn bị trong ~/client-configs/keys để tuồn vào bản copy của file base.conf ở trên và sau đó phọt kết quả đã mông má tương ứng ra vị trí ~/client-configs/files. Công việc này có thể có thể triển với cái bash script như sau.
nano ~/client-configs/make_config.sh
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn

Lưu ý: Tôi có giới thiệu về bash script trong các nội dung thuộc mục Bash Script Archives – Dummytip. Bạn có thể xem thêm nếu cần.
Ở bước cuối cùng trong phần này, tôi sẽ tiến hành phân quyền tương ứng cho cái script make_config.sh.
chmod 700 ~/client-configs/make_config.sh

Như vậy, mỗi khi cần bổ sung thêm VPN client mới, tôi sẽ chỉ cần tạo và đẩy các key/cert vào vị trí tương ứng như đã làm trong kỳ trước. Sau đó tôi có thể bắt đầu sản xuất công nghiệp các client configuration với make_config.sh.
#2. Khởi tạo client configuration
Quá trình chuẩn bị đã xong, giờ tôi có thể rung đùi và triển phần khởi tạo client configuration với các command.
cd ~/client-configs
./make_config.sh client1
ls ~/client-configs/files

Dễ thấy, tôi đã khởi tạo thành công client configuration client1.ovpn tại vị trí ~/client-configs/files.
Công việc kế tiếp chắc bạn cũng dễ dàng đoán được. Tôi sẽ hốt cái client configuation này về máy client tương ứng. Ở đây có nhiều phương án triển khai, ví dụ với scp command như sau.
scp test1@192.168.64.132:/tmp/client1.ovpn ~/
Lưu ý:
- Cái tên client1 là do tôi đặt kiểu mì ăn liền phục vụ demo, thực tế bạn nên đặt tên nghiêm chỉnh để tiện quản lý khi có nhiều client;
- Ở lần đầu khởi tạo client configuration, bạn nên hốt cả 2 file conf và make_config.sh sao lưu về local machine nào đấy dự phòng để khi cần thì móc hàng ra đẩy lên OpenVPN server luôn cho nhanh.
#3. Cài cắm OpenVPN client cho Ubuntu 22.04 và kết nối đến OpenVPN server
Do việc cài cắm VPN client cho Windows và Android device tôi đã đề cập trong nội dung Hướng dẫn tạo VPN Server miễn phí từ A đến Z – Phần 6: Các bước tạo Client Config trên VPN Server và cài đặt phần mềm VPN trên VPN Client nên sẽ không nhắc lại ở đây.
Trong nội dung này, tôi sẽ tập trung vào một đối tượng phổ biến khác là Linux based machine (nếu bạn đang dùng macOS thì vui lòng comment). Và để phù hợp với tinh thần chung của series này, tôi sẽ tập trung demo cho cái Ubuntu 22.04.
Quá trình cài cắm OpenVPN client sẽ thông qua các bước như sau:
sudo apt update
sudo apt install openvpn
Như đề cập ở Mục 1.1, tôi tiến hành kiểm tra và xác nhận Ubuntu 22.04 machine đang sử dụng systemd-resolved.
cat /etc/resolv.conf

Và với Linux based VPN client sử dụng systemd-resolved phục vụ cho DNS resolution, tôi sẽ cần bỏ comment (dấu “;“) để kích hoạt cái đám sau đây trong file client1.ovpn.
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE
sudo nano client1.ovpn

Đến đây tôi có thể kết nối đến Open VPN server với command.
sudo openvpn --config client1.ovpn
#4. Thu hồi client certificate
Trong quá trình tác nghiệp, nếu vì lí do nào đó, bạn muốn triệt hạ một thằng OpenVPN client cụ thể (ví dụ client1) thì quá trình xử lý sẽ bao gồm các bước như sau.
Ở CA Server, tôi sẽ cần di chuyển đến thư mục ~/easyrsa quen thuộc và tiến hành thu hồi certificate của đối tượng với command:
./easyrsa revoke client1
Sau khi xác nhận việc thu hồi, tôi sẽ cần tạo file CA’s Certigicate Revocation List – CRL để OpenVPN server biết được ý đồ triệt hạ client1 của tôi. Công việc này sẽ được triển với command:
./easyrsa gen-crl
Kế tiếp, tôi hốt file crl.pem vừa mới sáng tác về OpenVPN server (ví dụ đút vô thư mục /tmp).
Chuyển qua OpenVPN server, tôi copy file crl.pem vào vị trí /etc/openvpn/server/.
sudo cp /tmp/crl.pem
Tiếp theo, tôi mở file cấu hình của OpenVPN server.
sudo nano /etc/openvpn/server/server.conf
Rồi nhét vào file cấu hình dòng kiểm tra việc thu hồi certificate mỗi khi có kết nối đến OpenVPN server:
crl-verify crl.pem
Sau đó tôi khởi động lại OpenVPN server và chờ con hàng OpenVPN client bị thu hồi certificate rên xiết vì không thể kết nối.
sudo systemctl restart openvpn-server@server.service
Phù, đến đây coi như tôi đã hoàn thành xong lời hứa năm xưa về cập nhật “Hướng dẫn tạo VPN Server miễn phí từ A đến Z” trên bản Ubuntu 22.04. Vì quá trình thực hiện hơi dông dài nên đâu đó trong quá trình thực hiện, có thể bạn sẽ gặp các lỗi phát sinh thêm. Việc này có thể là do các điểm nhầm lẫn trong lúc cấu hình, do sự sai khác của hệ thống bạn đang sử dụng với các VM tôi đang demo, do định mệnh (hoặc có khi do tôi hướng dẫn tào lao?!!). Nếu sau khi đã kiểm tra chán chê mà vẫn không xử lý được, bạn vui lòng để lại comment để tôi (cười cợt và) cùng tìm cách fix lỗi với bạn.