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.
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.crt
và ca.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-req
và nopass
, 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.crt
và ta.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 cert
và key
trong file server.conf
. Khi đó các file này mới có thể trỏ đến file .crt
và .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 user
và group
:
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
Tìm directive đặt ca
, cert
và key
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 cipher
và auth
đã đượ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.crt
và client1.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.
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.
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.
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.
Sau đó chuyển sang nơi lưu profile rồi chọn file .ovpn
. Nhấn 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:
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:
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:
- Thu hồi bằng lệnh
./easyrsa revoke client_name
. - Khởi tạo một CRL mới.
- 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ũ. - 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é.