release: prepare 0.2.0 for sing-box 1.14
This commit is contained in:
+47
-44
@@ -2,73 +2,76 @@
|
||||
|
||||
## Policy schema version 1
|
||||
|
||||
Production-образец находится в `config/policy.json`. Неизвестные и отсутствующие
|
||||
ключи являются ошибкой.
|
||||
Production-образец находится в `config/policy.json`. Все секции имеют строгий
|
||||
набор ключей; неизвестные и отсутствующие значения являются ошибкой.
|
||||
|
||||
### `sing_box`
|
||||
|
||||
- `binary`: абсолютный путь к бинарнику;
|
||||
- `config_path`: production JSON;
|
||||
- `service`: systemd service;
|
||||
- `required_version`: допускается только `1.13.19`.
|
||||
- `config_path`: генерируемый production JSON;
|
||||
- `service`: имя systemd service;
|
||||
- `required_version`: только `1.14.0`.
|
||||
|
||||
### `runtime`
|
||||
|
||||
- `uri_path`: desired-state secret;
|
||||
- `state_dir`: state и backups;
|
||||
- `uri_path`: защищённый desired-state URI;
|
||||
- `state_dir`: state, last-good и backups;
|
||||
- `lock_path`: межпроцессная блокировка;
|
||||
- `backup_keep`: число timestamped backups, от 1 до 100.
|
||||
- `backup_keep`: число same-release backups, от 1 до 100.
|
||||
|
||||
### `network`
|
||||
|
||||
Здесь явно фиксируются интерфейсы, TUN CIDR, MTU, exclusions, таблица 2022,
|
||||
начальный rule index 9000, marks `0x2023`/`0x2024`/`0x2025`, NFQUEUE 100 и
|
||||
fallback rule 32768.
|
||||
|
||||
Публичные адреса не должны добавляться в `route_exclude_address`. Локальные
|
||||
подсети `10.20.0.0/24`, `10.30.0.0/24` и loopback сохраняются.
|
||||
Policy фиксирует `eth0`, `eth1`, `tun-sb0`, `172.19.0.1/30`, MTU 1400,
|
||||
таблицу 2022, rule index 9000, marks `0x2023/24/25`, NFQUEUE 100 и fallback
|
||||
rule 32768. Публичные endpoint IP не добавляются в exclusions.
|
||||
|
||||
### `dns`
|
||||
|
||||
Текущий контракт:
|
||||
|
||||
- UDP bootstrap `1.1.1.1:53`, bind `eth0`;
|
||||
- bootstrap `1.1.1.1:53`, bind `eth0`;
|
||||
- DoH `1.1.1.1:443/dns-query`, SNI `cloudflare-dns.com`;
|
||||
- DoH detour `hy2-out`;
|
||||
- только `ipv4_only`.
|
||||
- стратегия только `ipv4_only`.
|
||||
|
||||
### `healthcheck`
|
||||
### `bandwidth`
|
||||
|
||||
По умолчанию выполняется HTTPS-запрос к Cloudflare trace и ожидается HTTP 200 с
|
||||
маркером `ip=`. Этот локальный post-activation connectivity healthcheck идёт
|
||||
после запуска sing-box и проверяет состояние systemd и исходящую связность
|
||||
самого шлюза. Он не заменяет acceptance-тест forwarding с workload за `eth1`.
|
||||
`up_mbps=50` и `down_mbps=200` выбирают Hysteria congestion control. Поэтому
|
||||
renderer не задаёт `bbr_profile`: BBR profile применяется только когда bandwidth
|
||||
values не заданы.
|
||||
|
||||
`url: null` оставляет только проверку `systemctl is-active`. Это допустимо для
|
||||
изолированного стенда, но слабее production-проверки.
|
||||
## Hysteria2 URI
|
||||
|
||||
## Поддерживаемая часть Hysteria2 URI
|
||||
Production-форма HY2XS:
|
||||
|
||||
Поддерживаются:
|
||||
```text
|
||||
hysteria2://<peer-secret>@<host>:<port>/?insecure=0&obfs=gecko&obfs-password=<secret>&sni=<domain>
|
||||
```
|
||||
|
||||
- `hysteria2://` и `hy2://`;
|
||||
- percent-encoded auth, включая `username:password`;
|
||||
- DNS, IPv4, bracketed IPv6 и IDNA;
|
||||
- port 443 по умолчанию;
|
||||
- одиночный port и официальный multi-port/ranges;
|
||||
- `sni`, `insecure=0|1`;
|
||||
- `obfs=salamander&obfs-password=...`;
|
||||
- fragment как необязательное display name.
|
||||
Поддерживаются `hysteria2://`/`hy2://`, auth/userpass, DNS/IPv4/bracketed IPv6,
|
||||
IDNA, port hopping, `sni`, `insecure=0|1`, fragment, Gecko и Salamander.
|
||||
|
||||
Отклоняются `gecko`, `pinSHA256`, `ech`, client modes, неизвестные и
|
||||
повторяющиеся параметры. Причина для `pinSHA256`: Hysteria URI и sing-box
|
||||
1.13.19 используют разные виды certificate hash. `ech` будет добавлен только
|
||||
после доказанного преобразования формата config list.
|
||||
Правила obfs:
|
||||
|
||||
Специальные символы в auth должны быть percent-encoded: сырой `@` отклоняется,
|
||||
а `%40` декодируется в `@`.
|
||||
```text
|
||||
нет obfs -> допустимо для внешнего generic endpoint
|
||||
obfs=gecko -> требуется obfs-password; профиль всегда 512/1200
|
||||
obfs=salamander -> требуется obfs-password; compatibility fallback
|
||||
другой obfs -> ошибка
|
||||
password без obfs -> ошибка
|
||||
```
|
||||
|
||||
## Bandwidth
|
||||
Для HY2XS допустимым production-режимом считается только Gecko. Salamander не
|
||||
включается на сервере и не выбирается автоматически.
|
||||
|
||||
`up_mbps=50` и `down_mbps=200` являются локальной политикой и намеренно не
|
||||
принимаются из URI.
|
||||
Query parser применяет RFC percent-decoding, но не form decoding: сырой `+`
|
||||
сохраняется как `+`, `%2B` также превращается в `+`, а `%26`/`%3D` безопасно
|
||||
остаются частью значения после разбора разделителей.
|
||||
|
||||
`pinSHA256`, `ech`, Realm URI, client modes, неизвестные и повторяющиеся
|
||||
параметры отклоняются. Custom Gecko packet sizes через URI не принимаются:
|
||||
официальная Hysteria2 URI schema их не переносит.
|
||||
|
||||
## Healthcheck
|
||||
|
||||
По умолчанию проверяется Cloudflare trace: HTTP 200 и маркер `ip=`. Это
|
||||
проверяет локальную post-activation связность шлюза, но не заменяет E2E с
|
||||
workload за `eth1`. `url: null` допустим только для изолированного стенда.
|
||||
|
||||
Reference in New Issue
Block a user