MAATRIX / Блог / SoftEther VPN на AlmaLinux 9: пошаговая установка

SoftEther VPN на AlmaLinux 9: пошаговая установка

MAATRIX

SoftEther — один из немногих VPN-серверов, который умеет говорить сразу на нескольких протоколах: собственный SoftEther-протокол, L2TP/IPsec, SSTP, OpenVPN-клон и даже маскировка под HTTPS на 443 порту. В официальных репозиториях AlmaLinux 9 готового пакета нет, поэтому ставить придётся из исходников. Ниже — весь путь: зависимости для сборки, компиляция, systemd-юнит, настройка через vpncmd и открытие портов в firewalld.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Зачем SoftEther и когда он оправдан на AlmaLinux 9

SoftEther разрабатывался в Университете Цукуба как альтернатива дорогим корпоративным VPN-шлюзам, и до сих пор это, по сути, единый сервер, который закрывает сразу несколько сценариев. Один процесс vpnserver умеет одновременно поднимать:

  • нативный протокол SoftEther (TCP, с автоматическим определением порта, вплоть до маскировки под HTTPS на 443);
  • L2TP/IPsec — для встроенных клиентов iOS, Android и Windows без установки дополнительного софта;
  • SSTP — для Windows-клиентов через штатный «VPN» в настройках системы;
  • OpenVPN-совместимый режим — можно раздавать обычные .ovpn-профили тем, у кого уже настроен клиент OpenVPN.

Для сравнения с более узкоспециализированными решениями стоит заранее понимать компромиссы: если нужен максимально простой и быстрый туннель между двумя точками, часто разумнее взять WireGuard или OpenVPN — сравнение WireGuard и OpenVPN поможет определиться. SoftEther оправдан, когда нужна гибкость: один сервер, разные протоколы под разных клиентов, и админ-панель для управления пользователями без ручной правки конфигов.

AlmaLinux 9 в этой связке даёт предсказуемую базу — SELinux в enforcing по умолчанию, firewalld как единая точка управления портами, длинный цикл поддержки. Это удобно для сервера, который должен работать месяцами без пересборки.

Подготовка сервера и зависимости сборки

Начните с обновления системы и установки набора инструментов разработки — без него cmake и make работать не будут:

sudo dnf update -y
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y gcc gcc-c++ make cmake git \
    openssl-devel zlib-devel readline-devel ncurses-devel \
    libsodium-devel kernel-headers kernel-devel

Проверьте, что модуль tun доступен — SoftEther использует виртуальные сетевые интерфейсы через /dev/net/tun, как и большинство VPN-серверов:

ls -l /dev/net/tun
lsmod | grep tun || sudo modprobe tun

Если сервер — виртуальная машина на стороннем гипервизоре, отсутствие /dev/net/tun — частая причина отказа: попросите провайдера включить проброс TUN/TAP для вашего инстанса, это делается на стороне гипервизора, а не внутри гостевой ОС.

Заодно включите постоянную маршрутизацию пакетов — она понадобится, когда SoftEther начнёт раздавать клиентам доступ в интернет:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-softether.conf
sudo sysctl -p /etc/sysctl.d/99-softether.conf

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Скачивание исходников и сборка

Официальный способ сборки — клонирование репозитория SoftEtherVPN с GitHub с подмодулями (в них лежат зависимые библиотеки вроде mbedTLS-совместимого кода):

cd /usr/local/src
sudo git clone --recursive https://github.com/SoftEtherVPN/SoftEtherVPN.git
cd SoftEtherVPN
sudo ./configure

configure проверит наличие cmake и попросит принять лицензионное соглашение (GPLv2 плюс отдельные условия для криптографических компонентов) — прочитайте его перед тем, как соглашаться, это не формальность: SoftEther исторически подписывал отдельное согласие на экспортные ограничения по шифрованию. После согласия он сгенерирует проект сборки в каталоге build:

sudo make -C build -j"$(nproc)"

Время сборки сильно зависит от процессора хоста, ориентироваться на цифры из чужих статей не стоит. По завершении бинарники появятся в ./bin/:

ls bin/vpnserver/
# vpnserver  vpncmd  hamcore.se2  ...

Если сборка падает на этапе линковки с ошибками вокруг OpenSSL, проверьте версию через openssl version — актуальные ветки SoftEther поддерживают OpenSSL 3.x, который идёт в AlmaLinux 9 из коробки, но старые форки исходников на это не рассчитаны. Берите код именно из официального репозитория, а не из архивных тарболов пятилетней давности.

Установка бинарников и systemd-сервис

Перенесите собранный каталог vpnserver в стандартное расположение и выставьте права строго 600 на исполняемые файлы — SoftEther при старте сам проверяет права доступа и откажется запускаться, если файлы доступны на запись кому-то, кроме владельца:

sudo mkdir -p /usr/local/vpnserver
sudo cp -r /usr/local/src/SoftEtherVPN/bin/vpnserver/* /usr/local/vpnserver/
sudo chmod 600 /usr/local/vpnserver/*
sudo chmod 700 /usr/local/vpnserver
sudo chmod +x /usr/local/vpnserver/vpnserver /usr/local/vpnserver/vpncmd

SELinux на AlmaLinux 9 не знает о каталоге /usr/local/vpnserver и по умолчанию может блокировать запуск процесса как демона. Проверить это можно после первого запуска через ausearch:

sudo ausearch -m avc -ts recent

Если видите записи denied, самый аккуратный вариант — не отключать SELinux целиком, а промаркировать бинарник подходящим типом и восстановить контекст:

sudo semanage fcontext -a -t bin_t "/usr/local/vpnserver/vpnserver"
sudo restorecon -v /usr/local/vpnserver/vpnserver

Пакет semanage может отсутствовать — доустановите policycoreutils-python-utils.

Создайте systemd-юнит:

sudo tee /etc/systemd/system/softether-vpnserver.service > /dev/null <<'EOF'
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now softether-vpnserver
sudo systemctl status softether-vpnserver

Статус active (running) подтверждает, что демон поднялся и слушает управляющий порт (по умолчанию TCP 5555 для локального vpncmd, если явно не переопределили).

Настройка через vpncmd: HUB, протоколы, пользователи

Всё дальнейшее управление идёт через консольную утилиту vpncmd. Подключитесь к локальному серверу:

cd /usr/local/vpnserver
sudo ./vpncmd localhost /SERVER

При первом входе задайте пароль администратора и создайте виртуальный HUB (это логическая группа, объединяющая пользователей и настройки одного VPN):

ServerPasswordSet
HubCreate VPN_HUB
Hub VPN_HUB

Внутри выбранного HUB включите нужные протоколы. Для L2TP/IPsec с преднастроенным ключом (годится для встроенных клиентов iOS/Android/Windows без установки софта):

IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /PSK:ВашСложныйКлюч /DEFAULTHUB:VPN_HUB

Для SSTP и OpenVPN-совместимого режима, а также для маскировки нативного протокола под HTTPS:

SstpEnable yes
OpenVpnEnable yes /PORTS:1194
ServerCertRegenerate mydomain.example.com

Выдачей адресов клиентам и NAT можно управлять либо через встроенный SecureNAT (виртуальный DHCP + NAT внутри HUB, проще всего для одиночного VPN-шлюза), либо через мост на физический интерфейс, если нужен полноценный L2-доступ в локальную сеть за сервером:

Hub VPN_HUB
SecureNatEnable

Создайте пользователя и назначьте пароль:

Hub VPN_HUB
UserCreate ivan /GROUP:none /REALNAME:none /NOTE:none
UserPasswordSet ivan

Выйдите командой exit. На этом сервер готов принимать подключения — осталось открыть порты снаружи.

Настройка firewalld

AlmaLinux 9 использует firewalld как фронтенд к nftables, и по умолчанию все порты, кроме SSH, закрыты. Откройте то, что реально включили на предыдущем шаге — не открывайте лишнее:

ПротоколПортыНазначение
L2TP/IPsec500/udp, 4500/udpIKE и NAT-T
SSTP443/tcpHTTPS-маскировка
OpenVPN-клон1194/udpесли включили OpenVpnEnable
Управление vpncmd (удалённо)5555/tcpтолько если админите не локально
sudo firewall-cmd --permanent --add-port=500/udp
sudo firewall-cmd --permanent --add-port=4500/udp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=1194/udp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Если планируете администрировать сервер удалённым vpncmd (лучше ходить через SSH-туннель), добавьте 5555/tcp и ограничьте доступ конкретными IP через rich rule, а не открывайте порт всему интернету. Общий подход к настройке firewalld на AlmaLinux 9, включая зоны и rich rules, разобран отдельно — см. настройку файрвола на AlmaLinux 9. Если сервер используется ещё и для SSH-доступа, стоит закрыть его по паролю и перейти на ключи — см. статью про подключение по SSH-ключу.

Не забудьте про SecureNAT: если включили его вместо моста, отдельного правила masquerade в firewalld добавлять не нужно — SoftEther делает NAT сам внутри пользовательского пространства, в обход firewalld. Это удобно, но и означает, что трафик клиентов не виден стандартным правилам зоны — логируйте его на уровне самого SoftEther, если нужен аудит.

Проверка подключения и типичные проблемы

Подключите тестового клиента. Проще всего проверить L2TP/IPsec встроенными средствами телефона или Windows: адрес сервера, ваш PSK-ключ, логин и пароль пользователя, созданного через vpncmd. Для нативного протокола или OpenVPN-клона удобнее клиент SoftEther VPN Client или обычный OpenVPN-клиент с .ovpn-профилем, который экспортируется через vpncmd командой AccountExport на стороне клиента после первичной настройки подключения.

Частые причины, по которым подключение не поднимается:

  • SELinux блокирует процесс. Проверяется через ausearch -m avc -ts recent, чаще всего требует restorecon на бинарник или каталог, как описано выше — отключать SELinux полностью не стоит, это решение временное и небезопасное для продакшена.
  • Строгие права на файлы конфигурации. vpn_server.config должен принадлежать root с правами 600 — если вы редактировали файл вручную и изменили владельца, сервис откажется стартовать или проигнорирует изменения.
  • Двойной NAT у клиента. IPsec NAT-T (порт 4500) обычно спасает ситуацию, но за особо жёсткими корпоративными или мобильными NAT иногда не проходит — тогда выручает нативный SoftEther-протокол на 443, который меньше зависит от особенностей NAT.
  • Провайдер режет протокол 50 (ESP). Для чистого IPsec без NAT-T это критично; NAT-T инкапсулирует ESP в UDP 4500 и обычно решает проблему без дополнительных настроек.
  • Забытое правило firewalld. После любых изменений в наборе включённых протоколов не забывайте синхронизировать список открытых портов — сервер и firewalld настраиваются независимо друг от друга.

Если ставите SoftEther поверх ещё не защищённой системы, сначала пройдите базовые шаги — они описаны в статье про базовую защиту AlmaLinux 9 от взлома. SoftEther открывает наружу несколько новых портов, и поверхность атаки сервера растёт — это стоит учитывать при выборе PSK-ключа и политики паролей в UserCreate.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Нужен ли отдельный модуль TUN/TAP или его нужно собирать вручную?

Нет, TUN/TAP в ядре AlmaLinux 9 присутствует по умолчанию, отдельная сборка не требуется — достаточно убедиться, что /dev/net/tun доступен и модуль tun загружен.

Есть ли готовые RPM-пакеты SoftEther для AlmaLinux 9, чтобы не собирать из исходников?

В официальных и стандартных сторонних репозиториях для RHEL-совместимых систем актуального пакета нет — сборка из исходников через git clone --recursive и cmake остаётся официально поддерживаемым способом.

Какой протокол включать: SoftEther native, L2TP/IPsec, SSTP или OpenVPN-клон?

Зависит от клиентов. Для мобильных устройств без установки софта — L2TP/IPsec. Для обхода блокировок нестандартных портов — нативный SoftEther на 443 или SSTP. Если у пользователей уже настроен OpenVPN-клиент — OpenVPN-клон избавляет от установки нового софта.

Безопасно ли использовать SecureNAT в продакшене, или лучше настраивать мост на физический интерфейс?

SecureNAT достаточно надёжен для типового сценария «VPN как выход в интернет» и проще в настройке. Мост на физический интерфейс нужен только если клиентам требуется L2-доступ в локальную сеть за сервером — это отдельный уровень сложности с рисками для сетевой изоляции.

Обязательно ли отключать SELinux, если после установки процесс не стартует?

Нет, и делать это не стоит. Правильный путь — найти конкретный AVC-запрет через ausearch и точечно промаркировать нужный файл или каталог типом bin_t через semanage fcontext и restorecon.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →