<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Citrus · Новости</title><description>Новости Citrus: релизы, изменения в протоколах и планы.</description><link>https://getmikan.github.io/Citrus/news/</link><language>ru</language><item><title>Вторая бета — быстрее на загрузке и скачивании, ниже пинг под нагрузкой</title><link>https://getmikan.github.io/Citrus/news/beta-2/</link><guid isPermaLink="true">https://getmikan.github.io/Citrus/news/beta-2/</guid><description>v1.0.0-beta.2 — сравнение с Xray, sing-box и mihomo на одном хосте, ускорение скачивания, пинг под нагрузкой, память туннелей, исправления TUIC, smux и квот.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Вышел второй бета-релиз &lt;a href=&quot;https://github.com/getmikan/Citrus/releases/tag/v1.0.0-beta.2&quot;&gt;&lt;code&gt;v1.0.0-beta.2&lt;/code&gt;&lt;/a&gt;. Полный список изменений — в &lt;a href=&quot;/Citrus/changelog/&quot;&gt;журнале изменений&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;сравнение-четырёх-серверов-126&quot;&gt;Сравнение четырёх серверов (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/126&quot;&gt;#126&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Citrus, Xray v26.10.17, sing-box v1.14.3 и mihomo v1.19.32 замерены как серверы на одном хосте, восемь протоколов, одинаковые клиенты для всех. Итоги:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Citrus впереди на загрузке: REALITY в 32 потока на 52% быстрее лучшего из остальных, в один поток загрузка REALITY и SS2022 быстрее на 40–49%.&lt;/li&gt;
&lt;li&gt;У Citrus меньше всего памяти на простаивающий туннель на большинстве протоколов.&lt;/li&gt;
&lt;li&gt;sing-box впереди на AnyTLS, на новых соединениях TUIC и на скачивании SS2022.&lt;/li&gt;
&lt;li&gt;Xray впереди на загрузке Trojan и SS2022 в 32 потока.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Эти цифры сняты до изменений, описанных ниже. Методика, оговорки и все таблицы — в &lt;code&gt;test/bench/compare/results/2026-10-18-four-cores/RESULTS.md&lt;/code&gt; в репозитории.&lt;/p&gt;
&lt;h2 id=&quot;что-вошло-после-сравнения&quot;&gt;Что вошло после сравнения&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Скачивание&lt;/strong&gt; (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/124&quot;&gt;#124&lt;/a&gt;). Чтение по 64 КиБ, TLS-записи уходят в сокет вместе (в форках getmikan/tls и getmikan/utls). В 32 потока, по данным стенда: REALITY 2802 → 4235 МБ/с, Trojan 2737 → 3936, SS2022 3895 → 4392.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Пинг под нагрузкой&lt;/strong&gt; (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/131&quot;&gt;#131&lt;/a&gt;). Эхо рядом с восемью закачками: 55–63 → 20 мс. Для сравнения: у Xray около 77 мс, у sing-box на SS2022 около 47.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Память простаивающего туннеля&lt;/strong&gt; (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/129&quot;&gt;#129&lt;/a&gt;). Trojan −36% (37,7 КиБ, меньше, чем у sing-box с 43,6), AnyTLS −18%, REALITY −12%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QUIC&lt;/strong&gt; (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/125&quot;&gt;#125&lt;/a&gt;). Отставание от sing-box на новых потоках сократилось с 10–12% до 4–6%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ещё до сравнения в &lt;code&gt;dev&lt;/code&gt; были пакетная запись при загрузке (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/119&quot;&gt;#119&lt;/a&gt;) и меньше аллокаций на новое соединение (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/118&quot;&gt;#118&lt;/a&gt;); они в цифры сравнения уже входят.&lt;/p&gt;
&lt;h2 id=&quot;исправления&quot;&gt;Исправления&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TUIC: &lt;code&gt;CONNECT&lt;/code&gt; с доменом длиной 255 байт больше не роняет сервер до авторизации (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/125&quot;&gt;#125&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;smux заменён форком &lt;a href=&quot;https://github.com/getmikan/smux&quot;&gt;getmikan/smux&lt;/a&gt;: после ошибки буфер вызывающего больше не отправляется (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/123&quot;&gt;#123&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Лимиты: гонка при закрытии пользователя сверх квоты больше не трогает его новые соединения (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/116&quot;&gt;#116&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ci&quot;&gt;CI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Задача &lt;code&gt;-race&lt;/code&gt; для пакетов без гонок (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/121&quot;&gt;#121&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Ночная проверка производительности против mihomo (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/127&quot;&gt;#127&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;известное&quot;&gt;Известное&lt;/h2&gt;
&lt;p&gt;Сервер TUIC принимает не больше 2048 потоков на одно QUIC-соединение. Клиент, который открывает больше и не ждёт разрешения на новые потоки (так делает клиент sing-box), получает ошибки на лишних.&lt;/p&gt;
&lt;h2 id=&quot;дальше&quot;&gt;Дальше&lt;/h2&gt;
&lt;p&gt;К следующей бете — переработка AnyTLS (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/130&quot;&gt;#130&lt;/a&gt;). Остальное — на странице &lt;a href=&quot;/Citrus/roadmap/&quot;&gt;Дорожная карта&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Аудит закрыт, каскады, события, unix-сокеты и DNSCrypt</title><link>https://getmikan.github.io/Citrus/news/audit-cascades-events/</link><guid isPermaLink="true">https://getmikan.github.io/Citrus/news/audit-cascades-events/</guid><description>Итоги недели в dev — исправления по аудиту, группы-цепочки, поток событий /events, листенеры на unix-сокете, DNSCrypt и проверка с клиентами mihomo.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Всё ниже влито в ветку &lt;code&gt;dev&lt;/code&gt; и пока не вышло в релиз. Попробовать можно, &lt;a href=&quot;/Citrus/start/getting-started/#%D1%81%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2&quot;&gt;собрав ядро из исходников&lt;/a&gt;. Полный список — в &lt;a href=&quot;/Citrus/changelog/&quot;&gt;журнале изменений&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;аудит-закрыт&quot;&gt;Аудит закрыт&lt;/h2&gt;
&lt;p&gt;Статический аудит ядра разобран: найденное исправлено серией PR с &lt;a href=&quot;https://github.com/getmikan/Citrus/pull/75&quot;&gt;#75&lt;/a&gt; по &lt;a href=&quot;https://github.com/getmikan/Citrus/pull/97&quot;&gt;#97&lt;/a&gt;, у каждого исправления есть тест, который падает на старом коде. Главное, что заметят пользователи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;контроллер на сетевом адресе требует &lt;code&gt;secret&lt;/code&gt;, а без secret на loopback отклоняет запросы браузера с чужих сайтов;&lt;/li&gt;
&lt;li&gt;HTTP-прокси авторизует каждый запрос, UDP через SOCKS5 привязан к пользователю и порту, смена пароля закрывает сессии;&lt;/li&gt;
&lt;li&gt;самообновление сверяет пакет с &lt;code&gt;checksums.txt&lt;/code&gt; релиза;&lt;/li&gt;
&lt;li&gt;публичный URL провайдера не может перенаправить в частную сеть, пути проверяются с учётом симлинков;&lt;/li&gt;
&lt;li&gt;состояние, которое клиент создаёт до авторизации, ограничено во всех протоколах;&lt;/li&gt;
&lt;li&gt;GitHub Actions и образы закреплены по хешам.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Часть изменений требует правок в конфиге: они собраны на новой странице &lt;a href=&quot;/Citrus/migration/&quot;&gt;Переход с mihomo&lt;/a&gt;. Как сообщить об уязвимости и что сделано для защиты — на странице &lt;a href=&quot;/Citrus/security/&quot;&gt;Безопасность&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;каскады-73&quot;&gt;Каскады (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/73&quot;&gt;#73&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Новая группа &lt;code&gt;type: chain&lt;/code&gt; собирает цепочку из прокси и групп: первый хоп — вход, последний — выход.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/Citrus/_astro/ec.eoueo.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;/Citrus/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;proxy-groups&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;exits&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;url-test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;proxies&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;exit-de&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;exit-nl&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;https://cp.cloudflare.com/generate_204&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;cascade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;chain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;proxies&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;exits&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;]   &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# entry → лучший выход&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;https://cp.cloudflare.com/generate_204&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;interval&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79C0FF&quot;&gt;300&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Копировать&quot; data-copied=&quot;Скопировано!&quot; data-code=&quot;proxy-groups:  - name: exits    type: url-test    proxies: [exit-de, exit-nl]    url: https://cp.cloudflare.com/generate_204  - name: cascade    type: chain    proxies: [entry, exits]   # entry → лучший выход    url: https://cp.cloudflare.com/generate_204    interval: 300&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Если цепочка не работает, проверка находит первый сломанный хоп и показывает его в &lt;code&gt;/proxies&lt;/code&gt;, в &lt;code&gt;/metrics&lt;/code&gt; и в событии &lt;code&gt;chain.health&lt;/code&gt;. Подробнее — на странице &lt;a href=&quot;/Citrus/start/chains/&quot;&gt;Цепочки&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;поток-событий-70&quot;&gt;Поток событий (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/70&quot;&gt;#70&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GET /events&lt;/code&gt; отдаёт события ядра по WebSocket, SSE или NDJSON: авторизации, срабатывания лимитов, изменения пользователей, перезагрузки конфига, обновления провайдеров, состояние листенеров и цепочек. Панели больше не нужно опрашивать &lt;code&gt;/traffic/users&lt;/code&gt; и &lt;code&gt;/limits/users&lt;/code&gt;, чтобы узнать, что квота кончилась. См. &lt;a href=&quot;/Citrus/start/events/&quot;&gt;События&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;unix-сокеты-68&quot;&gt;Unix-сокеты (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/68&quot;&gt;#68&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;TCP-листенеры (VLESS, Trojan, TrustTunnel, HTTP, SOCKS и другие) слушают unix-сокет: &lt;code&gt;listen: unix:/run/citrus/vless.sock&lt;/code&gt;. Так ноду удобно ставить за nginx или Caddy, а настоящий адрес клиента передаётся через &lt;code&gt;trusted-proxy-header&lt;/code&gt; и &lt;code&gt;trusted-proxies: [loopback]&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;dnscrypt-63&quot;&gt;DNSCrypt (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/63&quot;&gt;#63&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Серверы DNSCrypt v2 задаются штампами &lt;code&gt;sdns://&lt;/code&gt; в &lt;code&gt;nameserver&lt;/code&gt;. Запросы идут через тот же диалер, что и у других DNS-клиентов, так что &lt;code&gt;#proxy&lt;/code&gt; и правила работают, а под TUN нет утечек. Сторонних библиотек DNSCrypt не понадобилось.&lt;/p&gt;
&lt;h2 id=&quot;клиенты-mihomo-74&quot;&gt;Клиенты mihomo (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/74&quot;&gt;#74&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Новые интеграционные тесты запускают официальные релизы mihomo v1.19.31 и v1.19.32 как клиентов против сервера Citrus — так работают приложения пользователей Mikan. Все 31 случая проходят: REALITY с пост-квантовыми настройками, XHTTP, WebSocket, gRPC, Trojan, Shadowsocks 2022, Hysteria2, TUIC v5, AnyTLS, TrustTunnel, Snell, Mieru, Sudoku, HTTP и SOCKS. Несовместимостей не нашлось. Таблица — на странице &lt;a href=&quot;/Citrus/compatibility/&quot;&gt;Совместимость&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ещё&quot;&gt;Ещё&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PUT /rules&lt;/code&gt; меняет правила без перезагрузки конфига (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/64&quot;&gt;#64&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;XHTTP по h2 тратит вдвое меньше CPU на гигабайт (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/53&quot;&gt;#53&lt;/a&gt;), а простаивающее соединение — на 30 КБ меньше памяти (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/52&quot;&gt;#52&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;JSON-логи для Loki и ELK: &lt;code&gt;log-format: json&lt;/code&gt; (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/65&quot;&gt;#65&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;В форки getmikan/tls и getmikan/utls перенесены исправления безопасности TLS из Go 1.26 (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/58&quot;&gt;#58&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Что дальше — первый релиз и переход панели Mikan на Citrus — на странице &lt;a href=&quot;/Citrus/roadmap/&quot;&gt;Дорожная карта&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Пост-квантовый REALITY, быстрый XHTTP через CDN и чистка протоколов</title><link>https://getmikan.github.io/Citrus/news/post-quantum-reality/</link><guid isPermaLink="true">https://getmikan.github.io/Citrus/news/post-quantum-reality/</guid><description>В dev влиты пост-квантовый REALITY на клиенте и сервере, ускорение packet-up через CDN, удаление устаревших протоколов, хук отклонённой авторизации и исправление гонок.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Всё ниже уже влито в ветку &lt;code&gt;dev&lt;/code&gt;, но ещё не вышло ни в релиз, ни в пререлиз. &lt;code&gt;dev&lt;/code&gt; больше не собирается в &lt;code&gt;Prerelease-dev&lt;/code&gt;: попробовать изменения сейчас можно, только &lt;a href=&quot;/Citrus/start/getting-started/#%D1%81%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2&quot;&gt;собрав ядро из исходников&lt;/a&gt; ветки &lt;code&gt;dev&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;пост-квантовый-reality-8-10&quot;&gt;Пост-квантовый REALITY (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/8&quot;&gt;#8&lt;/a&gt;, &lt;a href=&quot;https://github.com/getmikan/Citrus/pull/10&quot;&gt;#10&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Начиная с Xray 26.9.8 сервер REALITY молча отбрасывает ClientHello без key share X25519MLKEM768 перед X25519. Поэтому прежний Citrus не мог подключиться к актуальным серверам Xray.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Клиент (&lt;code&gt;reality-opts&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X25519MLKEM768 включён по умолчанию. &lt;code&gt;support-x25519mlkem768: false&lt;/code&gt; возвращает классический hello для старых серверов. Отпечаткам без ML-KEM (ios, edge, randomized и другим) key share добавляется автоматически.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client-version&lt;/code&gt;: версия Xray, которую клиент сообщает серверу. По умолчанию &lt;code&gt;26.10.10&lt;/code&gt;, раньше было зашито &lt;code&gt;1.8.2&lt;/code&gt;. Это нужно для серверов с &lt;code&gt;minClientVer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mldsa65-verify&lt;/code&gt;: проверка подписи ML-DSA-65 во временном сертификате, аналог &lt;code&gt;mldsa65Verify&lt;/code&gt; в Xray (параметр &lt;code&gt;pqv&lt;/code&gt; в ссылках).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client-fingerprint: firefox&lt;/code&gt; и &lt;code&gt;safari&lt;/code&gt; теперь отдают настоящие hello Firefox 148 и Safari 26.3 из нашего форка &lt;a href=&quot;https://github.com/getmikan/utls&quot;&gt;getmikan/utls&lt;/a&gt;. Принимаются и имена Xray: &lt;code&gt;hellofirefox_148&lt;/code&gt;, &lt;code&gt;hellosafari_26_3&lt;/code&gt;, &lt;code&gt;hellochrome_131&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/Citrus/_astro/ec.eoueo.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;/Citrus/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;proxies&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;vless-reality-vision&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;vless&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79C0FF&quot;&gt;443&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;uuid&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;uuid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;network&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;tls&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79C0FF&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;flow&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;xtls-rprx-vision&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;servername&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;www.microsoft.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;client-fingerprint&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;chrome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;reality-opts&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;public-key&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;xxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;short-id&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;xxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# support-x25519mlkem768: true  # по умолчанию; false только для старых серверов&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# client-version: 26.10.10      # по умолчанию&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# mldsa65-verify: xxx           # публичный ключ ML-DSA-65 (pqv)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Копировать&quot; data-copied=&quot;Скопировано!&quot; data-code=&quot;proxies:  - name: vless-reality-vision    type: vless    server: server    port: 443    uuid: uuid    network: tcp    tls: true    flow: xtls-rprx-vision    servername: www.microsoft.com    client-fingerprint: chrome    reality-opts:      public-key: xxx      short-id: xxx      # support-x25519mlkem768: true  # по умолчанию; false только для старых серверов      # client-version: 26.10.10      # по умолчанию      # mldsa65-verify: xxx           # публичный ключ ML-DSA-65 (pqv)&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Сервер (&lt;code&gt;reality-config&lt;/code&gt; у входящих)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mldsa65-seed&lt;/code&gt;: подпись временного сертификата ML-DSA-65, аналог &lt;code&gt;mldsa65Seed&lt;/code&gt; в Xray. Цепочка сертификатов &lt;code&gt;dest&lt;/code&gt; должна быть не короче примерно 3,5 КБ, иначе подпись не помещается и рукопожатие не проходит. У Xray то же ограничение.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require-x25519mlkem768&lt;/code&gt;: принимать только клиентов с X25519MLKEM768, остальные уходят на &lt;code&gt;dest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min-client-ver&lt;/code&gt; и &lt;code&gt;max-client-ver&lt;/code&gt;: допустимый диапазон версий клиента.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;listeners&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;vless-in&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;vless&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79C0FF&quot;&gt;443&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;users&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;username&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;uuid&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;uuid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;flow&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;xtls-rprx-vision&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;reality-config&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;dest&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;test.com:443&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;private-key&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;xxx&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;   &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# citrus generate reality-keypair&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;short-id&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;0123456789abcdef&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#7EE787&quot;&gt;server-names&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E6EDF3&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#A5D6FF&quot;&gt;test.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# max-time-difference: 60000     # миллисекунды&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# mldsa65-seed: xxx              # xray mldsa65&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# require-x25519mlkem768: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# min-client-ver: 26.9.8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;--0:#8B949E&quot;&gt;# max-client-ver: 26.10.10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Копировать&quot; data-copied=&quot;Скопировано!&quot; data-code=&quot;listeners:  - name: vless-in    type: vless    port: 443    users:      - username: 1        uuid: uuid        flow: xtls-rprx-vision    reality-config:      dest: test.com:443      private-key: xxx   # citrus generate reality-keypair      short-id:        - 0123456789abcdef      server-names:        - test.com      # max-time-difference: 60000     # миллисекунды      # mldsa65-seed: xxx              # xray mldsa65      # require-x25519mlkem768: true      # min-client-ver: 26.9.8      # max-client-ver: 26.10.10&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Проверено вживую против Xray 26.10.10 (VLESS + Vision + REALITY) в обе стороны: клиент Citrus к серверу Xray и клиент Xray к серверу Citrus, с подписью ML-DSA-65 и без неё. Неверный ключ отклоняется.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Изменение поведения.&lt;/strong&gt; &lt;code&gt;max-time-difference&lt;/code&gt; теперь в миллисекундах, как &lt;code&gt;maxTimeDiff&lt;/code&gt; в Xray. Раньше значение читалось в микросекундах, и число, скопированное из конфига Xray, допускало расхождение часов в 1000 раз меньше. Если вы подбирали значение под старые единицы, разделите его на 1000.&lt;/p&gt;
&lt;p&gt;Все ключи описаны в &lt;a href=&quot;https://github.com/getmikan/Citrus/blob/dev/docs/config.yaml&quot;&gt;справочнике конфига&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;xhttp-через-cdn-9&quot;&gt;XHTTP через CDN (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/9&quot;&gt;#9&lt;/a&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;В режиме &lt;code&gt;packet-up&lt;/code&gt; следующий POST больше не ждёт ответа на предыдущий, как и в Xray. Через CDN каждый POST раньше стоил полный круг клиент → CDN → сервер, и отдача упиралась в задержку. В живом тесте против Xray 26.10.10 запрос через packet-up занял 0,4 с вместо 5,4 с. Через HTTP/1.1 ответы по-прежнему ждутся.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-padding-bytes: &quot;0-0&quot;&lt;/code&gt; теперь значит паддинг по умолчанию Xray (100–1000 байт), а не его отсутствие.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path&lt;/code&gt; с запросом, например &lt;code&gt;/xh?ed=2048&lt;/code&gt;, отправляется как путь и query, как в Xray, а не как экранированный &lt;code&gt;%3F&lt;/code&gt; внутри пути.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;удалены-устаревшие-протоколы-7&quot;&gt;Удалены устаревшие протоколы (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/7&quot;&gt;#7&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Удалены ShadowsocksR, Hysteria v1, TUIC v4, потоковые шифры Shadowsocks (rc4-md5, aes-ctr/cfb, chacha20 и другие) и v2ray-plugin. Shadowsocks принимает только &lt;code&gt;none&lt;/code&gt;, AEAD и &lt;code&gt;2022-blake3-*&lt;/code&gt;. VMess пока остаётся.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В провайдерах прокси такой узел пропускается с предупреждением, остальная подписка загружается.&lt;/li&gt;
&lt;li&gt;В основном конфиге это ошибка с понятным текстом, например «TUIC v4 is no longer supported, use uuid/password (v5)».&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;журнал-отклонённой-авторизации-5&quot;&gt;Журнал отклонённой авторизации (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/5&quot;&gt;#5&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Пакет &lt;code&gt;component/authevent&lt;/code&gt; сообщает о неудачных попытках входа на входящих TrustTunnel, REALITY, AnyTLS, VLESS, Trojan, TUIC v5, Hysteria2 и Sudoku: протокол, адреса и причину, без учётных данных. Это основа для журнала отклонённых запросов в панели. События идут через очередь и не замедляют рукопожатие.&lt;/p&gt;
&lt;h2 id=&quot;гонки-данных-в-vision-и-anytls-11&quot;&gt;Гонки данных в Vision и AnyTLS (&lt;a href=&quot;https://github.com/getmikan/Citrus/pull/11&quot;&gt;#11&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Исправлены гонки данных в фильтре и чтении XTLS Vision и в потоке AnyTLS, которые находил &lt;code&gt;go test -race&lt;/code&gt;. Горячий путь Vision после первых пакетов стоит одну атомарную загрузку.&lt;/p&gt;
</content:encoded></item><item><title>Citrus запущен</title><link>https://getmikan.github.io/Citrus/news/citrus-is-live/</link><guid isPermaLink="true">https://getmikan.github.io/Citrus/news/citrus-is-live/</guid><description>Сетевое ядро Mikan теперь отдельный проект — форк mihomo со своими релизами. Что уже есть и что планируем.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Citrus — сетевое ядро &lt;a href=&quot;https://miroshka000.github.io/mikan/&quot;&gt;Mikan&lt;/a&gt;, форк &lt;a href=&quot;https://github.com/MetaCubeX/mihomo&quot;&gt;MetaCubeX/mihomo&lt;/a&gt;. Ядро теперь живёт в своём репозитории &lt;a href=&quot;https://github.com/getmikan/Citrus&quot;&gt;getmikan/Citrus&lt;/a&gt;, с сохранённой историей и авторством upstream, и выходит своими релизами.&lt;/p&gt;
&lt;h2 id=&quot;как-устроена-разработка&quot;&gt;Как устроена разработка&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Две ветки: &lt;code&gt;dev&lt;/code&gt; и &lt;code&gt;main&lt;/code&gt;. Все pull request’ы идут в &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt; получает только слияния из &lt;code&gt;dev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Каждая ветка собирается в свой пререлиз: &lt;code&gt;Prerelease-dev&lt;/code&gt; и &lt;code&gt;Prerelease-main&lt;/code&gt;. Стабильные версии выходят релизами с тегом.&lt;/li&gt;
&lt;li&gt;Изменения из mihomo приходят отдельными PR в &lt;code&gt;dev&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Подробнее — в разделе &lt;a href=&quot;/Citrus/project/contributing/&quot;&gt;«Как участвовать»&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;что-планируем&quot;&gt;Что планируем&lt;/h2&gt;
&lt;p&gt;Это планы, а не готовые изменения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Убрать устаревшие протоколы&lt;/strong&gt;, начиная с VMess.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Совместимость с Xray&lt;/strong&gt;, включая постквантовый REALITY: обмен ключами X25519MLKEM768 и подписи ML-DSA-65.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Исправления xhttp.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;О каждом шаге напишем здесь, когда он будет в релизе.&lt;/p&gt;
</content:encoded></item></channel></rss>