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

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

Тематические термины: VPN, Ubuntu, OpenVPN.

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

$ sudo su

Подготовка Ubuntu

Обновляем установленные пакеты:

apt-get update && apt-get upgrade

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

apt-get install chrony

Разрешаем ее автозапуск и стартуем сервис:

systemctl enable chrony --now

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

timedatectl set-timezone Europe/Moscow

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

Если в нашей системе используется брандмауэр, открываем порт, на котором будет слушать OpenVPN:

iptables -I INPUT -p udp --dport 443 -j ACCEPT

* в данной инструкции предполагается, что мы настроим VPN-сервер на UDP-порту 443, однако, по-умолчанию, OpenVPN работает на порту 1194.

Для сохранения правила используем iptables-persistent:

apt-get install iptables-persistent

netfilter-persistent save

Установка, настройка и запуск VPN-сервера

Установка OpenVPN

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

apt-get install openvpn easy-rsa

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

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

mkdir /etc/openvpn/easy-rsa

Переходим в созданный нами каталог:

cd /etc/openvpn/easy-rsa

Скопируем в текущий каталог шаблоны скриптов для формирования сертификатов:

cp -r /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 — альтернативный адрес.

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

. ./vars

Почистим каталог от старых сертификатов:

./clean-all

Для генерирования сертификатов необходим конфигурационный файл openssl.cnf — по умолчанию, он отсутствует, но есть файл openssl-1.0.0.cnf. Создаем на него симлинк:

ln -s openssl-1.0.0.cnf openssl.cnf

* в каталоге /etc/openvpn/easy-rsa может быть несколько разных версий конфигурационного файла openssl-x.x.x.cnf. Чтобы узнать точное имя файла, вводим команду ls /etc/openvpn/easy-rsa.

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

./easyrsa init-pki

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

./easyrsa build-ca

* после вводим дважды пароль.

На запрос «Common Name» можно просто нажать Enter:

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

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

./easyrsa gen-req server nopass

nopass можно упустить, если хотим повысить безопасность с помощью пароля на сертификат.

На запрос «Common Name» можно просто нажать Enter:

Common Name (eg: your user, host, or server name) [server]:

Генерируем сам сертификат:

./easyrsa sign-req server server

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

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

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

Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:

Готово. Ключ для сервера создан.

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

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

Формируем ключ Диффи-Хеллмана:

./easyrsa gen-dh

Сертификаты сервера готовы, остается создать рабочую папку openvpn:

mkdir -p /etc/openvpn/keys

И скопировать в нее ключи:

cp -r pki/* /etc/openvpn/keys/

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

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

vi /etc/openvpn/server.conf

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

local 192.168.0.15
port 443
proto udp
dev tun
ca keys/ca.crt
cert keys/issued/server.crt
key keys/private/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 4
mute 20
daemon
mode server
tls-server
comp-lzo

* где

  • local — IP-адрес, на котором будет обрабатывать запросы OpenVPN; 
  • port — сетевой порт (443 позволит избежать проблем при использовании Интернета в общественных местах, но может быть любым из свободных. Порт 1194 является стандартным для OpenVPN).
  • proto — используемый транспортный протокол.
  • dev — виртуальный сетевой адаптер, который будет создан для работы OpenVPN.
  • ca — путь до сертификата корневого центра сертификации.
  • cert — путь до открытого сертификата сервера.
  • key — путь до закрытого сертификата сервера.
  • dh — путь до ключа Диффи - Хеллмана.
  • tls-auth — путь до tls-ключа.
  • server — задаем IP-адрес сервера в сети VPN.
  • ifconfig-pool-persist — путь к файлу для хранения клиентских IP-адресов.
  • keepalive X Y — каждые X секунд отправляется ping-запрос на удаленный узел. Если за Y секунд не получено ответа — перезапускать туннель.
  • max-clients — максимум одновременных подключений.
  • persist-key — не перезагружать ключи при повторной загрузки из-за разрыва соединения.
  • persist-tun —  не изменять устройства tun/tap при перезапуске сервера.
  • status — путь до журнала статусов.
  • log-append — путь до файла лога с дополнительным выводом информации.
  • verb — уровень логирования событий. От 0 до 9.
  • mute — ограничение количества подряд отправляемых в лог событий.
  • daemon — работа в режиме демона.
  • mode — в каком режиме работает openvpn (сервер или клиент).
  • tls-server — указывает, что данный сервер работает с использованием TLS.
  • comp-lzo — использовать сжатие.

Создадим каталог для логов:

mkdir /var/log/openvpn

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

systemctl enable openvpn@server --now

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

На сервере:

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

cd /etc/openvpn/easy-rsa

Создаем системные переменные, настроенные ранее в файле vars:

. ./vars

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

./easyrsa build-client-full client1 nopass

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

Enter pass phrase for /etc/openvpn/easy-rsa/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 для удобства переноса их на клиентский компьютер.

На клиенте:

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

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

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

Переходим в папку C:\Program Files\OpenVPN\config. И копируем в нее файлы ca.crt, client1.crt, client1.key, ta.key из каталога /tmp/keys на сервере, например, при помощи программы WinSCP.

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

rm -R /tmp/keys

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

client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo
ca ca.crt
cert client1.crt
key client1.key
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
verb 0

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

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

Запускаем с рабочего стола программу «OpenVPN GUI» от имени администратора (это важно).

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

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

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

Доступ к локальной сети

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

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

Позволяет требовать от пользователя ввод логина и пароля при каждом подключении. Также идентификация каждого пользователя необходима для уникальной идентификации каждого из них и выдачи разных IP-адресов.

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

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

vi /etc/openvpn/server.conf

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

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

* где:

  • plugin — путь до библиотеки проверки введенных логина и пароля. Как путь, так и название файла openvpn-plugin-auth-pam.so могут отличаться. Это зависит от версии Linux и OpenVPN. Чтобы найти путь до нужного файла, можно воспользоваться командой find / -name "openvpn-*auth-pam*" -print.
  • tmp-dir — указание пути до директории хранения временных файлов. Если не указать, то будет использоваться /tmp, однако, на практике это может привести к ошибке Could not create temporary file '/tmp/openvpn_<набор символов>.tmp': No such file or directory (errno=2).

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

systemctl restart openvpn@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 запускался при старте операционной системы Windows и подключался к серверу, просто открываем службы и находим OpenVPNService. Переводим его в режим автозапуска:

Настройка службы OpenVPN для автоматического старта

Статические IP для клиентов

На сервере для каждого клиента генерируем свой сертификат. Например, для client2 вводим следующие команды:

cd /etc/openvpn/easy-rsa

. ./vars

./build-key client2

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

  • ca.crt
  • client2.crt
  • client2.key
  • dh2048.pem
  • ta.key

Также на сервере открываем следующий файл и заносим статический адрес для клиента:

vi /etc/openvpn/ipp.txt

client,172.16.10.4
client2,172.16.10.24

* в данном примере клиент client будет получать IP 172.16.10.4, а client2172.16.10.24.

В конфигурационном файле server.conf должна быть строчка:

ifconfig-pool-persist ipp.txt

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

systemctl restart openvpn@server

Теперь на клиенте не забываем указать правильные названия файлов в конфигурационном файле клиента:

cert client2.crt
key client2.key

Пробуем подключиться.

Доступ в Интернет через VPN-сервер

Настройка делает так, что клиенты VPN-сервера начинают использовать последний как шлюз по умолчанию. Таким образом, весь трафик идет через наш сервер.

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

vi /etc/openvpn/server.conf

и добавляем:

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

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

systemctl restart openvpn@server

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

Возможные проблемы при работе с OpenVPN

1. failed to start openvpn robust and highly flexible tunneling application on server

Описание: при запуске сервера получаем данную ошибку.

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

Решение: открываем лог /var/log/openvpn/openvpn.log и смотрим, с каким сертификатом проблема. Проверяем, что все файлы скопированы и что мы не забыли сгенерировать все сертификаты.

2. Постоянно разрывается соединение

Описание: с периодичностью от 1 до 5 минут постоянно рвется соединение с сервером. После нескольких минут переподключается.

Причина: как правило, конфликт IP-адресов. Такая ситуация возникает при случаях, когда подключение выполняется с нескольких компьютеров одновременно с одинаковыми данными авторизации (логином и паролем).

Решение: настройте клиента для подключения к серверу с уникальными логином и паролем.

3. ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)

Описание: ошибка возникаем при попытке запустить сервис openvpn.

Причина: не загружается модуль tun.

Решение: необходимо перед запуском сервиса openvpn создавать устройство tun. Для этого мы создадим скрипт, который будет создавать устройство при запуске сервера.

Создаем каталог, в который поместим скрипт:

mkdir /scripts

Создадим сам скрипт:

vi /scripts/tun.sh

/bin/mkdir /dev/net
/bin/mknod /dev/net/tun c 10 200

* данный скрипт создает каталог /dev/net, а в нем — устройство tun.

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

vi /etc/systemd/system/tun.service

[Unit]
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/scripts/tun.sh"

[Install]
WantedBy=multi-user.target

Перечитываем изменения в systemd:

systemctl daemon-reload

Разрешаем автозапуск юнита tun и стартуем скрипт:

systemctl enable tun --now

Теперь можно запустить openvpn:

systemctl start openvpn@server

Перезагружаем сервер, чтобы убедиться а работе сервиса после старта компьютера.

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

Да            Нет