NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
19/05/2023
Lượt xem

Hướng dẫn cài đặt và cấu hình OpenVPN Server trên Ubuntu 20.04

19/05/2023
41 phút đọc
Lượt xem

Đánh giá

5/5 - (163 bình chọn)

VPN là một giải pháp truy cập mạng an toàn và bảo mật, cho phép vượt qua các rào cản vật lý và bảo vệ hệ thống khỏi các lưu lượng không được mã hóa. OpenVPN là một công cụ VPN mã nguồn mở dựa trên giao thức TLS rất phổ biến hiện nay. Bài viết này sẽ hướng dẫn chi tiết cấu hình và cách cài đặt OpenVPN trên Ubuntu 20.04.

Để bắt đầu hướng dẫn này, bạn cần có một tài khoản non-root với quyền sudo và cài đặt sẵn tường lửa, một server Ubuntu 20.04 riêng biệt, được cài đặt như một Nhà cung cấp chứng chỉ số riêng (Certificate Authority – CA). ( Bài viết về cách thiết lập và cấu hình Certificate Authority trên Ubuntu 20.04 tại đây)

Về lý thuyết thì bạn vẫn có thể sử dụng server OpenCPN hoặc máy local làm CA, nhưng việc này không được khuyến khích vì có thể làm lộ một số lỗ hổng bảo mật đối với VPN. Theo tài liệu của OpenVPN, người dùng nên sử dụng một máy riêng biệt làm CA, chỉ có nhiệm vụ import và ký các yêu cầu chứng thực (certificate request). Vì vậy bài viết này sẽ giả sử rằng bạn đang sử dụng CA trên một server Ubuntu 20.04 riêng biệt, có user non-root, quyền sudo và bật sẵn tường lửa.

OpenVPN
OpenVPN

Ngoài ra, hướng dẫn này cũng cần một máy client dùng để kết nối đến server OpenVPN, tạm gọi máy này là OpenVPN client. Bạn nên sử dụng máy local làm OpenVPN client cho hướng dẫn này.

Sau khi chuẩn bị xong các yếu tố trên, bạn có thể bắt đầu thực hiện việc cài đặt và cấu hình server OpenVPN trên server Ubuntu 20.04 theo các bước dưới đây.

Bước 1: Cài đặt OpenVPN và Easy-RSA

Easy-RSA là một công cụ quản lý cơ sở hạ tầng public key (Public key infrastructure – PKI). Bạn sẽ sử dụng công cụ này trên OpenVPN để tạo một yêu cầu chứng chỉ, sau đó sẽ dùng chứng chỉ này để xác minh và đăng nhập trên server CA.

Trước tiên, cập nhật chỉ mục gói của server OpenVPN rồi cài đặt OpenVPN và Eassy-RSA. Cả hai package này đều có sẵn trong repo của Ubuntu nên bạn có thể cài đặt bằng apt như sau:

sudo apt update
sudo apt install openvpn easy-rsa

Sau đó tạo một thư mục mới trên server OpenVPN server, lấy tên là ~/easy-rsa:

mkdir ~easy-rsa

Bây giờ tạo một liên kết tượng trưng (symlink) từ script easyrsa đến thư mục vừa tạo:

ln -s /usr/share/easy-rsa/* ~/easy-rsa/

Với phương pháp sử dụng symlink này, mọi cập nhật trên package easy-rsa đều sẽ được tự động đồng bộ sang script của PKI.

Cuối cùng, hãy đảm bảo giới hạn quyền sở hữu của thư mục cho một user non-root có quyền sudo:

sudo chown vietnix ~/easy-rsa
chmod 700 ~/easy-rsa

Sau khi cài đặt và chuyển xong các chương trình vào những thư mục tương ứng, bạn tạo một PKI trên server OpenVPN để yêu cầu và quản lý chứng chỉ TLS cho client và những server khác kết nối đến VPN.

Bước 2: Tạo PKI cho OpenVPN

Đầu tiên, bạn cần tạo một thư mục PKI cục bộ trên server OpenVPN, dùng để quản lý các yêu cầu chứng chỉ của server và client. Bạn sẽ dùng directory này để quản lý yêu cầu chứng chỉ của cả phía server và client thay vì chuyển hướng trực tiếp về server CA của người dùng.

Vào thư mục easy-rsa rồi mở file vars:

cd ~/easy-rsa
nano vars

Sau đó paste hai dòng dưới đây vào:

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

File này chỉ cần đúng hai dòng trên cho server OpenVPN vì không cần sử dụng như một CA. Các dòng này giúp đảm bảo private key và những yêu cầu chứng chỉ được cấu hình để sử dụng thuật toán Elliptic Curve Cryptography (ECC) để khởi tạo key, giúp bảo mật các chữ ký cho client và server OpenVPN.

Vì cả server OpenVPN và CA đều sử dụng thuật toán ECC nên khi một client và server cố gắng xây dựng một key đối xứng dùng chung, cả hai có thể dùng thuật toán này cho quá trình trao đổi. Thuật toán này giúp việc trao đổi nhanh hơn so với thuật toán RSA với Diffie-Hellman thông thường.

Tiếp theo, chạy script easyrsa với option init-pki để tạo thư mục PKI:

./easyrsa init-pki

Lưu ý rằng bạn không cần phải tạo một CA trên server OpenVPN, vì server CA chỉ có nhiệm vụ xác minh và ký các chứng chỉ. PKI trên server VPN chỉ được dùng như một nơi lưu trữ tập trung, tiện lợi cho các yêu cầu chứng chỉ.

Bước 3: Tạo một yêu cầu chứng chỉ server OpenVPN và private key

Tiếp theo, bạn cần tạo một private key và yêu cầu ký chứng chỉ (Certificate Signing Request – CSR) trên server OpenVPN. Ở bước này bạn cũng sẽ chuyển yêu cầu đến CA để ký và tạo chứng chỉ được yêu cầu. Sau đó, chứng chỉ này được chuyển về lại server OpenVPN rồi cài đặt để server sử dụng.

Đầu tiên, chuyển đến thư mục ~/easy-rsa trên server OpenVPN:

cd ~/easy-rsa

Bây giờ gọi lệnh easyrsa với option gen-req, theo sau là một Common Name (CN) cho máy. CN có thể là bất kỳ tên nào, trong ví dụ này Vietnix sẽ tạm đặt là server. Sau đó là option nopasss để bỏ qua việc bảo vệ file được yêu cầu bằng mật khẩu, giúp tránh các vấn đề liên quan đến quyền truy cập.

./easyrsa gen-req server nopass

Output:

Output
Common Name (eg: your user, host, or server name) [server]:
 
Keypair and certificate request completed. Your files are:
req: /home/vietnix/easy-rsa/pki/reqs/server.req
key: /home/vietnix/easy-rsa/pki/private/server.key

Sau đó bạn sẽ tạo được một private key và một file yêu cầu chứng chỉ (server.req). Copy server key vào thư mục /etc/openvpn/server:

sudo cp /home/vietnix/easy-rsa/pki/private/server.key /etc/openvpn/server/

Sau bước này, bạn đã tạo thành công private key và một CSR cho server OpenVPN. Bây giờ sẽ sử dụng private key của server CA để ký CSR này.

Bước 4: Ký Certificate Request của server OpenVPN

Đầu tiên, server CA cần phải biết thông tin về chứng chỉ server và xác thực nó. Sau khi xác thực và gửi chứng chỉ về lại server OpenVPN, client tin cậy CA cũng sẽ tin tưởng server OpenVPN.

Mở server OpenVPN, sử dụng SCP (hoặc một phương pháp truyền dữ liệu bất kỳ) để copy yêu cầu server.req sang server CA:

scp /home/vietnix/easy-rsa/pki/reqs/server.req vietnix@your_ca_server_ip:/tmp

Bây giờ đăng nhập vào server CA bằng user non-root, vào thư mục ~/easy-rsa rồi import yêu cầu vào bằng script easyrsa:

cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
Output
. . .
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.

Tiếp theo, ký request này bằng script easyrsa kèm theo option sign-req, loại request và Common Name. Trong đó loại request có thể là client hoặc server. Ta chỉ cần làm việc với request từ server OpenVPN nên ta sẽ chọn loại server:

./easyrsa sign-req server server

Ở trong output, ta sẽ được yêu cầu xác thực rằng request đến từ một nguồn được tin cậy. Nhấn yes rồi nhấn Enter để xác nhận:

Output
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
 
Request subject, to be signed as a server certificate for 3650 days:
 
subject=
commonName = server
 
 
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/vietnix/easy-rsa/pki/issued/server.crt

Lưu ý rằng nếu đã mã hóa private key của CA, bạn cần nhập mật khẩu khi được yêu cầu.

Như vậy là đã ký thành công request từ server OpenVPN. Kết quả thu được là một file server.crt chứa public key của server OpenVPN và chữ ký từ server CA. Chữ ký này giúp xác minh với mọi người rằng ai tin cậy server CA đều có thể tin cả server OpenVPN khi kết nối.

Để hoàn tất việc cấu hình chứng chỉ, copy file server.crtca.crt from server CA vào OpenVPN:

scp pki/issued/server.crt vietnix@your_vpn_server_ip:/tmp
scp pki/ca.crt vietnix@your_vpn_server_ip:/tmp

Về lại server OpenVPN, copy file từ /tmp sang /etc/openvpn/server:

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

Như vậy là việc cấu hình server OpenVPN đã gần như hoàn tất. Bây giờ bạn cần thực hiện thêm một số bước bảo mật để đảm bảo an toàn cho server.

Bước 5: Cấu hình tài liệu mật mã OpenVPN

Để tăng thêm bảo mật cho server, bạn sẽ bổ sung một private key dùng chung, server và mọi client sẽ sử dụng với directive tls-crypt của OpenVPN. Option này được dùng để xáo trộn chứng chỉ TLS dùng khi một server và client kết nối đến nhau ban đầu.

Bên cạnh đó, option cũng được sử dụng bởi server OpenVPN để thực hiện việc kiểm tra nhanh các packet đến. Nếu một packet được ký bằng key dùng chung trước đó thì server sẽ xử lý nó. Ngược lại, nếu packet chưa được ký thì server có thể hủy bỏ mà không cần thực hiện công đoạn giải mã.

Với lớp bảo mật này, server OpenVPN có thể được bảo vệ khỏi các lưu lượng truy cập không được xác thực hay tấn công DDoS. Đồng thời việc này cũng giúp việc xác định lưu lượng mạng OpenVPN khó khăn hơn.

Đầu tiên, chạy lệnh dưới đây trong thư mục ~easy-rsa của server OpenVPN để tạo key dùng chung tls-crypt:

cd ~/easy-rsa
openvpn --genkey --secret ta.key

Bạn sẽ thu được một file mới là ta.key. Copy file này vào thư mục /etc/openvpn/server/:

sudo cp ta.key /etc/openvpn/server

Bây giờ bạn có thể sẵn sàng tạo chứng chỉ client và file key cho user để kết nối đến VPN ở bước sau.

Bước 6: Tạo một chứng chỉ client và key pair

Mặc dù đã tạo một private key và yêu cầu chứng chỉ trên máy client ở bước trước, bây giờ bạn sẽ tạo một yêu cầu khác trên server OpenVPN. Việc này cho phép tạo một script tự động khởi tạo các file cấu hình chứa mọi key và chứng chỉ cần thiết. Khi đó, bạn không cần phải chuyển các key, chứng chỉ và file cấu hình đến client nữa, đồng thời quá trình truy cập VPN cũng dễ dàng hơn.

Bạn tạo một client key và một cặp chứng chỉ. Nếu có nhiều hơn một client thì hãy lặp lại quá trình từ đầu cho từng client. Lưu ý rằng ta cần truyền một tên cố định vào script cho mỗi client. Trong ví dụ này, Vietnix sẽ quy ước tên của chứng chỉ/key pair đầu tiên là client1.

Tạo một cấu trúc thư mục trong home directory để lưu trữ chứng chỉ client và các file key:

mkdir -p ~/client-configs/keys

Vì ta sẽ lưu trữ các file cấu hình và chứng chỉ/key pair của client trong thư mục này nên ta cần giới hạn quyền truy cập để đảm bảo an toàn:

chmod -R 700 ~/client-configs

Sau đó vào thư mục EasyRSA rồi chạy script easyrsa với option gen-reqnopass, common name:

cd ~/easy-rsa
./easyrsa gen-req client1 nopass

Nhấn Enter để xác nhận common name. Tiếp đến, copy file client1.key vào thư mục ~/client-configs/keys/ vừa tạo trước đó:

cp pki/private/client1.key ~/client-configs/keys/

Chuyển file client1.req vào server CA:

scp pki/reqs/client1.req vietnix@your_ca_server_ip:/tmp

Đăng nhập vào server CA, vào thư mục EasyRSA rồi import yêu cầu:

cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1

Tiếp theo, ký yêu cầu này bằng quy trình tương tự với các bước trên, trong đó đổi loại request thành client:

./easyrsa sign-req client client1

Nhập yes để xác thực khi được yêu cầu, và nhậu mật khẩu nếu cần.

Sau đó bạn sẽ có được một file client.crt. Bây giờ chuyển file này về lại server:

scp pki/issued/client1.crt vietnix@your_server_ip:/tmp

Trên server OpenVPN, copy chứng chỉ vào thư mục ~/client-configs/keys/:

cp /tmp/client1.crt ~/client-configs/keys/

Sau đó copy file ca.crtta.key vào thư mục ~client-configs/keys rồi đặt quyền truy cập cho user sudo:

cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown vietnix.vietnix ~/client-configs/keys/*

Vậy là bạn đã hoàn tất việc khởi tạo chứng chỉ và các key cho client và server, được chứa trong thư mục của server OpenVPN. Tiếp theo là thực hiện cấu hình OpenVPN.

Bước 7: Cấu hình OpenVPN

Tương tự như các công cụ mã nguồn mở khác, OpenVPN cũng có nhiều option cấu hình để người dùng tự do tùy chỉnh server tùy theo nhu cầu cá nhân. Ở bước này Vietnix sẽ hướng dẫn cấu hình server OpenVPN dựa trên một file config mẫu từ tài liệu hướng dẫn của phần mềm.

Trước tiên, copy file mẫu server.conf:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz

Mở file mới để edit:

sudo nano /etc/openvpn/server/server.conf

Tìm phần HMAC bằng cách tìm directive tls-auth. Comment dòng này bằng cách thêm dấu ; ở đầu. Sau đó thêm một dòng ở sau chứa giá trị tls-crypt ta.key:

;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key

Tiếp theo, tìm phần mã hóa mật mã bằng cách tìm dòng cipher. Giá trị mặc định đang là AES-256-CBC. Comment dòng này, thêm dấu ; ở trước rồi thêm dòng dưới đây để dùng phương pháp mã hóa AES-256-GCM – có hiệu năng tốt hơn và hỗ trợ các client OpenVPN đời mới hiệu quả hơn.

;cipher AES-256-CBC
cipher AES-256-GCM

Thêm một directive auth ở ngay sau dòng này để chọn thuật toán HMAC, Vietnix khuyên bạn nên chọn SHA256:

auth SHA256

Tiếp theo, tìm dòng chứa directive dh (định nghĩa tham số cho Diffie-Hellman). Vì ta đã cấu hình cho chứng chỉ dùng thuật toán ECC ở bước trên nên ta có thể comment dòng này rồi thêm ký tự ; ở trước. Sau đó thêm dòng dh none như dưới đây:

;dh dh2048.pem
dh none

Tiếp theo bạn sẽ muốn OpenVPN chạy mà không có đặc quyền nào, do đó bạn cần yêu cầu phần mềm chạy bằng user nobody và group nogroup. Tìm rồi uncomment và bỏ dấu ; ở các dòng tương ứng sau:

user nobody
group nogroup

(Không bắt buộc) Push các thay đổi DNS để định tuyến lưu lượng qua VPN

Các thiết lập trên sẽ tạo kết nối VPN giữa client và server, tuy nhiên vẫn chưa bắt buộc mọi kết nối phải sử dụng tunnel. Nếu bạn muốn sử dụng VPN để định tuyến mọi lưu lượng traffic qua VPN thì cần phải push những thiết lập mới đến máy client.

Trước tiên, tìm rồi uncomment dòng chứa push "redirect-gateway defl bypass-dhcp để yêu cầu client định tuyến mọi lưu lượng qua server OpenVPN. Lưu ý rằng việc này cũng có thể dẫn đến một số vấn đề khi kết nối với các dịch vụ mạng khác, chẳng hạn như SSH:

push "redirect-gateway def1 bypass-dhcp"

Ở bên dưới dòng đó, tìm phần dhcp-option, xóa dấu ; ở đầu rồi uncomment:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Các dòng này sẽ yêu cầu client sử dụng công cụ phân giải OpenDNS tại địa chỉ IP được liệt kê. Nếu bạn muốn sử dụng bộ phân giải DNS khác thì có thể thay vào phần địa chỉ tương ứng trong lệnh.

(Không bắt buộc) Đổi port và giao thức

Theo mặc định thì server OpenVPN sử dụng port 1194 và giao thức UDP để nhận kết nối từ client. Nếu muốn dùng một port khác thì ta có thể đổi option port. Nếu không host nội dung web trên server thì ta có thể dùng 443 vì thường được cho phép trong các quy tắc tương lửa.

Mở file server.conf rồi tìm dòng như dưới đây:

port 1194

Sau đó đổi thành port 443:

# Optional!
port 443

Thông thường, giao thức sẽ bị giới hạn theo port tương ứng. Tìm dòng proto bên dưới dòng port để rồi thành tcp như sau:

# Optional!
proto tcp

Sau khi đổi giao thức thành TCP, ta cũng cần đổi cả giá trị của directive explicit-exit-notify từ 1 thành 0 để tránh gặp lỗi khi khởi động dịch vụ (vì directive này chỉ hỗ trợ UDP).

# Optional!
explicit-exit-notify 0

(Không bắt buộc ) Trỏ đến thông tin đăng nhập non-defualt

Nếu có chọn một tên khác trong lệnh ./easyrsa gen-req server ở các bước trên thì bạn cũng cần phải đổi các dòng certkey trong file server.conf. Khi đó các file này mới có thể trỏ đến file .crt.key chính xác:

cert server.crt
key server.key

Sau khi hoàn tất, hãy lưu và đóng lại file để kết thúc việc cấu hình các thiết lập chung của OpenVPN.

Khi bạn cần một giải pháp máy chủ mạnh mẽ và linh hoạt để cài đặt và cấu hình OpenVPN Server trên Ubuntu, bạn có thể tham khảo dịch vụ VPS của Vietnix.

Vietnix hiện đang cung cấp dịch vụ máy chủ ảo (VPS) tốc độ cao với khả năng tùy chỉnh linh hoạt và hiệu suất ổn định như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS NVMe.

Thuê VPS tại Vietnix, bạn sẽ có quyền truy cập đầy đủ và quản lý toàn bộ hệ thống máy chủ của mình. Điều này cho phép bạn tự do cài đặt và cấu hình OpenVPN Server trên Ubuntu theo nhu cầu.

Bên cạnh đó, Vietnix cung cấp một môi trường ổn định và bảo mật, giúp đảm bảo rằng dịch vụ OpenVPN Server của bạn hoạt động an toàn. Hơn nữa, với tốc độ truy cập cao, khả năng xử lý nhanh chóng, VPS của Vietnix giúp kết nối VPN của bạn sẽ được duy trì một cách mượt mà và ổn định.

Liên hệ ngay đội ngũ tư vấn của Vietnix để được hỗ trợ lựa chọn gói VPS phù hợp với bạn!

Bước 8: Thay đổi cấu hình mạng của server OpenVPN.

Có một số khía cạnh của cấu hình mạng của server cần được điều chỉnh để OpenVPN có thể định tuyến chính xác lưu lượng truy cập qua VPN. Đầu tiên trong số này là chuyển tiếp IP, một phương pháp để xác định nơi lưu lượng IP sẽ được định tuyến. Điều này rất cần thiết cho chức năng VPN mà server sẽ cung cấp.

Để điều chỉnh cài đặt chuyển tiếp IP mặc định của máy chủ OpenVPN, mở file /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Sau đó thêm dòng sau vào phía dưới file:

net.ipv4.ip_forward = 1

Sau đó lưu rồi đóng lại file.

Tiếp theo, để đọc file và load các giá trị mới cho phiên hiện tại, hãy chạy lệnh sau:

sudo sysctl -p
Output
net.ipv4.ip_forward = 1

Bây giờ server OpenVPN sẽ có thể chuyển tiếp lưu lượng truy cập đến từ thiết bị ethernet này sang thiết bị ethernet khác. Cài đặt này đảm bảo server có thể hướng lưu lượng truy cập từ các máy khách kết nối trên giao diện VPN ảo qua các thiết bị ethernet vật lý khác của nó. Cấu hình này sẽ định tuyến tất cả lưu lượng truy cập web từ máy client thông qua địa chỉ IP của server và địa chỉ IP public của client sẽ được ẩn.

Trong bước tiếp theo, bạn cần cấu hình một số quy tắc tường lửa để đảm bảo rằng lưu lượng truy cập đến và đi từ server OpenVPN có thể hoạt động bình thường.

Bước 9: Cấu hình tường lửa

Đến đây, bạn đã thực hiện cài đặt OpenVPN trên server của mình, cấu hình nó cũng như tạo các key và chứng chỉ cần thiết để client truy cập VPN. Tuy nhiên, vẫn chưa cung cấp cho OpenVPN bất kỳ hướng dẫn nào về nơi gửi lưu lượng truy cập web đến từ client.

Bây giờ bạn có thể quy định cách server xử lý lưu lượng của client bằng cách thiết lập một số quy tắc tường lửa và cấu hình định tuyến.

Giả sử bạn đã cài đặt và chạy ufw trên máy server, để cho phép OpenVPN đi qua tường lửa thì bạn sẽ cần bật chế độ masquerading (giả mạo), một khái niệm iptables cung cấp dịch địa chỉ mạng động (NAT) nhanh chóng để định tuyến chính xác các kết nối của client.

Đầu tiên, tìm giao diện mạng public của máy bằng lệnh sau:

ip route list default

Giao diện này sẽ nằm trong output của lệnh, ở sau từ dev. Như ví dụ output dưới đây thì giao diện sẽ là eth0:

Output
default via 159.65.160.1 dev eth0 proto static

Sau đó mở file /etc/ufw/before.rules để thêm cấu hình liên quan:

sudo nano /etc/ufw/before.rules

Các quy tắc UFW thường được thêm bằng lệnh ufw. Các quy tắc có trong file before.rules được đọc và đặt vào trước khi các quy tắc UFW được load. Ở phía trên file, thêm một số dòng như dưới đây:

# 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/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Các dòng này sẽ đặt chính sách mặc định của chuỗi POSTROUTING trong bảng nat và giả mạo mọi lưu lượng đến từ VPN. Hãy lưu ý thay eth0 trong dòng -A POSTROUTING thành giao diện tương ứng có được từ lệnh trên.

#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#
 
# 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/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
 
# Don't delete these required lines, otherwise there will be errors
*filter

Sau đó lưu rồi đóng file lại.

Bây giờ, bạn cần yêu cầu UFW cho phép các packet được chuyển tiếp theo mặc định. Mở file /etc/default/ufw:

sudo nano /etc/default/ufw

Tìm directive DEFAULT_FORWARD_POLICY rồi đổi giá trị từ DROP thành ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Sau đó lưu rồi đóng file lại.

Tiếp theo, thay đổi tường lửa để cho phép các lưu lượng đến OpenVPN. Nếu chưa thay đổi port và giao thức trong file /etc/openvpn/server.conf thì cần mở các lưu lượng UDP cho port 1194. Nếu đã thay đổi port và giao thức ở bước trên thì hãy thay thành giá trị tương ứng.

Nếu bạn quên thêm SSH port thì cũng có thể bổ sung trong lệnh này:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

Sau đó disable rồi enable lại UFW để restart và load các thay đổi:

sudo ufw disable
sudo ufw enable

Bây giờ server đã có thể xử lý các lưu lượng OpenVPN. Ở bước sau ta sẽ bắt đầu khởi động dịch vụ OpenVPN trên server.

Bước 10: Khởi động OpenVPN

OpenVPN hoạt động như một dịch vụ systemd nên có thể quản lý bằng systemctl. Trước tiên bạn cấu hình OpenVPN để khởi động khi boot hệ thống:

sudo systemctl -f enable openvpn-server@server.service
sudo systemctl start openvpn-server@server.service

Sau đó kiểm tra trạng thái của dịch vụ:

sudo systemctl status openvpn-server@server.service
Output
● openvpn-server@server.service - OpenVPN service for server
     Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-04-29 15:39:59 UTC; 6s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 16872 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 1137)
     Memory: 1.0M
     CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
             └─16872 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --c>
. . .
. . .
Apr 29 15:39:59 ubuntu-20 openvpn[16872]: Initialization Sequence Completed

Bước 11: Tạo cơ sở hạ tầng cấu hình client

Việc tạo các file cấu hình cho client OpenVPN có thể tương đối phức tạp, vì mọi client phải có cấu hình riêng và mỗi máy phải phù hợp với các cài đặt được nêu trong file cấu hình của server. Thay vì viết một file cấu hình duy nhất chỉ có thể được sử dụng trên một client, bước này sẽ trình bày quy trình xây dựng cơ sở hạ tầng cấu hình client mà bạn có thể sử dụng để tạo các file cấu hình nhanh chóng.

Trước tiên, bạn sẽ tạo một file cấu hình “cơ sở”, sau đó xây dựng một script cho phép bạn tạo các file cấu hình client, chứng chỉ và key nếu cần.

Tạo một thư mục mới để lưu trữ các file cấu hình client trong thư mục client-configs đã tạo trước đó:

mkdir -p ~/client-configs/files

Sau đó copy một file cấu hình mẫu vào thư mục client-configs để dùng làm cấu hình cơ sở:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Mở file này bằng text editor bất kỳ:

nano ~/client-configs/base.conf

Tìm directive remote. Directive này trỏ đến địa chỉ server OpenVPN – địa chỉ IP public của server. Nếu muốn đổi port mà server nghe thì bạn phải đổi giá trị 1194 thành port tương ứng:

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .

Đảm bảo rằng giao thức cũng khớp với giao thức dùng trong cấu hình server:

proto udp

Tiếp theo, uncomment các directive usergroup:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

Tìm directive đặt ca, certkey rồi comment nó:

# 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

Tương tự, comment cả các directive tls-auth vì ta sẽ thêm ta.key trực tiếp vào file cấu hình của client:

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

Cập nhật các thiết lập cipherauth đã được thiết lập trong file etc/openvpn/server/server.conf:

cipher AES-256-GCM
auth SHA256

Tiếp theo, thêm directive key-direction ở một vị trí bất kỳ trong file, đặt giá trị thành 1 để VPN có thể hoạt động trên máy client:

key-direction 1

Cuối cùng, comment một số dòng dưới đây để xử lý các phương thức khác nhau mà những client dựa trên Linux có thể sử dụng để phân giải DNS.

; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf

Sau đó thêm một số dòng cho những client sử dụng systemd-resolved để phân giải DNS:

; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .

Cuối cùng là lưu rồi đóng file lại.

Tiếp theo, bạn sẽ tạo một script để biên dịch cấu hình cơ sở với key, chứng chỉ và file mã hóa tương ứng rồi đặt vào thư mục ~/client-configs/files.

Mở file make_config.sh trong thư mục ~client-configs:

nano ~/client-configs/make_config.sh

Rồi thêm các nội dung sau:

#!/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

Sau đó lưu rồi đóng file lại.

Cuối cùng, đặt quyền thực thi cho file này:

chmod 700 ~/client-configs/make_config.sh

Script này sẽ tạo một bản sao của file base.conf mà bạn đã tạo, thu thập tất cả các file chứng chỉ và key đã tạo cho client. Sau đó trích xuất nội dung và thêm vào bản sao của file cấu hình cơ sở, sau đó xuất tất cả nội dung này vào một file cấu hình client mới. Khi đó, thay vì phải quản lý riêng các file cấu hình, chứng chỉ và key của client thì tất cả thông tin cần thiết sẽ được lưu trữ ở một vị trí duy nhất.

Nếu sau này cần thêm client mới thì chỉ cần chạy script này để nhanh chóng tạo file cấu hình mới và đảm bảo rằng tất cả thông tin quan trọng được lưu trữ trong một file duy nhất, dễ truy cập.

Lưu ý rằng mỗi khi thêm một client mới, bạn cần tạo các khóa và chứng chỉ mới cho client đó trước khi có thể chạy script này và tạo file cấu hình.

Bước 12: Tạo cấu hình client

Đến đây, bạn có được một chứng chỉ và key client (client1.crtclient1.key). Bây giờ vào thư mục ~/client-configs rồi chạy script dưới đây để tạo một file config cho các thông tin đăng nhập này:

cd ~/client-configs
./make_config.sh client1

Lệnh này sẽ tạo một file mới tên client1.ovpn trong thư mục ~client-configs/files:

ls ~/client-configs/files

Output:

Output
client1.ovpn

Bạn cần chuyển file này đến thiết bị dùng sử dụng làm client như máy local hay thiết bị di động. Phương thức truyền file sẽ phụ thuộc vào hệ điều hành của thiết bị và nhu cầu của từng cá nhân. Vietnix khuyên bạn nên sử dụng giao thức SFTP hoặc SCP để truyền file thông qua kết nối được mã hóa an toàn.

Dưới đây là một lệnh mẫu dùng SFTP để copy file client1.ovpn:

sftp vietnix@openvpn_server_ip:client-configs/files/client1.ovpn ~/

Bước 13: Cài đặt cấu hình client

Ở bước này, bạn sẽ tìm hiểu cách cài đặt một profile client VPN trên Windows, macOS, Linux, iOS và Android. Bạn đọc có thể đến phần hướng dẫn tương ứng với thiết bị của mình vì quá trình cài đặt trên các thiết bị sẽ không liên quan đến nhau.

Ở ví dụ này, kết nối OpenVPN sẽ được tạm gọi là client1.ovpn.

Windows

Cài đặt

Trước tiên, download ứng dụng client OpenVPN cho Windows tại https://openvpn.net/community-downloads/. Sau đó copy file .opvn vào thư mục C:\Program Files\OpenVPN\config.

Khi khởi chạy OpenVPN thì nó sẽ tự động tìm và bật profile.

Lưu ý rằng ta phải chạy OpenVPN với tư cách quản trị viên mỗi khi nó được sử dụng, kể cả bằng tài khoản quản trị.

Để đặt ứng dụng OpenVPN luôn chạy với tư cách admin, hãy click chuột phải vào biểu tượng rồi chuyển đến tab Properties. Ở cuối tab Compatibility, nhấp vào nút Change settings for all users. Trong cửa sổ mới, hãy check vào option Run this program as an administrator.

Kết nối

Mỗi lần khởi chạy OpenVPN GUI, Windows sẽ hỏi xem có muốn cho phép chương trình thực hiện các thay đổi đối với máy tính của mình không. Nhấp vào Yes. Khởi chạy ứng client OpenVPN chỉ đặt applet vào khay hệ thống để ta có thể kết nối và ngắt kết nối VPN khi cần chứ không thực sự tạo kết nối VPN.

Khi OpenVPN được bắt đầu, hãy bắt đầu kết nối bằng cách truy cập ứng dụng trên khay hệ thống và click chuột phải vào biểu tượng ứng dụng OpenVPN. Thao tác này sẽ mở menu ngữ cảnh. Chọn client1 ở đầu menu (profile client1.ovpn) và chọn Connect.

Một cửa sổ trạng thái sẽ mở ra hiển thị đầu ra log trong khi kết nối được thiết lập và một thông báo sẽ hiển thị sau khi client được kết nối.

Ta cũng có thể ngắt kết nối khỏi VPN theo cách tương tự: Đi vào ứng dụng của khay hệ thống, nhấp chuột phải vào biểu tượng ứng dụng của OpenVPN, chọn cấu hình client rồi click Disconnect.

macOS

Cài đặt

Tunnelblick là ứng dụng client OpenVPN mã nguồn mở, miễn phí dành cho macOS. Bạn có thể tải xuống image mới nhất từ trang chủ tại https://tunnelblick.net/downloads.html. Click đúp vào file .dmg đã tải xuống và làm theo hướng dẫn để cài đặt.

Khi kết thúc quá trình cài đặt, Tunnelblick sẽ hỏi xem có file cấu hình nào không. Chọn I have configuration files và để Tunnelblick tự hoàn thành. Mở cửa sổ Finder và click đúp vào client1.ovpn. Tunnelblick sẽ cài đặt profile client. Lưu ý bạn cần có quyền admin để thực hiện cài đặt.

Kết nối

Khởi động Tunnelblick bằng cách nhấp đúp vào biểu tượng Tunnelblick trong thư mục Ứng dụng.

Khi Tunnelblick đã được khởi chạy, sẽ có một biểu tượng Tunnelblick trong thanh menu ở trên cùng bên phải của màn hình để kiểm soát các kết nối. Nhấp vào biểu tượng, sau đó nhấp vào mục menu Connect client1 để bắt đầu kết nối VPN.

Nếu đang sử dụng cài đặt DNS tùy chỉnh với Tunnelblick thì bạn nên check vào option “Allow changes to manually-set network settings” trong hộp thoại cấu hình nâng cao.

Linux

Cài đặt

Linux có rất nhiều công cụ có thể sử dụng, tùy vào bản phân phối đang có trên hệ thống. Môi trường máy tính desktop hoặc trình quản lý Windows của bạn cũng có thể có sẵn các tiện ích kết nối. Tuy nhiên, cách kết nối phổ biến nhất là chỉ sử dụng phần mềm OpenVPN.

Bạn có thể cài đặt trên server Ubuntu hoặc Debian bằng lệnh sau:

sudo apt update
sudo apt install openvpn

Trên CentOS thì ta có thể enable repo EPEL rồi cài đặt như sau:

sudo dnf install epel-release
sudo dnf install openvpn

Cấu hình client sử dụng systemd-resolved

Trước tiên kiểm tra xem hệ thống có đang sử dụng systemd-resolved để phân giải DNS hay không bằng cách kiểm tra file /etc/resolv.conf:

cat /etc/resolv.conf
Output
# This file is managed by man:systemd-resolved(8). Do not edit.
. . .

nameserver 127.0.0.53
options edns0

Nếu hệ thống sử dụng systemd-reosolved để phân giải DNS thì địa chỉ IP sau option nameserver sẽ là 127.0.0.53. Để hỗ trợ các client này thì cần cài đặt package openvpn-systemd-resolved:

sudo apt install openvpn-systemd-resolved

Sau đó cấu hình cho client sử dụng và gửi mọi truy vấn DNS qua giao diện VPN. Bây giờ hãy mở file client VPN:

nano client1.ovpn

Sau đó uncomment các dòng sau:

script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

Cấu hình các client sử dụng update-resolv-conf

Nếu hệ thống không sử dụng systemd-resolved để quản lý DNS thì hãy kiểm tra phân phối có script /etc/openvpn/update-resolv-conf:

ls /etc/openvpn
Output
update-resolv-conf

Nếu client có file update-resolv-conf thì hãy edit file như sau:

nano client1.ovpn

Uncomment các dòng sau:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Nếu đang dùng CentOS thì hãy đổi giá trị của directive group từ nogroup thành nobody:

groip nobody

Sau đó lưu rồi đóng file lại.

Kết nối

Bây giờ ta có thể kết nối đến VPN bằng cách trỏ lệnh openvpn đến file config của client:

sudo openvpn --config client1.ovpn

Sau đó ta sẽ kết nối được đến VPN.

iOS

Cài đặt

Từ iTunes App Store, tìm và cài đặt OpenVPN Connect – client OpenVPN chính thức của iOS. Để chuyển cấu hình ứng dụng khách iOS vào thiết bị, hãy kết nối trực tiếp thiết bị với máy tính.

Đầu tiên, mở iTunes trên máy tính và click vào iPhone > apps. Kéo xuống dưới cùng đến phần File Sharing và click vào ứng dụng OpenVPN. Phần cửa sổ OpenVPN bên phải là dành cho chia sẻ file. Kéo file .ovpn vào cửa sổ OpenVPN Documents.

Cửa sổ OpenVPN Documents
Cửa sổ OpenVPN Documents

Sau đó mở OpenVPN trên máy. Nhấn vào nút màu xanh lá trên màn hình để import profile mới.

Mở OpenVPN
Mở OpenVPN

Kết nối

Bây giờ bạn có thể sử dụng profile mới. Khởi động kết nối bằng cách trượt nút Connect sang vị trí On hoặc disconnect bằng cách trượt sang Off.

Kết nối với OpenVPN
Kết nối với OpenVPN

Android

Cài đặt

Mở Google Play Store, tìm và cài đặt ứng dụng Android OpenVPN Connect. Ta có thể chuyển file .ovpn bằng cách kết nối thiết bị Android đến máy tính bằng USB hoặc copy file sang. Ngoài ra nếu có đầu đọc thẻ SD thì có thể xóa SD của thiết bị, copy profile vào thẻ rồi cắm lại vào thiết bị.

Khởi động ứng dụng rồi nhấn vào menu FILE để import profile.

Import profile
Import profile

Sau đó chuyển sang nơi lưu profile rồi chọn file .ovpn. Nhấn nút IMPORT để hoàn tất.

Nhấn vào nút Import để hoàn tất
Nhấn vào nút Import để hoàn tất

Kết nối

Sau khi thêm profile xong ta sẽ thấy một màn hình như dưới đây:

Giao diện profiles
Giao diện profiles

Nhấn vào nút bật bên cạnh profile muốn sử dụng để kết nối. Sau đó sẽ thấy các thông số trong thời gian thực của kết nối và quan sát được cả những lưu lượng được định tuyến qua server OpenVPN:

Kết nối Profiles với OpenVPN
Kết nối Profiles với OpenVPN

Nếu muốn disconnect thì nhấn vào nút bật một lần nữa.

Bước 14: Kiểm tra kết nối VPN

Lưu ý: Phương pháp này chỉ áp dụng nếu bạn chọn định tuyến mọi lưu lượng qua VPN trong Bước 7 khi chỉnh sửa file server.conf cho OpenVPN.

Khi mọi thứ đã được cài đặt, bạn có thể kiểm tra để xác nhận mọi thứ đang hoạt động bình thường. Không bật kết nối VPN, hãy mở trình duyệt và truy cập DNSLeakTest (https://www.dnsleaktest.com/).

Trang web sẽ trả lại địa chỉ IP được chỉ định bởi nhà cung cấp dịch vụ internet. Để kiểm tra cài đặt DNS thông qua cùng một trang web, click vào Extended Test và nó sẽ cho biết ta đang sử dụng máy chủ DNS nào.

Bây giờ hãy kết nối ứng dụng khách OpenVPN với VPN của Droplet và refresh lại trình duyệt. Một địa chỉ IP hoàn toàn khác (địa chỉ IP của server VPN) sẽ xuất hiện. Đây cũng là cách ta hiển thị với mọi người.

Bước 15: Thu hồi chứng chỉ client

Đôi khi, bạn có thể cần thu hồi chứng chỉ của client để ngăn không cho tiếp tục truy cập vào server OpenVPN.

Sau khi thu hồi chứng chỉ client, hãy copy file crl.pem đã tạo vào server OpenVPN của mình trong thư mục /etc/openvpn/server:

sudo cp /tmp/crl.pem /etc/openvpn/server/

Sau đó mở file cấu hình OpenVPN:

sudo nano /etc/openvpn/server/server.conf

Ở phía cuối file, thêm option crl-verify để yêu cầu server OpenVPN kiểm tra danh sách thu hồi chứng chỉ đã tạo mỗi khi có kết nối được thiết lập:

crl-verify crl.pem

Sau đó lưu rồi đóng file lại.

Cuối cùng, restart OpenVPN để thực hiện việc thu hồi:

sudo systemctl restart openvpn-server@server.service

Bây giờ client sẽ không còn kết nối đến sử dụng bằng thông tin đăng nhập cũ nữa.

Để thu hồi cho các client khác, thực hiện các bước sau:

  1. Thu hồi bằng lệnh ./easyrsa revoke client_name.
  2. Khởi tạo một CRL mới.
  3. Truyền file crl.pem mới đeens server OpenVPN rồi copy vào thư mục /etc/openvpn/server/ để ghi đè danh sách cũ.
  4. Restart dịch vụ OpenVPN.

Với 11 năm kinh nghiệm và đồng hành cùng sự thành công của 50.000+ khách hàng, Vietnix tự hào là một trong những nhà cung cấp hosting, VPS hàng đầu tại Việt Nam. Nếu bạn đang tìm kiếm dịch vụ VPS chất lượng cao để triển khai dự án, hãy liên hệ ngay với Vietnix.

  • Với hơn 100.000 dịch vụ đã được kích hoạt tại Vietnix, điều này chứng tỏ sự tin tưởng của đông đảo khách hàng.
  • Năm 2022, Vietnix đã nhận được giải thưởng Thương hiệu Việt Nam xuất sắc, khẳng định chất lượng và uy tín của dịch vụ.
  • 97% khách hàng đánh giá 5 sao và giới thiệu dịch vụ sau khi sử dụng, chứng tỏ dịch vụ của Vietnix được đánh giá cao.

Liên hệ với Vietnix theo những thông tin dưới đây để trải nghiệm VPS tốc độ cao ngay hôm nay.

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn

Như vậy, thực hiện theo hướng dẫn về cách cài đặt OpenVPN trên Ubuntu 20.04 bạn đã có một mạng VPN hoạt động đầy đủ đang chạy trên máy chủ OpenVPN của mình. Có thể duyệt web và download các nội dung mà không phải lo lắng về các tác nhân độc hại theo dõi hoạt động. Để cấu hình nhiều client hơn, bạn chỉ cần làm theo các bước 6 và 11-13 cho mỗi thiết bị mới. Để thu hồi quyền truy cập vào máy client, hãy làm theo bước 15. Nếu có bất kỳ thắc mắc nào khác, hãy bình luận bên dưới để được Vietnix hỗ trợ nhanh nhất nhé.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Banner group
Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

Black Friday Hosting & VPS

Chương trình bắt đầu sau

Giảm giá 40% hosting VPS

50 coupon mỗi ngày

Gia hạn giá không đổi

NHẬN DEAL NGAY
Pattern

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG