🔐 Triển khai hệ thống mạng riêng ảo bằng OpenVPN 🔐

ℹ️ Giới thiệu

  • Trước khi đi vào triển khai hệ thống OpenVPN ta sẽ tìm hiểu về VPN và OpenVPN là gì.

    • VPN (Virtual Private Network): là công nghệ mạng riêng ảo giúp tạo kết nối mạng an toàn khi bạn sử dụng internet. Hiểu đơn giản thì, VPN tương tự như một đường hầm cho phép bạn trao đổi dữ liệu thông qua mạng Internet một cách an toàn.

    • OpenVPN: là tên một phần mềm VPN, đây là giao thức mã hóa mạng VPN mã nguồn mở. OpenVPN là một trong những giao thức mã hóa bảo mật hàng đầu, sử dụng mã hóa và xác thực để tạo một “đường hầm” an toàn giữa người dùng và máy chủ.


💻 Xây dựng mô hình

  • Mục đích của bài Lab này nhằm xây dựng và triển khai mô hình đơn giản nhất để phục vụ mục đích học tập, hiểu thêm về concept triển khai một hệ thống VPN. Vậy nên mô hình sẽ được xây dựng đơn giản trên VMware như sau:

  • Máy Client: có kết nối Internet, IP có được thông qua card mạng NAT của VMware.

  • Máy Ubuntu: đóng vai trò là OpenVPN Server, có kết nối với Internet và kết nối với một FTP Server thông qua một Private Network. Ở đây sẽ dùng VMnet3 với mạng 192.168.10.0/24 .

  • Máy FTP Server: là một máy Windows Server 2019 có cài đặt FTP service và kết nối với VMnet3.

🛠️ Bắt đầu triển khai

  • Về cơ bản thì ta có thể chia quá trình thực hiện ra các bước như sau để dễ hình dung hơn:

    • Bước 1: Tải xuống và cấu hình OpenVPN Server.

      • Bao gồm các bước, tạo các khoá, chứng chỉ cho cả Server và Client.
    • Bước 2: Cấu hình server.conf .

    • Bước 3: Cấu hình OpenVPN Client.

      • Bao gồm di chuyển khoá, chứng chỉ của Client và cấu hình client.ovpn .

  • Ta sẽ bắt đầu cài đặt OpenVPN Server.

  • Ở máy Ubuntu, thực hiện update các gói cài đặt trước khi tải xuống OpenVPN và easy-rsa.

sudo apt update
sudo apt install openvpn easy-rsa openssh-server -y
  • Sau khi cài đặt xong ta sẽ tạo một thư mục easy-rsa để chứa tất cả các key và crt sẽ được tạo ra ở các bước sắp tới. Tiếp theo, thực hiện copy toàn bộ file trong thư mục easy-rsa vào thư mục mới tạo và chuyển quyền cho user root.
mkdir easy-rsa
cp -r /usr/share/easy-rsa/* easy-rsa
chmod 700 easy-rsa
  • Di chuyển vào thư mục vừa tạo. Tạo PKI và CA cho OpenVPN. CA sẽ phục vụ cho việc tạo và ký chứng chỉ cho cả Server và Client.
./easyrsa init-pki
./easyrsa build-ca
  • Nhập CA Key và ghi nhớ để sử dụng trong quá trình ký các chứng chỉ.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 
You are about to be asked to enter information that will be incorporated
into your certificate request.
  • Tạo và ký request cho Server
./easyrsa gen-req server nopass
  • Ở mục common bạn có thể Enter để dùng tên mặc định là server.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /home/neyugniat/Documents/easy-rsa/pki/reqs/server.req
key: /home/neyugniat/Documents/easy-rsa/pki/private/server.key
  • Sau khi tạo server.req, ta sẽ thực hiện ký request này
./easyrsa sign-req server [server]
  • Phần nằm trong ngoặc là tên của request bạn đã tạo bên trên, ở đây mình để mặc định là server. Nhớ bỏ dấu ngoặc [] đi nhé.
Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
  • Gõ yes để tiếp tục. Nhập CA Key ở bước tạo CA ở trên.
Using configuration from /home/neyugniat/Documents/easy-rsa/pki/easy-rsa-3898.hpcbP9/tmp.347r4j
Enter pass phrase for /home/neyugniat/Documents/easy-rsa/pki/private/ca.key:
  • Thực hiện lại tương tự với request của Client.
./easyrsa gen-req [client1] nopass
  • [client1] là tên mình sẽ đặt cho máy Client.
-----
Common Name (eg: your user, host, or server name) [client1]:

Keypair and certificate request completed. Your files are:
req: /home/neyugniat/Documents/easy-rsa/pki/reqs/client1.req
key: /home/neyugniat/Documents/easy-rsa/pki/private/client1.key
  • Thực hiện ký request của client1.
./easyrsa sign-req client [client1]
  • Phần trong ngoặc là Common Name ta nhập ở trên, ở đây là client1.
Request subject, to be signed as a client certificate for 825 days:

subject=
    commonName                = client1


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
  • Các bước tương tự với server. Nhập CA Key.
Using configuration from /home/neyugniat/Documents/easy-rsa/pki/easy-rsa-3969.DDAKgB/tmp.rK0QcC
Enter pass phrase for /home/neyugniat/Documents/easy-rsa/pki/private/ca.key:
  • Sau khi đã tạo và ký xong các chứng chỉ cho Server và Client. Ta sẽ tạo khoá DH (Diffie-Hellman) cho quá trình trao đổi khoá giữa Server và Client.
./easyrsa gen-dh

Output:
DH parameters of size 2048 created at /home/neyugniat/Documents/easy-rsa/pki/dh.pem
  • Để tăng tính bảo mật, ta sẽ tạo thêm một khoá tls-crypt được chia sẻ trước.
openvpn --genkey secret ta.key
  • Sau khi hoàn thành các bước ở trên, ta sẽ cần di chuyển các file dưới đây đến thư mục /etc/openvpn/server :
  • {ca.crt, dh.pem, server.crt, server.key, ta.key}

    • File ta.key sẽ nằm tại đường dẫn của /easy-rsa.

    • ca.crt và dh.pem sẽ nằm trong directory /easy-rsa/pki.

    • server.key nằm trong /easy-rsa/pki/private.

    • server.crt ở /easy-rsa/pki/issued.

  • Ta sẽ làm tương tự với các file của Client:

  • Tạo 1 thư mục client-configs để chứa các file cấu hình riêng cho Client. Vị trí đặt directory sẽ tuỳ thuộc vào bạn, ở đây mình sẽ đặt cùng cấp với easy-rsa

mkdir -p client-configs
  • {ca.crt, client1.crt, client1.kety, ta.key}

    • Ta sẽ di chuyển các file này tới một thư mục tên client-configs/keys để thuận tiện cho việc tạo file client.ovpn sau này.
  • Sau khi di chuyển các file này tới đường dẫn /etc/openvpn/server, ta sẽ tiến hành cấu hình server.conf . Vì OpenVPN đã có sẵn file server.conf mẫu nên mình sẽ tận dụng luôn.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
  • Mở file server.conf mới copy và cấu hình. Để đơn giản thì ta sẽ chỉ cần chỉnh sửa một số đoạn như sau.
ca ca.crt
cert server.crt
key server.key
dh dh.pem
  • Đảm bảo các file ca.crt, server.crt, server.key, dh.pem nằm trong cùng một thư mục với server.conf, hoặc bạn có thể tuỳ chỉnh đường dẫn tới các file đó.

  • Phần IP ở mục server này sẽ là IP của VPN Tunnel. Ở đây mình sẽ để mặc định 10.8.0.0.

server 10.8.0.0 255.255.255.0
  • Phần IP ở mục push này là IP của mạng private. Mình sẽ để là 192.168.10.0 như mô hình đã xây dựng ở trên.
push "route 192.168.10.0 255.255.255.0"
  • Mục tls-auth để file ta.key, số 0 xác định đây là server, ở client sẽ là số 1.
tls-auth ta.key 0
  • Sử dụng phương thức mã hoá AES-256-CBC.
cipher AES-256-CBC
  • Bạn có thể bỏ comment ở mục log để ghi log. Mục này là tuỳ chọn.
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
  • Sau khi chỉnh sửa xong ta sẽ lưu file lại và đến bước tiếp theo.

  • Để máy Ubuntu có thể hoạt động như một router và định tuyến lưu lượng mạng từ Tunnel đến mạng Private thì ta cần bật IP_Forwarding.
sudo nano /etc/sysctl.conf
  • Tìm đến dòng #net.ipv4.ip_forward=1 và bỏ comment, sau đó lưu lại và apply các thay đổi.
sudo sysctl -p
  • Ra được kết quả như này:
net.ipv4.ip_forward = 1
  • Là OK.

  • Tiếp đến sẽ là cấu hình tưởng lửa.

sudo nano /etc/ufw/before.rules
  • Thêm các dòng lệnh cho phép traffic từ OpenVPN đến mạng Private.
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/24 -d 192.168.10.0/24 -j MASQUERADE
COMMIT
# END OPENVPN RULES
  • -s là địa chỉ source, ở đây là địa chỉ mạng của Tunnel.

  • -d là địa chỉ destination, là địa chỉ mạng của mạng Private.

  • Sau đó ta sẽ thay đổi chế độ forward mặc định của ufw từ DROP thành ACCEPT.

sudo nano /etc/default/ufw
  • Tìm đến dòng DEFAULT_FORWARD_POLICY="DROP" đổi thành.
DEFAULT_FORWARD_POLICY="ACCEPT"
  • Lưu lại và tiến đến bước tiếp theo. Ta sẽ cho phép giao thức UDP tại port 1194. Đây là giao thức và port ta đã khai báo trong server.conf.
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
  • Sau đó ta sẽ enable ufw.
sudo ufw disable
sudo ufw enable
  • Sau khi cấu hình xong firewall, ta sẽ khởi chạy service OpenVPN để kiểm tra trạng thái hoạt động.
sudo systemctl start openvpn-server@server
sudo systemctl status openvpn-server@server
  • Output như dưới có nghĩa là service OpenVPN đã được cấu hình và chạy thành công.
● openvpn-server@server.service - OpenVPN service for server
     Loaded: loaded (/lib/systemd/system/openvpn-server@.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-10-25 13:09:32 +07; 7s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 63728 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 4552)
     Memory: 2.8M
        CPU: 42ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
             └─63728 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf

Thg 10 25 13:09:32 neyugniat systemd[1]: Starting OpenVPN service for server...
Thg 10 25 13:09:32 neyugniat systemd[1]: Started OpenVPN service for server.
  • Vậy là phần OpenVPN về cơ bản đã hoàn thành. Tiếp theo sẽ đến cấu hình cho OpenVPN Client.

  • Ở bước này có nhiều cách để thực hiện, nhưng mình sẽ làm theo cách đơn giản hơn, đó là di chuyển các file chứng chỉ và khoá của Client qua FTP service trên Ubuntu. Các bạn có thể tham khảo như sau.

  • Đầu tiên ta cần tải xuống vsftpd.

sudo apt install vsftpd
  • Kế đến thực hiện backup và cấu hình file.
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf
  • Đảm bảo các dòng sau được uncomment.
local_enable=YES

write_enable=YES

anonymous_enable=YES
  • Lưu lại và thực hiện khởi động lại vsftpd.
sudo systemctl restart vsftpd
  • Cho phép FTP Traffic.
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw reload
  • Sau khi thành công thì sẽ dùng WinSCP từ máy Client để kết nối đến máy Server và di chuyển các file.

  • Trên máy Client, tải xuống và cài đặt OpenVPN GUI.

  • Sau khi cài đặt xong thì đi chuyển các file sau:

  • {ca.crt, ta.key, client1.crt, client1.key}

  • Tới đường dẫn C:\Program Files\OpenVPN\config.

  • Ra được kết quả như hình là OK, ta sẽ bắt đầu cấu hình client.ovpn.

  • Tạo 1 file có tên client.ovpn trong thư mục C:\Program Files\OpenVPN\config. Sau đó thực hiện cấu hình như sau.
client

dev tun

proto udp

remote 192.168.5.142 1194
resolv-retry infinite
nobind

;user nobody
;group nobody

persist-key
persist-tun

ca ca.crt
cert client1.crt
key client1.key

remote-cert-tls server
tls-auth ta.key 1

cipher AES-256-CBC

verb 3
;mute 20

auth-nocache
key-direction 1
  • Lưu lại và chuẩn bị kiểm tra kết nối.

  • Chuột phải vào biểu tượng OpenVPN GUI, chọn Connect.

  • Hiện ra thông báo như hình sau có nghĩa là đã kết nối thành công đến OpenVPN Server

  • Máy Client đã được cấp IP 10.8.0.6.

  • Thực hiện ping thử tới máy Windows Server tại địa chỉ 192.168.10.10 như mô hình đã xây dựng.

C:\Users\neyugniat>ping 192.168.10.10

Pinging 192.168.10.10 with 32 bytes of data:
Reply from 192.168.10.10: bytes=32 time=1ms TTL=127
Reply from 192.168.10.10: bytes=32 time=1ms TTL=127
Reply from 192.168.10.10: bytes=32 time=1ms TTL=127
Reply from 192.168.10.10: bytes=32 time=1ms TTL=127

Ping statistics for 192.168.10.10:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms
  • Đã có kết nối.

  • Ở trên máy Windows Server này đã cài dịch vụ FTP Server, bây giờ ta sẽ thực hiện kết nối tới FTP Server này thông qua đường mạng VPN đã được tạo ra bởi OpenVPN Server.

  • Sau khi đăng nhập thành công, thực hiện tạo một folder tên Client, và một file Client.txt có nội dung Day la may Client trong thư mục được chia sẻ trên FTP Server.

  • Trên máy FTP Server đã nhận được file máy Client vừa tạo, chứng tỏ rằng kết nối chia sẻ dữ liệu đã được tạo. Và VPN Tunnel được tạo bởi OpenVPN đang hoạt động rất tốt.

  • Về cơ bản thì đây chỉ là một mô hình demo nên có một số phương thức mã hoá, bảo mật chưa được triển khai. Tuy nhiên cũng đã xây dựng được một hệ thống VPN giúp truy cập an toàn vào mạng nội bộ từ xa thông qua Internet.

0
Subscribe to my newsletter

Read articles from Nguyễn Tài Nguyên directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Nguyễn Tài Nguyên
Nguyễn Tài Nguyên

In search of the Great Manifesto