SSTP-сервер через SoftEther на Debian 12: установка
Если корпоративный или гостиничный Wi-Fi режет всё, кроме порта 443, классический WireGuard или L2TP просто не поднимется — а SSTP, который снаружи выглядит как обычный HTTPS-трафик, пройдёт почти везде. Ниже — как поднять SSTP-сервер на Debian 12 через SoftEther: с настоящим TLS-сертификатом (без него встроенный клиент Windows откажется подключаться), включением протокола через vpncmd и разбором типичных ошибок сертификата и портов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое SSTP и когда он оправдан
SSTP (Secure Socket Tunneling Protocol) — протокол от Microsoft, который упаковывает PPP-кадры внутрь обычной TLS-сессии на порту 443/tcp. Технически это не «VPN поверх HTTPS» в смысле маскировки под чужой трафик, а честный TLS-туннель — но именно поэтому он проходит через файрволы и DPI, которые режут UDP-протоколы (WireGuard, L2TP/IPsec) или блокируют нестандартные TCP-порты. Для приёмных комиссий, гостиничных сетей и офисных прокси SSTP-соединение выглядит как заход на HTTPS-сайт.
Главное практическое преимущество — SSTP встроен в Windows начиная с Vista SP1, никакого стороннего клиента ставить не нужно. Обратная сторона: это протокол Microsoft, нативной поддержки в macOS, iOS и большинстве дистрибутивов Linux нет (на Linux есть сторонний sstp-client, но это уже не «из коробки»). Второй нюанс — SSTP работает поверх TCP, а не UDP, поэтому при потере пакетов возможны просадки скорости и задержки — та же особенность, что у OpenVPN в режиме TCP.
SoftEther хорош тем, что умеет отдавать SSTP, L2TP/IPsec и свой собственный протокол одновременно с одного сервера и одного Virtual Hub — вы не выбираете протокол раз и навсегда, а даёте разным устройствам подключаться так, как им удобнее. Если вам не нужна именно SSTP-совместимость с Windows и вы не упираетесь в блокировку UDP, проще и легче по нагрузке взять WireGuard или обычный L2TP/IPsec без сборки SoftEther из исходников.
Установка SoftEther на Debian 12
В официальных репозиториях Debian 12 пакета SoftEther нет, поэтому единственный надёжный путь — собрать из исходников. Если вы уже проходили этот шаг для L2TP/IPsec на этом же сервере, разверните существующий Virtual Hub заново — просто добавьте к нему SSTP, установка сервера не меняется. Подробный разбор сборки, прав доступа и systemd-юнита — в статье про установку SoftEther VPN на Debian 12; здесь — сжатая версия для самостоятельного старта.
apt update && apt upgrade -y
apt install -y build-essential libssl-dev libreadline-dev \
libncurses5-dev zlib1g-dev wget tar
cd /usr/local/src
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/<версия>/softether-vpnserver-<версия>-linux-x64-64bit.tar.gz
tar xzf softether-vpnserver-*.tar.gz
cd vpnserver
make # дважды подтвердите лицензию клавишей 1
cd ..
mv vpnserver /usr/local/vpnserver
chmod 600 /usr/local/vpnserver/*.key /usr/local/vpnserver/*.crt 2>/dev/null
chmod 700 /usr/local/vpnserver/vpnserver /usr/local/vpnserver/vpncmd
Версию и имя архива уточните на странице релизов SoftEtherVPN/SoftEtherVPN_Stable перед скачиванием — они меняются, а зашитая в мануал ссылка быстро устаревает. Оформите автозапуск через systemd-юнит vpnserver.service (ExecStart=/usr/local/vpnserver/vpnserver start, Type=forking) и включите форвардинг пакетов ядром (net.ipv4.ip_forward=1 в /etc/sysctl.conf) — без этого сервер поднимется, но трафик клиентов никуда не пойдёт.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверДомен и TLS-сертификат — обязательное условие для SSTP
Здесь SSTP принципиально отличается от L2TP/IPsec, где можно обойтись общим ключом (PSK) и самоподписанным сертификатом. Встроенный клиент Windows при SSTP-подключении проверяет цепочку сертификата сервера по системному хранилищу доверенных корневых центров. Самоподписанный сертификат Windows не примет — соединение упадёт с ошибкой недоверенного сертификата, а обходной путь (вручную установить сертификат в «Доверенные корневые центры» на каждом клиенте) на практике неудобен и не масштабируется.
Значит, сначала нужен домен, указывающий на IP сервера — если домена ещё нет, разбор DNS-записей есть в статье про настройку домена на Debian 12. Дальше — сертификат Let's Encrypt через certbot:
apt install -y certbot
certbot certonly --standalone -d vpn.example.com
Режим --standalone требует свободный порт 80 на момент выпуска сертификата — если на этом же сервере крутится веб-сервер, используйте --webroot вместо --standalone. С SoftEther конфликтов по 80-му порту не будет: он слушает 443, а не 80.
Полученный сертификат и ключ нужно передать SoftEther через vpncmd:
/usr/local/vpnserver/vpncmd localhost /SERVER
ServerCertSet /etc/letsencrypt/live/vpn.example.com/fullchain.pem /etc/letsencrypt/live/vpn.example.com/privkey.pem
Синтаксис ServerCertSet в разных сборках vpncmd может незначительно отличаться — если команда не принимает пути напрямую, проверьте актуальный формат через help ServerCertSet в той же консоли. Важный практический момент, который часто упускают: сертификат Let's Encrypt живёт 90 дней, а certbot renew сам по себе не обновит копию внутри SoftEther. Заведите хук-скрипт в /etc/letsencrypt/renewal-hooks/deploy/, который после продления заново прогоняет ServerCertSet через vpncmd — иначе через три месяца SSTP тихо перестанет пускать клиентов с тем же самым «недоверенный сертификат», от которого вы уходили.
Включение SSTP и настройка Hub через vpncmd
Протокол SSTP в SoftEther по умолчанию выключен на уровне сервера. Включается это одной командой в той же консоли vpncmd:
SstpEnable yes
Если Virtual Hub ещё не создан, сделайте его и добавьте пользователя — те же команды, что и для остальных протоколов SoftEther, поскольку SSTP работает через тот же Hub, что L2TP и собственный протокол сервера:
HubCreate MyHub
Hub MyHub
UserCreate sstpuser /GROUP:none /REALNAME:none /NOTE:none
UserPasswordSet sstpuser
Отдельного «SSTP-пользователя» не существует — один и тот же аккаунт в Hub одинаково годится для подключения по L2TP с телефона и по SSTP с ноутбука на Windows, разница только в протоколе, которым клиент стучится на сервер.
Проверьте список HTTPS-листенеров командой ListenerList — SSTP всегда идёт через тот же порт 443, на котором SoftEther отдаёт свой родной протокол и веб-интерфейс администрирования. Если на этом же сервере уже висит nginx или Apache под сайт, они будут конкурировать за 443-й порт с процессом vpnserver, и один из них не запустится. Практичное решение — либо выделить под VPN отдельный IP-адрес сервера и создать под него новый листенер через ListenerCreate, либо развести VPN и веб-сайты по разным машинам.
Подключение с Windows: встроенный клиент и PowerShell
Через интерфейс: «Параметры» → «Сеть и Интернет» → VPN → «Добавить VPN-подключение». Поставщик — «Windows (встроенный)», в поле «Имя или адрес сервера» — тот же домен, что указан в сертификате (не IP-адрес, иначе проверка имени в сертификате не пройдёт), тип VPN — «Secure Socket Tunneling Protocol (SSTP)», тип данных для входа — «Имя пользователя и пароль», и учётные данные из Hub.
Тот же результат через PowerShell, если нужно развернуть подключение массово через политику или скрипт:
Add-VpnConnection -Name "MAATRIX SSTP" `
-ServerAddress "vpn.example.com" `
-TunnelType Sstp `
-EncryptionLevel Required `
-AuthenticationMethod MSChapv2 `
-RememberCredential -AllUserConnection
Адрес сервера должен буквально совпадать с именем в сертификате (Common Name или Subject Alternative Name) — малейшее расхождение, вплоть до www. или другого поддомена, даёт ошибку несовпадения имени, а не «сертификату не доверяют». Для macOS, iOS и Linux нативного SSTP нет — на этих системах логичнее подключать тот же Hub по L2TP/IPsec или через клиент SoftEther, благо один сервер спокойно отдаёт оба варианта одновременно.
Firewall и типичные ошибки SSTP
Хорошая новость по сравнению с L2TP/IPsec — SSTP не нуждается в UDP 500/4500/1701, ему достаточно одного 443/tcp наружу. Если у сервера есть облачный Security Group или отдельный firewall, кроме 443/tcp для VPN ничего открывать не нужно. Логику правил и цепочек для nftables/iptables на Debian 12 разбирали в статье про настройку firewall — принципы применимы и здесь.
Типичные сбои при первом подключении:
- Ошибка 0x800B0109 («сертификату не доверяют»). Почти всегда значит, что
ServerCertSetтак и не подхватил валидный сертификат — сервер всё ещё отдаёт самоподписанный. ПроверьтеServerCertGetвvpncmd, чтобы увидеть, какой сертификат сервер реально использует прямо сейчас. - Ошибка 0x8007232B («имя DNS не совпадает»). Клиент подключался по IP или не по тому домену, что указан в сертификате. Исправляется вводом точного FQDN из сертификата.
- Порт 443 занят,
vpnserverне стартует. Проверьте, кто слушает порт:ss -tulnp | grep 443. Если это чужой процесс (веб-сервер), нужен отдельный IP под VPN-листенер. - Соединение устанавливается и сразу рвётся. Обычно проблема в самом аккаунте — проверьте в
vpncmd, не заблокирован ли пользователь и подходит ли метод аутентификации; в логеsecurity_logна сервере обычно виден точный код причины разрыва. - Корпоративный прокси с deep packet inspection. Если сеть не просто фильтрует порты, а расшифровывает и переподписывает TLS своим корневым сертификатом (типичная практика в жёстко зарегулированных офисах), SSTP тоже может не пройти, несмотря на «честный» HTTPS — это уже не блокировка порта, а перехват содержимого.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
SSTP лучше L2TP/IPsec для обхода блокировок?
Для сетей, которые режут именно UDP или нестандартные порты — да, SSTP проходит там, где L2TP/IPsec не пройдёт, потому что снаружи это неотличимо от захода на HTTPS-сайт. Если ограничений по протоколам в сети нет, разницы для конечного пользователя почти нет, а L2TP проще в настройке сертификата.
Можно подключиться по SSTP с телефона или Linux?
Нативно — только Windows. На Android и iOS штатной поддержки SSTP нет, на Linux есть сторонний sstp-client, но проще завести для этих устройств L2TP/IPsec или клиент SoftEther на том же сервере и Hub.
Подойдёт самоподписанный сертификат вместо Let's Encrypt?
Нет для встроенного клиента Windows — он проверяет цепочку доверия и с самоподписанным сертификатом либо откажется подключаться, либо потребует ручной установки сертификата в доверенные корневые центры на каждом устройстве, что не подходит для сколько-нибудь массового использования.
Что будет через 90 дней, когда сертификат Let's Encrypt истечёт?
Если не настроен deploy-hook, который заново прогоняет ServerCertSet после certbot renew, SoftEther продолжит отдавать старый (уже просроченный) сертификат из своей внутренней копии, и клиенты снова увидят ошибку недоверенного сертификата — обновление файла на диске само по себе SoftEther не подхватывает.
Можно использовать SSTP и другие протоколы SoftEther одновременно?
Да, это и есть смысл SoftEther как многопротокольного сервера — один Virtual Hub и один набор пользователей одинаково обслуживают SSTP-подключения с Windows и L2TP/IPsec-подключения с телефонов без дублирования настройки.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →