Приветствую!
По просьбе некоторых подписчиков из нашего вороньего чата, сегодня мы соберем OpenConnect VPN сервер, он же ocserv, последней версии – 1.3, из открытых исходных кодов, в дистрибутиве Debian 12. А также создадим Docker образ на основе того же дистрибутива.
Если вы не в курсе, что это за зверь такой, рекомендую мою другую статью к прочтению: Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов
Все действия из данной статьи будут выполняться в следующей конфигурации:
Поехали🙃
Сборка ocserv из исходных кодов
Первым делом, обновляем нашу текущую систему до последней версии такой командой:
sudo apt update && sudo apt upgrade -y
Далее подключаем репозиторий Debian Sid – репозиторий “нестабильных” пакетов дистрибутива, т.к. там находятся нужные нам версии библиотек. После, обязательно обновляем кэш для применения изменений:
echo "deb http://deb.debian.org/debian sid main" | sudo tee -a /etc/apt/sources.list
sudo apt update
Команда tee принимает на ввод данные и записывает их в файл, а также выводит в стандартный вывод (stdout). Ключ -a (append) означает добавить полученное содержимое в файл, а не перезаписать его полностью.
Далее нам необходимо установить большой список зависимостей 😳 Предусмотрите свободное пространство на вашем диске под эти цели.
sudo DEBIAN_FRONTEND=noninteractive apt install -y build-essential fakeroot devscripts iputils-ping ruby-ronn openconnect libuid-wrapper libnss-wrapper libsocket-wrapper gss-ntlmssp git-core make autoconf libtool autopoint gettext automake nettle-dev libwrap0-dev libpam0g-dev liblz4-dev libseccomp-dev libreadline-dev libnl-route-3-dev libkrb5-dev liboath-dev libradcli-dev libprotobuf-dev libtalloc-dev libhttp-parser-dev libpcl1-dev protobuf-c-compiler gperf liblockfile-bin nuttcp libpam-oath libev-dev libgnutls28-dev gnutls-bin haproxy yajl-tools libcurl4-gnutls-dev libcjose-dev libjansson-dev libssl-dev iproute2 libpam-wrapper tcpdump libopenconnect-dev iperf3 ipcalc-ng freeradius libfreeradius-dev
Переменная DEBIAN_FRONTEND=noninteractive указывает пакетному менеджеру apt выполнить установку исключая взаимодействие с пользователем. Т.е. при разрешении конфликтов во время установки, apt будет применять действие по умолчанию. Помните, что вы все делаете на свой риск и ответственность.
После установки всех нужных пакетов, скачиваем архив с исходниками ocserv с помощью утилиты curl. После чего распаковываем архив с помощью архиватора tar:
curl -fLO https://www.infradead.org/ocserv/download/ocserv-1.3.0.tar.xz
ls
tar -xvf ./ocserv-1.3.0.tar.xz
Используемые ключи tar:
- -x – eXtract, собсно распаковка;
- -v – Verbose, подробный вывод процесса распаковки;
- -f – File, после этого ключа указывается фал архива.
После распаковки переходим в созданную директорию с исходниками и запускаем сборку, а также проверку ocserv, и все это от имени root:
cd ./ocserv-1.3.0
sudo sh -c './configure --enable-oidc-auth && make && make check'
С помощью конструкции sh -c 'commands' мы объединили несколько команд в одну. Таким образом их проще запустить указав sudo один раз.А параметр --enable-oidc-auth в команде configure указывает выполнить сборку с поддержкой OpenID Connect.
В итоге будет выполнен билд почти дефолтной конфигурации:
Процесс может занять длительное время, в зависимости от вашего железа и конфигурации компилятора.
И так сборка завершена, но.. видно 2 провальных теста:
- haproxy-auth – в ходе изучения пришел к выводу, что проблема в обращении haproxy по адресу 127.0.0.2 во время теста, при сборке в виртуальной машине. Проблема известная и судя по всему ни на что не влияет. Подробнее в ишью в официальном GitLab и сам скрипт теста там же.
- test-oidc – потому что требует OpenID auth токен для проверки.
Установка и запуск ocserv
Для установки собранных файлов в вашу систему, выполните:
sudo make install
Тут вы увидите, что и куда было установлено/скопировано.
Теперь проверяем:
whereis ocserv
sudo ocserv --version
Обратите внимание, что ocserv по умолчанию устанавливается в /usr/local/sbin.
Описывать, что нужно для запуска ocserv во всех подробностях не стану😐 Иначе статья получится слишком большая, да и цель ее не в этом. Для простоты установки, вы можете воспользоваться моим готовым bash скриптом, который я сделал для запуска ocserv в Docker из прошлой статьи.
Для этого нужно скачать его из моего GitHub и запустить следующим образом:
sudo mkdir /etc/ocserv
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/ocserv.sh
chmod +x ./ocserv.sh
sudo ./ocserv.sh ocserv --foreground
При первом запуске скрипт сгенерит все нужные сертификаты с дефолтными значениями. При необходимости отредактируйте их вначале скрипта ocserv.sh.
Проверка в соседней вкладке:
ss -tulnap | grep 443
curl --insecure https://localhost:443
Утилита ss позволяет просматривать сетевую активность ОС. Параметр --insecure в curl позволяет выполнить запроса с игнорированием предупреждений о самоподписанных SSL сертификатах.
Отлично, все работает. Для выхода нажмите Ctrl+c на основной вкладке.
Сборка из исходных кодов внутри Docker
Теперь чутка поинтереснее 😌
Мои подписчики знают, что личные сервисы я предпочитаю разворачивать в Docker. Это сильно упрощает их обслуживание, масштабируемость и переносимость.
Поэтому сейчас, мы с вами выполним сборку ocserv 1.3 в одном в Docker контейнере с Debian 12, а в другой, такой же, установим парочку зависимостей и просто скопируем готовые исполняемые файлы из образа сборки, чтобы итоговый получился небольшого размера.
По сути, все тоже самое, что мы с вами проделали ранее, только внутри контейнеров без засорения основной системы.
Для сборки нам понадобится установленный Docker engine. Если это еще не сделано, рекомендую мою статью: Установка Docker engine на Linux сервер под управлением Debian.
Создание Docker образа для сборки ocserv 1.3
И так, создаем новую директорию и копируем туда Docker файл с описанием контейнера сборки из моего GitHub:
mkdir ~/ocserv && cd ~/ocserv/
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/Dockerfile_build
И запускаем сборку командой (займет некоторое время):
docker build -f Dockerfile_build ./ -t openconnect-build:v1.3
В этой команде с помощью ключа -f явно указывается файла описания сборки, ./ означает использовать текущую директорию как рабочую, а openconnect-build:v1.3 – это имя собираемого образа и его тег (v1.3), по которому мы будем обращаться при сборке конечного образа.
Готово. После завершения проверяем:
docker image ls
Целых 1.4 gb, толстоват😳 Но, как я говорил ранее, это образ сборки. Из него мы далее скопируем только скомпилированные файлы ocserv в итоговый образ.
Создание итогового Docker образа с ocserv 1.3
Вновь копируем из моего GitHub Docker файл с описанием конечного образа + уже ранее упомянутый bash скрипт для запуска ocserv:
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/Dockerfile
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/ocserv.sh
chmod +x ./ocserv.sh
ocserv.sh будет скопирован в образ во время сборки.
И запускаем сборку командой:
docker build -f Dockerfile ./ -t openconnect:v1.3
Обратите внимание, что имя файла сборки и образа с тегом другие.
Готово.
Смотрим список образов:
docker image ls
Разница очевидна.
Запуск ocserv в Docker контейнере
Тестовый запуск можно провести так:
docker run --rm --detach openconnect:v1.3
docker ps
Но рекомендую воспользоваться docker compose:
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/docker-compose.yml
curl -fLO https://raw.githubusercontent.com/r4ven-me/openconnect/main/src/server/v1.3/.env
Заполните файл .env при необходимости и запустите:
docker compose up -d
docker compose ps
А еще лучше изучите ранее упоминаемую статью: Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов.
Заключение
Мне кажется, получился довольно наглядный кейс, как выглядит сборка ПО из исходных кодов. Отмечу, что многое в такой ситуации зависит от документации, которую пишут разработчики. В случае сборки ocserv документация неплоха, но далеко не идеально. Некоторые проблемы заняли у меня довольно много времени. Но с другой стороны, это открытое ПО, и чаще всего, распространяется оно по лицензиям, которые не подразумевают какую-либо гарантию. Это когда ПО, что называется, “поставляется как есть”.
В любом случае для меня это был интересный и безусловно полезный опыт.
Если у вас остались вопросы или есть что обсудить, заглядывайте в наш чат телеги: @r4ven_me_chat. Ну и конечно подписывайтесь на основной канал там же: @r4ven_me – ссылки на все новые посты приходят туда в день публикации. А также там проводятся Linux викторины😉
Спасибо, что читаете. Желаю вам безошибочных сборок из исходников😎
Используемые материалы
- Пишем bash скрипт для подключения к OpenConnect VPN серверу – Вороний блог