← На главную

IPv6-зоны ломают URL: Anubis на Go вынужден терпеть %25

04.06.2026 21:42 · hackernews

IPv6 зоны в URL — это проблема, и автор технического блога Cadey объясняет, почему. Суть в том, что у каждого сетевого интерфейса локальные адреса link-local находятся в одной подсети fe80::/64. Если у машины два интерфейса, оба получат адреса вроде fe80::4. Чтобы ядро понимало, через какой интерфейс отправлять пакет, придумали зоны (scopes). На Linux это имя интерфейса, например eth0, и адрес выглядит как fe80::4%eth0.

С портами всё просто: IPv6 в URL оборачивают в квадратные скобки — [fe80::4]:80. Добавляем зону: [fe80::4%eth0]:80. Казалось бы, всё логично. Но если попытаться распарсить такой URL в Go, он упадёт с ошибкой invalid URL escape "%et". Дело в том, что % — служебный символ в URL: он начинает процентное кодирование (как %20 для пробела). Поэтому %eth0 интерпретируется как попытка закодировать символ, а et — невалидный код.

Разработчики знают об этой проблеме. Согласно RFC 6874, для зон в URL нужно дважды кодировать процент: %25 вместо %. То есть правильный URL выглядит так: http://[fe80::4%25eth0]:80. В Go после разбора Hostname() вернёт fe80::4%eth0 — то есть работает, но выглядит ужасно. Есть RFC 9844, который описывает, как показывать такие адреса в интерфейсах, но для самих URL единого решения нет. Go не следует этому RFC в пакете net/url.

Автор признаётся, что для своего проекта Anubis ему приходится использовать эту дикую схему с %25. Другие языки и библиотеки тоже страдают. Форкать стандартную библиотеку Go он не хочет, поэтому терпит этот костыль. Итог: компьютеры — это ошибка.

Читать оригинал →