Установка из исходников OpenConnect VPN-сервера (ocserv) на Debian 11 Bullseye

Разберем как установить из исходников актуальную (на момент написания статьи) версию VPN-сервера OpenConnect 1.2.2 на Debian 11 Bullseye.

 

# Все ниже действия будут производится из под root.

 

# Обновляем информацию о репозиториях и обновляем установленные пакеты:

apt-get update && apt-get upgrade -y

# Устанавливаем необходимые зависимости:

apt-get install build-essential make pkg-config libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev libpcl1-dev libcjose-dev libjansson-dev liboath-dev libprotobuf-c-dev libtalloc-dev libhttp-parser-dev libcurlpp-dev libssl-dev libmaxminddb-dev libbsd-dev libsystemd-dev libwrap0-dev libuid-wrapper libpam-wrapper libnss-wrapper libsocket-wrapper gss-ntlmssp tcpdump protobuf-c-compiler iperf3 lcov ssl-cert libpam-oath

 

# Скачиваем и распаковываем исходники OpenConnect (на момент написания статьи последняя версия 1.2.2):

wget -P /opt/ https://www.infradead.org/ocserv/download/ocserv-1.2.2.tar.xz
tar -xvf /opt/ocserv-1.2.2.tar.xz -C /opt/ 

cd /opt/ocserv-1.2.2

# Собираем и устанавливаем — OpenConnect:

./configure --prefix= --enable-oidc-auth

make && make install

 

# Создаем рабочий каталог для ocserv и копируем примеры файлов конфигурации в него:

mkdir -p /etc/ocserv/

cp doc/sample.config /etc/ocserv/ocserv.conf
cp doc/sample.passwd /etc/ocserv/
cp doc/sample.otp /etc/ocserv/
cp doc/profile.xml /etc/ocserv/

 

# Создаем пользователя ocserv от которого будет работать служба:

useradd -r -M -U -s /usr/sbin/nologin ocserv

 

# Приводим файл конфигурации /etc/ocserv/ocserv.conf к дефолтным значениям:

sed -i 's/auth = "plain\[passwd=\.\/sample\.passwd\]"/#&/' /etc/ocserv/ocserv.conf
sed -i 's/^#auth = "pam\[gid-min=1000\]"/auth = "pam[gid-min=1000]"/' /etc/ocserv/ocserv.conf

sed -i 's/run-as-user = nobody/run-as-user = ocserv/g' /etc/ocserv/ocserv.conf
sed -i 's/run-as-group = daemon/run-as-group = ocserv/g' /etc/ocserv/ocserv.conf

sed -i 's#server-cert = \.\./tests/certs/server-cert\.pem#server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem#' /etc/ocserv/ocserv.conf
sed -i 's#server-key = \.\./tests/certs/server-key\.pem#server-key = /etc/ssl/private/ssl-cert-snakeoil.key#' /etc/ocserv/ocserv.conf
sed -i 's#ca-cert = \.\./tests/certs/ca\.pem#ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem#' /etc/ocserv/ocserv.conf

sed -i '747,$s/^/# /' /etc/ocserv/ocserv.conf

 

# Добавим модуль аутентификации (PAM) для ocserv:

cat << EOF > /etc/pam.d/ocserv
#
# /etc/pam.d/ocserv - specify the PAM behaviour of ocserv
#

# Standard Un*x authentication.
@include common-auth

# Disallow non-root logins when /etc/nologin exists.
account       required     pam_nologin.so

# Uncomment and edit /etc/security/access.conf if you need to set complex
# access limits.
# account  required     pam_access.so

# Standard Un*x authorization.
@include common-account

# SELinux needs to be the first session rule. This ensures that any
# lingering context has been cleared. Without out this it is possible
# that a module could execute code in the wrong domain.
session    [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close

# Standard Un*x session setup and teardown.
@include common-session

# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session    [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

@include common-password
EOF

 

# Копируем файл сервиса ocserv.service в системную библиотеку и добавим сервис в автозагрузку:

cp doc/systemd/standalone/ocserv.service /lib/systemd/system/

systemctl daemon-reload
systemctl enable ocserv.service

# Создадим init скрипт для запуска ocserv:

cat << EOF > /etc/init.d/ocserv
#! /bin/sh
### BEGIN INIT INFO
# Provides:             ocserv
# Required-Start:       $remote_fs $syslog dbus
# Required-Stop:        $remote_fs $syslog dbus
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    OpenConnect SSL VPN server
# Description:          secure, small, fast and configurable OpenConnect SSL VPN server
### END INIT INFO
set -e

NAME=ocserv
DESC="OpenConnect SSL VPN server"

DAEMON=/usr/sbin/ocserv
DAEMON_CONFIG=/etc/${NAME}/${NAME}.conf
DAEMON_PIDFILE=/run/${NAME}.pid
DAEMON_ARGS="--pid-file $DAEMON_PIDFILE --config $DAEMON_CONFIG"

test -x $DAEMON || exit 0

umask 022

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

daemon_start()
{
    if [ ! -s "$DAEMON_CONFIG" ]; then
        log_failure_msg "please create ${DAEMON_CONFIG}, not starting..."
        log_end_msg 1
        exit 0
    fi
    log_daemon_msg "Starting $DESC" "$NAME" || true
    if start-stop-daemon --start --quiet --oknodo --pidfile $DAEMON_PIDFILE --exec $DAEMON -- $DAEMON_ARGS ; then
        log_end_msg 0 || true
    else
        log_end_msg 1 || true
    fi
}

case "$1" in
  start)
    daemon_start
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME" || true
    if start-stop-daemon --stop --quiet --oknodo --pidfile $DAEMON_PIDFILE; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;

  reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME" || true
        if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $DAEMON_PIDFILE --exec $DAEMON; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;

  restart)
        log_daemon_msg "Restarting $DESC" "$NAME" || true
        start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $DAEMON_PIDFILE
        daemon_start
        ;;

  try-restart)
        log_daemon_msg "Restarting $DESC" "$NAME" || true
        RET=0
        start-stop-daemon --stop --quiet --retry 30 --pidfile $DAEMON_PIDFILE || RET="$?"
        case $RET in
            0)
                # old daemon stopped
                daemon_start
                ;;
            1)
                # daemon not running
                log_progress_msg "(not running)" || true
                log_end_msg 0 || true
                ;;
            *)
                # failed to stop
                log_progress_msg "(failed to stop)" || true
                log_end_msg 1 || true
                ;;
        esac
        ;;

  status)
        status_of_proc -p $DAEMON_PIDFILE $DAEMON $NAME && exit 0 || exit $?
        ;;

  *)
        log_action_msg "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|try-restart|status}" || true
        exit 1
esac

exit 0
EOF

# Делаем скрипт исполняемым и запускаем сервис ocserv:

chmod +x /etc/init.d/ocserv

/etc/init.d/ocserv start
/etc/init.d/ocserv status

 

# Вывод работающего сервиса ocserv:

Starting ocserv (via systemctl): ocserv.service.
● ocserv.service - OpenConnect SSL VPN server
     Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-10-13 09:49:04 MSK; 28ms ago
       Docs: man:ocserv(8)
   Main PID: 24725 (ocserv-main)
      Tasks: 2 (limit: 2280)
     Memory: 2.4M
        CPU: 10ms
     CGroup: /system.slice/ocserv.service
             ├─24725 ocserv-main
             └─24729 ocserv-sm

окт 13 09:49:04 deb10 ocserv[24725]: ocserv[24725]: main: initializing control unix socket: /var/run/occtl.socket
окт 13 09:49:04 deb10 ocserv[24725]: main: initializing control unix socket: /var/run/occtl.socket
окт 13 09:49:04 deb10 ocserv[24725]: ocserv[24725]: main: initialized ocserv 1.2.2
окт 13 09:49:04 deb10 ocserv[24725]: main: initialized ocserv 1.2.2
окт 13 09:49:04 deb10 ocserv[24729]: ocserv[24729]: sec-mod: reading supplemental config from files
окт 13 09:49:04 deb10 ocserv[24729]: sec-mod: reading supplemental config from files
окт 13 09:49:04 deb10 ocserv[24729]: ocserv[24729]: sec-mod: loaded 1 keys
окт 13 09:49:04 deb10 ocserv[24729]: sec-mod: loaded 1 keys
окт 13 09:49:04 deb10 ocserv[24729]: ocserv[24729]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.75fb90ca.0)
окт 13 09:49:04 deb10 ocserv[24729]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.75fb90ca.0)

 

Выведем информацию об установленной версии ocserv:

ocserv -v

ocserv 1.2.2

Compiled with: seccomp, tcp-wrappers, oath, radius, gssapi, PAM, PKCS#11, AnyConnect, oidc_auth
GnuTLS version: 3.7.1

 

Логи сервиса ocserv пишутся в /var/log/syslog, для удобного просмотра их в tail режиме воспользуемся командой:

journalctl -f -u ocserv

 

Можно провести тестовое подключение к поднятому VPN-серверу, к примеру через Cisco AnyConnect (OpenConnect прекрасно с ним работает). В дефолтной конфигурации авторизация на VPN-сервере через локальные учетные записи. В случае если все сделали правильно, то авторизация будет успешной.

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА

БесполезноСлабоватоПриемлемоОтличноПревосходно (1 голос(ов), в среднем: 5,00 из 5)
Загрузка...

Всего комментариев: 25 Комментировать

  1. Anonymous /

    Рад что ты жив!

    1. Жаконда / Автор записи

      Спасибо) Конечно я жив)

  2. Роман /

    «systemctl deamon reload»
    может так:
    «systemctl daemon-reload»

    1. Жаконда / Автор записи

      Да, верно, опечатался, тире забыл. Исправил. Спасибо за наблюдение.

  3. Роман /

    Подскажи, почему выдает ошибку после запуска /etc/init.d/ocserv status:
    «gnutls error (at worker-vpn.c888) error in the pull function»

  4. Роман /

    Заработало!
    Проверил параметры:
    /etc/sysctl.conf:
    «net.ipv4.ip_forward = 1»
    /etc/systemd/timesyncd.conf:
    «NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org»
    и перезапуск: «systemctl restart systemd-timesyncd»
    открыл фаервол:
    «ufw allow 80,443/tcp»

    1. Роман /

      К сожалению нет, ошибка опять полезла в логах.
      Может есть еще какие то варианты?

      1. Жаконда / Автор записи

        Точно все по статье делал ? На какой системе ставил ? gnutls в системе пакет установлен ? Для Debian должен быть обязательно установлен — libgnutls28-dev

  5. Роман /

    Ubuntu 20.4
    ocserv 1.2.3
    GnuTLS 3.6.13
    libgnutls28-dev установлен.

    1. Жаконда / Автор записи

      На убунту не тестировал, все делал на Debian 11. Что то в настройках TLS смотрите. Сертификаты указанные в настройках ocserv существуют ?

  6. Роман /

    Да подключение происходит норм, не падает. пинги до сервера бегают. Тока ошибка в логах постоянно эта выходит

  7. Роман /

    Хмм. Перезагрузил еще раз, пропала ошибка. Спасибо.

    1. Жаконда / Автор записи

      Да не за что 🙂

  8. Dmitry /

    Добрый день! поднял openconnect для жены, что бы она могла в инстогрмм лазать, но вот незадача, почмеу-то вылезает HTTP ERROR 429 при попытки войти в instagramm.com как это можно решить?

    1. Жаконда / Автор записи

      Смотрите какой трафик перенаправляется в VPN тунель, а вообще да этих целей лучше поднять WireGuard, я так себе и сделал. На мобильнике очень удобно, да и на ПК.
      Чуть позже напишу статью как это все развернуть, может будет полезно.

      1. Павел /

        Так РКН лочит WireGuard и т.д. (( Ваша статья как нельзя к месту ) Спасибо за труд !

        1. Жаконда / Автор записи

          хз что у вас там лочит, у меня все пашет))
          Спасибо, приятно осознавать что оказываешься полезен кому то!

          1. Dmitry /

            Да вот сюда(openconnect) и полез, т.к. WG поломали 15ого числа. ну может shadowsock только если к нему прикручивать

  9. dmitry /

    но вот засада с в openconnect именно с instagramm, всё остальное работае. как поправить так и не понял.

  10. Жаконда / Автор записи

    А вы весь трафик через OpenConnect заворачиваете ? или частично ?

  11. Ivan /

    Добрый день, у меня на Debian ругается на отсутствие ocserv в /usr/sbin. Он при сборке туда сам положиться должен или как? Версия 1.2.4.

    1. Жаконда / Автор записи

      Добрый день,
      Вы при конфигурировании так указывали — ./configure --prefix= --enable-oidc-auth ?
      Он туда должен положится при установке а не при сборке/компилияции.

  12. Roman /

    Я совсем что-то не понимаю, как прописать директивы route и no-route
    Есть внутренние подсети и есть весь остальной интернет
    Можно как-то прописать, чтобы весь трафик, кроме внутренних подсетей, шел через vpn?
    Сначала подумал можно прописать route = default, но при это перестаёт резолвиться совсем всё

    1. кекс /

      если route нет то весь траффик перенаправляется. или route = default и просто добавь no route = внутреннии сети

      ***вы совсем уже с такой капчей***

      1. Жаконда / Автор записи

        Без нее, просто неимоверное количество спам комментариаев шарашит..

Оставить ответ

12 + пятнадцать =

© IT-блог Жаконды All Rights Reserved.
Яндекс.Метрика