🔐 Triển khai hệ thống mạng riêng ảo bằng OpenVPN 🔐
Table of contents
ℹ️ 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 choClient
. 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 fileclient.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ìnhserver.conf
. Vì OpenVPN đã có sẵn fileserver.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ớiserver.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 định10.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ànhACCEPT
.
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 port1194
. Đây là giao thức và port ta đã khai báo trongserver.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ụcC:\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 fileClient.txt
có nội dungDay 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.
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