Разберем как установить из исходников актуальную (на момент написания статьи) версию 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 deamon 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-сервере через локальные учетные записи. В случае если все сделали правильно, то авторизация будет успешной.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА ДОНАТОМ