OpenVPN в Docker

Итак в этом посте я вам расскажу как за пару минут поднять OpenVPN на вашем сервере используя Docker.

Все эксперименты проводились на серверве с Debian Jessie и примеры соответственно оттуда, но разницы в других дистрах быть не должно. Все же основной цимес у нас внутри Docker-контейнера который у всех будет одинаковым.

Если вам уже интересно то прошу под кат:

Поехали

1. Создаем контейнер с данными
OVPN_DATA="ovpn-data"
docker run --name $OVPN_DATA -v /etc/openvpn busybox

Тут у нас создается переменная окружения OVPN_DATA и потом создается контейнер на основе образа busybox с названием хранящимся в ней.
В этом контейнере будут храниться данные (конфиги и ключи) openvpn.

2. Получаем контейнер с OpenVPN и выполняем первичную настройку
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://100.100.100.100
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki

Как мы видим тут к контейнеру с openvpn линкуется наш data-volume контейнер из пункта 1 и затем запускается скрипт первоначальной конфигурации OpenVPN. В аргументе указываем ip или хост нашего сервера.
Тут нас попросят придумать пароль который нам дальше пригодится для генеации ключей. Сохраните его.

3. Пилим systemd-сервис чтобы в будущем стартовать наш VPN в одну команду
cd /etc/systemd/system
vim dockeropenvpn.service

Вставляем содержимое dockeropenvpn.service

[Unit]
Description=OpenVPN based on Docker container
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

[Install]
WantedBy=multi-user.target
~                            

Пробуем включить и запустить наш сервис

systemctl enable /etc/systemd/system/dockeropenvpn.service
systemctl start dockeropenvpn.service

Убеждаемся в том что наш Docker-контейнер стартанул при старте сервиса

docker ps

docker ps

4. Генерируем пользовательские сертификаты и конфиги
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full USERNAME nopass

Как раз тут нам пригодится пароль из пункта 2.

Генерируем готовый пользовательский конфиг connect.ovpn

docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient USERNAME > /home/USERNAME/connect.ovpn

Как вы наверное уже догадались USERNAME нужно везде поменять на имя пользователя VPN (не обязательно наличие такого пользователя на сервере).

Вот собственно и все. Быстрого и безопасного вам интернета, друзья!