Как за 15 минут настроить VPN-сеть для безопасного управления Linux-серверами.

В этой статье рассказывается о том, как настроить VPN-сеть на базе OpenVPN OpenSource-проекта https://community.openvpn.net/openvpn.

В этом примере мы установили сервер на моей машине linux-admin.jurkiewicz.tech : VPS NVMe.Light – https://rapiddc.pl/

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-79-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Aug 17 08:55:08 PM CEST 2023

  System load:  0.03857421875      Processes:             97
  Usage of /:   36.6% of 19.60GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for eth0: 188.68.237.191
  Swap usage:   0%

Все скрипты и файлы вы можете найти в репозитории GitHub

Мы будем использовать OpenVPN из системного пакета:

root@linux-admin:~# apt info openvpn
Package: openvpn
Version: 2.5.5-1ubuntu3.1
Priority: optional
Section: net
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Bernhard Schmidt <berni@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug

Если в системе не установлен openvpn, мы можем установить его стандартной командой:

root@linux-admin:~# apt install openvpn

Далее нам необходимо поместить несколько файлов из репозитория на наш сервер. Для этого мы можем использовать Midnight Commander или любую другую программу типа scp.

root@linux-admin:/etc/openvpn/server# ls -l
total 56
-rwxr-xr-x 1 root root  242 Aug 17 21:23 build-ca
-rwxr-xr-x 1 root root  228 Aug 17 21:23 build-dh
-rwxr-xr-x 1 root root  516 Aug 17 21:23 build-key
-rwxr-xr-x 1 root root  662 Aug 17 21:23 build-key-server
-rwxr-xr-x 1 root root  280 Aug 17 21:23 clean-all
-rwxr-xr-x 1 root root  268 Aug 17 21:23 make-crl
-rw-r--r-- 1 root root 7491 Aug 17 21:23 openssl.cnf
-rw-r--r-- 1 root root 1303 Aug 17 21:23 vars
-rw-r--r-- 1 root root 9659 Aug 17 21:23 vpn_example.conf

Далее нам необходимо подправить наш файл vars и заполнить его данными aur. Для этого мы используем стандартный vim:

root@linux-admin:/etc/openvpn/server# vim vars

## we have to change the following env variables:

export KEY_COUNTRY="PL"
export KEY_PROVINCE="Mazowsze"
export KEY_CITY="Warszawa"
export KEY_ORG="OpenVPN-Adam"
export KEY_EMAIL="vpn@jurkiewicz.tech"

Для экспорта переменных необходимо выполнить команду vars:

root@linux-admin:/etc/openvpn/server# source vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/server/keys

Мы можем проверить, все ли правильно:

root@linux-admin:/etc/openvpn/server# env | grep KEY_
KEY_COUNTRY=PL
KEY_EMAIL=vpn@jurkiewicz.tech
KEY_ORG=OpenVPN-Adam
KEY_PROVINCE=Mazowsze
KEY_SIZE=2048
KEY_CITY=Warszawa
KEY_DIR=/etc/openvpn/server/keys
KEY_CONFIG=/etc/openvpn/server/openssl.cnf

Первым шагом в построении конфигурации OpenVPN 2.0 является создание PKI (инфраструктуры открытых ключей). PKI состоит из:

  • отдельного сертификата (также известного как открытый ключ) и закрытого ключа для сервера и каждого клиента, и
  • сертификата и ключа главного центра сертификации (ЦС), которые используются для подписи каждого из сертификатов сервера и клиента.

Инициализируем PKI

Сначала нам необходимо очистить и создать несколько каталогов:

root@linux-admin:/etc/openvpn/server# ./clean-all 

Во-вторых, создаем основной сертификат центра сертификации (CA) (не забываем писать server-name для Common Name)

root@linux-admin:/etc/openvpn/server# ./build-ca
..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+.+.....+.+........+.+...+..+...+.......+.........+..+.........+.+..+...+.............+..+....+...+...+........+......+...+.......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+..........+.....+.+.....+.......+..+....+.........+..+....+..+....+......+............+...........+.+.....+....+.....+....+...........+....+........+...................+...+..+.........+.......+.....+....+...+.....+............+...+......+....+.....+.......+...........+...+....+.....+.......+...+..+....+.....+..........+.....+.+...+.................+.+..............+.+.....+....+......+..............+.+........................+...+...+...+.....+......+...+......+.......+.........+...+...+............+...........+......+.+.....+............+.+.....+.+......+..+......+..........+...........+.+.........+..............+....+...+............+...+..+...+....+...+......+.....+.......+.....+....+.....+.+...+......+.........+.....+......+.+.........+...+...........+......+...+..........+.....+...+............+...+...+.......+........+.......+...............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
..........+.+.........+...+..+..........+...+........+.........+..........+...+..+....+..+...+.+......+..+.+..+.......+.....+......+......+....+..+...+.+...+..+.........+.+...+...........+.......+..+.+.........+.....+...+.............+..+....+.....+.+...+..............+.+.....+....+..+.+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.......+........+.+.....+....+...+.....+...+....+........+...+....+......+...........+....+.....+.+...+.....+............+..........+.....+.+..+......+.+.....+......+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+....+......+............+..+.......+.....+.+........+.......+.....+..........+..+............+....+..+...+.........+............+.+..+......+.+.........+.....+.......+............+..+....+..............+...............+.+.........+...+........+.+......+..+.+.....+.........+...+......................+........+..........+..+..........+..+..........+......+.....+....+......+..............+......+...+...............+....+..+......+...+....+......+.........+..+......+...+....+......+.........+...+..............+..........+......+..+...+..........+..............+.+..+...............+.+..+...+....+...+...+.........+...+........+.+.........+.....+....+.....+...+...............+.......+..+.+.................+......+....+...+.........+.....+...+.+......+.........+.....+.........+......+......+.....................+....+...+.....+.+......+......+...+..+....+.....+.........+.+......+.....+.......+...............+........+...+......+...+..................+...+.+..............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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) [PL]:
State or Province Name (full name) [Mazowsze]:
Locality Name (eg, city) [Warszawa]:
Organization Name (eg, company) [OpenVPN-Adam]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:linux-admin.jurkiewicz.tech
Email Address [vpn@jurkiewicz.tech]:

В-третьих, мы сгенерируем сертификат и закрытый ключ для сервера (не забудьте ответить Y на вопросы в этом процессе и просто нажать “ENTER” для пароля Challenge – это значит, что пароля в процессе подключения не будет):

root@linux-admin:/etc/openvpn/server# ./build-key-server server
Ignoring -days without -x509; not generating a certificate
............+......+++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++*...+..........+...++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++*....+....+...+..+++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++
..+.....+.+.........+..+.+........+.......+..+.+.....+++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++*.+...+....+..+++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++*....+..+...+....+...+.........+..
......+......+.+......+.........+.....+.+........................+...+.....+..
....+....+...+............+........+....+........+.+..............+.......+...
..+....+.................+...............+....+...++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++
-----
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) [PL]:
State or Province Name (full name) [Mazowsze]:
Locality Name (eg, city) [Warszawa]:
Organization Name (eg, company) [OpenVPN-Adam]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:linux-admin.jurkiewicz.tech
Email Address [vpn@jurkiewicz.tech]:

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/server/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'PL'
stateOrProvinceName   :PRINTABLE:'Mazowsze'
localityName          :PRINTABLE:'Warszawa'
organizationName      :PRINTABLE:'OpenVPN-Adam'
commonName            :PRINTABLE:'linux-admin.jurkiewicz.tech'
emailAddress          :IA5STRING:'vpn@jurkiewicz.tech'
Certificate is to be certified until Aug 14 19:36:10 2033 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

В-четвертых, необходимо сгенерировать параметры Diffie Hellman для сервера OpenVPN – это займет некоторое время, оно зависит от процессора:

root@linux-admin:/etc/openvpn/server# ./build-dh 
Generating DH parameters, 2048 bit long safe prime
........................................................................+..
...+.........................................................................
........+...................................................................
...............................................+............................
................................

В-пятых, нам необходимо иметь файл CRL, поэтому мы его создаем:

root@linux-admin:/etc/openvpn/server# ./make-crl crl.pem
Using configuration from /etc/openvpn/server/openssl.cnf

Теперь мы можем настроить конфигурационный файл сервера:

/etc/openvpn/server/vpn_server.conf
Нам необходимо задать номер VPN-сети и номер IP-порта, на котором VPN-сервер будет слушать клиентов; изменяем следующие параметры в соответствии с нашими потребностями (ниже приведены мои параметры для системы Ubuntu):

# these are my values - please read the comments in file
server 172.30.0.0 255.255.0.0
client-config-dir ccd
route 172.30.0.0 255.255.0.0
#
user nobody
group nogroup
port 1195
dh keys/dh2048.pem
client-to-client
status /etc/openvpn/server/openvpn-status.log
log         /etc/openvpn/server/openvpn.log
log-append  /etc/openvpn/server/openvpn.log

После этого можно попробовать запустить сервер:

root@linux-admin:/etc/openvpn/server# systemctl enable openvpn-server@vpn_server
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn-server@vpn_server.service → /lib/systemd/system/openvpn-server@.service.
root@linux-admin:/etc/openvpn/server# systemctl start openvpn-server@vpn_server

Далее мы можем проверить….

root@linux-admin:/etc/openvpn/server# systemctl status openvpn-server@vpn_server
● openvpn-server@vpn_server.service - OpenVPN service for vpn_server
     Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-08-18 16:33:48 CEST; 48s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 1420 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 2219)
     Memory: 2.9M
        CPU: 13ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@vpn_server.service
             └─1420 /usr/sbin/openvpn --status /run/openvpn-server/status-vpn_server.log --status-version 2 --suppress-timestamps --co>

Aug 18 16:33:48 linux-admin.jurkiewicz.tech systemd[1]: Starting OpenVPN service for vpn_server...
Aug 18 16:33:48 linux-admin.jurkiewicz.tech systemd[1]: Started OpenVPN service for vpn_server.

root@linux-admin:/etc/openvpn/server# ifconfig tun0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 172.30.0.1  netmask 255.255.255.255  destination 172.30.0.2
        inet6 fe80::e957:9659:7ebe:f5e3  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 240 (240.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Все работает!

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *