Установка OpenVPN сервера в CentOS 7

Здравствуйте, уважаемые читатели. Сегодня тема статьи: "Установка OpenVPN сервера в CentOS 7". OpenVPN сервер - это одно из самых популярных решений для организации VPN-сетей, благодаря своей простоте, кроссплатформенности, и доступности.
VPN-сеть – это частная виртуальная сеть, созданная поверх другой сети, в основном с использованием шифрования.
VPN-сервер – это сервер предоставляющий свои ресурсы (проверка подлинности, маршрутизация, шифрование…) для организации VPN-сети.
Установка необходимых компонентов
- На сервере должен быть подключен репозиторий epel-release, если не подключен, то подключаем.
# yum install epel-release
- Переходим непосредственно к установке OpenVPN сервера.
# yum install openvpn
- Для работы с ключами и сертификатами, мы будем использовать утилиту easy-rsa. Утилиты нет в репозиториях, поэтому нужно либо скачать её прямо на сервер, либо предварительно к себе на компьютер, а уже потом закачать на сервер.
Скачать утилиту easy-rsa, можно со страницы проекта: https://github.com/OpenVPN/easy-rsa/

- Если же действовать напрямую на сервере, то нужно установить две дополнительные утилиты.
# yum -y install wget
# yum -y install unzip zip
- Следующим шагом нужно создать директорию, в которую мы скачаем утилиту easy-rsa, и в которой будем проводить все манипуляции с ключами и сертификатами.
# mkdir /etc/openvpn/keys
- Переходим в созданную директорию.
# cd /etc/openvpn/keys
- Скачиваем архив с последней версией утилиты easy-rsa.
# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
- После скачивания, разархивируем архив.
# unzip master.zip
- Теперь можно произвести глобальные настройки создаваемых ключей и сертификатов.
- Переходим в директорию easyrsa3, и создаем конфигурационный файл из файла шаблона.
# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
# cp vars.example vars
- Открываем файл /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars, и исправляем под себя некоторые настройки.
Например усиливаем безопасность ключей:
set_var EASYRSA_KEY_SIZE 4096 set_var EASYRSA_DIGEST "sha512"
И прописываем глобальные регистрационные настройки:
set_var EASYRSA_REQ_COUNTRY "RU" set_var EASYRSA_REQ_PROVINCE "Moscow" set_var EASYRSA_REQ_CITY "Moscow" set_var EASYRSA_REQ_ORG "Org" set_var EASYRSA_REQ_EMAIL "admin@localhost.local" set_var EASYRSA_REQ_OU "OU"
Создание инфраструктуры для работы с ключами и сертификатами
- Далее нужно создать инфраструктуру для публичных ключей.
- Будет создан каталог /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/, в котором и будет находится вся инфраструктура.
# ./easyrsa init-pki
- Для удостоверения подлинности ключей и сертификатов, создаём сертификационный центр.
# ./easyrsa build-ca
- В процессе создания удостоверяющего центра, будет создан файл-ключ /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/ca.key, и потребуется придумать сложный пароль, который нужно будет ввести и подтвердить.

- Созданный пароль, в последствии понадобится при подписании создаваемых сертификатов.
- Ключ ca.key и пароль нужно беречь от посторонних, это главные удостоверяющие компоненты.
- После создания ca.key, будет создан сертификат удостоверяющего цента /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/ca.crt, нужно присвоить имя создаваемому центру, это на Ваше усмотрение.

Создание сертификатов и ключей для OpenVPN сервера
- Нужно создать все необходимые удостоверяющие файлы, для нашего OpenVPN сервера.
# ./easyrsa gen-req server nopass
Водим команду с атрибутом nopass, чтобы при перезапуске сервера не приходилось вводить пароль.
В результате будут созданы файлы:
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/reqs/server.req
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/server.key
- Делаем запрос на получение сертификата для сервера, у нашего удостоверяющего центра.
# ./easyrsa sign-req server server
- В процессе будет выведена сводная информация, нужно согласится введя yes.

- После подтверждения, нужно будет ввести пароль, который был создан при создании файла ca.key.

- В итоге будет создан файл /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/server.crt.
Создание ключа Диффи-Хелмана
- Далее нам нужно создать ключ Диффи-Хелмана, используемый в шифровании.
# ./easyrsa gen-dh
- Процесс создания ключа, может занять значительное время.

- В итоге будет создан файл /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/dh.pem.
Создание файла дополнительной проверки подлинности
- Теперь нужно создать файл дополнительной проверки подлинности при подключении.
- Переходим в директорию /etc/openvpn/, и создаём файл vpn.tlsauth.
# cd /etc/openvpn
# openvpn --genkey --secret /etc/openvpn/vpn.tlsauth
Подготовка файлов в директории OpenVPN
- Файлы необходимые для работы сервера созданы.
- Копируем четыре файла в директорию /etc/openvpn/.
# cp /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/
# cp /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/
# cp /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/server.crt /etc/openvpn/
# cp /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/server.key /etc/openvpn/
Изменяем права, на нужные файлы:
# chmod 644 /etc/openvpn/ca.crt
# chmod 644 /etc/openvpn/dh.pem
# chmod 644 /etc/openvpn/server.crt
Конфигурация OpenVPN сервера
- Теперь нужно произвести конфигурацию сервера.
- Создаём фал server.conf, с базовой конфигурацией.
port 1111
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"
tls-crypt vpn.tlsauth
tls-server
auth SHA512
cipher AES-256-CBC
keepalive 10 120
max-clients 50
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
#log /dev/null
log openvpn.log
comp-lzo
verb 3
--- port 1111 - порт OpenVPN.
--- server 10.8.0.0 255.255.255.0 – виртуальная подсеть.
Объяснения по каждому пункту, можно посмотреть в видео по теме, в конце статьи.
Включение маршрутизации в системе
- Далее нужно разрешить маршрутизацию.
- Находим файл /etc/sysctl.conf и добавляем строчку.
net.ipv4.ip_forward = 1

- Перечитываем sysctl.
# sysctl –p
Настройка SeLinux и Iptables
Если Включен SeLinux, и используется не стандартный порт:
# semanage port -a -t openvpn_port_t -p udp 1111
--- 1111 – порт OpenVPN сервера.
- Ну и последняя настройка на стороне сервера, это настройка iptables.
- Для настройки я предлагаю использовать скрипт.
#!/bin/sh export IF_EXT="enp0s3" export IF_OVPN="tun0" export OVPN_PORT="1111" export IPT="/sbin/iptables" export IPT6="/sbin/ip6tables" # CLEAN $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X $IPT6 --flush # LO $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # DROP $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP $IPT6 -P INPUT DROP $IPT6 -P OUTPUT DROP $IPT6 -P FORWARD DROP # NAT $IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE # NPUT $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH $IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT # OPENVPN $IPT -A INPUT -i $IF_EXT -p udp --dport $OVPN_PORT -j ACCEPT # FORWARD $IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT # OUTPUT $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # SAVE /sbin/iptables-save > /etc/sysconfig/iptables
--- enp0s3 – название Вашего сетевого интерфейса.
--- 1111 – порт OpenVPN сервера.
Запуск OpenVPN сервера
- На этом настройки на стороне сервера завершены.
- Можно запустить OpenVPN сервер, и добавить его в автозагрузку.
# systemctl start openvpn@server
# systemctl enable openvpn@server
Создание сертификатов и ключей для клиентских устройств
- Переходим к созданию ключей и сертификатов для пользователей.
- Идём в директорию easyrsa3.
# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
- Вводим команду.
# ./easyrsa gen-req client1 nopass
--- client1 – это имя нашего клиента, оно может быть на Ваше усмотрение.
--- Атрибут nopass означает, что не будет создан пароль и клиенту не нужно будет вводить пароль при каждом подключении. Если хотите, чтобы клиент вводил пароль, то соответственно используйте команду без этого атрибута.
В результате будут созданы файлы:
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/reqs/ client1.req
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/client1.key
- Подписываем сертификат для клиента client1.
# ./easyrsa sign-req client client1
- В процессе нужно будет согласится со сводкой, и ввести пароль ключа сертификационного центра.
- В итоге будет создан файл /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/client1.crt.
При необходимости, можно ограничить действие сертификата на определённое количество дней. Тогда команда будет выглядеть так:
# ./easyrsa sign-req client client1 -days 90
--- -days 90 – число дней, на которое выдаётся сертификат.
- Теперь можно переходить на клиентское устройство.
- Я буду использовать клиент для Windows.
Клиенту для подключения к серверу, необходимо передать файлы:
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/client1.crt /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/client1.key /etc/openvpn/ca.crt /etc/openvpn/vpn.tlsauth
Конфигурация OpenVPN клиента
- Чтобы клиент смог подключатся к серверу, нужно создать конфигурационный файл клиента с расширением .ovpn.
- Какое будет имя у файла, не имеет значения.
client
tls-client
dev tun
proto udp
remote 1.1.1.1 1111
resolv-retry infinite
nobind
block-outside-dns
persist-key
persist-tun
mute-replay-warnings
remote-cert-eku "TLS Web Server Authentication"
remote-cert-tls server
auth SHA512
tls-crypt vpn.tlsauth
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC
comp-lzo
verb 3
--- remote 1.1.1.1 1111 – ip адрес, и порт OpenVPN.
Пояснения по каждому пункту конфигурации, можно посмотреть в видео по теме, в конце статьи.
- С примерами конфигурации Вы можете ознакомится в директории с установленным клиентом OpenVPN C:\Program Files\OpenVPN\sample-config, там есть шаблоны файлов конфигурации с комментариями.

Подключение к OpenVPN серверу
- Как я уже сказал выше, производить подключение мы будем с клиента для Windows.
- Нам нужно добавить четыре файла с сервера, и файл конфигурации клиента в директорию C:\Program Files\OpenVPN\config.

- После проведённых действий, можно запускать клиент.
- На Windows, для корректной работы, клиент нужно запускать от имени администратора.
- После запуска клиента, в трее появляется значок программы. По двойному клику по значку, начинается подключение к серверу.

- Если всё сделано правильно, то после подключения значок станет зелёным, и в трее появится подсказка о том, что подключение произошло успешно и компьютеру присвоен ip-адрес виртуальной сети.
Ссылки по которым можно найти OpenVPN-клиент для своей платформы:
https://openvpn.net/community-downloads/ https://sourceforge.net/projects/ovpnp/ https://openvpn.ru/OPENVPN_Macintosh.html https://apps.apple.com/ru/app/openvpn-connect/id590379981 https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ru
Сегодня мы рассмотрели тему: "Установка OpenVPN сервера в CentOS 7". Установили сервер, произвели необходимые настройки, и произвели подключение при помощи клиента. Смотрите также видео по теме.
Надеюсь статья была вам полезна. До встречи в новых статьях.
✍
С уважением, Андрей Бондаренко.
Видео на тему "Установка OpenVPN сервера в CentOS 7":

WMZ-кошелёк = Z667041230317
«Linux»
alexandr
Было бы еще не плохо добавить как настроить OpenVpn на телефоне (ios, android). Тогда можно в командировках/отдыхе, где есть ограничения, пользоваться телефоном.
Андрей Бондаренко
Ничего сложного:
1.Установить приложение.
2.Переместить файлы на телефон.
3.Запустить приложение.
4.Указать где находится конфигурационный файл .ovpn.
Дмитрий
Здравствуйте Андрей Бондаренко. вроде все делаю по вашей инструкции но при проверки статуса после запуска выдает ошибку
openvpn@server.service — OpenVPN Robust And Highly Flexible Tunneling Applicat ion On server
Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor pre set: disabled)
Active: failed (Result: exit-code) since Tue 2021-11-09 21:16:43 EST; 31s ago
Main PID: 2543 (code=exited, status=1/FAILURE)
Status: «Pre-connection initialization successful»
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Starting OpenVPN Robust And ….
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Started OpenVPN Robust And H….
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: openvpn@server.service: main…E
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Unit openvpn@server.service ….
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: openvpn@server.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@vm268749 ~]# systemctl status openvpn@server -l
● openvpn@server.service — OpenVPN Robust And Highly Flexible Tunneling Applicat ion On server
Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor pre set: disabled)
Active: failed (Result: exit-code) since Tue 2021-11-09 21:16:43 EST; 1min 5s ago
Main PID: 2543 (code=exited, status=1/FAILURE)
Status: «Pre-connection initialization successful»
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Starting OpenVPN Robust And High ly Flexible Tunneling Application On server…
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Started OpenVPN Robust And Highl y Flexible Tunneling Application On server.
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: openvpn@server.service: main pro cess exited, code=exited, status=1/FAILURE
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: Unit openvpn@server.service ente red failed state.
Nov 09 21:16:43 vm268749.pq.hosting systemd[1]: openvpn@server.service failed.
[root@vm268749 ~]#
Андрей Бондаренко
Здравствуйте, Дмитрий!
Возможно включена Selinux, тогда нужно или отключить, или настроить.
Возможно где-то сделана ошибка, нужно смотреть лог в /var/log/messages.
dimi nest
добрый вечер openvpn запускается но нет трафика в чем проблема может быть?
Андрей Бондаренко
Здравствуйте.
Как понять нет трафика?
Если Вы имеете в виду, что клиент подключается, но не выходит в интернет, то проверяйте настройки системного Firewall, и включена ли в системе маршрутизация.
Иван
Отличная инструкция. Только по ней получилось настроить. Единственное , в ней не рассказывается как настроить, чтобы виртуальная сеть vpn видела локальную сеть. То есть, подключение клиента удачно, но вот сервера внутри офиса не видны.
Андрей Бондаренко
В server.conf добавить строчки:
push "route 10.8.0.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0"
* Первая строчка — Vpn сеть
* Вторая строчка — Локальная сеть
Иван
И по возможности расскажите пожалуйста как запихнуть все серты и ключи в 1 конфигурационный файл
Андрей Бондаренко
В конфиге клиента добавить:
key-direction 1
И ниже, в тегах, добавить содержимое файлов:
<ca> … </ca>
<tls-crypt> … </tls-crypt>
<cert> … </cert>
<key> … </key>
Strajnik
Здравствуйте! Настроил всё как в вашей статье, VPN заработал. Однако, на сервер также был поднят сайт и он перестал работать после этого. Естественно, я не могу своими силами понять в чём проблема.
Андрей Бондаренко
Здравствуйте.
Скорее всего смотрите в настройки системного Firewall…
test
при выполнении скрипта iptables-vpn.sh, выводит ошибку:
Команда ‘»./iptables-vpn.sh»‘
не сработала и вернулась с ошибкой 0 и следующим сообщением.
iptables v1.4.21: option «—state» requires an argument
Try `iptables -h’ or ‘iptables —help’ for more information.
./iptables-vpn.sh: line 38: NEW,ESTABLISHED,RELATED: command not found
Андрей Бондаренко
При добавлении статьи, либо позже, часть кода, а именно: пробел заменился переносом на нижнюю строчку. В вордпрессе такое бывает, бывает и не такое…
Нужно просто часть правила указанного в ошибке, поднять на строчку выше. Я исправил в статье.
test
Приветствую, спасибо большое за полезную инструкцию. У меня возникла проблема. Все подключается замечательно, после подключения у меня пропадает интернет. И в CentOs у меня нету iptables что довольно странно. ОС чистая ставил с 0. Если будет время и удобно не могли бы ответить. Спасибо.
Андрей Бондаренко
Здравствуйте.
По умолчанию для настройки системного Firewall в Centos установлена firewalld, я же в статье использую iptables
Вот статья об установке iptables.
test
Спасибо получилось. У Вас еще нет инструкции или советов как обезопасить CentOs из вне сети. Чтобы минимизировать попытки взлома или что то вроде того. Какие необходимые настройки надо сделать чтобы сервер был защищенным. Спасибо большое!!!
Андрей Бондаренко
Пожалуйста.
Вот пару статей на тему безопасности:
https://aeb-blog.ru/linux/kak-izmenit-port-dlya-ssh-podklyucheniya/
https://aeb-blog.ru/linux/ustanovka-i-primer-nastrojki-fail2ban/