news
Управление доменами по API и CLI

Настройка OpenVPN в Ubuntu

АМ
Александр Мельников
26 сентября 2019

OpenVPN - открытая реализация одной из технологий VPN, предназначенная для организации защищенных виртуальных частных сетей между территориально удаленным локальными сетями, а также отдельными клиентами. Безопасность туннелей обеспечивается шифрованием с помощью OpenSSL.

Как работает OpenVPN?

По окончании настройки сервера и его запуске, он перейдет в режим готовности приема и перенаправления внешних защищенных SSL-соединений на виртуальный сетевой адаптер (tun/tap).

По желанию, маршрутизация сервера может быть настроена таким образом, чтобы Интернет-трафик клиентов проходил через сервер и становился трафиком сервера. В этом случае OpenVPN будет выполнять проксирование трафика (proxy).

Что требуется от операционной системы?

Перед установкой OpenVPN необходимо убедиться в корректности базовых параметров.

1. У сервера есть хотя бы один “белый” статичный IP-адрес. Т.е. сервер должен быть доступен из сети Интернет. Если адрес динамический, но сервер все же остается быть доступным из глобальной сети - воспользуйтесь услугами DynDNS.

2. Разрешена загрузка и установка пакетов из официальных репозиториев. Для проверки выполните cat /etc/apt/sources.list. Строки с указаниями репозиториев должны быть раскомментированы (не должно быть символа “#” решетка в начале строки).

Репозитории
Скриншот 1. Репозитории

3. Должны быть верно указаны параметры сети - hostname, параметры DNS-серверов.

Для обеспечения должного уровня безопасности, рекомендуем ознакомиться с нашими рекомендациями.

Приступаем к установке.

Все действия по установке будем выполнять от пользователя root.

1. Обновляем информацию о репозиториях:

apt-get update

2. Устанавливаем текущие обновления системы и установленных программ:

apt-get upgrade

3. Устанавливаем OpenVPN:

apt-get install openvpn

Установка OpenVPN
Скриншот 2. Установка OpenVPN

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

4. Аналогичным образом устанавливаем пакет easy-rsa:

apt-get install easy-rsa

Действия после установки.

Размещаем скрипты easy-rsa:

cd /etc/openvpn/ && make-cadir easy-rsa

Подготавливаем публичные ключи (PKI - Public Key Infrastructure):

1. Переходим в директорию /etc/openvpn/easy-rsa:

cd /etc/openvpn/easy-rsa

2. Создаем символьную ссылку на файл конфигурации openssl:

ln -s openssl-1.0.0.cnf openssl.cnf

3. Инициализируем скрипт vars:

source ./vars

Система сообщит: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

4. Выполняем

./clean-all

Подготавливаем публичные ключи
Скриншот 3. Подготавливаем публичные ключи

5. Для создания центра сертификации выполняем скрипт:

./build-ca

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

Создание центра сертификации
Скриншот 4. Создание центра сертификации

Создаем ключ сервера.

Для создания ключа сервера выполним команду:

./build-key-server server

Создание ключа сервера
Скриншот 5. Создание ключа сервера

Следует обратить внимание, что процесс похож на генерацию сертификата центра сертификации, однако, перед подписанием сертификата программа задаст 2 уточняющих вопроса. Если все указано верно, отвечаем “y”.

Генерация клиентских ключей.

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

./build-key client1

Следует обратить внимание, что созданный client1.key не имеет парольной или криптографической защиты. Это может привести к тому, что любой пользователь завладевший файлом может попробовать подключиться к серверу. Если такая угроза существует, лучше генерировать ключи другим скриптом:

./build-key-pass client2

Скрипт запросит парольную фразу в самом начале. Далее процесс ничем не отличается от генерации ключей сервера и простого клиента.

Создание ключа клиента
Скриншот 6. Создание ключа клиента

Следует помнить, что имена ключей должны быть уникальными. Один пользователь - один ключ с уникальным именем.

Бывает так, что в процессе работы сервера, по прошествии некоторого времени, необходимо создать еще один или несколько сертификатов. Для этого потребуется повторно инициализировать скрипт vars и только потом запустить процесс генерации ключа:

cd /etc/openvpn/easy-rsa

source ./vars

./build-key client3

Генерация ключа Диффи-Хеллмана

Благодаря протоколу Диффи-Хеллмана, две и более стороны могут получить один секретный ключ, который позволит выстроить защищенный канал связи. Генерируются ключи командой:

./build-dh

Результат будет примерно таким.

Генерация ключа Диффи-Хеллмана
Скриншот 7. Генерация ключа Диффи-Хеллмана

По окончании работы программы, в директории /etc/openvpn/easy-rsa/keys/ появится файл dh2048.pem

Перемещение сертификатов и ключей

Сервер

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

1. Переходим в каталог с ключами:

cd /etc/openvpn/easy-rsa/keys

2. Копируем только необходимые серверу файлы:

cp ca.crt ca.key dh2048.pem server.crt server.key /etc/openvpn

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

Клиенты

Клиенту понадобится всего 3 файла ca.crt, client1.crt, client1.key. Каждому клиенту необходимо отдавать только его ключи. Данные файлы можно разместить в директории /etc/openvpn на машине клиента, если она под управлением Linux-подобной ОС.

В ОС Windows их следует разместить в пользовательский каталог.

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

Сервер

Большинство устанавливаемых программ в ОС Linux имеют так называемые sample-файлы. Эти файлы содержат примеры настройки и объяснения их. OpenVPN не стал исключением. Распакуем серверный конфигурационный файл в директорию /etc/openvpn:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

С полученным файлом сервер уже готов к работе. Он сконфигурирован с возможностью туннелирования, однако не имеет возможности к проксированию, т.е. отправки клиентского трафика от своего имени. Исправим это.

Для начала, проверяем какие файлы оказались в директории /etc/openvpn:

ls /etc/openvpn

Содержимое директории OpenVPN
Скриншот 8. Содержимое директории OpenVPN

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

nano /etc/openvpn/server.conf

И проверяем соответствие файлов прописанных в конфигурации с файлами находящимися в каталоге. Интересны строки после “SSL/TLS root certificate (ca), certificate (cert), and private key (key).”

Файл конфигурации OpenVPN
Скриншот 9. Файл конфигурации OpenVPN

Если имена отличаются от существующих, следует внести необходимые исправления. Выходим из редактора сочетанием клавиш Ctrl + X.

Запускаем сервер:

/etc/init.d/openvpn start

Проверим результат запуска:

/etc/init.d/openvpn status

Запуск службы OpenVPN
Скриншот 10. Запуск службы OpenVPN

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

Предполагается, что на стороне клиента уже установлен пакет OpenVPN.

1. Копируем файл клиентских настроек в домашний каталог пользователя:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /root

2. Копируем сгенерированные ключи - client1.key, client1.crt, ca.crt:

cd /etc/openvpn/easy-rsa/keys

cp client1.key client1.crt ca.crt /root

3. Редактируем файл конфигурации клиента:

nano /root/client.conf

4. Находим закомментированные строки “# The hostname/IP and port of the server”. Для параметра remote меняем my-server-1 на IP-адрес сервера или его доменное имя.

Редактирование настроек
Скриншот 11. Редактирование настроек

5. В том же файле, ниже, находим блок “#SSL/TLS parms.”. Редактируем имена ключей.

Редактирование SSL TLS parms
Скриншот 12. Редактирование SSL TLS parms

6. Выходим из редактирования сочетанием Ctrl + X. На вопрос о сохранении изменений отвечаем “Y”. Имя файла оставляем неизменным.

7. Переносим файлы client1.key, client1.crt, ca.crt и client.conf на компьютер клиента с которого будет происходить подключение к серверу OpenVPN.

Важно! Некоторые клиентские реализации OpenVPN работают только с файлами *.ovpn. В подобных случаях достаточно изменить расширение файл (переименовать) с client.conf на client.ovpn.

8. Подключаемся к серверу командой:

openvpn openvpn.conf

Следует обратить внимание, что проксирование до сих пор не настроено. При этом, когда клиентская машина подключена к OpenVPN-серверу, доступ в Интернет прекращается. Связано это с тем, что созданный адаптер TUN, а в месте с ним и сам сервер, являются шлюзом по умолчанию.

Настройка маршрутизации.

1. На сервере редактируем файл server.conf:

nano /etc/openvpn/server.conf

2. В файле находим следующую строку и удаляем перед ней символ “;”, таким образом раскомментируем ее:

push "redirect-gateway def1 bypass-dhcp"

3. Сохраняем и закрываем редактор.

4. Редактируем файл /etc/sysctl:

nano /etc/sysctl.conf

5. В конец файла добавляем следующую строку:

net.ipv4.ip_forward=1

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

6. Разрешаем форвардинг пакетов без перезагрузки сервера:

echo 1 > /proc/sys/net/ipv4/ip_forward

7. Настроим NAT в iptables. Поочередно вводим команды:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT

iptables -A FORWARD -j REJECT

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

iptables -A INPUT -i tun+ -j ACCEPT

iptables -A FORWARD -i tun+ -j ACCEPT

iptables -A INPUT -i tap+ -j ACCEPT

iptables -A FORWARD -i tap+ -j ACCEPT

Также их можно просто вписать в файл /etc/rc.local до строки “exit 0” или выполнить настройку firewall как это указано в нашей статье.

Настройка автозагрузки iptables
Скриншот 13. Настройка автозагрузки iptables

Сервер уже готов к использованию. Однако, задача проксировать весь трафик, а следовательно необходимо настроить форвардинг DNS-запросов. Настроим.

1. Устанавливаем dnsmasq

Если установка выполняется в ОС Ubuntu:

apt-get install dnsmasq

Несмотря на то, что в большинстве современных версий ОС Ubuntu dnsmasq уже предустановлен, в старых версиях необходимо выполнить так:

apt-get install dnsmasq && dpkg-reconfigure resolvconf

Возможно запустится диалоговое окно мастера установки. В нем будет 2 вопроса. В первом случае, на вопрос “prepare /etc/resolv.conf for dynamic updates” отвечаем “Yes”, а на следующий - “Append original file to dynamic file?” отвечаем “No”.

Для ОС Debian 7:

apt-get install dnsmasq resolvconf

2. Отредактируем файл настроек dnsmasq:

nano /etc/dnsmasq.conf

Добавим следующие параметры:

listen-address=10.8.0.1

bind-interfaces

Сохраняем файл и закрываем редактор.

3. Редактируем файл сетевых настроек:

nano /etc/network/interfaces

Требуется указать адрес DNS-серверов в соответствующих секциях настроек адаптера:

dns-nameservers 8.8.8.8 8.8.4.4

Возможно это действие уже произведено,. Повторно его выполнять не нужно.

4. Учитывая особенность запуска и последующей работы dnsmasq - возможность аварийного завершения до инициализации виртуального tun-адаптера, добавим следующую строчку в файл rc.local, перед “exit 0”:

/etc/init.d/dnsmasq restart

Настройка перезапуска dnsmasq
Скриншот 14. Настройка перезапуска dnsmasq

5. Теперь разрешим клиентам OpenVPN-сервера использовать DNS. С помощью редактора nano раскомментируем строку:

push "dhcp-option DNS 10.8.0.1"

Фиксируем изменения в файле.

6. Перезагружаем сервер:

reboot

Проверка работы

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

Остались вопросы? Задайте их нашему эксперту и получите квалифицированную помощь