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

31 May 2022, 00:47 server

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

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

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

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

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

Подготовка

Я использую DigitalOcean (который предусмотрительно оплатил на год вперед 😎 ), самая дешевая виртуалка включает 1 ТБ траффика в месяц, и этого вполне хватает мне и моим друзьям. Сейчас есть проблема с оплатой заграничных провайдеров, и виртуалку уже просто так не купишь. В качестве обходного пути могу посоветовать найти провайдера с оплатой биткоинами

Итак, берем чистый 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.