Настройка OpenVPN сервера на CentOS 8 и подключение MikroTik как клиента

Поскольку VPS под FreeBSD, отработавшая три года, своими периодическими зависаниями поднадоела, было решено пересобрать всё заново. К сожалению FreeBSD, предлагаемая в шаблонах на aruba.it, не поддерживает IPv6, поэтому новая VPS будет создана на CentOS 8.
Установка и настройка OpenVPN сервер на CentOS 8
Устанавливаем пакеты OpenVPN и Easy-RSA:
$ sudo dnf install openvpn easy-rsa
Создаем папку easy-rsa
и символьные ссылки из скрипта easyrsa
:
$ sudo mkdir /etc/openvpn/easy-rsa $ sudo ln -s /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa
Что бы не создавать новый файл vars
, копируем из файла примера:
$ sudo wget https://raw.githubusercontent.com/OpenVPN/easy-rsa/master/easyrsa3/vars.example $ sudo mv vars.example /etc/openvpn/easy-rsa/vars
Правим файл /etc/openvpn/easy-rsa/vars
, раскомментируем и заполняем поля, которые относятся к информации о сертификате:
set_var EASYRSA_REQ_COUNTRY "FR" set_var EASYRSA_REQ_PROVINCE "Freedom area" set_var EASYRSA_REQ_CITY "Freedom City" set_var EASYRSA_REQ_ORG "Freedom Co" set_var EASYRSA_REQ_EMAIL "no@mail.net" set_var EASYRSA_REQ_OU "Freedom Org"
Устанавливаем размер ключа 4096 bit:
set_var EASYRSA_KEY_SIZE 4096
Режим шифрования RSA:
set_var EASYRSA_ALGO rsa
Срок действия корневого сертификата в днях:
set_var EASYRSA_CA_EXPIRE 3650
Срок действия выпущенных сертификатов в днях:
set_var EASYRSA_CERT_EXPIRE 1095
Сохраняем файл vars. Теперь создаем структуру каталогов для ключей. Команда выполняется только один раз!
$ cd /etc/openvpn/easy-rsa/ $ ./easyrsa init-pki
Создание корневого сертификата, которым будут подписываться остальные (Certificate Authority):
$ ./easyrsa --vars=/etc/openvpn/easy-rsa/vars build-ca nopass
Опция nopass
не требует при запуске пароль, но ключи в этом случае необходимо хранить надежно.
Создание сертификата OpenVPN сервера (Server Certificate):
$ ./easyrsa --vars=/etc/openvpn/easy-rsa/vars build-server-full openvpn-server nopass
Генерация ключа Diffie Hellman, для ключа в 4096 bit процесс может занять некоторое время:
$ ./easyrsa --vars=/etc/openvpn/easy-rsa/vars gen-dh
Создание сертификата клиента (Client Certificate). Для каждого клиента необходимо выпустить свой сертификат.
$ ./easyrsa --vars=/etc/openvpn/easy-rsa/vars build-client-full <strong><client_name></strong> nopass
Создаем пустой список отозванных сертификатов:
$ ./easyrsa gen-crl
Создаем файл конфигурации OpenVPN сервера:
$ sudo touch /etc/openvpn/server/server.conf
Заполняем файл конфигурации:
# Выставляем порт 443 что бы никто не догадался что мы используем VPN :) port 443 # Протокол TCP т.к. MikroTik не умеет UDP proto tcp dev tun # Сертификаты и ключи ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt key /etc/openvpn/easy-rsa/pki/private/openvpn-server.key dh /etc/openvpn/easy-rsa/pki/dh.pem # Используемый пул адресов server 10.11.12.0 255.255.255.0 ifconfig-pool-persist /etc/openvpn/server/ipp.txt client-config-dir /etc/openvpn/server/ccd # Интерфейс OpenVPN должен использоваться клиентами по умолчанию (MikroTik это не касается) push "redirect-gateway def1 bypass-dhcp" keepalive 10 120 cipher AES-256-CBC # Максимальное количество подключенных клиентов max-clients 10 # Понижение привилегий OpenVPN сервера после инициализации user nobody group nobody persist-key persist-tun # Логирование status /var/log/openvpn-status.log log /var/log/openvpn.log verb 4 # Отозванные сертификаты crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
Создаем папку ccd
и пустой файл ipp.txt
:
$ sudo mkdir /etc/openvpn/server/ccd $ sudo touch /etc/openvpn/server/ipp.txt
Включаем и запускаем сервис OpenVPN:
$ sudo systemctl -f enable openvpn-server@server.service $ sudo systemctl start openvpn-server@server.service
Настройка NAT
По умолчанию пересылка пакетов отключена, для включения необходимо ввести команду:
$ sudo sysctl -w net.ipv4.ip_forward=1
Что бы маршрутизация работала после перезагрузки сервера в файл /etc/sysctl.conf
добавляем строчку:
net.ipv4.ip_forward = 1
Для применения изменений:
$ sudo sysctl -p /etc/sysctl.conf
Включение NAT на интерфейсе eth0:
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
В цепочку INPUT фаервола разрешаем доступ подсети OpenVPN:
$ sudo iptables -A INPUT -s 10.11.12.0/24 -j ACCEPT
Настройка MikroTik в качестве OpenVPN клиента
Копируем на MikroTik созданный ранее сертификат клиента с ключом (client.crt
и client.key
).

В меню System -> Certificates
последовательно импортируем сертификат и ключ, кнопка Import
. Импортированный сертификат должен иметь атрибуты KT
(K - ключ имеет Private Key, T - Trusted).

Создаем новое подключение OpenVPN. PPP -> + -> OVPN Client
. В открывшемся окне на вкладке General
произвольно заполняем поле Name
. На вкладке Dial Out
последовательно заполняем поля:
- Connect To - адрес предварительно настроенного OpenVPN сервера
- Port - 443, как ранее конфигурационном файле OpenVPN сервера
- Mode - ip
- User - произвольно, в настройках сервера мы не указывали пользователя, но в настройках MikroTik заполнить его необходимо
- Profile - default
- Certificate - в выпадающем списке выбираем ранее импортированный сертификат
- Auth - sha1
- Cipher - aes 256
- Add Default Route - только если хотим, чтобы весь трафик шел в OpenVPN канал

После сохранения настроенное соединение должно подключиться к OpenVPN серверу.
Самое интересное, для чего все это строилось, в разделе IP -> Routes
добавляем адреса, трафик с которых мы хотим пустить по OpenVPN соединению.

Дополнительные команды для работы с сертификатами
Отзыв сертификата:
$ ./easyrsa revoke <strong><client_name></strong>
Просмотр информации о сертификате:
- *.crt -
$ openssl x509 -in certificate.crt -text -noout
- *.pem -
$ openssl rsa -in privatekeyfile.key -check
- *.pfx (p12) -
$ openssl pkcs12 -info -in keystore.p12
- *.csr -
$ openssl req -text -noout -verify -in CSR.csr