Trong bài viết này, chúng ta sẽ xem xét cài đặt và cấu hình máy chủ OpenVPN chạy Linux CentOS/RHEL (7/8) và chỉ cách kết nối hai máy tính từ xa (hoặc văn phòng) phía sau NAT thành một mạng duy nhất bằng máy chủ OpenVPN đã cấu hình. Client VPN sẽ được xác thực bằng chứng chỉ.
VPN là tập hợp công nghệ cho phép xây dựng mạng an toàn qua mạng công cộng hoặc Internet. Sử dụng VPN, bạn có thể kết nối các thiết bị hoặc mạng khác nhau thành một mạng cục bộ an toàn qua Internet.
OpenVPN là một trong những triển khai mã nguồn mở của công nghệ VPN dựa trên SSL/TLS và OpenSSL. Sử dụng OpenVPN, bạn có thể kết nối cả văn phòng từ xa và máy tính cá nhân phía sau thiết bị NAT vào một mạng duy nhất.
Cài đặt OpenVPN và Easy-RSA
Trong bước đầu, bạn phải kết nối kho EPEL và cập nhật máy chủ:
# yum install epel-release -y
# yum update -y
Sau khi hệ thống cập nhật, cài đặt OpenVPN và Easy-RSA bằng trình quản lý gói yum (chúng ta sẽ cần nó để triển khai cơ sở hạ tầng khóa PKI trên máy chủ VPN).
# yum install openvpn easy-rsa -y
Cách cấu hình Easy-RSA và tạo chứng chỉ X.509?
Sao chép tất cả script easy-rsa vào /etc/openvpn/:
# cp -r /usr/share/easy-rsa /etc/openvpn/
Đi đến /etc/openvpn/easy-rsa/3/ và tạo file vars tại đó:
# cd /etc/openvpn/easy-rsa/3/
# nano vars
Thêm nội dung file (bạn có thể sửa cấu hình theo nhu cầu):
set_var EASYRSA "$PWD" set_var EASYRSA_PKI "$EASYRSA/pki" set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "DE" set_var EASYRSA_REQ_PROVINCE "MUN" set_var EASYRSA_REQ_CITY "BY" set_var EASYRSA_REQ_ORG "WOSHUB" set_var EASYRSA_REQ_EMAIL "vpnadmin@woshub.com" set_var EASYRSA_REQ_OU "IT dept" set_var EASYRSA_KEY_SIZE 4096 set_var EASYRSA_ALGO rsa set_var EASYRSA_CA_EXPIRE 7500 set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_NS_SUPPORT "no" set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY" set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types" set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf" set_var EASYRSA_DIGEST "sha512"
Bạn có thể chỉ định bất kỳ dữ liệu nào trong file, nó sẽ không ảnh hưởng đến cấu hình và vận hành tiếp theo của máy chủ.
File phải có quyền thực thi, vì vậy chạy:
# chmod +x vars
Tạo chứng chỉ và khóa OpenVPN
Trước khi tạo khóa, khởi tạo thư mục PKI và tạo khóa CA.
# cd /etc/openvpn/easy-rsa/3/
# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /etc/openvpn/easy-rsa/3/pki
Tạo khóa CA:
# ./easyrsa build-ca
Sau khi chạy lệnh, bạn sẽ cần nhập mật khẩu để tạo khóa và chứng chỉ. Bạn sẽ cần mật khẩu sau để ký chứng chỉ.

Tạo khóa server (tên server là vpn.woshub.com):
tùy chọn nopass tắt mật khẩu
# ./easyrsa gen-req vpn.woshub.com nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key .........................++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key.R4IYCbD1zP' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [vpn.woshub.com]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/vpn.woshub.com.req key: /etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key
Khi cấp chứng chỉ, nhấn Enter ở cột Common Name.
Ký khóa vpn.woshub.com bằng chứng chỉ CA của chúng ta:
# ./easyrsa sign-req server vpn.woshub.com
Để ký chứng chỉ, chúng ta sẽ cần mật khẩu đã đặt khi cấp CA chứng chỉ:

Như ảnh chụp màn hình, bạn sẽ phải nhập yes và CA password trong quá trình.
Để đảm bảo chứng chỉ được tạo không lỗi, chạy lệnh:
# openssl verify -CAfile pki/ca.crt pki/issued/vpn.woshub.com.crt
pki/issued/vpn.woshub.com.crt: OK
Tất cả chứng chỉ máy chủ OpenVPN đã được tạo.
- Chứng chỉ gốc
pki/ca.crt - Khóa riêng server
pki/private/vpn.woshub.com.key - Chứng chỉ server
pki/issued/vpn.woshub.com.crt
Để tạo khóa client, chạy lệnh:
# ./easyrsa gen-req client_name nopass
Hãy tạo khóa client admin1:
# ./easyrsa gen-req admin1 nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key ..........++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/admin1.key.R5OY6reT2e' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [admin1]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/admin1.req key: /etc/openvpn/easy-rsa/3/pki/private/admin1.key
Bạn phải ký nó bằng chứng chỉ CA, giống như khóa server:
# ./easyrsa sign-req client admin1

Chứng chỉ cho người dùng đã được tạo.
Ngoài ra, bạn phải tạo khóa Diffie-Hellman để dùng cho trao đổi khóa:
# ./easyrsa gen-dh
Mất một chút thời gian để tạo:

Sau đó tạo chứng chỉ TSL:
# openvpn --genkey --secret ta.key
Nếu sau này chúng ta sẽ thu hồi chứng chỉ client, cần tạo khóa CRL:
# ./easyrsa gen-crl
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Using configuration from /etc/openvpn/easy-rsa/3/pki/safessl-easyrsa.cnf Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key: An updated CRL has been created. CRL file: /etc/openvpn/easy-rsa/3/pki/crl.pem
Để thu hồi chứng chỉ, chạy lệnh:
./easyrsa revoke admin1— trong đó admin1 là tên chứng chỉCác chứng chỉ cần thiết đã được tạo. Bây giờ sao chép chúng vào thư mục làm việc.
Đây là chứng chỉ server:
# cp pki/ca.crt /etc/openvpn/server/ # cp pki/issued/vpn.woshub.com.crt /etc/openvpn/server/ # cp pki/private/vpn.woshub.com.key /etc/openvpn/server/ # cp pki/private/dh.pem /etc/openvpn/server/ # cp pki/private/ta.key /etc/openvpn/server/ # cp pki/crl.pem /etc/openvpn/server/Đây là chứng chỉ client:
# cp pki/issued/admin1.crt /etc/openvpn/client/ # cp pki/private/admin1.key /etc/openvpn/client/File cấu hình OpenVPN Server, Quy tắc Firewall
Chuyển sang cài đặt file cấu hình OpenVPN. Trước hết, tạo file cấu hình OpenVPN server.conf:
# cd /etc/openvpn/ && nano server.confThay đổi nội dung file như sau:
# Chỉ định cổng, giao thức và thiết bị port 1194 proto udp dev tun # Chỉ định đường dẫn đến chứng chỉ server ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/vpn.woshub.com.crt key /etc/openvpn/server/vpn.woshub.com.key # Đường dẫn đến khóa CRL và DH dh /etc/openvpn/server/dh.pem crl-verify /etc/openvpn/server/crl.pem # Chỉ định cài đặt IP của mạng VPN client sẽ lấy địa chỉ từ server 10.1.2.0 255.255.255.0 push "redirect-gateway def1" # Chỉ định máy chủ DNS được gán push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" # Cho phép kết nối đến các client khác với cùng khóa duplicate-cn # Bảo vệ TLS tls-auth /etc/openvpn/server/ta.key 0 cipher AES-256-CBC tls-version-min 1.2 tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 auth SHA512 auth-nocache # Các chi tiết cấu hình khác keepalive 20 60 persist-key persist-tun comp-lzo yes daemon user nobody group nobody # Đường dẫn đến file log log-append /var/log/openvpn.log verb 3Sau đó lưu file. Tôi đã chỉ định cổng UDP mặc định 1194 cho máy chủ VPN, nhưng bạn có thể chỉ định bất kỳ cổng trống nào trên máy chủ cho OpenVPN.
Bây giờ bạn chỉ cần đặt quy tắc tường lửa để cho phép kết nối và định tuyến giữa các phân đoạn.
Nếu bạn dùng firewalld, kích hoạt module kernel forwarding trước:
# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf # sysctl -pnet.ipv4.ip_forward = 1Thêm dịch vụ openvpn vào firewalld, và giao diện tun0 vào zone trusted:
# firewall-cmd --permanent --add-service=openvpn # firewall-cmd --permanent --zone=trusted --add-interface=tun0Kích hoạt 'MASQUERADE' cho zone trusted của firewalld:
# firewall-cmd --permanent --zone=trusted --add-masqueradeKích hoạt NAT:
# firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.1.2.0/24 -o Server_IP -j MASQUERADE # firewall-cmd --reloadNếu bạn dùng iptables không qua firewalld, chạy các lệnh:
# iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o eth0 -j MASQUERADE # iptables -A INPUT -p udp --dport 1194 -j ACCEPT # service iptables saveChạy dịch vụ OpenVPN và thêm vào khởi động:
# systemctl start openvpn@server # systemctl enable openvpn@serverĐảm bảo cổng udp/1194 đang được lắng nghe bởi dịch vụ openvpn:
# lsof -i:1194COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME openvpn 12327 nobody 5u IPv4 45122 0t0 UDP *:openvpnKiểm tra cài đặt IP của giao diện mạng:
# ip a~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.1.2.1 peer 10.1.2.2/32 scope global tun0 valid_lft forever preferred_lft foreverNhư bạn thấy, mạng được chỉ định trong cấu hình được thêm vào thiết bị tun0.
Đây là cài đặt tối thiểu để OpenVPN hoạt động.
Cách kết nối nhiều văn phòng (máy tính) bằng OpenVPN?
Hãy xem cách kết nối đến máy chủ OpenVPN từ hai máy tính từ xa có truy cập Internet qua NAT và gộp chúng vào một mạng duy nhất. Để kết nối từ máy tính chạy Windows đến máy chủ OpenVPN, tôi dùng client chính thức. Bạn có thể tải từ trang web chính thức, nhưng chúng ta không mô tả chi tiết, và đi thẳng đến cấu hình.
Sau khi cài client, chuyển sang tạo file cấu hình tại:
C:\Program Files\OpenVPN\config\Tôi tạo file tên client và thêm nội dung sau:
client dev tun proto udp remote 112.113.114.15 1194 resolv-retry infinite nobind block-outside-dns persist-key persist-tun mute-replay-warnings remote-cert-tls server tls-client auth SHA512 tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1 remote-cert-eku "TLS Web Server Authentication" ca "C:\\Program Files\\OpenVPN\\config\\ca.crt" cert "C:\\Program Files\\OpenVPN\\config\\admin1.crt" key "C:\\Program Files\\OpenVPN\\config\\admin1.key" cipher AES-256-CBC comp-lzo verb 3Để cấu hình, chúng ta cần chứng chỉ client, bảo mật và server đã tạo trước. Bạn phải tải chúng từ server và đặt vào thư mục cục bộ. Sau đó chỉ định đường dẫn đến chúng trong file cấu hình client OpenVPN.
Sau đó bạn có thể kết nối đến server bằng cách nhấp vào biểu tượng OpenVPN trong khay hệ thống:
Tôi đã kết nối và nhận được địa chỉ IP cho thiết bị:
IPv4 address. . . . . . . . . . . . : 10.1.2.14 Subnet mask . . . . . . . . . . : 255.255.255.0Trên máy tính thứ hai phía sau NAT, tôi thực hiện cùng hành động và tạo chứng chỉ cho người dùng thứ hai trước. Sau kết nối, máy tính thứ hai cũng nhận địa chỉ IP từ mạng VPN:
IPv4 address. . . . . . . . . . . . : 10.1.2.16 Subnet mask . . . . . . . . . . : 255.255.255.0Sau kết nối, cả hai máy tính trong cùng mạng và thấy nhau.
Ping máy tính thứ hai:
Pinging 10.1.2.16 with 32 bytes of data: Reply from 10.1.2.16: bytes=32 time=73ms TTL=127Ping trên máy tính đầu tiên:
Pinging 10.1.2.14 with 32 bytes of data: Reply from 10.1.2.14: bytes=32 time=79ms TTL=127Cả hai client VPN kết nối đều có thể gửi gói tin và truyền file trực tiếp cho nhau. Như vậy, chúng ta đã gộp hai thiết bị vật lý ở vị trí khác nhau của đất nước vào một mạng cục bộ duy nhất.
Bạn có thể tạo bất kỳ số lượng khóa hoặc chứng chỉ cho người dùng trên máy chủ OpenVPN. Nếu cần chứng chỉ mới, chạy các lệnh này cho /etc/openvpn/easy-rsa/3:
# ./easyrsa gen-req clientname nopass # ./easyrsa sign-req client clientnameĐừng quên thu hồi chứng chỉ client nếu không sử dụng để giữ an toàn mạng.
