Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
88 lines
9.1 KiB
Markdown
88 lines
9.1 KiB
Markdown
---
|
||
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).
|