Техническая документация

Настройка SSTP и NaiveProxy

Нейтральные к провайдеру примеры для подключения собственного сервера или сторонней точки к MONO VPN. Выберите нужную схему и адаптируйте её под свою инфраструктуру.

SSTP-сервер

SSTP требует публичное имя хоста, TCP 443 или другой доступный TCP-порт, TLS-сертификат, PPP-аутентификацию и IPv4-конфигурацию на сервере. Подойдут развёртывания в стиле RouterOS, SoftEther и Windows RRAS, если они предоставляют совместимый SSTP-сервис.

Пример в стиле RouterOS

/ip pool
add name=your-pool ranges=10.20.30.10-10.20.30.200

/ppp profile
add name=sstp-profile \
    local-address=10.20.30.1 \
    remote-address=your-pool \
    dns-server=1.1.1.1,8.8.8.8 \
    use-encryption=yes

/ppp secret
add name=username password="strong-password" service=sstp profile=sstp-profile

/interface sstp-server server
set enabled=yes \
    port=443 \
    certificate=your-certificate-name \
    authentication=mschap2 \
    default-profile=sstp-profile

Ссылка подключения

sstp://username:strong-password@yourdomain.com:443?name=Office&cc=DE&label=Work
  • По возможности используйте действительный публичный TLS-сертификат.
  • Откройте SSTP TCP-порт в firewall.
  • Создавайте уникальные учётные данные для каждого пользователя или устройства.
  • Пусть PPP-сервер выдаёт IP и DNS-параметры, если это поддерживает ваша схема.
  • Используйте RADIUS или штатные ограничения сервера для срока действия, учёта и лимита одновременных сессий.

Чек-лист диагностики SSTP

СимптомЧто проверить
TLS закрывается сразуЦепочку сертификата, SNI/имя хоста, firewall, неподдерживаемую TLS-политику или прокси перед SSTP.
Ошибка аутентификацииЛогин и пароль, метод PPP-аутентификации, статус аккаунта, срок действия секрета и ответ RADIUS.
Подключено, но трафика нетМаршруты, NAT/masquerade, DNS, правила forward в firewall и серверный IP-пул.
Разрыв при смене сетиПолитику таймаутов сервера и поведение переподключения клиента: при переходе Wi-Fi/мобильная сеть на iOS путь может создаваться заново.

NaiveProxy с Caddy

Распространённая схема NaiveProxy использует Caddy со сборкой, в которую добавлен forward-proxy. Важная часть — аутентифицированный HTTP CONNECT поверх TLS. Точная сборка Caddy и синтаксис плагина могут отличаться, поэтому ниже показан паттерн развёртывания, а не гарантированный copy-paste.

yourdomain.com {
    tls admin@yourdomain.com

    route {
        forward_proxy {
            basic_auth username strong-password
            hide_ip
            hide_via
            probe_resistance
        }

        respond 204
    }
}
naive+https://username:strong-password@yourdomain.com:443?sni=yourdomain.com&name=Office&cc=DE&label=Work

Этот вариант часто выбирают за обычное TLS-завершение на прокси, автоматические сертификаты и простую basic-аутентификацию.

NaiveProxy с sing-box

Другой вариант — запускать sing-box напрямую с Naive inbound. Это удобно, когда один бинарник должен владеть и proxy-listener, и логикой маршрутизации.

{
  "log": { "level": "warn" },
  "inbounds": [
    {
      "type": "naive",
      "tag": "naive-in",
      "listen": "0.0.0.0",
      "listen_port": 443,
      "users": [
        { "username": "username", "password": "strong-password" }
      ],
      "tls": {
        "enabled": true,
        "server_name": "yourdomain.com",
        "certificate_path": "/etc/letsencrypt/live/yourdomain.com/fullchain.pem",
        "key_path": "/etc/letsencrypt/live/yourdomain.com/privkey.pem"
      }
    }
  ],
  "outbounds": [
    { "type": "direct", "tag": "direct" }
  ],
  "route": { "final": "direct" }
}
[Unit]
Description=sing-box naive proxy
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=3
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

UDP-over-TCP для NaiveProxy

NaiveProxy в основном ориентирован на TCP. Если пользователям нужен UDP-подобный трафик через Naive-профиль, MONO VPN может направлять UDP-потоки на отдельный Naive TCP-listener. Добавьте uot в ссылку и запустите совместимый listener на этом порту.

naive+https://username:strong-password@yourdomain.com:443?sni=yourdomain.com&uot=8443
{
  "log": { "level": "warn" },
  "inbounds": [
    {
      "type": "naive",
      "tag": "naive-uot-in",
      "listen": "0.0.0.0",
      "listen_port": 8443,
      "users": [
        { "username": "username", "password": "strong-password" }
      ],
      "tls": {
        "enabled": true,
        "server_name": "yourdomain.com",
        "certificate_path": "/etc/letsencrypt/live/yourdomain.com/fullchain.pem",
        "key_path": "/etc/letsencrypt/live/yourdomain.com/privkey.pem"
      }
    }
  ],
  "outbounds": [
    { "type": "direct", "tag": "direct" }
  ],
  "route": { "final": "direct" }
}

Открывайте UoT TCP-порт только при использовании этого режима. Если uot отсутствует, MONO VPN использует обычную NaiveProxy-ветку для TCP-трафика и дополнительный listener не нужен.

Безопасность и эксплуатация

  • Не публикуйте реальные пароли, root-учётные данные и долгоживущие общие ключи.
  • Выдавайте уникальные учётные данные каждому пользователю или устройству.
  • Отзывайте и ротируйте данные, когда пользователь уходит, ссылка утекла или срок доступа закончился.
  • Обновляйте Caddy, sing-box, RouterOS, SoftEther или выбранный стек VPN.
  • Ограничивайте management-порты по IP-источникам и отделяйте администрирование от VPN/proxy-портов.
ufw allow 443/tcp
ufw allow 443/udp
ufw allow 8443/tcp

Открывайте только порты, которые соответствуют вашей схеме. UDP 443 опционален и зависит от использования QUIC/HTTP3. TCP 8443 нужен только для примера с UDP-over-TCP.