fix(admin): считать достижимым только тот адрес Traffic Stats API, который админка действительно опрашивает
Проверка принимала любой ip.IsLoopback(), то есть считала рабочим и 127.0.0.5. Это неверно: слушатель на конкретном адресе принимает соединения только на него, а слой proxy обращается строго к http://127.0.0.1:<port>. bind 127.0.0.5:38712 -> dial 127.0.0.1:38712 -> connection refused bind 0.0.0.0:38713 -> dial 127.0.0.1:38713 -> connected Такой адрес выглядел локальным, ломал контур доступа целиком (лимит устройств fail-closed => не подключается никто) и не вызывал у админки ни одного возражения. Принимаются ровно 127.0.0.1, 0.0.0.0 и пустой хост. IPv6-wildcard не принимается сознательно: соединение он принял бы, но HY2XS объявлен IPv4-only, а зависеть в ответе «достучусь» от net.ipv6.bindv6only нельзя. На странице конфигурации мягкое состояние nonCanonicalLoopback убрано: прочий loopback — это ошибка, а не предупреждение. Осталось три состояния: канон профиля, wildcard, недостижим. Свойство закреплено тестом с настоящими сокетами, а гейт приёмки запрещает возврат IsLoopback() и требует негативного случая 127.0.0.5 в тестах.
This commit is contained in:
@@ -385,11 +385,22 @@ API только по loopback. ...Верните 127.0.0.1 через `hy2xs-or
|
||||
| --- | --- | --- |
|
||||
| `127.0.0.1:36712` | без пометки | канон production-профиля |
|
||||
| `0.0.0.0:36712`, `:36712` | предупреждение | API достижим, но опубликован на всех интерфейсах; при `HY2XS_FIREWALL_MODE=external\|off` его не прикрывает ничто |
|
||||
| `127.0.0.5:36712` | предупреждение | достижим, но оркестратор такого не создаёт — конфиг правили руками |
|
||||
| `127.0.0.5:36712` | ошибка | **недостижим**, см. ниже |
|
||||
| `192.168.1.10:36712` | ошибка | панель до него не достучится, доступ пиров уже не работает |
|
||||
|
||||
Пустой хост в `listen` — это не loopback: в Go `:36712` означает все интерфейсы,
|
||||
ровно как `0.0.0.0`.
|
||||
Две детали, на которых легко ошибиться:
|
||||
|
||||
- пустой хост в `listen` — это **не** loopback: в Go `:36712` означает все
|
||||
интерфейсы, ровно как `0.0.0.0`;
|
||||
- другой адрес loopback — это **не** «почти правильно». Слушатель на конкретном
|
||||
адресе принимает соединения только на него:
|
||||
|
||||
```text
|
||||
bind 127.0.0.5:36712 → dial 127.0.0.1:36712 → connection refused
|
||||
```
|
||||
|
||||
Админка обращается к Traffic Stats API строго через `127.0.0.1`, поэтому
|
||||
`127.0.0.5` ломает контур доступа так же, как LAN-адрес.
|
||||
|
||||
### Дашборд показывает «состояние службы неизвестно»
|
||||
|
||||
|
||||
Reference in New Issue
Block a user