Настройка сервера OpenVPN на Rocky Linux или CentOS 8

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: VPNOpenVPN, CentOS, Rocky Linux.

Подготовка операционной системы

Мы внесем небольшие правки в настройки. Настроим время для правильного формирования клиентских сертификатов, отключим систему безопасности SELinux, откроем нужные порты брандмауэра.

1. Настройка времени

Установим правильную временную зону:

timedatectl set-timezone Europe/Moscow

* в данном примере мы укажем московское время.

Устанавливаем утилиту для синхронизации времени:

dnf install chrony

Разрешаем автозапуск службы chronyd и запускаем ее:

systemctl enable chronyd

systemctl start chronyd

Проверить корректность времени можно командой:

date

2. Настройка SELinux

В нашей инструкции мы просто отключим SELinux. Если необходимо его настроить и оставить включенным, используем инструкцию Настройка SELinux в CentOS 7 (для CentOS 8 она также подходит).

И так, отключаем Selinux командой:

setenforce 0

Чтобы Selinux не включился после перезагрузки, открываем на редактирование файл:

vi /etc/selinux/config

... и редактируем опцию SELINUX:

...
SELINUX=disabled
...

3. Настройка брандмауэра

Создаем правило для firewalld:

firewall-cmd --permanent --add-port=443/udp

* в данной инструкции мы настроим работу OpenVPN на порту 443 по UDP. Если в вашем случае необходим другие порт и протокол, меняем значения на соответствующие. По умолчанию, OpenVPN использует порт 1194.

Применяем настройку:

firewall-cmd --reload

Установка и создание сертификатов

Использование сертификатов является обязательным условием при использовании VPN. Поэтому сразу после установки мы создадим все необходимые ключи.

Установка OpenVPN

Устанавливаем репозиторий epel:

dnf install epel-release

Устанавливаем необходимые пакеты следующей командой:

dnf install openvpn easy-rsa

Создание сертификатов

Подготовительный этап

Переходим в каталог easy-rsa:

cd /usr/share/easy-rsa/3

* в зависимости от версии easy-rsa, последний каталог может быть другим. Увидеть точное название каталога можно командой ls -l /usr/share/easy-rsa/.

Чтобы упростить и ускорить процесс создания ключей, создаем следующий файл:

vi vars

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Sankt-Petersburg"
export KEY_CITY="Sankt-Petersburg"
export KEY_ORG="DMOSK COMPANY"
export KEY_EMAIL="master@dmosk.ru"
export KEY_CN="DMOSK"
export KEY_OU="DMOSK"
export KEY_NAME="name-openvpn-server.dmosk.ru"
export KEY_ALTNAMES="name-openvpn-server"

* где KEY_CN и KEY_OU: рабочие подразделения (например, можно указать название отдела); KEY_NAME: адрес, по которому будет выполняться подключение (можно указать полное наименование сервера); KEY_ALTNAMES — альтернативный адрес.
* так как мы генерируем самоподписный сертификат, значения данных полей никак не повлияют на работу OpenVPN, однако, для удобства, лучше подставить реальные данные.

Запускаем созданный файл на исполнение:

. ./vars

Генерация ключей

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

./easyrsa init-pki

Мы должны увидеть:

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/share/easy-rsa/3/pki

... а в текущем каталоге появится папка pki.

2. Генерируем корневой сертификат (CA):

./easyrsa build-ca

... после ввода Enter обязательно задаем пароль дважды. На запрос ввести Common Name можно просто нажать ввод или написать свое имя:

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

3. Создаем ключ Диффи-Хеллмана:

./easyrsa gen-dh

4. Для создания сертификата сервера необходимо сначала создать файл запроса:

./easyrsa gen-req vpn-server nopass

* на запрос ввода Common Name просто вводим Enter, чтобы использовать настройку из файла vars; nopass можно упустить, если хотим повысить безопасность с помощью пароля на сертификат.

... и на его основе — сам сертификат:

./easyrsa sign-req server vpn-server

После ввода команды подтверждаем правильность данных, введя yes:

  Confirm request details: yes

... и вводим пароль, который указывали при создании корневого сертификата.

5. Для создания ta ключа используем команду:

openvpn --genkey --secret pki/ta.key

6. Сертификаты сервера готовы и находятся в каталоге pki. 

Создаем каталог в /etc/openvpn, в котором будем хранить сертификаты:

mkdir -p /etc/openvpn/server/keys

Переходим в каталог pki:

cd pki

Копируем в него необходимые сертификаты:

cp ca.crt issued/vpn-server.crt private/vpn-server.key dh.pem ta.key /etc/openvpn/server/keys/

Настройка и запуск сервера

Создаем конфигурационный файл для сервера openvpn:

vi /etc/openvpn/server/server.conf

И вставляем в него следующее:

local 192.168.0.15
port 443
proto udp
dev tun
ca keys/ca.crt
cert keys/vpn-server.crt
key keys/vpn-server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
server 172.16.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
max-clients 32
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 0
mute 20
daemon
mode server
tls-server
comp-lzo no
tun-mtu 1500
mssfix 1620
cipher AES-256-GCM

* где из всех параметров, обязательно, внести изменения нужно в следующие — local: IP-адрес, на котором будет обрабатывать запросы OpenVPN; port: сетевой порт (443 позволит избежать проблем при использовании Интернета в общественных местах, но может быть уже занят в вашей системе — посмотреть список используемых портов можно командой ss -tunlp. Если порт занят, используйте любой из свободных, например 1194).

Создаем каталог для логов сервера:

mkdir /var/log/openvpn

Разрешаем автоматический старт сервиса vpn:

systemctl enable openvpn-server@server

И запускаем его:

systemctl start openvpn-server@server

Проверить работоспособность можно командой:

systemctl status openvpn-server@server

Настройка OpenVPN-клиента

Для настройки клиента необходимо на сервере сгенерировать сертификаты, а на клиентском компьютере установить программу openvpn и настроить ее.

Создание сертификатов

На сервере генерируем сертификаты для клиента. Для этого снова переходим в каталог easy-rsa:

cd /usr/share/easy-rsa/3

Запускаем еще раз vars:

. ./vars

Создаем клиентский сертификат:

./easyrsa gen-req client1 nopass

./easyrsa sign-req client client1

* в данном примере будет создан сертификат для client1.

Мы должны увидеть запрос на подтверждение намерения выпустить сертификат — вводим yes:

  Confirm request details: yes

После появится запрос на ввод пароля для ключа ca:

Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key:

Вводим его.

На сервере скопируем ключи во временную директорию, выполнив последовательно 3 команды:

mkdir /tmp/keys

cp pki/issued/client1.crt pki/private/client1.key pki/ca.crt pki/ta.key /tmp/keys

chmod -R a+r /tmp/keys

* сертификаты скопированы в каталог /tmp для удобства переноса их на клиентский компьютер.

Сертификаты готовы для скачивания.

На клиенте

В качестве примера, выполним подключение к нашему серверу с компьютеров Windows и Linux. Более подробно процесс настройки клиента описан в инструкции Настройка OpenVPN клиента.

Windows

1. Заходим на официальную страницу загрузки openvpn и скачиваем клиента для Windows:

Загрузка клиента openvpn

Запускаем скачанный файл и устанавливаем программу, нажимая «Далее».

2. Переходим в папку C:\Program Files\OpenVPN\config.

Копируем в нее файлы ca.crt, client1.crt, client1.key, dh.pem, ta.key из каталога /tmp/keys на сервере, например, при помощи программы WinSCP.

После переноса файлов, не забываем удалить ключи из временного каталога на сервере:

rm -R /tmp/keys

3. Возвращаемся к компьютеру с Windows, открываем блокнот от имени администратора и вставляем следующие строки:

client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo no
ca ca.crt
cert client1.crt
key client1.key
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
tun-mtu 1500
mssfix 1620
cipher AES-256-GCM
verb 0

* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы.

Сохраняем файл с именем config.ovpn в папке C:\Program Files\OpenVPN\config.

4. Запускаем с рабочего стола программу «OpenVPN GUI» от имени администратора.

Нажимаем правой кнопкой по появившемуся в трее значку и выбираем «Подключиться»:

Запуск подключения openvpn-клиента к серверу

Произойдет подключение и значок поменяет цвет с серого/желтого на зеленый.

5. Для автозапуска клиента, открываем службы Windows, находим и настраиваем службу OpenVPNService для автозапуска:

Настройка службы OpenVPNService для автозапуска

Linux

1. Устанавливаем клиента одной из команд.

а) для Rocky Linux / CentOS:

yum install epel-release

yum install openvpn

б) для Ubuntu / Debian:

apt-get install openvpn

2. Создаем каталог:

mkdir /etc/openvpn/client

И переходим в него:

cd /etc/openvpn/client

Копируем в каталог файлы ca.crt, client1.crt, client1.key, dh.pem, ta.key из каталога /tmp/keys на сервере, например, при помощи утилиты scp:

scp admin@192.168.0.15:/tmp/keys/* .

* где admin — имя пользователя, под которым можно подключиться к серверу по SSH; 192.168.0.15 — IP-адрес сервера.

Для закрытых ключей разрешаем доступ только для владельца:

chmod 600 client1.key ta.key

После переноса файлов, не забываем удалить ключи из временного каталога на сервере:

rm -R /tmp/keys

3. Создаем конфигурационный файл:

vi /etc/openvpn/client/client.conf

client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo no
ca ca.crt
cert client1.crt
key client1.key
dh dh.pem
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
tun-mtu 1500
mssfix 1620
cipher AES-256-GCM
verb 0

* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы.

4. Разово запустим клиента:

cd /etc/openvpn/client

openvpn --config /etc/openvpn/client/client.conf

Соединение должно выполниться. Мы можем увидеть предупреждения — по желанию, межете их исправить самостоятельно.

5. Прерываем выполнение подключения комбинацией Ctrl + C и запустим клиента в качестве службы:

systemctl enable openvpn-client@client --now

Проверить, что соединение состоялось можно пинганув сервер по VPN-адресу:

ping 172.16.10.1

Аутентификация пользователей

Мы можем настроить проверку пользователя по логину и паролю. Это даст дополнительный уровень защиты, а также позволит использовать один и тот же сертификат для всех подключений.

Настройка сервера

Открываем конфигурационный файл openvpn:

vi /etc/openvpn/server/server.conf

И добавляем следующие строчки:

username-as-common-name
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login

* где username-as-common-name указывает на то, что openvpn должен использовать логины, как основные идентификаторы клиента; plugin указывает на путь к самому плагину и для чего он используется.
* как путь, так и название файла openvpn-plugin-auth-pam.so могут отличаться. Это зависит от версии Linux и OpenVPN. Чтобы найти путь до нужного файла, можно воспользоваться командой find / -name "openvpn-*auth-pam*" -print.

Перезапускаем сервер:

systemctl restart openvpn-server@server

При необходимости, создаем учетную запись для авторизации:

useradd vpn1 -s /sbin/nologin

И задаем ей пароль:

passwd vpn1

Настройка на клиенте

В конфигурационный файл клиента добавляем:

auth-user-pass

Теперь при подключении программа будет запрашивать логин и пароль.

Вход без ввода пароля (сохранение пароля)

Если необходимо настроить авторизацию, но автоматизировать вход клиента, открываем конфигурационный файл последнего и строку для авторизации меняем на:

auth-user-pass auth.txt

* где auth.txt — файл, в котором мы будем хранить логин и пароль.

Создаем текстовый файл auth.txt в той же папке, где находится файл конфигурации со следующим содержимым:

username
password

* где username — логин пользователя, а password — пароль.

Переподключаем клиента.

Описанный метод аутентификации является базовым и требует наличие обычной системной учетной записи. Если необходима более сложная авторизация на базе LDAP, можно воспользоваться инструкцией настройка OpenVPN сервера с аутентификацией через LDAP (написана на базе Linux Ubuntu).

Маршрутизация и доступ в Интернет

Для настройки маршрутизации или доступа к локальной сети, воспользуйтесь инструкцией Настройка доступа к локальной сети клиентам OpenVPN в Linux.

Если мы хотим, чтобы при подключении к серверу VPN, клиентское устройство по умолчанию использовало VPN-сеть для доступа в Интернет, открываем на сервере конфигурационный файл:

vi /etc/openvpn/server/server.conf

и добавляем:

push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.8"

redirect-gateway говорит клиенту использовать в качестве приоритетного шлюза, сервер VPN. Директива dhcp-option задаст настройку для сервера DNS, который будет использоваться для разрешения Интернет-имен.

Перезапускаем сервер:

systemctl restart openvpn-server@server

Наш сервер должен быть настроен в качестве шлюза. Подробнее в инструкции Настройка Интернет шлюза на CentOS.

Отзыв сертификата

В случае, когда необходимо прекратить действие определенного сертификата, можно его отозвать (revoke). Чтобы настроить отзыв сертификата в OpenVPN, нужно указать файл для проверки отозванных сертификатов, затем отозвать сам сертификат.

Настройка OpenVPN

Открываем конфигурационный файл:

vi /etc/openvpn/server/server.conf

Добавляем строку:

...
crl-verify keys/crl.pem

* в данном примере, сервер будет проверять список отозванных сертификатов в файле keys/crl.pem.

Отзыв сертификата

В нашем примере мы создали сертификат client1 — сделаем его отзыв. Переходим в каталог:

cd /usr/share/easy-rsa/3

Отзываем сертификат командой:

./easyrsa revoke client1

* здесь мы отзываем сертификат для клиента client1.

Подтверждаем наши намерения:

  Continue with revocation: yes

... и вводим пароль для центра сертификации.

После этого создаем/обновляем файл crl.pem:

./easyrsa gen-crl

* необходимо будет ввести пароль центра сертификации.

Копируем файл crl.pem в каталог openvpn:

cp pki/crl.pem /etc/openvpn/server/keys/

После перезагружаем сервис openvpn:

systemctl restart openvpn-server@server

Доступ клиентам друг к другу

Ранее мы настроили более безопасный сценарий подключения — туннели, которые не позволяют подключенным клиентам видеть друг друга. Но если мы хотим сделать так, чтобы все подключенные к VPN устройства видели друг друга по сети, нам нужно изменить некоторые настройки на сервере и клиенте.

Настройка сервера

Открываем файл настроек:

vi /etc/openvpn/server/server.conf

Добавляем строку:

client-to-client

* данная настройка как раз и говорит, что клиенты могут видеть друг друга через нашу сеть VPN.

Теперь находим настройку:

dev tun

... и меняем ее на:

dev tap

* туннели создают небольшие подсети на 4 адреса для каждого подключения, таким образом, изолируя клиентов друг от друга. Нам же нужно сделать так, чтобы клиенты были в одной сети VPN. Поэтому мы меняем тип интерфейса на tap.

Перезапускаем нашу службу сервиса:

systemctl restart openvpn-server@server

Настройка клиента

На клиенте нам нужно изменить только тип сетевого интерфейса на tap:

dev tap

После можно подключаться к серверу.

Индивидуальные настройки для клиента

OpenVPN позволяет на стороне сервера определить некоторые настройки, которые получит наш клиент. Для этого открываем конфигурационный файл сервера:

vi /etc/openvpn/server/server.conf

Добавляем строку:

client-config-dir ccd

* данная настройка задает каталог (cdd), в котором будут находиться файлы с настройками пользователей.

Создаем каталог:

mkdir /etc/openvpn/server/ccd

Создаем файл с настройкой. Название файла должно соответствовать либо имени сертификата, либо имени пользователя (если в конфигурации есть опция username-as-common-name).

а) например, имя сертификата:

vi /etc/openvpn/server/ccd/client1

б) например, имя пользователя:

vi /etc/openvpn/server/ccd/vpn1

Добавляем следующее содержимое:

push-reset
push "route 192.168.0.10 255.255.255.255"
push "dhcp-option DOMAIN dmosk.local"
push "dhcp-option DNS 192.168.0.2"
push "dhcp-option DNS 192.168.0.3"

* в данном примере мы предоставим пользователю доступ только к узлу 192.168.0.10, зададим доменный суфикс и укажим серверы DNS.

Для применения настроек перезапускаем сервис:

systemctl restart openvpn-server@server

Другие статьи про OpenVPN

Также Вам может быть интересным:

1. Настройка доступа к локальной сети клиентам OpenVPN в CentOS

2. Настройка OpenVPN клиента

3. Как настроить сервер OpenVPN сервер на Windows

4. Настройка и использование OpenVPN на Ubuntu

# CentOS # Rocky Linux # Безопасность # Интернет # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет