posts projects about

Установка и настройка OpenVPN сервера с помощью Docker

31 мая 2022 г. server vpn

Расскажу как за пару минут поднять OpenVPN сервер на Linux хосте. В своем примере я использую Ubuntu 20.04, но подойдет любой Linux, так как будем использовать докер.

Особенности моей инсталяции

Вообще подобная инструкция есть в разных уголках интернета, но в моей есть пара доработок:

  1. Нестандартный порт: VPN-сервер слушает на нестандартном для OpenVPN 1174, это позволяет отбиться от назойливых crawler-ов, которые пытаются брутфорсить все подряд в интернете.

  2. Возможность подключаться под одним пользователем несколько раз одновременно: по умолчанию OpenVPN не дает такой возможности. Если добавить duplicate-cn в конфиг, то один пользователь сможет создавать несколько подключений одновременно.

Подготовка

Итак, берем чистый Ubuntu сервер.

Поднимать OpenVPN мы будем в Docker контейнере, поэтому для начала нужно установить Docker на сервер. Это можно сделать одной командой:

$curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh

Для запуска OpenVPN мы будем использовать образ kylemanna/openvpn

TL;DR

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

  • Папка с конфигом определяется в переменной configdir перед выполнением;
  • Заменить SERVERADDR на адрес своего сервера — IP или хостнейм (порт важно оставить как есть);
  • Заменить CLIENTNAME на свое имя пользователя
$export configdir=/etc/openvpn && mkdir $configdir && docker run -v $configdir:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://SERVERADDR:11194 -e "duplicate-cn" && docker run -v $configdir:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki && docker run -v $configdir:/etc/openvpn -d --name openvpn --restart=always -p 11194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn && docker run -v $configdir:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass && docker run -v $configdir:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

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

Установка OpenVPN по шагам

Создаем папку для конфигов и генерируем первичный конфиг, вместо SERVERADDR нужно подставить IP-адрес вашего сервера или его хостнейм:

$export configdir=/etc/openvpn
$mkdir $configdir
$docker run -v $configdir:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://SERVERADDR:11194 -e "duplicate-cn"

Теперь создаем корневые сертификаты. Потребуется ввести пароль (минимум 5 символов) и CommonName - это имя сервера (может быть любое):

$docker run -v $configdir:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

Конфигурация готова, можно запустить наш сервер:

$docker run -v $configdir:/etc/openvpn -d --name openvpn --restart=always -p 11194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

Создаем пользователя. Потребуется пароль, который придумали выше (CLIENTNAME нужно заменить на имя юзера):

$docker run -v $configdir:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass

Скачиваем файл конфигурации из контейнера на хост машину (CLIENTNAME нужно заменить на имя юзера):

$docker run -v $configdir:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

Всё. Забираем файл с сервера, ставим клиент OpenVPN, и импортируем этот конфиг в него. После подключения, весь траффик клиента будет проходить через VPN.