Особая разновидность VPN - это SSL VPN, протоколы, работающие с использованием SSL/TLS шифрования и неотличимые от обычного HTTPS-трафика. К ним относятся Microsoft SSTP и CISCO AnyConnect, оба протокола проприетартные, но у последнего есть открытый совместимый аналог - OpenConnect. SSL VPN в первую очередь рассматриваются как средство удаленного доступа, позволяя сотрудникам безопасно работать из любого места, где просто есть доступ в интернет, легко проходя через NAT, прокси и брандмауэры.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
В нашем примере будет рассматриваться установка OpenConnect в среде Debian 11, однако инструкция будет актуальной для любых современных версий Debian или Ubuntu, а также систем на них основанных. Все действия, если не сказано иного, выполняются от имени суперпользователя root или через sudo.
Подготовка сервера и установка OpenConnect
Прежде всего включим маршрутизацию пакетов в системе, чтобы сервер мог передавать их между интерфейсами, для этого в /etc/sysctl.conf найдем и раскомментируем (либо добавим) строку:
net.ipv4.ip_forward = 1
Затем перечитаем настройки командой:
sysctl -p
SSL чувствительна к еще одному важному параметру - совпадении времени между клиентом и сервером, поэтому сразу настроим его синхронизацию с вышестоящими NTP-серверами. Для этого мы будем использовать стандартную службу systemd-timesyncd, откроем конфигурационный файл /etc/systemd/timesyncd.conf, раскомментируем параметр NTP и укажем в нем через пробел сервера времени:
NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
Перезапустим службу:
systemctl restart systemd-timesyncd
И проверим ее статус:
systemctl status systemd-timesyncd
Состояние синхронизации можно проверить командой:
timedatectl
Из вывода первой команды мы можем видеть, что система инициировала синхронизацию с сервером 0.pool.ntp.org, а вторая сообщает, что системные часы синхронизированы, служба NTP активна.
Теперь можно установить сам сервер OpenConnect:
apt update
apt install ocserv
После установки проверяем статус службы:
systemctl status ocserv
В выводе команды нас интересует параметр в строке Loaded следующий после пути к файлу юнита, если там стоит enabled, то автозагрузка службы включена и ничего делать не нужно, в противном случае добавим ее в автозагрузку командой:
systemctl enable ocserv
Дальнейшие действия зависят от того, какой тип сертификата вы решите использовать, мы рекомендуем использовать сертификаты от Let's Encrypt.
Получение сертификатов от Let's Encrypt
Для работы с Let's Encrypt нам понадобится доменное имя. Большинство современных компаний имеют свой сайт, а значит и домен, поэтому создать еще один поддомен для VPN-сервера не составит никакого труда, либо доменное имя можно купить, это недорого, от 199 руб. в зоне RU, при том, что домен всегда пригодиться.
Мы, для примера, будем использовать вымышленное доменное имя ocserv.horns-and-hooves.lab одной небезызвестной вымышленной компании.
Сначала поставим certbot:
apt install certbot
Затем получим бесплатный сертификат для нашего домена:
certbot certonly -d ocserv.horns-and-hooves.lab --standalone
При первом запуске вам потребуется ввести рабочий адрес электронной почты и принять условия использования сервиса. Для успешной работы certbot у вас должен быть открыт порт 80 TCP. Все сертификаты Let's Encrypt выдаются сроком на 90 дней и certbot будет их автоматически продлять, единственное что нам остается сделать, это настроить перезапуск сервера OpenConnect после получения нового сертификата.
Для этого откроем etc/letsencrypt/renewal/ocserv.horns-and-hooves.lab.conf и добавим в секцию [renewalparams] следующую строку:
post_hook = systemctl restart ocserv
Современное SSL/TLS шифрование немыслимо без совершенной прямой секретности - PFS, поэтому создадим файл с параметрами Диффи-Хеллмана:
openssl dhparam -out /etc/ocserv/dh.pem 3072
На этом настройка работы с Let's Encrypt закончена, можно переходить к настройке OpenConnect.
Создание самоподписанного сертификата
Если вы по каким-либо причинам не хотите использовать Let's Encrypt, то можете выпустить самоподписанный сертификат. Вопреки распространенному мнению, самоподписанные сертификаты ни в чем не уступают "настоящим" и за безопасность соедниения можете не беспокоиться. Но для них становится актуальным вопрос доверия, чтобы системы доверяли вашему сертификату вам придется установить на них сертификат вашего CA как доверенный корневой сертификат.
Установим пакет инструментов certtool:
apt install gnutls-bin
Наличие своего CA диктует особые требования по безопасности, закрытый ключ центра сертификации не должен быть доступен третьим лицам, так как при его компрометации компрометируются все выпущенные сертификаты. Поэтому хранить его мы будем в домашней директории root и никто, кроме суперпользователя не будет иметь туда доступ.
Прежде всего изменим маску системы, что автоматически обеспечит нужные права на создаваемые объекты:
umask 077
Затем создадим директорию для хранения файлов СА и перейдем в нее:
mkdir /root/pki
cd /root/pki
Создадим шаблон для корневого сертификата CA:
nano ca.tmpl
И внесем в него следующий текст:
cn = "H&H CA"
organization = "Horns & Hooves Inc"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
В поле cn вводим имя нашего удостоверяющего центра, в поле organization - название организации, expiration_days - срок действия сертификата, в нашем случае 10 лет.
Затем создадим шаблон сертификата сервера:
nano server.tmpl
И внесем в него текст:
cn = "ocserv.horns-and-hooves.lab"
organization = "Horns & Hooves Inc"
serial = 2
expiration_days = 3650
signing_key
encryption_key
tls_www_server
dns_name = "ocserv.horns-and-hooves.lab"
Где cn - имя сервера, указываем доменное имя, organization - название организации, expiration_days - срок действия сертификата, снова 10 лет, dns_name - FQDN сервера и если в cn можно в принципе вписать все что угодно, то в этой опции должно быть именно полное доменное имя сервера, по которому вы будете к нему подключаться.
Если вместо домена вы используете IP-адрес, то замените эту опцию на:
ip_address = "x.x.x.x"
Также можете сочетать обе опции. Хотя использовать IP-адреса в SSL-шифровании считается дурным тоном.
Теперь создадим ключевую пару CA:
certtool --generate-privkey --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --template ca.tmpl --outfile ca.pem
Закрытый ключ ca.key является секретным и никогда не должен покидать пределы этого расположения.
Теперь создадим ключевую пару сервера:
certtool --generate-privkey --outfile server.key
certtool --generate-certificate --load-privkey server.key --load-ca-certificate ca.pem --load-ca-privkey ca.key --template server.tmpl --outfile server.pem
А также файл параметров Диффи-Хеллмана:
certtool --generate-dh-params --outfile dh.pem
Затем скопируем нужные ключи и сертификаты в конфигурационную директорию OpenConnect:
cp ca.pem server.key server.pem dh.pem /etc/ocserv/
Также скопируем корневой сертификат CA в директорию обычного пользователя (в нашем случае это andrey) и сделаем его владельцем файла:
cp ca.pem ~andrey/ca.crt
chown andrey:andrey ~andrey/ca.crt
Затем вернем маску к нормальному состоянию:
umask 022
Самоподписанный сертификат создан, можно переходить к настройке сервера.
Настройка OpenConnect VPN-сервера
OpenConnect предлагает достаточно широкие возможности, но всему свое время, ниже мы рассмотрим самую простую конфигурацию, которую можно использовать для удаленного доступа или выхода в интернет с аутентификацией по логину и паролю. Все настройки сосредоточены в файле /etc/ocserv/ocserv.conf, все опции будут приведены в порядке следования в файле.
Прежде всего закомментируем опцию:
#auth = "pam"
И приведем к следующему виду опцию:
auth = "plain[passwd=/etc/ocserv/ocserv.passwd]"
Этим мы включаем аутентификацию по логину и паролю для пользователей перечисленных в файле ocserv.passwd, вас не должна смущать опция plain, аутентификация производится после установления защищенного SSL-соединения и безопасности данных ничего не угрожает.
Следующие опции задают порты, на которых принимает соединения OpenConnect, можете изменить их, но практического смысла в этом нет, так как SSL VPN должен быть максимально похож на обычный HTTPS, в этих целях можно отключить UDP, но лучше это делать на клиенте.
tcp-port = 443
udp-port = 443
Ниже указываем пути к ключевой паре сервера:
server-cert = /etc/ocserv/server.pem
server-key = /etc/ocserv/server.key
Затем к файлу параметров Диффи-Хеллмана:
dh-params = /etc/ocserv/dh.pem
И к корневому сертификату CA:
ca-cert = /etc/ocserv/ca.pem
Если вы получили сертификат от Let's Encrypt, то измените значение опций на следующие:
server-cert = /etc/letsencrypt/live/ocserv.horns-and-hooves.lab/fullchain.pem
server-key = /etc/letsencrypt/live/ocserv.horns-and-hooves.lab/privkey.pem
Опцию ca-cert следует закомментировать:
#ca-cert
Следующие параметры задают максимальное количество подключений к серверу и количество одновременных подключений с одними и теми же учетными данными, установите их исходя из собственных потребностей:
max-clients = 16
max-same-clients = 2
Затем раскомментируйте опции отвечающие за сжатие трафика:
compression = true
no-compress-limit = 256
А теперь одна из самых интересных опций, отвечающая за предлагаемый клиентам набор шифров, в Debian 11 он выглядит следующим образом:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
В целом настройка нормальная, отключены слабые SSL 3.0 и RC4, включена прямая совершенная секретность (по согласованию), но лучше выставить более современные настройки, отключив все версии SSL и TLS ниже TLS 1.2:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-ALL:+VERS-TLS1.2:-ARCFOUR-128"
Теперь о безопасности, OpenConnect умеет отслеживать попытки подбора паролей и успешно блокировать их, за это отвечают следующие опции:
max-ban-score = 80
ban-reset-time = 300
ban-points-wrong-password = 10
ban-points-connection = 1
Система построена на принципе подсчета очков, за каждый неправильный ввод пароля начисляется сразу 10 очков, это задано опцией ban-points-wrong-password, а при каждом успешном коннекте убирается только одно очко, это задано в опции ban-points-connection, порог, при котором происходит бан и его время задается в max-ban-score и ban-reset-time.
По умолчанию порог в 80 очков, может показаться что это много. Но давайте посмотрим, как работает система: после 8 неудачных попыток входа пользователь будет заблокирован на 5 минут (300 сек), при каждой последующей попытке бан будет снова и снова продлеваться. Чтобы получить шанс на еще один неправильный ввод пароля, после 8 неудачных попыток, потребуется 10 раз успешно аутентифицироваться на сервере.
После этого перейдем к сетевым настройкам, прежде всего зададим диапазон адресов для выдачи клиентам:
ipv4-network = 10.30.1.0/24
Если мы хотим завернуть в туннель все DNS-запросы, то следует указать опции:
tunnel-all-dns = true
dns = 8.8.8.8
dns = 8.8.4.4
Смысл настройки понятен, все запросы будут направлены на серверы, указанные в параметре dns.
Но чаще встречается иная ситуация, когда нужно направить запросы к отдельным DNS-зонам на собственные DNS-сервера, причем зона может быть в несуществующей зоне типа local или office. Тогда конфигурируем DNS иным образом:
dns = 192.168.72.100
dns = 192.168.72.101
split-dns = office.local
Здесь в опции dns мы указываем локальные сервера в сети офиса, а в split-dns - зоны, запросы к которым следует направлять указанным серверам. Каждый параметр можно указывать несколько раз.
Теперь о маршрутизации, OpenConnect умеет передавать на клиента маршрутную информацию. Если мы хотим завернуть весь трафик в туннель укажите:
route = default
Эта опция автоматически активирует:
tunnel-all-dns = true
Вне зависимости от того, что указано в конфиге.
Если же нам нужно обеспечить доступ в сеть за VPN-сервером, то укажем эту сеть в опции:
route = 192.168.72.0/24
Таких опций можно указать несколько, по количеству сетей.
Также интересна опция no-route, она позволяет создать исключение в правилах маршрутизации, скажем вы можете завернуть в туннель все сети 192.168.0.0/16 и исключить оттуда подсеть:
no-route = 192.168.100.0/24
Остальные опции можно оставить без изменения, сохраняем файл конфигурации и перезапускаем службу.
systemctl restart ocserv
Сервер успешно установлен и настроен, можно переходить к созданию пользователей и настройке клиентов. Обратите внимание, что для работы сервера нужно открыть порты 443 TCP и 443 UDP.
Создание пользователей OpenConnect
Для создания клиентов воспользуемся утилитой ocpasswd:
ocpasswd -c /etc/ocserv/ocserv.passwd ivanov
Если файл не существует, то при первом выполнении команды он будет создан.
Для блокировки пользователя используйте:
ocpasswd -c /etc/ocserv/ocserv.passwd -l ivanov
Для разблокировки:
ocpasswd -c /etc/ocserv/ocserv.passwd -u ivanov
Для удаления пользователя выполните команду:
ocpasswd -c /etc/ocserv/ocserv.passwd -d ivanov
Файл с паролями читается динамически, перезапуск сервера после операций с пользователями не нужен.
Настройка клиента OpenConnect в Windows
Если вы используете самоподписанный сертификат, то прежде всего следует скачать с сервера корневой сертификат CA - ca.crt и щелкнув на него два раза установить в хранилище Локальный компьютер - Доверенные корневые центры сертификации.
Затем следует скачать и установить официальный клиент OpenConnect, это не должно вызвать каких-либо затруднений. Запускаем приложение и выпадающем меню напротив поля Server выбираем New Profile.
В поле Gateway прописываем адрес нашего сервера с явным указанием протокола: https://ocserv.horns-and-hooves.lab
Больше никаких настроек не требуется, при подключении потребуется указать только логин и пароль. Просто? Да, при необходимости с подключением справится средней руки пользователь, особенно если снабдить его подробной инструкцией.
При желании можете открыть свойства подключения и установить там дополнительные опции:
Например, вы можете отключить протокол UDP, чтобы совсем никак не отличаться от HTTPS-трафика, либо настроить работу через прокси, при это используются системные настройки прокси-сервера.
Настройка клиента Cisco AnyConnect в Windows
Для самоподписанного сертификата также установите корневой сертификат CA, как это сделать - написано в предыдущем разделе. Затем следует получить и установить клиент Cisco AnyConnect, проще всего это сделать через магазин Windows.
После установки можно открыть одноименное приложение, но особого смысла делать этого нет, при нажатии на кнопку Manage VPN вы попадете в стандартную системную оснастку для управления VPN-подключениями.
Можно сразу пойти туда и создать новое подключение, все что вам необходимо - это выбрать поставщика услуг VPN AnyConnect и указать адрес сервера через https://.
Управление подключением также происходит стандартными инструментами. Это может быть удобнее для пользователей, так как не нужно запускать сторонний клиент. Единственное, что можно посмотреть в родном приложении - это параметры установленного подключения.
При этом никаких дополнительных действий при использовании обоих клиентов делать не нужно, они сами выполняют настройку сетевых параметров клиента, например, прописывают маршруты до указанных сетей. Пользователь может быстро и просто настроить подключение и сразу же начать работу с ресурсами удаленной сети.
Настройка клиента OpenConnect в Linux
И снова начнем с самоподписанного сертификата, будем считать, что он скачан и находится в домашней директории пользователя. Обратите внимание - расширение сертификата обязательно должно быть .crt.
Откроем консоль и повысим права пользователя до root, в Ubuntu это можно сделать командой:
sudo -s
В Debian, если не установлен sudo:
su -
Затем создадим директорию для корневых сертификатов нашего предприятия, название может быть произвольным:
mkdir /usr/share/ca-certificates/H&H
И скопируем в нее сертификат:
cp ~andrey/ca.crt /usr/share/ca-certificates/H&H/ca-ocserv.crt
Где ~andrey означает домашнюю директорию пользователя andrey, также мы переименовали сертификат при копировании, дав ему более понятное имя.
Теперь установим его в хранилище корневых сертификатов:
dpkg-reconfigure ca-certificates
В первом окне укажите что вы доверяете новым сертификатам:
Во втором не забудьте выбрать добавленный нами сертификат:
Если вы используете Let's Encrypt, то производить описанные выше действия не нужно.
Затем установим клиент OpenConnect и плагин для NetworkManager:
apt install network-manager-openconnect-gnome
Точнее мы устанавливаем только плагин, все остальные пакеты, включая клиент, будут установлены по зависимостям.
Теперь можно создать новое подключение средствами NetworkManager.
Все, что вам понадобится указать в настройках - это адрес сервера в поле Шлюз.
Затем вам останется только ввести логин и пароль при подключении, а также, по желанию, установить флаг Save passwords. На красный восклицательный знак и 404 ошибку можете не обращать внимания.
И хотя мы рассматривали в качестве примера Ubuntu, процесс настройки в иных дистрибутивах будет аналогичный, если там используется NetworkManager. Более того, во многих системах, например, Kubuntu, ROSA или Simply Linux плагин для поддержки OpenConnect уже установлен.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии