todo/sing-box/hardcoded-defaults.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

88 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-07-18
tags:
- sing-box
- справочник
- конфигурация
aliases:
- Хардкод-константы sing-box
- дефолты sing-box
- sing-box defaults
link: https://github.com/shtorm-7/sing-box-extended
---
# 🔩 Хардкод-константы и дефолты sing-box-extended
> [!info] О чём заметка
> Справочник значений, зашитых в исходники [[sing-box/sing-box-extended|sing-box-extended]] (и в унаследованный от upstream sing-box код): порты по умолчанию, таймауты, интервалы, магические адреса и числа протоколов. Полезно, когда поведение «из коробки» неочевидно из документации. Устройство кода, откуда эти константы взяты, — в [[sing-box/architecture|разборе архитектуры]].
> [!warning] Снимок исходников
> Значения выписаны из ветки `extended` на июль 2026 (релиз `v1.13.14-extended-2.5.1`), файлы указаны от корня репозитория. В новых версиях константы могут меняться — при сомнении сверяйся с `constant/` в актуальных исходниках.
## Порт по умолчанию у socks/http: его нет
Частый вопрос: «какой порт слушает socks/http-inbound, если не указать?». Ответ: **никакого привычного дефолта (1080 для SOCKS, 8080 для HTTP) в sing-box не существует**. По коду (`option/inbound.go`, `common/listener/listener_tcp.go`):
- Поле `listen` (адрес) — **обязательное**: без него конфиг не валиден.
- Поле `listen_port` — необязательное (`uint16`, omitempty): если его не указать, значение будет `0`, и операционная система выдаст **случайный свободный порт**. Для постоянного inbound это почти всегда не то, что нужно, — порт задавай явно.
- Если адрес из `listen` не удаётся собрать, fallback-адрес привязки — `127.0.0.1`.
Проще говоря: sing-box сознательно не назначает «известных» портов — каждый inbound слушает ровно то, что написано в конфиге, а забытый `listen_port` оборачивается случайным портом, а не 1080.
## Таймауты ядра (`constant/timeout.go`)
| Константа | Значение | Что означает |
|---|---|---|
| `TCPConnectTimeout` | 5 с | Лимит на установление исходящего TCP-соединения |
| `TCPTimeout` | 15 с | Общий лимит TCP-операций (например, хендшейков протоколов) |
| `ReadPayloadTimeout` | 300 мс | Ожидание первых данных (для сниффинга протокола) |
| `DNSTimeout` | 10 с | Лимит DNS-запроса |
| `UDPTimeout` | 5 мин | Простой UDP-сессии до закрытия NAT-записи |
| `ICMPTimeout` | 10 с | Простой ICMP-сессии |
| `TCPKeepAliveInitial` / `Interval` | 5 мин / 75 с | Параметры TCP keep-alive |
| `DefaultURLTestInterval` | 3 мин | Период URL-теста в группах `urltest` |
| `DefaultURLTestIdleTimeout` | 30 мин | Простой, после которого URL-тест группы засыпает |
| `StartTimeout` / `StopTimeout` / `FatalStopTimeout` | 10 с / 5 с / 10 с | Лимиты запуска и остановки сервисов ядра |
| `TLSFragmentFallbackDelay` | 500 мс | Задержка-фолбэк при TLS-фрагментации |
Сниффер протоколов дополнительно связывает известные порты с протоколами (`PortProtocols`): 53 → DNS, 123 → NTP, 3478 → STUN, 443 (UDP) → QUIC; для распознанных протоколов действуют свои таймауты UDP-сессий (`ProtocolTimeouts`): DNS/NTP/STUN — 10 с, QUIC/DTLS — 30 с. TTL DNS-ответов по умолчанию — 600 с (`constant/dns.go`, `DefaultDNSTTL`).
## Константы фич форка
Значения из extended-кода (подробности механики — в [[sing-box/architecture|архитектуре]]):
| Где | Константа | Значение |
|---|---|---|
| Fallback-группа | `blacklist_timeout` по умолчанию | 1 мин (неисправный outbound временно исключается) |
| Failover | размер кольцевого буфера кадров | 10 кадров (глубина восстановления сессии; при большем отставании — `SessionBroken`) |
| Failover | служебный адрес протокола | `sp.failover.sing-box.arpa:444` |
| Bond | служебный адрес протокола | `sp.bond.sing-box.arpa:444` |
| Bond | сумма `download_ratio` и `upload_ratio` | обязана равняться 100, иначе ошибка `invalid ratios` |
| Провайдер remote | `update_interval` по умолчанию / минимум | 24 ч / 1 мин |
| Провайдер, health check | интервал / минимум / таймаут / параллелизм | 10 мин / 1 мин / 3 с / 10 одновременных URL-тестов |
| Traffic-лимитер | период отправки счётчиков менеджеру | 5 с |
| Node → manager | интервал переподключения gRPC-стрима | 5 с |
| Connection-лимитер (`lock_type: manager`) | обновление распределённого лока / TTL лока на менеджере | 5 с / 30 с |
| Manager | пул рассылки обновлений узлам | 16 воркеров |
| Manager API | префикс REST / лимит списков по умолчанию | `/manager/v1` / 100 записей |
| Пересчёт скоростей | `MbpsToBps` (`constant/speed.go`) | 125 000 (1 Мбит/с = 125 000 байт/с — множитель для опций `speed` лимитеров) |
## Магические числа протоколов
Константы, обеспечивающие байтовую совместимость с другими реализациями (происхождение кода — в [[sing-box/protocols-origin|заметке о происхождении протоколов]]):
- **XTLS-Vision**: размер чанка 8192 байта; пороги паддинга — контент короче 900 байт дополняется до `900 + rand(500)`, иначе паддинг `rand(256)`; 5-байтовый заголовок `{команда, длина контента (2 байта), длина паддинга (2 байта)}`. Значения совпадают с Xray-core — иначе Vision-клиент sing-box не работал бы с Vision-сервером Xray.
- **Hysteria2**: аутентификация — HTTP/3-запрос на путь `/auth` с заголовком `Hysteria-Auth`, успех — нестандартный статус-код **233**; максимальный размер UDP-датаграммы 4096 байт; обфускация Salamander — XOR с BLAKE2b-256(PSK + соль), соль 8 байт. Congestion control Brutal: минимум 50 сэмплов, `minAckRate` 0.8.
- **Trojan**: ключ — SHA224-хеш пароля в hex (56 символов), разделители CRLF, команды TCP=1, UDP=3.
## 📚 См. также
- [[sing-box/sing-box-extended|sing-box-extended — обзор]] — что за проект
- [[sing-box/architecture|Архитектура sing-box-extended]] — где эти константы живут в коде
- [[sing-box/protocols-origin|Откуда код протоколов]] — почему магические числа совпадают с Xray и apernet/hysteria
- 🔗 [constant/ в репозитории](https://github.com/shtorm-7/sing-box-extended/tree/extended/constant) — первоисточник констант
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/sing-box/hardcoded-defaults.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).