[VPN] Hướng Dẫn Xây Dựng Hệ Thống OpenVPN

Hướng Dẫn Xây Dựng Hệ Thống OpenVPN

Hệ Điều Hành : Centos 6.6 minimal
IP public         : 192.168.1.100

 

<1>. Kiểm tra sự hỗ trợ module TUN/TAP kernel của hệ thống máy chủ

1.1> Kiểm tra kernel OS có hỗ trợ module TUN/TAP hay không ?
Chúng ta sẽ thực thi lệnh sau để kiểm tra thông tin cần thiết :

# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

Nếu chúng ta có output như trên thì chứng tỏ máy chủ của chúng ta có hỗ trợ TUN/TAP trong kernel hệ thống. Còn nếu output ra khác thì có khả năng TUN/TAP kernel module có vấn đề hoặc kernel không hỗ trợ module này.

 

1.2> Kiểm tra TUN/TAP module đã kích hoạt hay chưa ?
Trong trường hợp, module TUN/TAP đã được kernel hỗ trợ thì công việc kế tiếp là kiểm tra xem module này đã được kích hoạt hay chưa ? Chúng ta sẽ chạy lệnh sau để kiểm tra xem module TUN/TAP đã được kích hoạt trên kernel VPS hay chưa.

# lsmod | grep "tun"
tun    16646  0

-> Nếu output ra kết quả bất kì như trên thì chứng tỏ TUN/TAP module đã được kích hoạt. Còn nếu lệnh trên không hề xuất ra thông tin output nào thì có khả năng là chưa được kích hoạt.

 

1.3> Kích hoạt module TUN/TAP

Để kích hoạt module TUN/TAP kernel ta sẽ sử dụng chương trình lệnh “modprobe” nhằm kích hoạt module :

# modprobe tun
# lsmod | grep tun
tun    82432  6

 

1.4> Làm sao để kích hoạt tự động module kernel mỗi khi reboot máy ?
Theo như mình biết thì file “modprobe.conf” và “modules.conf” chỉ là những file cấu hình, không hề có nhiệm vụ triệu hồi chương trình lệnh”modprobe”. Tất cả những gì chúng làm là cung cấp thông tin về những đối tượng mà chương trình phải thực thi khi được triệu hồi.

Chúng ta sẽ thêm dòng script vào file “/etc/rc.local” , đây là một file được thực thi sau cùng của hệ điều hành khi mà tất cả các file “rc.d” tương ứng level khác đã được thực thi. Như vậy ta sẽ thêm một script thực thi việc kích hoạt module TUN/TAP kernel lên khi hệ thống được khởi động.

# vim /etc/rc.d/rc.local
/sbin/modprobe tun

 

Chúng ta đã xong giai đoạn một : Xác định và kích hoạt module TUN/TAP kernel trên hệ thống máy chủ xây dựng OpenVPN.

 

<2>. Cài đặt phần mềm OpenVPN

Chúng ta sẽ cài đặt OpenVPN thông qua “yum” với sự hỗ trợ của repository của bên thứ 3 là EPEL.

– YUM là một công cụ quản lý và cài đặt phần mềm rất tiện dụng cho các hệ thống Red Hat Linux.

– EPEL (Extra Packages for Enterprise Linux) là một dự án repository từ Fedora team cung cấp rất nhiều gói add-on package mà chúng ta thường dùng cho các bản Linux bao gồm CentOS, RHEL (Red Hat Enterprise Linux) và Scientific Linux.

 

2.1> Cài đặt EPEL Repo trên CentOS 7/6/5

# yum install epel-release -y

Nếu không cài được bằng lệnh “yum” thì bạn hãy search google download bản cài đặt epel tương ứng OS và 32/64 bit.

 

2.2> Cài đặt OpenVPN và các gói tin cần thiết

# yum install openssl-devel lzo-devel pam-devel openvpn

 

2.3> Copy config mẫu vào thư mục chính OpenVPN

Mặc định OpenVPN cung cấp file OpenVPN mẫu về cấu hình ở đường dẫn : /usr/share/doc/openvpn-*/sample-config-files/server.conf

# cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn

 

Giai đoạn 2 hoàn tất việc cài đặt OpenVPN vào hệ thống.

 

<3>. Xây dựng Hạ Tầng Khoá Công Khai (PKI) cơ bản

Chúng ta sẽ đến với phần xây dựng một hệ thống khoá công khai (PKI) cơ bản. Mình sẽ liệt kê các loại certificate và key được sử dụng chủ yếu trong vận hành OpenVPN bao gồm :

  • ca.crt -> root certificate
  • ca.key -> root key
  • .crt files -> client/server certificates
  • .key files -> private keys, keep secure
  • .csr files -> certificate signing request
  • dh2048.pem -> Diffie Hellman parameters (–dh)
  • ta.key -> HMAC, mã xác thực được sử dụng thêm.

Kế đến chúng ta sẽ nói sơ qua công dụng của các loại này :
– client.crt/client.key : được dùng để xác thực người dùng user, cặp key này không được dùng để mã hoá dữ liệu data.
– server.crt/server.key : được dùng để mã hoá dữ liệu được truyền đi tới client.
– ca.crt/ca.key : là một khái niệm về hệ thống chấp nhận yêu cầu từ người dùng, xác nhận yêu cầu, cấp phát chứng chỉ điện tử, bảo trì thông tin trạng thái,…
– dh2048.pem : được sử dụng trong quá trình SSL/TLS, là một secret key. mình sẽ làm một bài nói rõ về phần này sau.
– ta.key : sẽ nói sơ ở phần cấu hình.


3.1>  Cài đặt chương trình Easy-RSA

# yum install easy-rsa -y
# mkdir -p /etc/openvpn/easy-rsa/
# cp /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/


3.2>  Khởi tạo các biến môi trường được sử dụng bởi các chương trình Easy-RSA

Tập tin vars bao gồm nội dung các biến sẽ được load lên môi trường terminal đang sử dụng nhằm phục vụ cho việc khởi tạo key hay cert bởi các PKI script. Vậy chúng ta sẽ cấu hình thay đổi một vài giá trị như KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG vàKEY_EMAIL để tạo cert info (không được để trống những phần này). Thông số KEY_SIZE nên đặt giá trị cao là 4096 để sử dụng 4096 bit RSA cho việc chứng thực.

Bạn có thể thay đổi tên tập tin vars thành bất cứ tên gì bạn muốn. Các giá trị cần chú ý sẽ được mình trình bày dưới đây

# vi /etc/openvpn/easy-rsa/vars
 export KEY_DIR="/etc/openvpn/keys/"
 export PKCS11_MODULE_PATH="cuongquach"
 export PKCS11_PIN="cuongquach"
 export KEY_SIZE=4096
 export KEY_COUNTRY="VN"
 export KEY_PROVINCE="CA"
 export KEY_CITY="HoChiMinh"
 export KEY_ORG="cuongquach"
 export KEY_EMAIL="cuong@cuongquach.com"
 export KEY_OU="Technique"
 # X509 Subject Field
 export KEY_NAME="EasyRSA"
 export KEY_CN="VPN

Chúng ta sẽ tạo thư mục để chứa các file key và certificate được tạo ra tương ứng trong khai báo ở trên.

# mkdir -p /etc/openvpn/keys


3.3>  Load biến môi trường trong vars

Chúng ta sẽ load biến môi trường nằm trong file “/etc/openvpn/easy-rsa/vars” bằng lệnh sau, nó sẽ export các biến lên để phục vụ cho các chương trình khác sử dụng thông số biến.

# pwd
 /etc/openvpn/easy-rsa
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/keys/

Nếu bạn nhận được dòng thông báo trên tức là nó hỏi bạn có muốn cài xoá hết tất cả mọi thứ trong directory chứa key đó nếu bạn cài mới. Còn không thì tuyệt đối không gõ lệnh này.

# ./clean-all


3.4>  Khởi tạo Root Certificate

Kế đến, bạn sẽ thấy là trong directory /etc/openvpn/keys/ không có các file quan trọng như ca.key, index và serial file. Do bạn vừa thực hiện xoá hết bằng lệnh clean-all . Lúc này ta sẽ khởi tạo một Root Certifiate bằng chương trình “pkitool” của OpenSSL .

Các bạn nên lưu ý “pkitool” chính là chương trình chính của Easy-RSA sử dụng để build các key, certificate,.. các chương trình liên quan khác trong bài đều là dùng để gọi chương trình “pkitool” này lên cùng tham số truyền vào thôi.

Khởi tạo CA Root mà không có mật khẩu :

#./pkitool --keysize 4096 --initca
Using CA Common Name: VPN
Generating a 4096 bit RSA private key
....................++
....................................................................++
writing new private key to 'ca.key'
-----

Khởi tạo CA Root mà có mật khẩu :

# ./pkitool --keysize 4096 --initca --pass
Using CA Common Name: VPN
Generating a 4096 bit RSA private key
....................++
....................................................................++
writing new private key to 'ca.key'
-----
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

Sau khi tạo xong bạn sẽ có 2 file “ca.crt” và “ca.key” nằm trong thư mục key của chúng ta.


3.5>  Khởi tạo server key/certificate

Bây giờ chúng ta sẽ tạo ra một chứng chỉ Server và key (server.crt/server.key), bạn có 2 chương trình để khởi chạy đó là “build-key-server”, là shell script gọi “pkitool” hoặc chính pkitool luôn. Mình sẽ hướng dẫn sử dụng cả hai.

Xem nội dung shell script “build-key-server”

[root]# cat ./build-key-server
#!/bin/sh
# Make a certificate/private key pair using a locally generated
root certificate.
Explicitly set nsCertType to server using the "server"
extension in the openssl.cnf file.
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --interact --server $*

Khởi tạo chứng chỉ server (server cert), với tham số truyền vào là tên mình định danh.

./build-key-server  

Tool “pkitool” với option –interact giúp bạn hiện các prompt xác nhận như build-key-server mặc định. Nhưng nếu bạn cảm thấy việc phải xác nhận hết tất cả gây ra phiền hà thì bạn có thể bỏ option –interact, nó sẽ tự động đồng ý “yes” với tất cả lựa chọn và cho ra một server certificate hoàn chỉnh.

./pkitool --interact --server vpn

hoặc

./pkitool --server vpn
 Using Common Name: VPN
 Generating a 2048 bit RSA private key
 ....................................................................+++
 ............+++
 writing new private key to 'tunnel.key'
 -----
 Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName :PRINTABLE:'VN'
 stateOrProvinceName :PRINTABLE:'CA'
 localityName :PRINTABLE:'HoChiMinh'
 organizationName :PRINTABLE:'cuonguqach'
 organizationalUnitName:PRINTABLE:'vpn'
 commonName :PRINTABLE:'VPN'
 name :PRINTABLE:'EasyRSA'
 emailAddress :IA5STRING:'cuong@cuongquach.com'
 Certificate is to be certified until Jun 22 09:39:22 2025 GMT (3650 days)
 Write out database with 1 new entries
 Data Base Updated


3.6>   Khởi tạo client cert/key

# ./build-key 
Generating a 2048 bit RSA private key
.................................................+++
........+++
writing new private key to 'client.key'
-----
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.
-----
Country Name (2 letter code) [VN]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [HoChiMinh]:
Organization Name (eg, company) [cuongquach]:
Organizational Unit Name (eg, section) [vpn]:
Common Name (eg, your name or your server's hostname) [client]:
Name [EasyRSA]:
Email Address [cuong@cuongquach.com]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'VN'
stateOrProvinceName :PRINTABLE:'CA'
localityName :PRINTABLE:'HoChiMinh'
organizationName :PRINTABLE:'cuongquach'
organizationalUnitName:PRINTABLE:'vpn'
commonName :PRINTABLE:'client'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'cuong@cuongquach.com'
Certificate is to be certified until Jun 26 15:32:50 2025 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


3.7>   Khởi tạo DH

Chỉ được build và sử dụng từ Server. Ta có thể chọn key size lớn hơn, nhưng mình chọn cao là 4096, thấp nhất là 1024.

# openssl dhparam 4096 -out dh4096.pem

hoặc

#./build-dh


3.8?   Khởi tạo Shared Secret TLS-Auth

Việc khởi tạo “ta.key” giúp chúng ta thêm một mã xác thực thông điệp vào các gói tin ở tiến trình SSL/TLS handshake để đảm bảo thông tin dữ liệu. Tính năng này sẽ đòi hỏi các gói tin chiều tới phải có một mã xác thực hợp lệ được tạo bởi pre-shared key (ta.key) và có thể coi nó như một lớp bảo vệ thứ 2 vậy. Nó giúp ta chống lại các vấn đề bảo mật như :
– DoS hoặc port flooding trên UDP port OpenVPN.
– Port scanning.
– Lỗ hỗng tràn bộ đệm trong sự vận hành của SSL/TLS.
– Tránh việc khởi tạo tiến trình SSL/TLS handshake từ một máy tính không uỷ quyền.

Dùng lệnh sau :

# openvpn --genkey --secret /etc/openvpn/keys/ta.key

Cấu hình quy định sử dụng ta.key sẽ được đề cập ở phần sau.


3.9> Kiểm tra lại các file đã được khởi tạo

# ls -lA /etc/openvpn/keys
-rw-r--r-- 1 root root 5413 Jun 21 21:40 01.pem
-rw-r--r-- 1 root root 1679 Jun 21 21:39 ca.crt
-rw------- 1 root root 1704 Jun 21 21:39 ca.key
-rw-r--r-- 1 root root 424 Jun 21 22:05 dh2048.pem
-rw-r--r-- 1 root root 251 Jun 21 22:11 index.txt
-rw-r--r-- 1 root root 21 Jun 21 22:11 index.txt.attr
-rw-r--r-- 1 root root 3 Jun 21 22:11 serial
-rw------- 1 root root 636 Jun 21 22:08 ta.key
-rw-r--r-- 1 root root 5413 Jun 21 21:40 vpn.crt
-rw-r--r-- 1 root root 1066 Jun 21 21:39 vpn.csr
-rw------- 1 root root 1708 Jun 21 21:39 vpn.key
-rw-r--r-- 1 root root 5292 Jun 21 22:11 user.crt
-rw-r--r-- 1 root root 1070 Jun 21 22:11 user.csr
-rw------- 1 root root 1704 Jun 21 22:11 user.key

[ngày 30/6/2015 chủ nhật mình sẽ post tiếp bản đầy đủ của bài hướng dẫn….]

Previous article[CCNAX] Tổng quan nội dung học CCNAX
Next article[Linux] Tắt tính năng tự gửi mail khi thực thi crontab
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !