Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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ỉ.

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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ỉ:

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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:

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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.conf

Thay đổ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 3

Sau đó 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 -p
net.ipv4.ip_forward = 1

Thê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=tun0

Kích hoạt 'MASQUERADE' cho zone trusted của firewalld:
# firewall-cmd --permanent --zone=trusted --add-masquerade

Kí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 --reload

Nế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 save

Chạ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:1194
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openvpn 12327 nobody 5u IPv4 45122 0t0 UDP *:openvpn

Kiể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 forever

Như 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:

Cài đặt và cấu hình OpenVPN Server trên Linux CentOS/RHEL

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.0

Trê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.0

Sau 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=127

Ping 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=127

Cả 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.