Найти тему
Вороний блог | Linux и IT

Собираем OpenConnect (ocserv) версии 1.3 из исходников в Debian 12 + docker образ

Оглавление
Собираем OpenConnect (ocserv) версии 1.3 из исходников в Debian 12 + docker образ
Собираем OpenConnect (ocserv) версии 1.3 из исходников в Debian 12 + docker образ

Приветствую!

По просьбе некоторых подписчиков из нашего вороньего чата, сегодня мы соберем OpenConnect VPN сервер, он же ocserv, последней версии – 1.3, из открытых исходных кодов, в дистрибутиве Debian 12. А также создадим Docker образ на основе того же дистрибутива.

Если вы не в курсе, что это за зверь такой, рекомендую мою другую статью к прочтению: Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов

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

-2

Поехали🙃

-3

Сборка ocserv из исходных кодов

Первым делом, обновляем нашу текущую систему до последней версии такой командой:

sudo apt update && sudo apt upgrade -y
-4

Далее подключаем репозиторий Debian Sid – репозиторий “нестабильных” пакетов дистрибутива, т.к. там находятся нужные нам версии библиотек. После, обязательно обновляем кэш для применения изменений:

echo "deb http://deb.debian.org/debian sid main" | sudo tee -a /etc/apt/sources.list
sudo apt update

-5

Команда 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 будет применять действие по умолчанию. Помните, что вы все делаете на свой риск и ответственность.
-6

После установки всех нужных пакетов, скачиваем архив с исходниками 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, после этого ключа указывается фал архива.
-7

После распаковки переходим в созданную директорию с исходниками и запускаем сборку, а также проверку 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.
-8

В итоге будет выполнен билд почти дефолтной конфигурации:

-9

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

И так сборка завершена, но.. видно 2 провальных теста:

-10
-11
  • haproxy-auth – в ходе изучения пришел к выводу, что проблема в обращении haproxy по адресу 127.0.0.2 во время теста, при сборке в виртуальной машине. Проблема известная и судя по всему ни на что не влияет. Подробнее в ишью в официальном GitLab и сам скрипт теста там же.
  • test-oidc – потому что требует OpenID auth токен для проверки.

Установка и запуск ocserv

Для установки собранных файлов в вашу систему, выполните:

sudo make install
-12

Тут вы увидите, что и куда было установлено/скопировано.

Теперь проверяем:

whereis ocserv
sudo ocserv --version
-13

Обратите внимание, что 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.
-14

Проверка в соседней вкладке:

ss -tulnap | grep 443
curl --insecure https://localhost:443

Утилита ss позволяет просматривать сетевую активность ОС. Параметр --insecure в curl позволяет выполнить запроса с игнорированием предупреждений о самоподписанных SSL сертификатах.
-15

Отлично, все работает. Для выхода нажмите 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
-16

И запускаем сборку командой (займет некоторое время):

docker build -f Dockerfile_build ./ -t openconnect-build:v1.3

В этой команде с помощью ключа -f явно указывается файла описания сборки, ./ означает использовать текущую директорию как рабочую, а openconnect-build:v1.3 – это имя собираемого образа и его тег (v1.3), по которому мы будем обращаться при сборке конечного образа.
-17

Готово. После завершения проверяем:

docker image ls
-18

Целых 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 будет скопирован в образ во время сборки.
-19

И запускаем сборку командой:

docker build -f Dockerfile ./ -t openconnect:v1.3

Обратите внимание, что имя файла сборки и образа с тегом другие.
-20

Готово.

Смотрим список образов:

docker image ls
-21

Разница очевидна.

Запуск ocserv в Docker контейнере

Тестовый запуск можно провести так:

docker run --rm --detach openconnect:v1.3
docker ps
-22

Но рекомендую воспользоваться 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
-23

Заполните файл .env при необходимости и запустите:

docker compose up -d
docker compose ps
-24

А еще лучше изучите ранее упоминаемую статью: Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов.

Заключение

Мне кажется, получился довольно наглядный кейс, как выглядит сборка ПО из исходных кодов. Отмечу, что многое в такой ситуации зависит от документации, которую пишут разработчики. В случае сборки ocserv документация неплоха, но далеко не идеально. Некоторые проблемы заняли у меня довольно много времени. Но с другой стороны, это открытое ПО, и чаще всего, распространяется оно по лицензиям, которые не подразумевают какую-либо гарантию. Это когда ПО, что называется, “поставляется как есть”.

-25

В любом случае для меня это был интересный и безусловно полезный опыт.

Если у вас остались вопросы или есть что обсудить, заглядывайте в наш чат телеги: @r4ven_me_chat. Ну и конечно подписывайтесь на основной канал там же: @r4ven_me – ссылки на все новые посты приходят туда в день публикации. А также там проводятся Linux викторины😉

Спасибо, что читаете. Желаю вам безошибочных сборок из исходников😎

Используемые материалы