Как за 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
Все работает!