Подписка VPN не обновляется обычно означает не одну ошибку, а сбой в цепочке: клиент должен скачать документ по subscription URL, разобрать его как конфигурацию и заменить локальную копию профиля. Если ссылка не отвечает, возвращает HTTP-ошибку, отдает HTML вместо конфига, требует авторизацию или приходит в неподходящем формате, приложение покажет старые узлы, пустой список или сообщение вроде update failed, failed to fetch subscription, invalid config.
Диагностику лучше начинать с простого вопроса: клиент смог получить свежий документ подписки или нет? Если не смог, проверяем URL, сеть, HTTP-статус, срок действия и доступ. Если смог, проверяем формат ответа, кэш, активный профиль и версию клиента.
#Что делает клиент при обновлении
При refresh клиент выполняет обычный HTTP-запрос к URL подписки. Успешный сценарий выглядит так: сервер отвечает статусом 200, тело ответа содержит конфигурацию, клиент определяет формат, сохраняет локальную копию и применяет ее к выбранному профилю. В зависимости от клиента это может быть Clash/mihomo YAML, V2RayN/base64, список строк vless://, JSON для sing-box или другой заявленный контейнер.
Поэтому одна и та же жалоба может иметь разные причины: URL не скачивается, скачивается страница ошибки, скачивается правильный документ в неправильный тип профиля, либо клиент успешно обновил не тот профиль.
#Быстрая развилка
| Симптом | Вероятная причина | Первое действие |
|---|---|---|
| Ошибка сразу после refresh | URL, DNS, TLS, HTTP, сеть | Откройте ссылку в браузере из той же сети |
| В браузере 401 или 403 | Авторизация, лимит, отозванный токен | Проверьте срок действия ссылки и статус аккаунта |
| В браузере 404 или 410 | Ссылка удалена, путь изменился, токен больше не существует | Получите новую subscription URL у источника |
| Скачивается HTML | Редирект на login, CDN challenge, заглушка ошибки | Проверьте конечный URL и первые строки ответа |
| Код 200, но узлов нет | Пустой профиль, лимит, неверный формат | Сверьте формат с типом клиента |
| После обновления видны старые серверы | Кэш или неактивный профиль | Проверьте timestamp, active profile и дубли |
От теории к подключению
От понимания к подключению
Если вы уже разобрались, зачем нужен VPN, можно получить данные для подключения и настроить доступ по инструкции.
#HTTP-ошибки subscription URL
HTTP-статус показывает, как сервер подписок ответил на запрос. Это не то же самое, что ошибка подключения к отдельному VPN-узлу: узел может быть рабочим, а ссылка подписки уже недоступна.
| Код | Что значит | Что делать |
|---|---|---|
200 OK | Документ скачан. Дальше ищите проблему в содержимом, формате или кэше. | Посмотрите первые строки ответа и тип документа. |
301/302/307/308 | Ссылка перенаправляет на другой адрес. Не все клиенты корректно следуют редиректам. | Проверьте через curl -L, куда ведет запрос. |
400 Bad Request | URL испорчен: обрезан токен, добавлен пробел, лишняя кавычка или сломан query string. | Скопируйте ссылку заново целиком. |
401 Unauthorized | Сервер требует действительные учетные данные или токен. | Получите новую ссылку, проверьте авторизацию и срок действия. |
403 Forbidden | Доступ запрещен: лимит устройств, IP-политика, исчерпанный трафик, заблокированный User-Agent. | Проверьте лимиты, аккаунт и доступ из другой сети. |
404 Not Found | По этому пути нет ресурса. Иногда сервер маскирует запрещенную ссылку как 404. | Не правьте URL вручную, сгенерируйте новый. |
410 Gone | Ресурс удален окончательно или ссылка отозвана. | Удалите старый профиль и добавьте свежую ссылку. |
429 Too Many Requests | Слишком частые обновления или антиабуз-ограничение. | Подождите, отключите частый auto-update, не нажимайте refresh подряд. |
500/502/503/504 | Сбой сервера, gateway, CDN или панели генерации подписок. | Повторите позже и сравните с другой сетью; переустановка клиента обычно не поможет. |
Could not resolve host, connection timed out и TLS handshake failed появляются до HTTP-ответа. Это зона DNS, маршрута, сертификата, времени на устройстве или сетевой блокировки.#Кэш и старые профили
Кэш бывает локальным и сетевым. Локальный кэш хранит последнюю успешную копию подписки в приложении. Сетевой HTTP-кэш может находиться на CDN, proxy или стороне сервера и отдавать устаревший документ, если заголовки кэширования настроены неудачно. В обоих случаях пользователь видит старый список и думает, что refresh сработал.
- Проверьте активный профиль. Обновление одного remote-профиля не меняет маршрут, если выбран другой профиль.
- Смотрите время обновления. Если клиент показывает timestamp, сравните его с текущим временем.
- Удалите дубли. После импорта из разных клиентов часто остаются две похожие подписки.
- Добавьте профиль заново. Новый remote-профиль помогает отличить проблему кэша от проблемы URL.
- Отключите Merge, Script и override. Сначала проверьте чистый документ, затем возвращайте пользовательские правила.
- Не очищайте кэш вслепую. Если новая ссылка не работает, вы можете потерять последнюю рабочую копию.
#Истекшая ссылка, авторизация и лимиты
Подписочная ссылка может выглядеть как обычный URL, но содержать токен доступа. Токен может истекать по времени, отзываться после смены пароля, привязываться к устройству, IP, тарифу или лимиту трафика. В таком случае вчерашняя рабочая ссылка сегодня может возвращать 401, 403, 404, пустой список или HTML-страницу входа.
- Expired link. Срок действия URL закончился, нужен новый адрес.
- Revoked token. Старый токен отозван после пересоздания подписки или изменения безопасности.
- Traffic limit. Панель может отдавать пустую подписку или текст ошибки вместо узлов.
- Device limit. Ссылка разрешена на одном устройстве и запрещена на другом.
- Authorization header. Endpoint ожидает cookie, Basic/Bearer auth или другой заголовок, который обычный клиент не отправляет.
- User-Agent policy. Источник может блокировать неизвестные клиенты или слишком частые запросы.
#Формат подписки и совместимость клиента
Успешное скачивание не гарантирует успешный импорт. Clash Verge Rev ожидает remote configuration URL с Clash/mihomo-совместимым YAML в UTF-8. V2RayN-совместимые клиенты часто принимают base64-контейнер или строки share-ссылок. sing-box ожидает JSON-конфигурацию или формат, который поддерживает конкретная оболочка. Одиночная ссылка vless://... может импортироваться как один узел, но не всегда подходит как remote subscription.
| Формат | Признаки | Типичный клиент |
|---|---|---|
| Clash/mihomo YAML | proxies, proxy-groups, rules | Clash Verge Rev, mihomo-клиенты |
| V2RayN/base64 | Base64, после декодирования строки vless://, vmess://, ss:// | V2RayN-совместимые клиенты |
| URLLine | Одна share-ссылка на строку | Клиенты, где это явно поддержано |
| sing-box JSON | JSON с outbounds, route, dns | sing-box и оболочки на его базе |
| HTML | <html>, login, challenge, текст ошибки | Не является подпиской |
Если один клиент импортирует ссылку, а другой нет, это не доказывает ошибку второго клиента. Скорее всего, они ждут разные контейнеры или поддерживают разные версии полей.
#Обновление клиента и ядра
Новые параметры VLESS Reality, sing-box, Xray-core или mihomo могут не поддерживаться старой сборкой. Ошибка при этом часто выглядит как invalid config, пустой список или молчаливый откат к старому профилю.
- Обновите клиент из официального источника.
- Проверьте, обновляется ли core отдельно от GUI: Xray-core, sing-box, mihomo или другой runtime.
- После обновления создайте чистый профиль без старых override и пользовательских rules.
- Не отключайте проверку TLS-сертификатов как постоянное решение. Это рискованный обход, а не исправление причины.
#Безопасная проверка через браузер
- Скопируйте subscription URL полностью. Не добавляйте пробелы, кавычки и переносы строк.
- Откройте ссылку в приватном окне. Так легче увидеть, не зависит ли ответ от cookies текущего аккаунта.
- Посмотрите, что пришло. Конфиг, base64, JSON, YAML, HTML, редирект или текст ошибки.
- Проверьте конечный адрес. Если был редирект на login или challenge, клиент может скачивать не профиль.
- Скрывайте токен. На скриншотах закрывайте query-параметры и уникальные части пути.
#Безопасная проверка через curl
curl показывает статус, редиректы и заголовки без догадок. Ниже используется placeholder; реальную ссылку подставляйте только локально.
#Статус и конечный URL
curl -L -s -o /dev/null -w 'status=%{http_code} final=%{url_effective}\n' 'https://example.com/sub/REDACTED'#Заголовки и первые строки
curl -L -i --max-time 20 'https://example.com/sub/REDACTED' | sed -n '1,40p'#Запрос без очевидного старого кэша
curl -L -H 'Cache-Control: no-cache' -H 'Pragma: no-cache' 'https://example.com/sub/REDACTED' -o subscription-check.txtИщите Content-Type, Cache-Control, Subscription-Userinfo, WWW-Authenticate, редиректы и первые признаки формата. Не храните файл с реальной подпиской в публичной папке.
#Чеклист исправления
- Проверено, что это именно subscription URL, а не одиночный ключ, QR для другого клиента или ссылка на страницу панели.
- URL скопирован целиком: без пробелов, кавычек, переносов и обрезанных query-параметров.
- Ссылка открыта в браузере из той же сети; понятно, что возвращается.
- Через
curl -Lпроверены HTTP-код и конечный URL после редиректов. - Ошибки
401,403,404,410,429и5xxразобраны как серверные или сетевые сигналы. - При
200проверен формат: Clash YAML, V2RayN/base64, URLLine, sing-box JSON или HTML. - Выбран правильный активный профиль, удалены дубли, проверено время последнего обновления.
- Временно отключены Merge, Script, override, кастомные rules и конвертеры.
- Клиент и core обновлены до версии, поддерживающей нужный формат.
- Полная ссылка не опубликована; токен скрыт в логах, скриншотах и сообщениях.
#Частые вопросы
#Почему в браузере ссылка открывается, а клиент не обновляет?
Браузер может быть авторизован через cookies или показывать HTML-страницу, которую человек видит как результат, а клиент не может разобрать как конфигурацию.
#Почему после refresh остались старые серверы?
Клиент мог обновить неактивный профиль, сохранить последнюю рабочую копию или не применить новый документ из-за ошибки формата. Проверьте active profile и timestamp.
#Можно ли просто очистить кэш?
Можно, но сначала проверьте URL. Если ссылка возвращает 401, 403 или HTML, очистка кэша уберет последнюю рабочую копию и не исправит доступ.
#Что значит пустая подписка?
Это может быть честный ответ панели при отсутствии доступных узлов, исчерпанном лимите, ошибке генерации или несовместимом формате. Смотрите тело ответа и нужный тип клиента.
#Нужно ли менять DNS или сеть?
Другая сеть полезна для сравнения DNS, маршрута и IP-политики. Но она не исправит истекший токен, неверный формат или отозванную ссылку.