Tập tin:OpenVPN logo.svg – Wikipedia tiếng Việt

 

 


1. Giới thiệu

OpenVPN là một giải pháp VPN mã nguồn mở, mạnh mẽ và linh hoạt, cho phép tạo kết nối an toàn giữa client và server thông qua Internet. Ngoài hình thức xác thực bằng chứng chỉ (certificate) tiêu chuẩn, OpenVPN còn hỗ trợ xác thực bằng tài khoản/mật khẩu thông qua PAM (Pluggable Authentication Modules).

Bài viết này hướng dẫn chi tiết cách triển khai OpenVPN Server sử dụng xác thực Username/Password (PAM) trên Ubuntu Server 24.04, phù hợp cho việc quản lý người dùng tập trung và đơn giản hóa quá trình kết nối.

Mô hình triển khai

Thành phần Chi tiết
Server OS Ubuntu Server 24.04
VPN Software OpenVPN
Cơ chế xác thực PAM (sử dụng tài khoản hệ thống Linux cục bộ)
Client Windows / Linux / macOS / Mobile

Luồng xác thực: Client → OpenVPN Server → PAM → User hệ thống Linux


2. Chuẩn bị Hệ thống và Cài đặt Các Gói Cần thiết

Đảm bảo hệ thống của bạn được cập nhật và cài đặt các gói cần thiết, bao gồm OpenVPN, plugin PAM để tích hợp xác thực, và easy-rsa (công cụ đơn giản hóa việc tạo ra các chứng chỉ và khóa mã hóa TLS/SSL cần thiết cho Server).

# Cập nhật hệ thống
sudo apt update
sudo apt upgrade -y

# Cài đặt OpenVPN, Plugin PAM (libpam-openvpn) và Easy-RSA
sudo apt install openvpn libpam-openvpn easy-rsa -y

3. Thiết lập Cơ sở hạ tầng Khóa công khai (PKI) Tối thiểu

Mặc dù chúng ta sử dụng mật khẩu để xác thực người dùng, OpenVPN vẫn yêu cầu chứng chỉ Server (TLS/SSL) để mã hóa đường hầm kết nối.

3.1. Tạo CA và Khóa Server

Sử dụng easy-rsa để tạo các tệp mã hóa quan trọng, là nền tảng bảo mật cho đường hầm VPN. OpenVPN bắt buộc phải có các thành phần này, ngay cả khi bạn dùng xác thực bằng mật khẩu (PAM).

Tệp/Thành phần
Công dụng trong OpenVPN
CA (ca.crt)
Cơ quan cấp Chứng chỉ gốc. Được dùng để xác nhận và tin cậy chứng chỉ Server.
Chứng chỉ Server
Dùng để Server chứng minh danh tính và mã hóa lưu lượng TLS/SSL với Client.
Khóa Diffie-Hellman (dh.pem)
Cho phép Server và Client trao đổi khóa mã hóa một cách an toàn.
Khóa TLS Auth (ta.key)
Khóa tĩnh bổ sung dùng để chống tấn công DoS và Replay (Xác thực HMAC).
# Thiết lập môi trường easy-rsa
make-cadir ~/openvpn-ca
cd ~/openvpn-ca

# Khởi tạo PKI và Tạo CA (Certificate Authority)
./easyrsa init-pki
./easyrsa build-ca nopass

# Tạo Chứng chỉ và Khóa Server (đặt tên là server)
./easyrsa gen-req server nopass
./easyrsa sign-req server server

# Tạo khóa Diffie-Hellman (Quá trình này có thể mất một chút thời gian)
./easyrsa gen-dh

# Tạo khóa TLS Auth tĩnh (Tăng cường bảo mật và chống tấn công Replay)
openvpn --genkey --secret ta.key

3.2. Sao chép các tệp cần thiết

Sao chép tất cả các tệp chứng chỉ và khóa đã tạo vào thư mục cấu hình OpenVPN:

sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/

4. Cấu hình OpenVPN Server (server.conf)

Tạo hoặc chỉnh sửa tệp cấu hình server tại /etc/openvpn/server.conf. Lưu ý dòng plugin là chìa khóa để kích hoạt xác thực PAM.

sudo nano /etc/openvpn/server.conf

Nội dung cấu hình:

# 1. Cổng và Giao thức
port 1194
proto udp
dev tun

# 2. Cấu hình PKI cho TLS/SSL
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

# 3. Cấu hình Mạng VPN
server 10.8.0.0 255.255.255.0  # Dải IP nội bộ VPN (Tunnel Network)
push "redirect-gateway def1 bypass-dhcp" # Chuyển hướng toàn bộ lưu lượng
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# 4. Xác thực PAM (Quan trọng)
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn

# 5. Cài đặt Bảo mật & Tối ưu
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
comp-lzo auto
status /var/log/openvpn-status.log
verb 3

5. Thiết lập Cấu hình PAM

Tạo tệp cấu hình PAM riêng cho dịch vụ OpenVPN tại /etc/pam.d/openvpn. Tệp này sẽ chỉ định cách PAM xác thực người dùng.

sudo nano /etc/pam.d/openvpn

Sử dụng cấu hình sau để cho phép OpenVPN sử dụng Tài khoản Linux Cục bộ (/etc/passwd/etc/shadow):

# Cấu hình sử dụng module pam_unix.so cho xác thực (auth) và tài khoản (account)
auth required pam_unix.so
account required pam_unix.so

Tạo Tài khoản Người dùng

Tạo các tài khoản hệ thống (không có quyền shell) để người dùng sử dụng cho VPN.

# Tạo người dùng mẫu vpnuser1 và đặt mật khẩu
sudo adduser --shell /usr/sbin/nologin vpnuser1

6. Định tuyến và Cấu hình Tường lửa (UFW)

Bước này cực kỳ quan trọng. Chúng ta cần thiết lập chuyển tiếp IP và NAT để cho phép lưu lượng truy cập từ đường hầm VPN (dải IP 10.8.0.0/24) đi ra ngoài Internet thông qua Server.

See also  VPN Là Gì? Giải Pháp Bảo Mật Thiết Yếu Cho Doanh Nghiệp Thời Đại Số

a) Bật IP Forwarding

Mục đích: Cho phép hạt nhân (kernel) Linux chuyển tiếp các gói tin giữa các giao diện mạng khác nhau (từ giao diện VPN tun0 ra giao diện mạng công cộng eth0).

Chỉnh sửa /etc/sysctl.conf và bỏ comment dòng net.ipv4.ip_forward=1:

sudo nano /etc/sysctl.conf

# Bỏ comment dòng sau:
net.ipv4.ip_forward=1

Áp dụng thay đổi:

sudo sysctl -p

b) Cấu hình UFW và NAT

Mục đích: Khi các gói tin từ Client VPN (có địa chỉ IP nội bộ 10.8.0.x) đi ra Internet, chúng phải được đổi thành địa chỉ IP công cộng của Server. Đây chính là chức năng của NAT (cụ thể là MASQUERADE).

Bước 1: Cho phép Chính sách Chuyển tiếp (Forwarding Policy)

sudo nano /etc/default/ufw

# Đảm bảo DEFAULT_FORWARD_POLICY là ACCEPT để cho phép lưu lượng chuyển tiếp: 
DEFAULT_FORWARD_POLICY="ACCEPT"

Bước 2: Thêm Quy tắc NAT (MASQUERADE)

Thêm quy tắc NAT vào /etc/ufw/before.rules (thay eth0 bằng giao diện mạng công cộng thực tế của Server bạn):

sudo nano /etc/ufw/before.rules


# Thêm đoạn này vào đầu tệp, ngay sau phần header
*nat
:POSTROUTING ACCEPT [0:0]# Quy tắc: Chuyển đổi (MASQUERADE) các gói đi ra từ dải VPN (10.8.0.0/24) qua giao diện mạng công cộng (eth0) 
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Bước 3: Mở Cổng và Kích hoạt Tường lửa

# Cho phép lưu lượng truy cập UDP trên cổng 1194 
sudo ufw allow 1194/udp

# Áp dụng các thay đổi UFW sudo ufw enable

7. Khởi động Dịch vụ OpenVPN

Sau khi hoàn tất cấu hình, khởi động lại dịch vụ và đảm bảo nó chạy tự động khi khởi động lại hệ thống:

sudo systemctl restart openvpn@server
sudo systemctl enable openvpn@server

Kiểm tra trạng thái dịch vụ:

sudo systemctl status openvpn@server

8.  Tạo và Hoàn thiện Tệp Cấu hình Client (.ovpn)

Tệp cấu hình Client (.ovpn) là tệp duy nhất mà người dùng cần để kết nối VPN. Nó phải bao gồm cấu hình kết nối, yêu cầu xác thực Tài khoản/Mật khẩu, và các khóa mã hóa cần thiết.

8.1. Tổng hợp các Thành phần cần thiết

Bạn cần lấy các thông tin sau từ OpenVPN Server (Ubuntu 24.04):

  1. Địa chỉ IP công cộng (Public IP) của Server.

  2. Nội dung của chứng chỉ CA (/etc/openvpn/ca.crt).

  3. Nội dung của khóa tĩnh TLS (/etc/openvpn/ta.key).

Sử dụng các lệnh cat trên Server để hiển thị nội dung, sau đó sao chép vào tệp cấu hình:

# Lấy nội dung chứng chỉ CA (ca.crt)
cat /etc/openvpn/ca.crt

# Lấy nội dung khóa TLS Auth (ta.key)
cat /etc/openvpn/ta.key

8.2. Tạo Tệp Gốc và Chèn Khóa

Sử dụng bất kỳ trình soạn thảo văn bản nào, chẳng hạn như Notepad (trên Windows), để tạo và chỉnh sửa tệp cấu hình.

  1. Mở trình soạn thảo văn bảndán đoạn mã cấu hình gốc sau đây.

  2. Thay thế YOUR_SERVER_IP bằng địa chỉ IP công cộng thật của OpenVPN Server.

    client
    dev tun
    proto udp
    remote YOUR_SERVER_IP 1194  <--- THAY THẾ IP CỦA BẠN
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    comp-lzo auto
    verb 3
    cipher AES-256-GCM
    
    # DÒNG QUAN TRỌNG: Yêu cầu xác thực Tên người dùng và Mật khẩu (PAM)
    auth-user-pass
    
    <ca>
    # Dán nội dung của tệp ca.crt vào đây, bao gồm BEGIN/END CERTIFICATE
    </ca>
    
    <tls-auth>
    # Dán nội dung của tệp ta.key vào đây
    </tls-auth>
    key-direction 1
    

8.3. Chèn Chứng chỉ và Khóa

Sử dụng kết quả từ lệnh cat trên Server (đã thực hiện ở Bước 8.1), thực hiện việc dán nội dung vào các vị trí đã đánh dấu:

  • Chèn Chứng chỉ CA: Dán toàn bộ nội dung của ca.crt (bao gồm dòng -----BEGIN CERTIFICATE----------END CERTIFICATE-----) vào giữa thẻ <ca></ca>.

  • Chèn Khóa TLS Auth: Dán toàn bộ nội dung của ta.key vào giữa thẻ <tls-auth></tls-auth>.

8.4. Lưu Tệp Chính xác dưới Định dạng .ovpn

Nếu bạn đang sử dụng Notepad trên Windows, hãy thực hiện theo các bước sau để đảm bảo tệp được lưu đúng định dạng, không bị thêm đuôi .txt một cách vô tình:

  1. Chọn File → Save As… (Lưu thành…).

  2. Tại trường File name (Tên tệp): Nhập tên bạn muốn kèm theo đuôi .ovpn (Ví dụ: pam-client.ovpn).

  3. Tại trường Save as type (Kiểu lưu): BẮT BUỘC phải chọn All Files (*.*) (Tất cả các tệp).

  4. Nhấn Save (Lưu).

See also  Hướng Dẫn Chi Tiết: Tự Động Hóa Cấu Hình SIP FreePBX sang PortSIP UC Bằng QR Code

Sau khi hoàn tất, tệp pam-client.ovpn là tệp cuối cùng bạn cần để thiết lập kết nối VPN bằng tài khoản/mật khẩu.

8.5. Hướng dẫn Người dùng Kết nối

Sau khi hoàn tất, gửi tệp client.ovpn này đến thiết bị của người dùng. Khi họ kết nối bằng ứng dụng OpenVPN Client, họ sẽ được nhắc nhập Tên người dùngMật khẩu đã tạo trong Mục 5 (xác thực qua PAM).


9. Mở Cổng Truy Cập (Port Forwarding)

Sau khi OpenVPN Server đã được cấu hình và chạy trên máy chủ Ubuntu, bước cuối cùng là đảm bảo các thiết bị client bên ngoài mạng cục bộ có thể gửi yêu cầu kết nối đến server.

Do OpenVPN Server thường đặt sau một Router hoặc chạy trên một Máy chủ Cloud (VPS), bạn cần thực hiện cấu hình tại các cấp độ này.

9.1. Đối với Môi trường Mạng Cục bộ (Sử dụng Router)

Nếu OpenVPN Server của bạn đang hoạt động trong mạng gia đình hoặc văn phòng và được kết nối với Internet thông qua một Router vật lý, bạn phải thiết lập Port Forwarding (Chuyển tiếp Cổng) trên Router đó.

  • Đăng nhập vào Router: Truy cập giao diện quản lý của Router (thường là qua địa chỉ IP cổng mặc định như 192.168.1.1 hoặc 192.168.0.1).

  • Tìm chức năng: Tìm mục Port Forwarding, NAT, hoặc Virtual Server.

  • Thiết lập quy tắc:

    • Giao thức: Chọn UDP.

    • Cổng Ngoài (External Port) / Cổng Công cộng (Public Port): Nhập 1194.

    • Cổng Trong (Internal Port) / Cổng Riêng (Private Port): Nhập 1194.

    • Địa chỉ IP Nội bộ (Internal IP): Nhập địa chỉ IP cục bộ tĩnh của máy chủ Ubuntu (Ví dụ: 192.168.1.100).

  • Lưu cấu hình: Lưu và áp dụng các thay đổi trên Router.

9.2. Đối với Môi trường Máy chủ Cloud (VPS)

Nếu máy chủ OpenVPN của bạn là một Máy chủ Ảo (VPS) hoặc chạy trên nền tảng đám mây (AWS, Azure, Google Cloud, DigitalOcean, Vultr, v.v.), bạn cần cấu hình Tường lửa Mạng (Network Firewall/Security Group) của nhà cung cấp Cloud.

  • Truy cập Bảng điều khiển (Console): Đăng nhập vào tài khoản nhà cung cấp dịch vụ Cloud của bạn.

  • Tìm Tường lửa/Nhóm Bảo mật (Security Group): Xác định hoặc tạo một nhóm bảo mật áp dụng cho VPS của bạn.

  • Thêm quy tắc vào (Inbound/Ingress Rules):

    • Loại (Type): Custom UDP.

    • Phạm vi Cổng (Port Range): Nhập 1194.

    • Nguồn (Source): Chọn Anywhere hoặc 0.0.0.0/0 để cho phép truy cập từ mọi nơi trên Internet.

  • Lưu quy tắc: Áp dụng quy tắc mới để cho phép lưu lượng UDP trên cổng 1194 đến VPS.

Lưu ý quan trọng: Bước này là bổ sung cho tường lửa cục bộ (UFW) đã cấu hình trên chính Ubuntu Server (Mục 6), không thay thế nó.


Chúc bạn triển khai thành công! 🚀

Leave a Reply

Your email address will not be published. Required fields are marked *