Инструкция по настройке OpenVPN server на Linux Centos 7 с двухфакторной аутентификацией

Описание

     В этом уроке мы рассмотрим наиболее распространенную установку OpenVPN сервера на Linux Centos версии 7. 
Мы попробуем два способа маршрутизации траф ика:
- маршрутизация всего трафика с клиента через OpenVPN - сервер
- маршрутизация определенных маршрутов с клиента через OpenVPN - сервер.
В дополнение мы:
- включим двухфакторную аутентификацию, чтобы клиенты подключались не только по сертификату, но и по имени пользователю/паролю
- обеспечим дополнительную безопаcность путем аутентификации пакетов на контрольном канале TLS. 
Эта инструкция подразумевает, что администратор обладает базовыми навыками работы на Linux CentOS (Линукс Центос) с уже имеющейся инсталляцией Операционной Системы Linux Centos 7. Не забывайте, что перед использованием этой инструкции Вы должны изучить законодательство стран, в которых используете клиентское или серверное подключение, и ни в коем случае его не нарушать. Есть хостинг-сервисы, предлагающие минимальную аппаратную конфигурацию VPS за $3/мес. Обязательно проверьте, что на Вашей услуге доступны TUN/TAP интерфейсы, без них OpenVPN не будет работать.

Проверка Вашей Системы

Здесь мы проверяем версию нашей Операционной Системы Линукс и видим, что у нас установлена версия Centos 7.4:

[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

Для начала давайте попытаемся установить пакет openvpn {далее...}

Для начала давайте попытаемся установить пакет openvpn с помощью пакетного менеджера Yum:

[root@centos7 ~]# yum install openvpn

И тут же мы видим ошибку:

No package openvpn available. Error: Nothing to do

Это означает, что у нас не прописаны необходимые репозитории, где содержится дистрибутив OpenVPN.

{cкрыть}

Установка OpenVPN

Для установки нам необходимо подключить дополнительный репозиторий EPEL (Extra Packages for Enterprise Linux - Дополнительные пакеты для корпоративного Linux). Этот репозиторий управляется Проектом Fedora - это Мировое партнёрство участников сообщества свободного ПО. Он содержит в себе дистрибутивы ПО, которые недоступны в стандартных репозиториях Linux CentOS.

Вводим команду:

[root@centos7 ~]# yum install epel-release -y

Если возникает ошибка вида: {далее...}

Если возникает ошибка вида:

No package epel-release available.

можно установить пакет вручную командой:

[root@centos7 ~]# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

{cкрыть}

     Устанавливаем OpenVPN и Easy RSA tool, необходимый для генерации SSL-ключей для шифрования трафика в VPN.

[root@centos7 ~]# yum install openvpn easy-rsa -y
    Конфигурация OpenVPN

     В директории /usr/share/doc/openvpn-х.х.х/sample/ очень много типовых конфигураций, скриптов и т.п. Там очень много полезных и дополнительных опций, с которыми Вы сможете поэкспериментировать позднее. Мы создадим безопасную, но совместимую со старыми клиентскими приложениями конфигурацию самостоятельно. Мы сделаем два конфигурационных файла  tcpserver.conf и позднее udpserver.conf. Запустим отдельный процесс для каждого конфигурационного файла - ниже рассмотрим, как нужно это делать. Мы планируем создать автоматический adaptive VPN, который будет слушать на двух разных портах. Приоритетным у нас будет протокол  UDP  - ввиду того, что он более устойчив к DoS-атакам и для сокращения времени доставки пакетов, т.к. если Вы планируете использовать VoIP через VPN, излишняя задержка, вносимая TCP протоколом, будет снижать качество голосового соединения. TCP будет использоваться как резервный вариант.

"А на каких портах лучше запустить сервер?"{далее...}

"А на каких портах лучше запустить сервер?" - спросите Вы? Я долго изучал этот вопрос и пришёл к выводу, что лучше всего использовать порты TCP 443 и UDP 443. TCP 443 будет работать в 99% случаях, только если Вы не наткнётесь на DPI firewall (Deep Packet Inspection), который заблокирует соединение, поскольку OpenVPN не использует родной SSL/TLS handshake. Если Вы используете HTTPS  сервис на этом же сервере, то не обязательно вешать  эти сервисы на разные ip адреса - можно использовать функцию port-share в OpenVPN. С этим параметром можно повесить OpenVPN на порту 443, а HTTPS, например, на порту 8443.

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

port-share 127.0.0.1 8443

При этом сервис HTTPS должен слушать на порту 8443 по ip адресу 127.0.0.1, и Firewall на самом сервере должен разрешать подключения на адрес 127.0.0.1 по порту 8443. Детальнее к этом вернёмся чуть позже. OpenVPN будет слушать все подключения на порту 443, и если он понимает, что трафик не предназначен для OpenVPN, он перенаправит его на порт 8443. При этом, для внешнего пользователя всё будет прозрачно: Ваш HTTPS сайт будет доступен по привычному порту 443. Кстати говоря, я бы рекомендовал Вам так сделать в любой случае, повесив хотя бы простую страницу на HTTPS, поскольку некоторые DPI отправляют пробные SSL handshake пакеты, которые в этом случае попадут на HTTPS сервис. При этом DPI получит корректный ответ, и должен будет пропустить трафик. Подробнее об этой опции я расскажу в следующих своих статьях. Что касается UDP, то, если у Вас есть время и желание, Вы можете добавить несколько конфигурационных файлов на самых распространённых портах: 53, 69, 123, 1194, но ни на одном из этих портов нет такой высокой доли вероятности отсутствия фильтрации в Интернете, как для TCP 443. Но совокупность  различных портов вероятность достучаться до Вашего сервера всё же увеличивает. Использовать UDP 443 я рекомендую, в частности, ввиду всё набирающего популярность протокола QUIC разработки компании Google - это значит, что со временем этот порт тоже должен быть всё чаще доступен в Интернете. Во всяком случае, надеюсь.

{cкрыть}

Создаём файл:

vi /etc/openvpn/tcpserver.conf

Ниже конфигурация файла с комментариями:

Полная конфигурация ниже: {далее...}


Full config is below (пожалуйста, учтите, что имя файла ключей DH зависит от размера ключа, который Вы выберете позднее):
;local a.b.c.d
proto tcp
port 443
;port-share 127.0.0.1 8443
mssfix 1300
tun-mtu 1400
dev tun0
tls-server
;tls-version-min 1.2
;tls-auth mykeys/ta.key 0
;tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
comp-lzo no
;comp-lzo yes
;compress lz4-v2
;push "compress lz4-v2"
cipher AES-256-CBC
auth SHA512
ca mykeys/ca.crt
cert mykeys/ovpn.crt
key mykeys/ovpn.key
dh mykeys/dh4096.pem
server 192.168.2.0 255.255.255.0
log-append /var/log/openvpn/openvpn.log
verb 0
status /var/log/openvpn/openvpn-status.log
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"
user nobody
group nobody
;explicit-exit-notify 1
client-to-client
duplicate-cn
max-clients 100
keepalive 10 120
persist-key
persist-tun

{скрыть}

;local a.b.c.d Раскомментируйте, убрав символ ";" и пропишите Ваш ip адрес, либо оставьте, эту строчку без изменения, чтобы OpenVPN слушал на всех ip адресах.
proto tcp
port 443
Прописываем порт 443.
;port-share 127.0.0.1 8443 Если мы хотим шарить внешние подключения по 443-му с сервисом SSH или HTTPS WEB  (подробнее рассмотрим в других статьях). Второй сервис должен слушать на порту 8443 по адресу 127.0.0.1. Адрес можно заменить на внешний.
mssfix 1300
tun-mtu 1400
Я рекомендую снижать размер TCP MSS и/или MTU на TUN интерфейсе, чтобы гарантировать работу VPN на низкокачественном Интернете. Если для Вас пропускная способность важнее, и в качестве Ваших клиентского и серверного Интернет-каналов Вы уверены - можно не включать эти опции.
dev tun0 Прописываем номер туннеля, т.к. у нас их будет 2, и мы хотим точно знать, какой номер туннеля для какого типа включения - TCP или UDP.
tls-server
;tls-version-min 1.2
;tls-auth mykeys/ta.key 0
;tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
Включаем TLS и усиливаем  канал контроля TLS: включаем дополнительную PSK аутентификацию для увеличения безопасности контроля канала TLS, защищаясь от DOS. На серверной части  выставляется значение "0".  3 нижние опции пока выключим, чтобы нам было проще траблшутить.
comp-lzo no
;comp-lzo yes
;compress lz4-v2
;push "compress lz4-v2"
Рекомендую отключать компрессию, ели Вы не уверены, что Вам она нужна и явно полезна. На всякий случай, привожу эти опции здесь. Конфигурация с клиентом должна быть идентичной. lzo - старый алгоритм для старых клиентов. lz4 более новый алгоритм, быстрее и менее требовательный к CPU.
cipher AES-256-CBC
auth SHA512
Устанавливаем протокол шифрования, включаем аутентификацию пакетов. Это максимально возможные алгоритмы, совместимые с большинством клиентов. Для более современных клиентов я рекомендую использовать шифрование по алгоритму AES-256-GCM.
ca mykeys/ca.crt
cert mykeys/ovpn.crt
key mykeys/ovpn.key
dh mykeys/dh4096.pem

Прописываем пути до ключей и сертификатов.

Имя файла ключей DH зависит от размера ключа, который Вы выберете позднее.

server 192.168.2.0 255.255.255.0 Прописываем диапазон подсети, из которой будут выдаваться адреса клиентам.
log-append /var/log/openvpn/openvpn.log
verb 0
Включаем логирование, если необходимо, и выставляем нужный уровень.
status /var/log/openvpn/openvpn-status.log Краткое логирование статуса текущих соединений.

 

push "redirect-gateway def1 bypass-dhcp"

Принудительно заворачиваем весь трафик от клиента в сторону VPN сервера. Если эту опцию отключить и давать принудительно клиенту только специфические маршруты, он всё равно сможет маршрутизировать весь трафик через сервер, если явно в iptables это не запретить. 
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"
Прописываем клиенту сервера DNS Google.
user nobody
group nobody
Запускаем от неприоритетного пользователя.
;explicit-exit-notify 1 Для TCP нужно закомментировать эту опцию, т.к. с TCP она не работает, и сервис не запустится. Опция необходима для информирования клиента при рестарте сервиса, чтобы клиент мог автоматически переподключиться. В TCP это реализовано средствами самого протокола. Оставим её здесь для UDP.
client-to-client
duplicate-cn
max-clients 100
Разрешаем трафику ходить между клиентами. Разрешаем использование одних и тех же ключей для нескольких пользователей (можно отключить, если Вы действительно планируете каждому пользователю выдавать свои ключи).
Максимальное количество подключений не более 100.
keepalive 10 120 Ping'овать каждые 10 секунд, при этом, если в течение 120 секунд ничего в ответ не получено - значит удалённый хост недоступен.
persist-key
persist-tun
Не перечитывать key файлы при рестарте и не переоткрывать TUN/TAP устройство во время рестарта.

Генерация ключей и сертификатов

Создадим директории для хранения скриптов и генерации ключей:

mkdir /etc/openvpn/scriptkeys

Копируем скрипты для генерации в нашу новую директорию:

cp /usr/share/easy-rsa/2.0/* /etc/openvpn/scriptkeys/

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

vi /etc/openvpn/scriptkeys/vars

Вносим исправления:

export KEY_SIZE=4096
export KEY_COUNTRY="RU"
export KEY_PROVINCE="MO"
export KEY_CITY="Dubna
export KEY_ORG="MyCompany"
export KEY_EMAIL="email@mycompany.com" export KEY_OU="MyOrgUnit"

Указываем директорию для ключей, размер ключа и данные, которые будут отображаться в сертификате.
Вы можете установить размер ключа, равный 3072 или оставить по умолчанию (2048). Дефолтного размера достаточно, 3072 - хорошее соотношение безопасности и вычислительных нагрузок на сервер.

export KEY_NAME="ovpn" Указываем то же, что прописано в конфигурации наших файлов - ссылке на файл *.crt и *.key.
export KEY_CN=openvpn.example.com  Домен или поддомен Вашего сервера.

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

cd /etc/openvpn/scriptkeys/
source ./vars

Удаляем все ранее созданные сертификаты:

./clean-all

Создаём сертификат Удостоверяющего Центра (УЦ):

./build-ca

Генерируем ключ и сертификат для сервера:

./build-key-server ovpn

На дополнительные вопросы отвечаем:

A challenge password []:
An optional company name []:
Оставляем пустыми.
Sign the certificate? [y/n]:y Подтверждаем подпись сертификата.

Генерируем ключи для обмена по алгоритму Diffie-Hellman (занимает много времени):

./build-dh

Осталось сгенерировать ключи и сертификат для клиентов:

./build-key client

На дополнительные вопросы отвечаем:

Common Name (eg, your name or your server's hostname) [client]: Для разных клиентов задаём разные имена.
A challenge password []: An optional company name []: Оставляем пустыми.
Sign the certificate? [y/n]:y Подтверждаем подпись. сертификата.
1 out of 1 certificate requests certified, commit? [y/n]y  Подтверждаем

Создаём папку и копируем туда нужные нам для работы сервиса ключи (имейте ввиду размер ключа и имя файла здесь):

mkdir /etc/openvpn/mykeys
cd /etc/openvpn/scriptkeys/keys/
cp ca.crt ovpn.crt ovpn.key dh4096.pem client.crt client.key /etc/openvpn/mykeys

Создаём папку для логов openvpn:

mkdir /var/log/openvpn

Включаем и запускаем сервис, проверяем, что нет ошибок при запуске:

systemctl enable openvpn@tcpserver.service
systemctl start openvpn@tcpserver.service

Ошибки запуска сервиса можно посмотреть командами:

openvpn@tcpserver.service
journalctl -xe
cat /var/log/openvpn/openvpn.log

Нужно установить пакет сетевых утилит (в частности, нам нужен netstat):

yum install net-tools -y

Проверяем, что сервис слушает на порту 443:

netstat -tulpan | grep 443

Вывод команды должен быть примерно следующий:

tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 2744/openvpn

Всё, наш сервис работает! Можем продублировать конфигурацию для udp:

cp /etc/openvpn/tcpserver.conf /etc/openvpn/udpserver.conf
vi  /etc/openvpn/udpserver.conf

Вносим 4 изменения (меняем tcp на udp, tun0 на tun1, назначаем другую сеть, включаем опцию, о которой говорили выше):

proto udp
dev tun1
server 192.168.3.0 255.255.255.0
explicit-exit-notify 1

Включаем и запускаем сервис по udp, проверяем, что нет ошибок при запуске:

systemctl enable openvpn@udpserver.service
systemctl start openvpn@udpserver.service

Проверяем, что сервис слушает на порту 443 по обоим протоколам:

netstat -tulpan | grep 443

Вывод команды должен быть примерно следующий:

tcp    0      0 0.0.0.0:443      0.0.0.0:*       LISTEN      2744/openvpn
udp   0     0 0.0.0.0:443       0.0.0.0:*                          3400/openvpn

Если Вы видите, что слушаются не оба порта, то выполните:

Выключите SElinux:

vi /etc/sysconfig/selinux

Смените значение SELINUX на:

SELINUX=disabled

перезагрузитесь командой reboot и проверьте снова:

netstat -tulpan | grep 443

Проверяем, что у нас корректно создались tun интерфейсы и на них назначен верный mtu:

ifconfig

Вывод команды должен быть примерно следующий (вывод без стандартных интерфейсов):

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1400
inet 192.168.2.1 netmask 255.255.255.255 destination 192.168.2.2
inet6 fe80::dcaa:3783:b687:71ad prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 647 bytes 42049 (41.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 144 (144.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

tun1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1400
inet 192.168.2.1 netmask 255.255.255.255 destination 192.168.2.2
inet6 fe80::ba0d:e3d8:a7cf:941b prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 19533 bytes 1249608 (1.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 144 (144.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Настройка локального FireWall на CentOS 7

В нашем примере будем использовать классический и более привычный iptables.

systemctl stop firewalld
systemctl mask firewalld
 Останавливаем и выключаем сервис firewalld.
yum install iptables-services -y
systemctl enable iptables
systemctl start iptables
 Устанавливаем и запускаем iptables.

Открываем конфигурационный файл iptables для разрешения трафика по портам 443 UDP/TCP:

vi /etc/sysconfig/iptables

 -Добавляем 2-4-е правило.
- 3-е приавло можно не включать, если мы не трогали дефолтное правило "-A INPUT -i lo -j ACCEPT".
- 4-е включаем, если используется опция port-share - в этом случае указываем на порт, который должен принять на себя не распознанные OpenVPN пакеты.
- Выключаем правило FORWARD символом #:

-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p udp --dport 443 -j ACCEPT
#-A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -p tcp dport 843 -j ACCEPT

#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

Перезапускаем iptables и проверяем, что мы настроили всё корректно:

systemctl restart iptables.service
iptables -vnL | grep 443

Вывод будет примерно такой:

0      0      ACCEPT      tcp     --      *     *     0.0.0.0/0      0.0.0.0/0     tcp dpt:443
0      0      ACCEPT      udp    --      *     *     0.0.0.0/0      0.0.0.0/0     udp dpt:443

Проверяем, что порт tcp 443 на сервере открыт, делаем telnet c рабочей станции (должен быть установлен компонент Windows или отдельное приложение):

telnet <ip_address> 443

Теперь необходимо разрешить forward IP трафика на нашей CentOS 7, открываем файл:

vi /etc/sysctl.conf

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

net.ipv4.ip_forward = 1

С iptables ещё не всё. Теперь нужно снова зайти в файл конфигурации iptables и добавить строчку в секции NAT для того, чтобы весь трафик с клиента NAT'ировался в адрес нашего сервера (если секции NAT нет, то она создаётся в самом конце после строчки COMMIT секции filter):

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.2.0/23 -o eth0 -j MASQUERADE
COMMIT

eth0 - имя Вашего интерфейса.

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

-A POSTROUTING -s 192.168.2.0/23 -o eth0 -j SNAT --to <ip_address>

Перезапускаем iptables и проверяем вывод командой :

systemctl reload iptables.service
iptables -vnL -t nat

Вывод должен быть примерно такой :

Сhain PREROUTING (policy ACCEPT 6 packets, 349 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 192.168.2.0/23 0.0.0.0/0

Остаётся 1 шаг до завершения настройки. Перезапускаем сетевой сервис для активации настроек (в идеале - перезагрузить сервер, чтобы проверить, что всё работает после ребута):

systemctl restart network.service
Настройка клиента на Windows 7 :

OpenVPN GUI должен запускаться от имени администратора, иначе, он не сможет добавить необходимые маршруты. Конфигурационный файл нужно создавать в директории: C\Program Files\OpenVPN\config. Там же он и создаётся по умолчанию. Правиться он может путем нажатия правой кнопки мыши на иконке OpenVPN в system tray -> редактировать конфигурацию. Туда же необходимо переписать следующие файлы, подключившись к Вашему серверу, например,  c помощью WinSCP (по протоколу SFTP на порт, по которому доступен SSH):
- /etc/openvpn/mykeys/ca.crt
- /etc/openvpn/mykeys/client.crt
- /etc/openvpn/mykeys/client.key
Прописываем туда следующие строки:

Полная конфигурация ниже: {далее...}

Full config is below:
client
tls-client
verb 3
dev tun
mssfix 1300
tun-mtu 1400
persist-key
persist-tun
cipher AES-256-CBC
auth SHA512
comp-lzo no
remote <ip address> 443 udp
remote <ip address> 443 tcp-client
redirect-gateway def1
ping-restart 10
ca "ca.crt"
cert "client.crt"
key "client.key"
nobind
;auth-user-pass pass.txt
;key-direction 1
;tls-version-min 1.2
;tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384

{скрыть}


client
tls-client
verb 3
dev tun
mssfix 1300
tun-mtu 1400
persist-key
persist-tun
cipher AES-256-CBC
auth SHA512
comp-lzo no
Про эти параметры Вы фактически уже знаете (за исключением того, что здесь мы настраиваем клиента).
remote <ip address> 443 udp
remote <ip address> 443 tcp-client
redirect-gateway def1
Сначала подключаемся по UDP, если неуспешно, то по TCP.
Дефолтный шлюз - VPN server.
ping-restart 10 При недоступности сервера по UDP в течение 10 секунд происходит подключение по TCP.
ca "ca.crt"
cert "client.crt"
key "client.key"
Если файлы ключей и сертификатов лежат в директории config, путь прописывать не нужно, по умолчанию они берутся из этой директории.
nobind IP стек выделяет динамический порт для ответных пакетов.
;auth-user-pass pass.txt
;key-direction 1
;tls-version-min 1.2
;tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
Добавляем и выключаем аутентификацию по логину и паролю. Временно выключаем аутентификацию TLS с дополнительными опциями.
Настройка клиента на Android:

Устанавливаем клиента OpenVPN из Play Market, добавляем новый профиль:
- в разделе "удалённые серверы" прописываем наш сервер 2 раза: UDP + TCP, в этом же разделе для каждого сервера устанавливаем MTU 1400 и MSS 1300.
- в разделе аутентификация выбираем режим "Сертификаты TLS";
-добавляем сертификаты: client.crt - сертификат, client.key - закрытый ключ, ca.crt - центр сертификации (скопировать файлы на Android можно прямо с сервера, установив на Android FTP сервер, либо по USB, предварительно скачав, подключившись при помощи WinSCP);
-обязательно добавляем в разделе "криптография": шифрование - cipher AES-256-CBC, аутентификация - auth SHA512;
- в разделе "опции", добавляем рестарт по пингу 10, сжатие данных LZO none;
- в разделе "дополнительные опции" добавить tls-version-min 1.2 и tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384;
-запускаем подключение.

Screenshot Screenshot Screenshot

 ScreenshotScreenshot

Заходим на сайт ripe.net и проверяем назначенный нам адрес:

Screenshot

 

 

 

 

 

 

Расширенные настройки безопасности

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

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login

Рестартовываем оба сервиса:

systemctl restart openvpn@udpserver.service
systemctl restart openvpn@tcpserver.service

Создадим пользователя для аутентификации и зададим ему пароль:

useradd testuser
passwd testuser

Выключаем warning сообщения в логах о replay пакетах в конфигурации UDP сервера. Периодически админы сталкиваются с такими сообщениями, которые, возможно, вызваны дуплицированием пакетов, например, на виртуализации серверов:

mute-replay-warnings

Пробуем подключиться с нашего Android клиента и понимаем, что у нас не проходит авторизация. Теперь, чтобы подключиться, надо в приложении, в разделе "Аутентификация" выбрать режим "Сертификат TLS + пароль" и, при желании, сохранить тут же имя пользователя и пароль. Если Вы всё указали верно, то всё должно работать.

Теперь сгенерируем на сервер pre-shared ключ для аутентификации пакетов:

cd /etc/openvpn/mykeys/
openvpn --genkey --secret ta.key

Нужно ограничить доступ к ключам:

cd /etc/openvpn/mykeys/
chmod 600 *.key

Включаем на сервере опции, которые мы задали ранее:

tls-auth mykeys/ta.key 0
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384

Снова рестартовываем оба сервиса:

systemctl restart openvpn@udpserver.service
systemctl restart openvpn@tcpserver.service

В клиентском ПО на Android в разделе "Аутентификация" добавляем checkbox TLS аутентификацию с направлением "1" и импортируем ключ. Пробуем переподключиться - всё должно работать.

Попробуем подключиться с усиленными настройками на Windows клиенте.
Чтобы добавить второй фактор и  TLS аутентификацию нужно в конфигурации прописать:

auth-user-pass pass.txt

pass.txt должен быть расположен в директории config, а в файле должны содержаться всего лишь 2 строчки: логин и пароль (без дополнительных директив).

 

key-direction 1
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384

<tls-auth>
# # 2048 bit OpenVPN static key #
-----BEGIN OpenVPN Static key V1-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OpenVPN Static key V1-----
</tls-auth>

Здесь есть маленькая хитрость. Ключ tls не читается из файла, его необходимо задавать встроенным, обрамляя в директивы <tls-auth> и </tls-auth>. И направление ключа указываем 1 несколько другой директивой.
Маршрутизация только специфических маршрутов через OpenVPN сервер

На сервере меняем 
-для конфигурации UDP:

;push "redirect-gateway def1 bypass-dhcp"
push "route 192.168.2.0 255.255.255.0"

-для конфигурации TCP:

;push "redirect-gateway def1 bypass-dhcp"
push "route 192.168.3.0 255.255.255.0"

Рестартовываем оба сервиса:

systemctl restart openvpn@udpserver.service
systemctl restart openvpn@tcpserver.service

На Андроид клиенте в разделе "Маршрутизация" необходимо снять Checkbox "Перенаправлять шлюз" (если установлен, соответсвенно).
На Windows клиенте просто нужно закомментировать строчку:

;redirect-gateway def1

После подключения на Андроид клиенте можно проверить маршруты в разделе "Маршрутизация", на Windows можно проверить командой route print из командной строчки.

Надеюсь, что инструкция Вам понравилась и была понятна, Благодарю Вас за внимание. Вы можете оставлять свои комментарии и вопросы ниже! Я с удовольствием на них постараюсь ответить!

 

При использовании материалов ссылка на сайт обязательна!