<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on dedinit()</title><link>https://dedinit.ru/posts/</link><description>Recent content in Posts on dedinit()</description><generator>Hugo -- 0.165.0</generator><language>ru-ru</language><lastBuildDate>Mon, 31 Aug 2026 03:00:00 +0300</lastBuildDate><atom:link href="https://dedinit.ru/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>WEB Proxy для Telegram Desktop: ставим tproxy-server на свой VPS и чиним грабли установщика</title><link>https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/</link><pubDate>Mon, 31 Aug 2026 03:00:00 +0300</pubDate><guid>https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/</guid><description>Рассказываю, как развернул WEB Proxy для Telegram Desktop на собственном VPS (tproxy-server + Caddy + MTProxy), что нашёл в установщике upstream и как починил падение mtproxy.service с правами на бинарь после сборки.</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/hero.svg" alt="WEB Proxy для Telegram Desktop: Caddy, tproxy-server, MTProxy"></figure><h1 id="web-proxy-для-telegram-desktop-на-своём-vps">WEB Proxy для Telegram Desktop на своём VPS</h1>
<p>В моей инфраструктуре давно крутится Telegram-трафик через SOCKS5-туннель на VPS — но у этого подхода есть минусы: SOCKS5 легко режется DPI, а клиент надо настраивать отдельно. Альтернатива от самих разработчиков Telegram Desktop — <strong>WEB Proxy</strong>: прокси, который маскируется под обычный HTTPS-сайт на 443-м порту. Такой трафик не отличить от обычного захода на сайт, а подключение настраивается в два поля в настройках клиента.</p>
<p>В этой статье — как я развернул <a href="https://github.com/telegramdesktop/tproxy-server">tproxy-server</a> на свежем VPS (Debian 13, Hostkey), какие проблемы встретил в установщике и как их обошёл. Полезно всем, кто решит поднять свой WEB Proxy.</p>
<h2 id="зачем-web-proxy-а-не-socks5">Зачем WEB Proxy, а не SOCKS5</h2>
<table>
	<thead>
			<tr>
					<th>Критерий</th>
					<th>SOCKS5-туннель</th>
					<th>WEB Proxy (tproxy-server)</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Внешний вид трафика</td>
					<td>SOCKS5 (легко детектится)</td>
					<td>Обычный HTTPS на 443</td>
			</tr>
			<tr>
					<td>Маскировка под сайт</td>
					<td>нет</td>
					<td>да (свой статический сайт)</td>
			</tr>
			<tr>
					<td>Настройка в Telegram Desktop</td>
					<td>тип прокси + адрес + порт</td>
					<td>hostname + secret</td>
			</tr>
			<tr>
					<td>Держит сам Telegram</td>
					<td>да</td>
					<td>да (через MTProxy на бэкенде)</td>
			</tr>
	</tbody>
</table>
<p>Схема работы tproxy-server:</p>
<pre tabindex="0"><code>Telegram Desktop → HTTPS:443 → Caddy → tproxy-server:8080 → MTProxy:2398 → Telegram
                                        └ admin :8081 (/readyz, /healthz)
</code></pre><p>Caddy отдаёт Let&rsquo;s Encrypt сертификат и проксирует весь трафик на tproxy-server, который сам решает: обычные запросы отдаёт сайт-маскировку, а запросы WEB Proxy — гонит в MTProxy. Снаружи это просто HTTPS-сайт.</p>
<h2 id="установка-что-делает-installsh">Установка: что делает install.sh</h2>
<p>У upstream отличный установщик — <code>deploy/install.sh</code> делает почти всё сам:</p>
<ul>
<li>ставит пакеты (ca-certificates, curl, nftables);</li>
<li>ставит <strong>Caddy 2.11.4</strong> и <strong>Go 1.26.5</strong> (если нет);</li>
<li>собирает <code>tproxy-server</code> из исходников;</li>
<li>собирает <strong>MTProxy</strong> (pinned commit <code>f36d8af</code>) в <code>/opt/MTProxy</code>;</li>
<li>создаёт systemd-сервисы: <code>tproxy-server</code>, <code>mtproxy</code>, <code>tproxy-firewall</code>, <code>caddy</code>;</li>
<li>настраивает таймер <code>refresh-mtproxy-config</code> (обновление списка серверов Telegram раз в сутки);</li>
<li>поднимает nft-правило, закрывающее порты MTProxy (2398, 8888) от внешнего мира.</li>
</ul>
<p>Запуск:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./deploy/install.sh --hostname vps03.nixg.ru <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --email me@example.com --site-dir /tmp/tproxy-site <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --secret <span style="color:#a5d6ff">&#34;</span><span style="color:#ff7b72">$(</span>cat /tmp/tproxy-secret.txt<span style="color:#ff7b72">)</span><span style="color:#a5d6ff">&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--secret</code> — 32 hex-символа (<code>openssl rand -hex 16</code>), <code>--site-dir</code> — каталог со статическим сайтом-маскировкой.</p>
<h2 id="грабли-1-mtproxyservice-падает-с-203exec-readyz-503">Грабли №1: mtproxy.service падает с 203/EXEC, readyz 503</h2>
<p>После первого прогона установщика <code>tproxy-server</code> был active, Caddy слушал 80/443, но прокси не работал:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>● mtproxy.service - failed (Result: exit-code), status=203/EXEC
</span></span></code></pre></td></tr></table>
</div>
</div><p>Порт 2398 не слушался, а <code>/readyz</code> административного эндпоинта отдавал 503 (readyz — это «вся цепочка готова», healthz при этом был 200).</p>
<p>Причина оказалась в <strong>правах на бинарь после сборки</strong>. Установщик собирает MTProxy в <code>/opt/MTProxy/objs/bin/mtproto-proxy</code>, но из-за umask бинарь и каталоги получают права <code>700 root:root</code>. Юнит <code>mtproxy.service</code> запускается от пользователя <code>mtproxy</code> (с <code>NoNewPrivileges=true</code> и <code>ProtectSystem=strict</code>) — процесс не может прочитать бинарь и умирает с 203/EXEC.</p>
<p>Лечится одной серией команд:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod <span style="color:#a5d6ff">755</span> /opt/MTProxy /opt/MTProxy/objs /opt/MTProxy/objs/bin
</span></span><span style="display:flex;"><span>chown root:mtproxy /opt/MTProxy/objs/bin/mtproto-proxy
</span></span><span style="display:flex;"><span>chmod <span style="color:#a5d6ff">750</span> /opt/MTProxy/objs/bin/mtproto-proxy
</span></span><span style="display:flex;"><span>systemctl restart mtproxy
</span></span></code></pre></td></tr></table>
</div>
</div><p>После этого <code>mtproxy</code> — active (running), слушает <code>0.0.0.0:2398</code>, readyz → 200.</p>
<h2 id="грабли-2-флейк-go-test-в-установщике">Грабли №2: флейк go test в установщике</h2>
<p>Первый прогон install.sh (холодный кэш Go, сборка всех пакетов параллельно) упал на тестах:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>FAIL: internal/config — TestLoadAcceptsSystemdCredentialReadPermissions:
</span></span><span style="display:flex;"><span>group/other-readable profiles file outside a credential directory was accepted
</span></span></code></pre></td></tr></table>
</div>
</div><p>А повторный <code>go test ./...</code> (тёплый кэш) — PASS. Это классическая гонка при холодном параллельном прогоне тестов, а не баг кода. Лечение простое: перезапустить install.sh — дальше идёт нормально.</p>
<h2 id="грабли-3-не-открыты-порты-80443--ложная-тревога">Грабли №3: «не открыты порты 80/443» — ложная тревога</h2>
<p>Снаружи curl на 80/443 не отвечал, и я заподозрил firewall провайдера (Hostkey). Пошёл в панель — а там <strong>вообще нет настроек firewall/прокси</strong>. Полез в документацию, искал API&hellip;</p>
<p>На самом деле всё проще: порты у провайдера открыты по умолчанию, просто на 80/443 <strong>ничего не слушало</strong> — curl получал connection refused. Проверка: поднимаю временный <code>python3 -m http.server 80</code> → TCP connect снаружи OK. После установки Caddy сам слушает 80/443.</p>
<p>Так что если у вас после установки снаружи не открывается сайт — сначала проверьте, что порт слушается (<code>ss -tlnp</code>), а не ищите firewall в панели провайдера.</p>
<h2 id="проверка-после-установки">Проверка после установки</h2>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl status tproxy-server mtproxy tproxy-firewall caddy   <span style="color:#8b949e;font-style:italic"># все active</span>
</span></span><span style="display:flex;"><span>curl -s -o /dev/null -w <span style="color:#a5d6ff">&#39;%{http_code}&#39;</span> http://127.0.0.1:8081/readyz    <span style="color:#8b949e;font-style:italic"># 200</span>
</span></span><span style="display:flex;"><span>curl -s -o /dev/null -w <span style="color:#a5d6ff">&#39;%{http_code}&#39;</span> https://vps03.nixg.ru/          <span style="color:#8b949e;font-style:italic"># 200 (сайт)</span>
</span></span><span style="display:flex;"><span>openssl s_client -connect vps03.nixg.ru:443 -servername vps03.nixg.ru  <span style="color:#8b949e;font-style:italic"># LE-серт</span>
</span></span><span style="display:flex;"><span>ss -tlnp | grep -E <span style="color:#a5d6ff">&#39;:80 |:443|:2398|:8080|:8081&#39;</span>
</span></span><span style="display:flex;"><span>nft list ruleset | grep -E <span style="color:#a5d6ff">&#39;2398|8888&#39;</span>   <span style="color:#8b949e;font-style:italic"># закрыто от внешнего мира</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Наружу видны только 80/443. MTProxy-бэкенд (2398, 8888) закрыт nft — <code>iifname != &quot;lo&quot; ... drop</code>, то есть бэкенд не светится и не принимает подключения напрямую.</p>
<h2 id="настройка-клиента">Настройка клиента</h2>
<p>В Telegram Desktop: <strong>Settings → Advanced → Connection Type → Use custom proxy → NEW PROXY → WEB Proxy</strong>:</p>
<ul>
<li>hostname: <code>vps03.nixg.ru</code></li>
<li>secret: (32 hex-символа, которые вы сгенерировали)</li>
</ul>
<h2 id="итог">Итог</h2>
<p>WEB Proxy — отличная замена SOCKS5-туннелю, если нужна маскировка под обычный HTTPS: настраивается в два поля, трафик неотличим от сайта, а готовый установщик upstream делает почти всю работу. Главные грабли — права на бинарь MTProxy после сборки (203/EXEC) и ложная тревога с «закрытыми портами». Оба решаются за пару минут, если знать, куда смотреть.</p>
<p>Полный набор файлов (заметки, сайт-маскировку, команду установки) я сложил в репозиторий <a href="https://github.com/telegramdesktop/tproxy-server">tproxy-web</a> — точнее, в свой <a href="https://gitverse.ru/kpa39l/tproxy-web">tproxy-web на gitverse</a>, а INSTALL_NOTES.md с деталями лежит там же.</p>
]]></content:encoded></item><item><title>Как я перевёл aux-задачи Hermes на локальные модели: экономия токенов и отключение режима размышлений у Qwen3</title><link>https://dedinit.ru/2026/local-aux-models-hermes-qwen3/</link><pubDate>Sun, 30 Aug 2026 12:00:00 +0300</pubDate><guid>https://dedinit.ru/2026/local-aux-models-hermes-qwen3/</guid><description>Рассказываю, как выбрал модель для вспомогательных (auxiliary) задач агента Hermes, перевёл vision и текстовые задачи на локальную Ollama, сэкономил токены облачного провайдера и допилил отключение режима размышлений (thinking) у Qwen3.</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/local-aux-models-hermes-qwen3/hero.svg" alt="Локальные aux-модели Hermes: qwen3-vl и qwen3"></figure><h1 id="как-я-перевёл-aux-задачи-hermes-на-локальные-модели">Как я перевёл aux-задачи Hermes на локальные модели</h1>
<p>У меня на домашнем сервере живёт агент <a href="https://hermes-agent.nousresearch.com">Hermes</a> — он ведёт блог, следит за сертификатами, ходит в мессенджеры и выполняет кучу мелких, но важных задач. Основную модель он берёт в облаке (провайдер polza.ai, 131K контекст), а для вспомогательных задач — генерации заголовков, извлечения текста из веб-страниц, описания картинок (vision) и сжатия контекста — у него есть отдельный механизм <strong>auxiliary</strong>. По умолчанию все aux-задачи тоже резолвятся в облако, а значит — тратят токены и деньги.</p>
<p>На сервере стоит видеокарта <strong>RTX 5060 Ti 16 GB</strong> (да, та самая, про которую я писал в статье про зависание Ubuntu при загрузке). Раз есть GPU — почему бы не увести aux-задачи на локальные модели? Приватность, скорость, ноль затрат на API. Рассказываю, как выбирал модель, как настраивал и какой грабли встретил при отключении режима размышлений (thinking) у Qwen3.</p>
<h2 id="что-такое-auxiliary-задачи-в-hermes">Что такое auxiliary-задачи в Hermes</h2>
<p>Hermes — агент с модульной архитектурой. Кроме основной модели (которая думает и пишет ответы), он вызывает <strong>вспомогательные (auxiliary) задачи</strong> через отдельный клиент — <code>auxiliary_client.py</code>. В моей версии их несколько:</p>
<table>
	<thead>
			<tr>
					<th>Задача</th>
					<th>Что делает</th>
					<th>Порог контекста</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>vision</code></td>
					<td>Описывает картинки, читает скриншоты</td>
					<td>нет</td>
			</tr>
			<tr>
					<td><code>title_generation</code></td>
					<td>Генерирует заголовки диалогов</td>
					<td>нет</td>
			</tr>
			<tr>
					<td><code>web_extract</code></td>
					<td>Извлекает текст из веб-страниц</td>
					<td>нет</td>
			</tr>
			<tr>
					<td><code>compression</code></td>
					<td>Сжимает историю диалога (context compaction)</td>
					<td><strong>64K жёсткий минимум</strong></td>
			</tr>
			<tr>
					<td><code>skills_hub</code>, <code>approval</code>, <code>mcp</code> и др.</td>
					<td>Служебные</td>
					<td>нет</td>
			</tr>
	</tbody>
</table>
<p>Ключевой момент: <strong>только <code>compression</code> требует большого контекста (64K)</strong>. Это жёсткое требование самого Hermes — для сжатия истории ему нужна модель, которая видит весь диалог. Локальные GGUF-модели до 64K не дотягивают (проверил: qwen3-8b упирается в 40960 токенов контекста, qwen2.5-coder-14b — в 32768; теги «64k/65k» в названиях моделей — маркетинг, реальный контекст меньше). Поэтому <strong>compression я оставил в облаке</strong>, а вот все остальные aux-задачи — кандидаты на локализацию.</p>
<h2 id="выбор-модели">Выбор модели</h2>
<p>Критерии были простые:</p>
<ol>
<li>Модель должна уметь <strong>vision</strong> (для <code>vision</code>-задачи).</li>
<li>Должна влезать в 16 GB VRAM вместе с эмбеддинг-моделью <code>bge-m3</code> и основной текст-моделью.</li>
<li>Должна быстро отвечать — aux-задачи вызываются часто, ждать минуту утомительно.</li>
<li>Желательно уметь закрыть и текстовые задачи (генерация заголовков, извлечение текста) — чтобы не гонять облако вообще.</li>
</ol>
<p>Я поставил <a href="https://ollama.com/library/qwen3-vl">qwen3-vl:8b</a> — мультимодальную модель Qwen 8B с поддержкой vision. Она весит ~6.1 GB, контекст 262K (но KV cache на полный контекст — ~309 GB, так что реально держу <code>num_ctx=8192</code>). Проверил через <code>/api/show</code> — у неё есть capability <code>vision</code>, значит Hermes её увидит как vision-модель.</p>
<p><strong>Важный нюанс про qwen3-vl:</strong> она великолепно описывает картинки (проверено E2E — отвечает «red»/«blue» на цветные картинки за 1-10 секунд), но для текстовых задач она&hellip; слишком умная. На простой вопрос «какой сегодня день недели» она генерирует 3778 токенов рассуждений и отвечает через 64 секунды! Это потому, что qwen3-модели по умолчанию включён режим reasoning/thinking. Для заголовков и извлечения текста это неприемлемо.</p>
<p>Поэтому я взял <strong>две модели</strong>:</p>
<ul>
<li><code>qwen3-vl:8b</code> — для vision (картинки);</li>
<li><code>qwen3:8b</code> — для текстовых aux (title_generation, web_extract), с принудительно отключённым thinking.</li>
</ul>
<h2 id="настройка">Настройка</h2>
<p>Hermes поддерживает per-task конфигурацию auxiliary-задач в <code>config.yaml</code>. Формат:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">20
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#7ee787">auxiliary</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">vision</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">provider</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">custom</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">model</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">qwen3-vl:8b</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">base_url</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">http://localhost:11434/v1</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">api_key</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">ollama</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">title_generation</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">provider</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">custom</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">model</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">qwen3:8b</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">base_url</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">http://localhost:11434/v1</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">api_key</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">ollama</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">extra_body</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span><span style="color:#7ee787">think</span>:<span style="color:#6e7681"> </span><span style="color:#79c0ff">false</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">web_extract</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">provider</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">custom</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">model</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">qwen3:8b</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">base_url</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">http://localhost:11434/v1</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">api_key</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">ollama</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">extra_body</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span><span style="color:#7ee787">think</span>:<span style="color:#6e7681"> </span><span style="color:#79c0ff">false</span><span style="color:#6e7681">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Настройка через CLI:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hermes config set auxiliary.vision.provider custom
</span></span><span style="display:flex;"><span>hermes config set auxiliary.vision.model qwen3-vl:8b
</span></span><span style="display:flex;"><span>hermes config set auxiliary.vision.base_url http://localhost:11434/v1
</span></span><span style="display:flex;"><span>hermes config set auxiliary.vision.api_key ollama
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># и так для каждой задачи</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Пара важных граблей:</p>
<ul>
<li><strong><code>api_key</code> обязан быть непустым.</strong> В коде Hermes пустой <code>api_key</code> означает «унаследовать ключ основного провайдера» — и тогда он попытается сходить в polza.ai с локальной моделью. Я поставил заглушку <code>ollama</code> (Ollama её не проверяет).</li>
<li><strong>Ollama надо форматировать через OpenAI-совместимый эндпоинт</strong> <code>/v1/chat/completions</code> — именно так Hermes ходит в локальные модели.</li>
<li><strong>Для qwen3-vl держать <code>num_ctx</code> небольшим</strong> (я использую 8192), иначе Ollama пытается зарезервировать KV cache под весь 262K контекст — это ~309 GB, runner падает с EOF.</li>
</ul>
<h2 id="допиливание-отключения-режима-размышлений-thinking">Допиливание отключения режима размышлений (thinking)</h2>
<p>Самая интересная часть. Qwen3-модели (и qwen3, и qwen3-vl) по умолчанию генерируют <strong>скрытый поток рассуждений (thinking/reasoning)</strong> перед ответом. Для aux-задач это означает:</p>
<ul>
<li>Заголовок генерируется 64 секунды вместо 3-5.</li>
<li>При ограниченном <code>max_tokens</code> ответ вообще <strong>пустой</strong> — весь бюджет съедает thinking, до <code>content</code> дело не доходит.</li>
</ul>
<p>Я перепробовал несколько способов отключить thinking, и вот что выяснилось:</p>
<h3 id="что-не-работает-в-ollama">Что НЕ работает (в Ollama)</h3>
<table>
	<thead>
			<tr>
					<th>Способ</th>
					<th>Результат</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>/no_think</code> в начале сообщения</td>
					<td>Не работает — модель всё равно думает</td>
			</tr>
			<tr>
					<td><code>enable_thinking: false</code> в <code>extra_body</code></td>
					<td>Не работает</td>
			</tr>
			<tr>
					<td><code>thinking: {type: disabled}</code> (как в OpenAI API Qwen)</td>
					<td>Не работает — content пустой, reasoning продолжается</td>
			</tr>
			<tr>
					<td><code>system: &quot;Не думай&quot;</code></td>
					<td>Не работает</td>
			</tr>
	</tbody>
</table>
<p>Я проверил chat template модели — там есть команды <code>/think</code> и <code>/no_think</code>, но они не активируются в Ollama (флаг <code>IsThinkSet</code> не выставляется).</p>
<h3 id="что-работает">Что работает</h3>
<p><strong>Единственный рабочий способ — корневой параметр <code>think: false</code> в теле запроса:</strong></p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl http://localhost:11434/api/chat -d <span style="color:#a5d6ff">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">  &#34;model&#34;: &#34;qwen3:8b&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">  &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Привет!&#34;}],
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">  &#34;think&#34;: false
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">}&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ответ приходит через <strong>0.7 секунды</strong> (вместо 64!), <code>reasoning=false</code>, <code>content</code> заполнен. Именно эту опцию я и прописал в <code>extra_body</code> конфига Hermes:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#7ee787">extra_body</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">think</span>:<span style="color:#6e7681"> </span><span style="color:#79c0ff">false</span><span style="color:#6e7681">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>В коде Hermes <code>extra_body</code> уходит в корень JSON-тела запроса — как раз туда, куда Ollama ждёт параметр <code>think</code>.</p>
<h3 id="проверка-e2e">Проверка E2E</h3>
<p>После настройки прогнал реальные вызовы через вспомогательный клиент Hermes (<code>call_llm</code>):</p>
<table>
	<thead>
			<tr>
					<th>Задача</th>
					<th>Время</th>
					<th>Результат</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>title_generation</code></td>
					<td>11.3 сек</td>
					<td>«Настройка Ollama: локальные модели»</td>
			</tr>
			<tr>
					<td><code>web_extract</code></td>
					<td>7.5 сек</td>
					<td>Извлёк главную мысль</td>
			</tr>
			<tr>
					<td><code>vision</code> (картинка 256x256)</td>
					<td>7.6 сек</td>
					<td>«blue»</td>
			</tr>
	</tbody>
</table>
<h2 id="vram-и-память">VRAM и память</h2>
<p>На RTX 5060 Ti 16 GB в памяти держатся одновременно:</p>
<ul>
<li><code>qwen3-vl:8b</code> — ~7.2 GB (vision)</li>
<li><code>qwen3:8b</code> — ~6.1 GB (текст)</li>
<li><code>bge-m3</code> — ~1.2 GB (эмбеддинги)</li>
</ul>
<p>Итого ~14.5 GB — влезает с запасом, и переключение vision↔текст происходит без выгрузки модели. Проверено через <code>/api/ps</code>: после текстового вызова в памяти остаются обе модели.</p>
<h2 id="итог">Итог</h2>
<ul>
<li><strong>Vision</strong> полностью локальный — картинки описываются на сервере, в облако не уходят.</li>
<li><strong>Текстовые aux</strong> (заголовки, извлечение текста) — локальные, быстрые, бесплатные.</li>
<li><strong>Compression</strong> остался в облаке — ему нужен контекст 64K, который локально не влезает.</li>
<li>Облачные токены тратятся только на основную модель и сжатие контекста — экономия существенная.</li>
</ul>
<p>Самое ценное знание, которым делюсь: <strong>если вы используете Qwen3 в Ollama для вспомогательных задач — не забудьте <code>think: false</code></strong>. Это превращает задумчивую модель, которая час думает над заголовком, в мгновенного исполнителя. И помните: <code>/no_think</code>, <code>enable_thinking</code> и <code>thinking: disabled</code> — в Ollama не работают, работает только корневой <code>think: false</code>.</p>
<hr>
<p><em>Полезные ссылки: <a href="https://hermes-agent.nousresearch.com">Hermes Agent</a> · <a href="https://ollama.com/library/qwen3-vl">Ollama qwen3-vl</a> · <a href="https://ollama.com/library/qwen3">Ollama qwen3</a></em></p>
]]></content:encoded></item><item><title>Проблема загрузки Ubuntu на RD450X+5060ti</title><link>https://dedinit.ru/2026/rd450x_not_boot_5060ti/</link><pubDate>Sun, 10 May 2026 17:14:10 +0300</pubDate><guid>https://dedinit.ru/2026/rd450x_not_boot_5060ti/</guid><description>После штатных выключения и включения сервера. Он перестал загружаться. Последнее сообщение на мониторе - EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path.</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/rd450x_not_boot_5060ti/hero.svg" alt="Hero картинка в SVG"></figure><h2 id="проблема-зависание-загрузки-ubuntu-после-обновления-с-сообщением-efi-stub">Проблема: зависание загрузки Ubuntu после обновления с сообщением EFI stub</h2>
<h3 id="симптомы">Симптомы</h3>
<p>После выполнения <code>apt upgrade</code> (об этом я вспомнил уже после того как разобарлся с пробелмой) и перезагрузки система перестала загружаться. На экране последнее сообщение:</p>
<pre tabindex="0"><code>EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path
</code></pre><p>После этого — полное зависание. GRUB работает, выбор ядра доступен. Ошибок ядра (<code>kernel panic</code>, <code>Oops</code>) нет.</p>
<h3 id="окружение">Окружение</h3>
<ul>
<li>ОС: Ubuntu (ядро 6.8.0-111-generic)</li>
<li>Видеокарта: NVIDIA RTX 5060 Ti (архитектура Blackwell)</li>
<li>Дисковая подсистема: программный RAID1 (mdadm)</li>
</ul>
<h3 id="диагностика">Диагностика</h3>
<ol>
<li><strong>Аппаратная часть исправна:</strong> диски определяются в BIOS, SMART — PASSED, RAID-суперблоки на месте (<code>mdadm --examine</code> показал корректные UUID).</li>
<li><strong>RAID собирается:</strong> <code>mdadm --assemble --scan</code> активен, <code>/proc/mdstat</code> — массив в состоянии <code>[UU]</code>. Проверял на соседней машине.</li>
<li><strong>LiveUSB с Ubuntu/Debian не загружается</strong> — аналогичное зависание на той же строчке.</li>
<li><strong>UEFI Shell работает</strong>, загрузчик GRUB физически присутствует на EFI-разделе.</li>
</ol>
<h3 id="решение">Решение</h3>
<p>Загрузка с параметром ядра:</p>
<pre tabindex="0"><code>nomodeset
</code></pre><p>После добавления этого параметра в строку загрузки GRUB система стартует штатно. Механизм <code>nomodeset</code> отключает Kernel Mode Setting (KMS), предотвращая инициализацию DRM/драйвера видеокарты на раннем этапе загрузки.</p>
<h3 id="причина">Причина</h3>
<p>Ядро 6.8.0 не имеет полной поддержки видеокарт на базе архитектуры Blackwell (RTX 5060 Ti вышла позже релиза ядра). При попытке инициализации видеорежима через <code>nouveau</code> (или фолбэк-механизмы) происходит зависание на этапе настройки дисплейного контроллера.</p>
<p><code>nomodeset</code> исключает этот этап, оставляя управление видеорежимом за прошивкой UEFI. Система загружается, но без ускорения графики — что для сервера в большинстве случаев некритично.</p>
<h3 id="постоянное-применение">Постоянное применение</h3>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo <span style="color:#a5d6ff">&#39;GRUB_CMDLINE_LINUX_DEFAULT=&#34;quiet splash nomodeset&#34;&#39;</span> | sudo tee /etc/default/grub
</span></span><span style="display:flex;"><span>sudo update-grub
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="корректное-решение-убрать-nomodeset">Корректное решение (убрать nomodeset)</h3>
<ol>
<li>Установить проприетарный драйвер NVIDIA версии 570 или новее.</li>
<li>Или обновить ядро до версии 6.12+, где поддержка Blackwell добавлена в <code>nouveau</code>.</li>
</ol>
<h3 id="вывод">Вывод</h3>
<p>Проблема не в дисках, не в RAID и не в памяти. Причина — отсутствие поддержки современной видеокарты в текущей версии ядра. Параметр <code>nomodeset</code> — рабочий временный обход, позволяющий сохранить функциональность системы до установки актуального драйвера или ядра.</p>
<h3 id="дополнение">Дополнение</h3>
<p>Я думал переустановить систему, залив Debian. Но после выбора параметра установки в загрузочном меню, я опять получал зависшую систему. Решилась пробелма что сложнее, одного параметра <code>nomodeset</code> не хватило, БЯМ подсказала расширенную версию:</p>
<p>Вот перечень параметров, которые вы должны добавить все вместе:</p>
<pre tabindex="0"><code>nomodeset acpi=off noapic nolapic pci=nomsi pci=nommconf console=tty0 console=ttyS0,115200
</code></pre><p><strong>Как это ввести</strong>:</p>
<ol>
<li>Загрузитесь с Ventoy, выберите Debian.</li>
<li>Нажмите <code>e</code> для редактирования.</li>
<li>Найдите строку с <code>linux</code>.</li>
<li>Удалите всё содержимое после <code>---</code> (или в конце строки) и вставьте туда эту строку.</li>
<li>Нажмите <code>Ctrl+X</code>.</li>
</ol>
<p><strong>Что эти флаги делают</strong>:</p>
<ul>
<li><code>acpi=off noapic nolapic</code>: Отключают продвинутое управление питанием и прерываниями (часто выручает на серверном железе)<a href="https://otvet.mail.ru/question/242988552"></a><a href="https://lists.debian.org/debian-user/2010/12/msg00882.html"></a>.</li>
<li><code>pci=nomsi pci=nommconf</code>: Отключают альтернативные методы обработки прерываний PCIe<a href="https://lists.debian.org/debian-user/2010/12/msg00882.html"></a>.</li>
<li><code>console=tty0 console=ttyS0</code>: Говорят ядру дублировать вывод на обычный экран и на «виртуальный последовательный порт» — это часто сдвигает процесс с мертвой точки<a href="https://blog.gitcode.com/2ed11393511874d91bf536891afeff00.html"></a></li>
</ul>
]]></content:encoded></item><item><title>Почему родился Чебурнет?</title><link>https://dedinit.ru/2026/chebernet/</link><pubDate>Fri, 08 May 2026 15:37:42 +0300</pubDate><guid>https://dedinit.ru/2026/chebernet/</guid><description>Моя попытка разобрать тезис об ограничениях интернета, как инструмента снижения доступа к знаниям для широких народных масс, через призму исторического материализма.</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/chebernet/hero.svg" alt="Hero картинка в SVG"></figure><h3 id="1-базис-и-надстройка-техническая-инфраструктура-как-инструмент-классового-господства">1. Базис и надстройка: техническая инфраструктура как инструмент классового господства</h3>
<p>С марксистско-ленинской точки зрения, интернет — это часть производительных сил. Контроль над ним есть контроль над средством производства информации. Постановление №1667 от марта 2026 года, дающее Роскомнадзору, ФСБ и Минцифры право централизованно перенаправлять трафик и изолировать Рунет в реальном времени [1] [7], формализует переход от «защиты от внешних угроз» к <strong>системному управлению идеологическим воспроизводством</strong>.</p>
<p>Технические средства противодействия угрозам (ТСПУ) с функцией DPI (Deep Packet Inspection) — это не просто «фильтры». Это материальная база для селективного доступа к знаниям, коммуникациям и рынкам. Когда доступ к зарубежным ресурсам деградирует «незаметно» (таймауты, обрывы, замедление), это создаёт эффект естественного отбора: кто может и хочет — ищет обходные пути, кто не может — принимает новую норму.</p>
<h3 id="2-метод-лягушки-как-диалектика-постепенной-нормализации">2. «Метод лягушки» как диалектика постепенной нормализации</h3>
<p>Для себя я процесс &ldquo;регулирования&rdquo; интернета чётко ассоциирую с правильным способом варки легушек - нужно медленно поднимать температуру (вводить ограничения), а не кидать лягушек в кипяток (резко всё блокировать). В диалектическом материализме количественные изменения переходят в качественные. Последовательное введение ограничений (блокировка платформ, ограничение VPN, требование русского языка в интерфейсах, хранение метаданных 3 года) — это не хаотичные шаги, а <strong>системная стратегия формирования новой субъективности</strong>.</p>
<p>Риторика «защиты населения» выполняет функцию идеологического прикрытия. В ленинской терминологии это — <strong>буржуазный патернализм</strong>: государство позиционирует себя как «защитника» от «вредного» внешнего влияния, маскируя классовый интерес — сохранение монополии на интерпретацию реальности и предотвращение стихийной самоорганизации вне контролируемых каналов.</p>
<h3 id="3-кто-выигрывает-классовый-анализ-последствий">3. Кто выигрывает? Классовый анализ последствий</h3>
<table>
	<thead>
			<tr>
					<th>Группа</th>
					<th>Интересы</th>
					<th>Эффект изоляции</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Госаппарат и силовые структуры</td>
					<td>Контроль, предсказуемость, подавление инакомыслия</td>
					<td>Усиление инструментов мониторинга и точечного отключения [[7]]</td>
			</tr>
			<tr>
					<td>Крупный национальный капитал (ИТ, медиа, финтех)</td>
					<td>Защищённый рынок, лояльная аудитория</td>
					<td>Конкурентное преимущество перед зарубежными сервисами, но риски технологического отставания</td>
			</tr>
			<tr>
					<td>Малый бизнес и фрилансеры</td>
					<td>Доступ к глобальным инструментам и рынкам</td>
					<td>Рост издержек на обход ограничений, потеря клиентов и компетенций</td>
			</tr>
			<tr>
					<td>Рабочий класс и интеллигенция</td>
					<td>Доступ к знаниям, коммуникациям, культурному обмену</td>
					<td>Цифровое неравенство: те, кто владеет техническими навыками, сохраняют доступ; остальные — маргинализируются</td>
			</tr>
	</tbody>
</table>
<h3 id="4-противоречия-системы-диалектический-взгляд">4. Противоречия системы (диалектический взгляд)</h3>
<p>Марксизм учит видеть внутренние противоречия как двигатель развития. В политике «суверенного интернета» их несколько:</p>
<ul>
<li><strong>Технологическая зависимость</strong>: ТСПУ, системы фильтрации, оборудование для ЦМУ ССОП — часто импортного происхождения или на импортных компонентах. Изоляция усиливает уязвимость, а не снижает её.</li>
<li><strong>Экономические издержки</strong>: Ограничение доступа к глобальным сервисам снижает конкурентоспособность российской экономики, тормозит инновации, увеличивает стоимость цифровизации.</li>
<li><strong>Социальное напряжение</strong>: Постепенное сужение доступа к информации порождает не пассивность, а поиск альтернатив (зеркала, P2P-сети, офлайн-обмен). Это создаёт новые формы неформальной солидарности и знаний.</li>
<li><strong>Идеологический кризис</strong>: Чем жёстче контроль, тем выше ценность «запретного плода». Риторика защиты всё меньше убеждает, когда пользователи видят, что блокируются не только «экстремистские», но и образовательные, научные, культурные ресурсы.</li>
</ul>
<h3 id="5-вывод-не-изоляция-а-перераспределение-доступа">5. Вывод: не изоляция, а перераспределение доступа</h3>
<p>С марксистско-ленинской позиции, речь идёт не о «закрытии интернета», а о <strong>перераспределении права на доступ к производительным силам информационного общества</strong>. Государство не устраняет интернет — оно превращает его из всеобщего блага в привилегию, распределяемую по лояльности и полезности для воспроизводства существующих производственных отношений.</p>
<p>«Чебурнет» — это не технический проект, а <strong>политическая технология управления сознанием через управление инфраструктурой</strong>. И как любая такая технология, она несёт в себе семена собственного отрицания: чем сильнее давление, тем активнее ищутся пути обхода, тем острее становится противоречие между потребностями развития производительных сил и устаревающими производственными отношениями.</p>
<h3 id="5-формы-классовой-борьбы-в-цифровой-сфере">5. Формы классовой борьбы в цифровой сфере</h3>
<p>С марксистской позиции, цифровое пространство — это арена классовой борьбы. Выделяются три уровня противостояния:</p>
<p><strong>А) Борьба за средства производства информации</strong></p>
<ul>
<li>ТСПУ и ЦМУ ССОП — это материализованная воля господствующего класса контролировать производительные силы [2] [3].</li>
<li>Ответ пролетариата: децентрализованные сети (Tor, Ceno, P2P), где средство производства — вычислительные ресурсы самих пользователей. Это форма <strong>кооперации вне государственного контроля</strong>.</li>
</ul>
<p><strong>Б) Борьба за рабочее время и отчуждение</strong></p>
<ul>
<li>Блокировка инструментов (GitHub, Stack Overflow, зарубежные SaaS) увеличивает время на выполнение задач. Это скрытая форма <strong>увеличения необходимого рабочего времени</strong> за счёт снижения производительности.</li>
<li>Рост спроса на обходные пути создаёт новый сегмент «теневого цифрового труда»: настройка прокси, поддержка зеркал, обучение других. Это стихийная самоорганизация, но пока не переросшая в классовое сознание.</li>
</ul>
<p><strong>В) Идеологическая борьба: самоцензура как форма отчуждения</strong></p>
<ul>
<li>Когда пользователь начинает фильтровать свои сообщения «на всякий случай», происходит <strong>интернализация контроля</strong>. Это высшая форма отчуждения: работник сам воспроизводит условия своего подчинения.</li>
<li>Однако диалектика: чем шире блокировки, тем очевиднее их политический характер. Растёт понимание, что проблема не в «экстремизме», а в контроле.</li>
</ul>
<h3 id="6-исторические-параллели-ссср-китай-иран">6. Исторические параллели: СССР, Китай, Иран</h3>
<p><strong>СССР: цензура как административный ресурс</strong></p>
<ul>
<li>Главлит контролировал содержание, но не инфраструктуру. Это создавало «лазейки»: самиздат, зарубежные радиостанции, личные контакты.</li>
<li>Урок: контроль над содержанием без контроля над каналами передачи неэффективен в долгосрочной перспективе. Современная Россия пытается контролировать и то, и другое, но технические ограничения (децентрализация ТСПУ) создают аналогичные уязвимости [27].</li>
</ul>
<p><strong>Китай: Великий файрвол как модель зрелого контроля</strong></p>
<ul>
<li>Ключевое отличие: Китай строил контроль 20+ лет, параллельно развивая полноценные внутренние аналоги (WeChat, Baidu, Douyin) [27].</li>
<li>Россия копирует технические решения, но не создаёт привлекательных альтернатив. Результат: высокая проницаемость барьера (36–41% используют VPN против 10–15% в Китае) [27].</li>
<li>Марксистский вывод: технологический контроль без экономического базиса (конкурентных внутренних сервисов) обречён на постоянное напряжение и высокие издержки.</li>
</ul>
<p><strong>Иран: изоляция как кризисная модель</strong></p>
<ul>
<li>Иранский опыт показывает: полная изоляция возможна, но цена — технологическая стагнация, утечка мозгов, рост социального напряжения.</li>
<li>Россия движется в этом направлении, но с поправкой на размер экономики и интеграцию в глобальные цепочки. Это создаёт дополнительное противоречие: бизнес требует доступа, государство — контроля.</li>
</ul>
<h3 id="7-перспективы-диалектика-развития">7. Перспективы: диалектика развития</h3>
<p><strong>Количественные изменения</strong>:</p>
<ul>
<li>Рост числа блокировок (417 тыс. ресурсов в РФ против ~300 тыс. в Китае) [33].</li>
<li>Увеличение бюджета на контроль ($780 млн на 2025–2027) [27].</li>
<li>Расширение полномочий ФСБ и Роскомнадзора [2] [8].</li>
</ul>
<p><strong>Качественный скачок</strong> произойдёт, когда:</p>
<ol>
<li>Техническая инфраструктура контроля станет достаточно точной, чтобы минимизировать «побочный ущерб» (как в Китае).</li>
<li>Внутренние сервисы достигнут паритета с зарубежными по качеству (маловероятно в среднесрочной перспективе).</li>
<li>Общественное сознание адаптируется к новой норме (пока сопротивление растёт).</li>
</ol>
<p><strong>Вывод</strong>: политика «суверенного интернета» — это попытка решить политические задачи техническими средствами. Но диалектика материализма учит: производительные силы (интернет как глобальная сеть) вступают в конфликт с производственными отношениями (национальный контроль). Это противоречие будет обостряться, создавая условия для новых форм социальной практики — от стихийного обхода блокировок до осознанной борьбы за цифровые права.</p>
<p>Дальше приложил анализ который мне помогли состявить БЯМ:</p>
<h3 id="классовая-структура-российского-ит-сектора-в-условиях-изоляции">Классовая структура российского ИТ-сектора в условиях изоляции</h3>
<h4 id="1-материальная-база-кто-владеет-средствами-фильтрации">1. Материальная база: кто владеет средствами фильтрации</h4>
<table>
	<thead>
			<tr>
					<th>Класс</th>
					<th>Материальный интерес</th>
					<th>Положение в системе</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Государственная буржуазия</strong> (подрядчики ТСПУ, Ростелеком, СИТРОНИКС, структуры ФСБ/РКН)</td>
					<td>Бюджеты на «защиту»: 2,27 млрд ₽ на модернизацию ТСПУ в 2026 [1], рост госзакупок VPN на 73% до 17,3 млрд ₽ [19]</td>
					<td>Владеют инфраструктурой контроля, извлекают ренту из обязательной установки оборудования у операторов</td>
			</tr>
			<tr>
					<td><strong>Национальный цифровой капитал</strong> (владельцы «импортозамещённых» платформ)</td>
					<td>Защищённый рынок без конкуренции, лояльная аудитория</td>
					<td>Выигрывают от блокировок зарубежных сервисов, но зависят от государственных контрактов и регуляторных послаблений</td>
			</tr>
			<tr>
					<td><strong>Мелкая буржуазия</strong> (фрилансеры, малые студии, инди-разработчики)</td>
					<td>Доступ к глобальным инструментам (GitHub, Figma, Stripe), стабильный доход</td>
					<td>Проигрывают: рост издержек на обход блокировок, потеря зарубежных заказчиков, вынужденная миграция или уход в тень</td>
			</tr>
			<tr>
					<td><strong>ИТ-пролетариат</strong> (наёмные разработчики, сисадмины, техподдержка)</td>
					<td>Стабильная зарплата, профессиональное развитие</td>
					<td>Зарплаты стагнируют: медиана 183 тыс. ₽, рост ниже инфляции [20] [26]. Усиление эксплуатации: больше задач на поддержку обходных решений</td>
			</tr>
			<tr>
					<td><strong>Цифровой прекариат</strong> (вытесненные из формального сектора)</td>
					<td>Выживание через неформальные практики</td>
					<td>Маргинализация: работа через зеркала, крипто-оплата, риск блокировок и преследований</td>
			</tr>
	</tbody>
</table>
<h4 id="2-диалектика-рынка-обхода-как-сопротивление-становится-товаром">2. Диалектика рынка обхода: как сопротивление становится товаром</h4>
<p><strong>А) Коммодификация доступа</strong></p>
<ul>
<li>VPN-приложения загружены 9,2 млн раз в марте 2026 — в 14 раз больше, чем год назад [15].</li>
<li>Но надёжные сервисы становятся платными, требующими криптовалюты или зарубежных карт.</li>
<li><strong>Вывод</strong>: право на доступ к информации превращается в привилегию, распределяемую по платежеспособности.</li>
</ul>
<p><strong>Б) Классовая дифференциация в методах обхода</strong></p>
<table>
	<thead>
			<tr>
					<th>Метод</th>
					<th>Кто использует</th>
					<th>Материальные требования</th>
					<th>Политический потенциал</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Коммерческие VPN (Proton, Mullvad)</td>
					<td>Мелкая буржуазия, квалифицированный пролетариат</td>
					<td>5–15$/мес, зарубежная карта</td>
					<td>Низкий: централизованные сервисы уязвимы для блокировок и сбора метаданных</td>
			</tr>
			<tr>
					<td>Self-hosted (VPS + VLESS/WireGuard)</td>
					<td>ИТ-пролетариат с техническими навыками</td>
					<td>Аренда зарубежного VPS, время на настройку</td>
					<td>Средний: автономия, но индивидуализированное решение</td>
			</tr>
			<tr>
					<td>Децентрализованные сети (Tor, Ceno, IPFS)</td>
					<td>Активисты, техническая интеллигенция</td>
					<td>Вычислительные ресурсы, знания</td>
					<td>Высокий: воспроизводство средств коммуникации вне контроля</td>
			</tr>
			<tr>
					<td>Офлайн-обмен (зеркала на флешках, локальные репозитории)</td>
					<td>Прекариат, регионы с плохим интернетом</td>
					<td>Физические носители, локальные сети</td>
					<td>Потенциально высокий: создание параллельной инфраструктуры</td>
			</tr>
	</tbody>
</table>
<p><strong>В) Противоречие</strong>: каждый технический ответ государства (блокировка протокола VLESS [19]) порождает новую адаптацию, но адаптация часто остаётся индивидуальной и не перерастает в коллективную практику. Это воспроизводит атомизацию, а не солидарность.</p>
<h4 id="3-технические-методы-с-марксистской-точки-зрения">3. Технические методы с марксистской точки зрения</h4>
<p><strong>ТСПУ как овеществлённая классовая воля</strong></p>
<ul>
<li>Системы глубокой инспекции трафика (DPI) — это не нейтральные инструменты, а материализованная функция контроля над производительными силами.</li>
<li>Их установка у операторов связи — форма <strong>принудительного отчуждения</strong>: провайдер вынужден содержать оборудование, которое работает против интересов его клиентов.</li>
</ul>
<p><strong>Обход как присвоение средств производства</strong></p>
<ul>
<li>Когда пользователь настраивает собственный прокси, он фактически <strong>присваивает средство производства коммуникации</strong>.</li>
<li>Но если это делается в одиночку, результат — временное облегчение, а не изменение отношений собственности.</li>
</ul>
<p><strong>Коллективное присвоение как путь</strong></p>
<ul>
<li>Марксистский подход: технические решения должны быть направлены на <strong>обобществление инфраструктуры</strong>.</li>
<li>Примеры: кооперативные хостинги, распределённые репозитории кода, локальные зеркала образовательных ресурсов.</li>
<li>Ключевое условие: организация должна быть не технической, а социальной — через доверие, взаимопомощь, разделение труда.</li>
</ul>
<h4 id="4-вывод-изоляция-как-ускоритель-классового-расслоения">4. Вывод: изоляция как ускоритель классового расслоения</h4>
<p>Политика «суверенного интернета» не устраняет неравенство — она <strong>перекодирует его в цифровой форме</strong>:</p>
<ul>
<li>Те, кто владеет ресурсами (деньги, знания, доступ к зарубежной инфраструктуре), сохраняют мобильность.</li>
<li>Те, кто зависит от наёмного труда и государственных сервисов, оказываются в ловушке контролируемого сегмента.</li>
</ul>
<p>Диалектический материаллизм подсказывает: противоречие между глобальным характером производительных сил (интернет) и национально-ограниченными производственными отношениями (контроль) будет обостряться. Вопрос не в том, <em>можно ли</em> технически обойти блокировку, а в том, <em>кто и на каких условиях</em> получает право на доступ к знаниям и коммуникациям.</p>
<p>Источники:
[1]: <a href="https://abit.ee/ru/kiberbezopasnost/sovereign-internet-runet-roskomnadzor-internet-isolation-censorship-russia-internet-law-blocking-ru">https://abit.ee/ru/kiberbezopasnost/sovereign-internet-runet-roskomnadzor-internet-isolation-censorship-russia-internet-law-blocking-ru</a> &ldquo;Суверенный интернет в России: с 1 марта 2026 года заработал&rdquo;
[2]: <a href="https://pnz.ru/laws/s-1-marta-2026-goda-vstupayut-v-silu-novye-pravila-upravleniya-runetom-kak-teper-budet-rabotat-internet/">https://pnz.ru/laws/s-1-marta-2026-goda-vstupayut-v-silu-novye-pravila-upravleniya-runetom-kak-teper-budet-rabotat-internet/</a> &ldquo;С 1 марта 2026 года вступают в силу новые правила управления Рунетом&rdquo;
[3]: <a href="https://www.ec-rs.ru/blog/novosti/suverennyy-internet-s-1-marta-2026-tsentralizovannoe-upravlenie-blokirovki-i-usilenie-antifroda/">https://www.ec-rs.ru/blog/novosti/suverennyy-internet-s-1-marta-2026-tsentralizovannoe-upravlenie-blokirovki-i-usilenie-antifroda/</a> &ldquo;Суверенный интернет с 1 марта 2026: централизованное управление, блокировки и усиление антифрода&rdquo;
[4]: <a href="https://www.rbc.ru/technology_and_media/09/11/2025/69107d8a9a79470274160bec">https://www.rbc.ru/technology_and_media/09/11/2025/69107d8a9a79470274160bec</a> &ldquo;Власти уточнили правила вмешательства в работу Рунета — РБК&rdquo;
[5]: <a href="https://www.fontanka.ru/2026/03/10/76302889/">https://www.fontanka.ru/2026/03/10/76302889/</a> &ldquo;Российский интернет станет суверенным: отключат ли нас от глобальной сети&rdquo;
[6]: <a href="https://www.instagram.com/reel/DQ7DqSiAaq-/">https://www.instagram.com/reel/DQ7DqSiAaq-/</a> &ldquo;Постановление №1667: с 1 марта 2026 года свободного интернета в России не будет&rdquo;
[7]: <a href="https://habr.com/ru/articles/1006424/">https://habr.com/ru/articles/1006424/</a> &ldquo;Суверенный интернет: что меняется с 1 марта 2026 года и как это работает&rdquo;
[8]: <a href="https://habr.com/ru/news/771194/">https://habr.com/ru/news/771194/</a> &ldquo;Суверенному Рунету исполнилось 4 года: история закона и практика&rdquo;
[9]: <a href="https://www.zeluslugi.ru/info-czentr/stati/sut-zakona-o-suverennom-internete-v-rossii">https://www.zeluslugi.ru/info-czentr/stati/sut-zakona-o-suverennom-internete-v-rossii</a> &ldquo;Закон о суверенном интернете в России: суть и последствия&rdquo;
[10]: <a href="https://www.quora.com/How-difficult-is-it-for-someone-in-Russia-to-access-foreign-websites-and-apps">https://www.quora.com/How-difficult-is-it-for-someone-in-Russia-to-access-foreign-websites-and-apps</a> &ldquo;How difficult is it for someone in Russia to access foreign websites and apps&rdquo;
[11]: <a href="https://en.zona.media/article/2026/04/07/russian_internet_censorship_2026">https://en.zona.media/article/2026/04/07/russian_internet_censorship_2026</a> &ldquo;Russia&rsquo;s internet censorship in 2026: blackouts, broken payments, shrinking tools&rdquo;
[12]: <a href="https://www.thedailystar.net/news/world/europe/news/internet-crackdown-russia-toughens-restrictions-vpns-4152536">https://www.thedailystar.net/news/world/europe/news/internet-crackdown-russia-toughens-restrictions-vpns-4152536</a> &ldquo;Internet crackdown: Russia toughens restrictions on VPNs&rdquo;
[13]: <a href="https://habr.com/ru/news/1003760/">https://habr.com/ru/news/1003760/</a> &ldquo;СМИ: на конец февраля 2026 года Роскомнадзор ограничил доступ к 469 VPN-сервисам&rdquo;
[14]: <a href="https://meduza.io/en/news/2026/04/16/russian-telecom-companies-agree-to-freeze-expansion-of-international-network-links-to-curb-vpn-use-rbc-reports">https://meduza.io/en/news/2026/04/16/russian-telecom-companies-agree-to-freeze-expansion-of-international-network-links-to-curb-vpn-use-rbc-reports</a> &ldquo;Russian telecom companies agree to freeze expansion of international links to curb VPN use&rdquo;
[15]: <a href="https://www.fontanka.ru/2026/04/16/76370317/">https://www.fontanka.ru/2026/04/16/76370317/</a> &ldquo;Ограничения VPN в России — последние инициативы и статистика&rdquo;
[16]: <a href="https://korrespondent.net/world/russia/4660299-cheburnet-kak-v-rossyy-khotiat-yzolyrovat-ynternet">https://korrespondent.net/world/russia/4660299-cheburnet-kak-v-rossyy-khotiat-yzolyrovat-ynternet</a> &ldquo;Чебурнет: как в России хотят изолировать интернет по китайскому образцу&rdquo;
[17]: <a href="https://bb.lv/statja/v-mire/2024/03/12/ekspert-v-rf-vsyo-gotovo-dlya-izolyacii-ot-vsemirnogo-interneta-video">https://bb.lv/statja/v-mire/2024/03/12/ekspert-v-rf-vsyo-gotovo-dlya-izolyacii-ot-vsemirnogo-interneta-video</a> &ldquo;Эксперт: в РФ всё готово для изоляции от всемирного интернета&rdquo;
[18]: <a href="https://www.tbank.ru/invest/social/profile/victorkoch/d3101a8f-eea6-4a61-9958-16ca5d6e0746/">https://www.tbank.ru/invest/social/profile/victorkoch/d3101a8f-eea6-4a61-9958-16ca5d6e0746/</a> &ldquo;Как блокировки угрожают бизнесу и интернету: долгосрочные последствия изоляции&rdquo;
[19]: <a href="https://prohoster.info/blog/administrirovanie/kogda-iz-interneta-budut-delat-cheburnet-obzor-proekta">https://prohoster.info/blog/administrirovanie/kogda-iz-interneta-budut-delat-cheburnet-obzor-proekta</a> &ldquo;Когда из интернета будут делать «чебурнет»: обзор проекта и технические условия&rdquo;
[20]: <a href="https://goodlucker.ru/zakon/cheburnet.html">https://goodlucker.ru/zakon/cheburnet.html</a> &ldquo;Чебурнет: закрытый интернет в России — главные особенности и сценарии работы&rdquo;
[21]: <a href="https://club.dns-shop.ru/digest/157598-v-rossii-prinyali-pravila-pozvolyauschie-izolirovat-runet-i-filtr/">https://club.dns-shop.ru/digest/157598-v-rossii-prinyali-pravila-pozvolyauschie-izolirovat-runet-i-filtr/</a> &ldquo;В России приняли правила, позволяющие изолировать Рунет и фильтровать трафик через ТСПУ&rdquo;
[22]: <a href="https://vpnblog.ru/russian-internet-control2024/">https://vpnblog.ru/russian-internet-control2024/</a> &ldquo;Чебурнет наступает: как меняется интернет-ландшафт России в 2024&rdquo;
[23]: <a href="https://vvvtv.ru/tehnologii/internet/cheburnet/">https://vvvtv.ru/tehnologii/internet/cheburnet/</a> &ldquo;Чебурнет — уже насущная реальность: технология глубокой фильтрации трафика&rdquo;</p>
]]></content:encoded></item><item><title>Факап с конфиге WG привел к потере 6 часов жизни</title><link>https://dedinit.ru/2026/20260503-dns-routing/</link><pubDate>Sun, 03 May 2026 01:26:20 +0300</pubDate><guid>https://dedinit.ru/2026/20260503-dns-routing/</guid><description>&lt;p&gt;Расскажу про то как один параметр в кофиге Wireguard причинил мне опыт по разбору половины сетевых настроек Ubuntu. Один с виду безобидный параметр&amp;hellip; IaC блин нужен обязательно. Я просто забыл что и для чего менял, а потом уже поздно было вспоминать.&lt;/p&gt;
&lt;h2 id="симптомы-тишина-в-эфире-и-гора-dropped-пакетов"&gt;Симптомы: тишина в эфире и гора dropped пакетов&lt;/h2&gt;
&lt;p&gt;Всё началось с того, полсе смерти системного диска в моем домашнем сервере, я перестал крутить его 24/7 и набегами по выходным конифгурировал его, пытаясь вернуть привычный набор сервисом. И вот однажды включаю я сервер, а у меня проблема с системным резолвом DNS. Так-то напрямую &lt;code&gt;nslookup ya.ru 8.8.8.8&lt;/code&gt; выдает всё нормально. но система ни в какую не хочет резолвить адреса. Так-то я забыл, что неделей ранее я настраивал Wireguard со своими VPS, и что именно после настройки Wireguard сервер потерял доступ к локальной сети и интернету. начал ковырять, ИИшка подсказала что на Ubuntu надо netplan копать, начал фигачить yamlики, тут время вышло и я еще на неделю забросил комп. И вот вчера, сейчас далеко за полночь, я его включил и опять начал разбираться, естественно забыл не только то что я две недели назад делал, но и то чем неделю назад занимался. И вот картинка, сервер загрузился, подозрительно долго грузился кстати, но по сети недоступен.&lt;/p&gt;</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/20260503-dns-routing/hero.svg" alt="Факап с конфиге WG привел к потере 6 часов жизни"></figure><p>Расскажу про то как один параметр в кофиге Wireguard причинил мне опыт по разбору половины сетевых настроек Ubuntu. Один с виду безобидный параметр&hellip; IaC блин нужен обязательно. Я просто забыл что и для чего менял, а потом уже поздно было вспоминать.</p>
<h2 id="симптомы-тишина-в-эфире-и-гора-dropped-пакетов">Симптомы: тишина в эфире и гора dropped пакетов</h2>
<p>Всё началось с того, полсе смерти системного диска в моем домашнем сервере, я перестал крутить его 24/7 и набегами по выходным конифгурировал его, пытаясь вернуть  привычный набор сервисом. И вот однажды включаю я сервер, а у меня проблема с системным резолвом DNS. Так-то напрямую <code>nslookup ya.ru 8.8.8.8</code> выдает всё нормально. но система ни в какую не хочет резолвить адреса. Так-то я забыл, что неделей ранее я настраивал Wireguard со своими VPS, и что именно после настройки Wireguard сервер  потерял доступ к локальной сети и интернету. начал ковырять, ИИшка подсказала что на Ubuntu надо netplan копать, начал фигачить yamlики, тут время вышло и я еще на неделю забросил комп. И вот вчера, сейчас далеко за полночь, я его включил и опять начал разбираться, естественно забыл не только то что я две недели назад делал, но и то чем неделю назад занимался. И вот картинка, сервер загрузился, подозрительно долго грузился кстати, но по сети недоступен.</p>
<p>Первая диагностика через <code>ip -s link show</code> показала тревожную картину на интерфейсе <code>eno1</code>:</p>
<ul>
<li><strong>RX:</strong> 53 000+ пакетов принято.</li>
<li><strong>Dropped:</strong> 21 000+ пакетов отброшено.</li>
<li><strong>TX:</strong> Всего 40 пакетов отправлено.</li>
</ul>
<p>Команда <code>ip route show</code> выводила только маршрут для интерфейса <code>wg0</code>. Маршрута по умолчанию через физический интерфейс не было. Система «не видела» шлюза.</p>
<p>Команда <code>ip a</code> показала, что на всех интерфейсах, кроме loopback, ip-адреса отсутствуют.</p>
<p>Попытки перезапустить службы или применить конфигурацию через <code>sudo netplan apply</code> не давали результата. Интерфейс зависал в состоянии <code>configuring</code>, а адрес не присваивался.</p>
<h2 id="расследование-кто-виноват">Расследование: кто виноват?</h2>
<h3 id="1-конфликт-маршрутизации">1. Конфликт маршрутизации</h3>
<p>Первоначальная гипотеза была в том, что WireGuard перехватывает весь трафик. Однако в конфиге <code>wg0.conf</code> параметр <code>AllowedIPs</code> был ограничен подсетью туннеля (<code>10.8.0.0/24</code>). Он не должен был блокировать локальную сеть.</p>
<p>Проблема оказалась глубже: отсутствие маршрута по умолчанию для <code>eno1</code> означало, что ядро просто не знало, куда девать исходящие пакеты, кроме как в туннель (если бы он был активен) или в никуда.</p>
<h3 id="2-почему-dhcp-молчал">2. Почему DHCP молчал?</h3>
<p>Ubuntu 24.04 использует стек <code>systemd-networkd</code> для управления сетью на серверных сборках. Конфигурация задается через <code>Netplan</code> (YAML-файлы).</p>
<p>Проверка статуса показала:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>networkctl status eno1
</span></span><span style="display:flex;"><span>State: routable <span style="color:#ff7b72;font-weight:bold">(</span>configuring<span style="color:#ff7b72;font-weight:bold">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Статус <code>configuring</code> в сочетании с <code>routable</code> — это классический признак того, что демон ждет завершения какой-то операции. В логах <code>journalctl -u systemd-networkd</code> не было ошибок получения адреса IPv4, зато постоянно терялась аренда IPv6 (<code>DHCPv6 lease lost</code>).</p>
<p>Оказалось, что <code>systemd-networkd</code> по умолчанию пытается настроить и IPv4, и IPv6. Если сервер DHCPv6 не отвечает или есть проблемы с Router Advertisements (RA), демон может зависнуть в ожидании, блокируя переход интерфейса в полностью рабочее состояние для IPv4.</p>
<h3 id="3-долгая-загрузка">3. Долгая загрузка</h3>
<p>При перезагрузке я заметил, что система висит на этапе <code>Job systemd-networkd-wait-online.service</code>. Однако служба <code>wait-online</code> держала систему, пока сеть не поднимется. Поскольку сеть не могла подняться из-за зависшего DHCP-клиента, загрузка затягивалась.</p>
<h2 id="решение-поэтапный-демонтаж-проблем">Решение: поэтапный демонтаж проблем</h2>
<h3 id="шаг-1-отключение-ожидания-сети">Шаг 1. Отключение ожидания сети</h3>
<p>Чтобы система загружалась быстро, даже если сеть сбоит, отключил службу ожидания:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl disable systemd-networkd-wait-online.service
</span></span><span style="display:flex;"><span>sudo systemctl mask systemd-networkd-wait-online.service
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="шаг-2-отключение-ipv6">Шаг 2. Отключение IPv6</h3>
<p>Возможно проблема долгой загрузки была в ожидании ответов IPv6, а поскольку в моей инфраструктуре он пока не критичен, то я отключил его на уровне ядра. Это сузило  площадь ошибок в конфигурации <code>systemd-networkd</code>, я сосредоточился только на IPv4.</p>
<p>В <code>/etc/sysctl.conf</code> добавил:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span>net.ipv6.conf.all.disable_ipv6<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">1</span>
</span></span><span style="display:flex;"><span>net.ipv6.conf.default.disable_ipv6<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">1</span>
</span></span><span style="display:flex;"><span>net.ipv6.conf.lo.disable_ipv6<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>И применил изменения: <code>sudo sysctl -p</code>.</p>
<h3 id="шаг-3-переход-на-прямую-конфигурацию-systemd-networkd">Шаг 3. Переход на прямую конфигурацию systemd-networkd</h3>
<p>Файлы Netplan (<code>/etc/netplan/*.yaml</code>) генерируют конфиги для бэкенда. У меня их было два, и они могли конфликтовать или содержать избыточные параметры, тем более я уже и не помнил как и почему я их именно так писал. Изолировал прослойку Netplan, создав файл-заглушку <code>/etc/systemd/network/10-eno1.network</code> с настройками для  <code>systemd-networkd</code>:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">8
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#ff7b72">[Match]</span>
</span></span><span style="display:flex;"><span>Name<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">eno1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Network]</span>
</span></span><span style="display:flex;"><span>DHCP<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">ipv4</span>
</span></span><span style="display:flex;"><span>IPv6AcceptRA<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">no</span>
</span></span><span style="display:flex;"><span>DNS<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">1.1.1.1</span>
</span></span><span style="display:flex;"><span>DNS<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">8.8.8.8</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ключевой момент здесь — <code>DHCP=ipv4</code>. Тут явно говорим демону: «Используй только IPv4, игнорируй IPv6». Параметр <code>IPv6AcceptRA=no</code> дополнительно страхует от ожидания сообщений роутера.</p>
<p>Удалил старые файлы из <code>/etc/netplan/</code>, чтобы избежать двойного применения настроек, и перезапустил службу:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl restart systemd-networkd
</span></span></code></pre></td></tr></table>
</div>
</div><p>Интерфейс сразу получил адрес <code>192.168.1.3</code> и перешел в статус <code>routable (configured)</code>. Системный резолв DNS заработал.</p>
<h3 id="шаг-4-финальный-босс-dns-и-wireguard">Шаг 4. Финальный босс: DNS и WireGuard</h3>
<p>Пинги пошли, но <code>nslookup ya.ru</code> выдавал таймауты на <code>127.0.0.53</code> (локальный stub-resolver <code>systemd-resolved</code>). Вот про эту штуку я не знал, поэтому теперь знаю что не нужно поднимать на каждом сервер unbound, в systemd все есть из коробки.</p>
<p>Проверка <code>resolvectl status</code> показала странность:</p>
<ul>
<li>Link 2 (eno1): DNS Servers: 1.1.1.1, 8.8.8.8</li>
<li>Link 5 (wg0): <strong>DNS Domain: ~.</strong></li>
</ul>
<p>Правда я её не заметил сперва, но консультации с ИИ не всегда являются потерей времени. Символ <code>~.</code> означает «глобальный поиск». WireGuard, увидев в своем конфиге строку <code>DNS = 1.1.1.1</code>, автоматически сообщил системе, что этот DNS-сервер должен обрабатывать <strong>все</strong> запросы, перекрывая настройки физического интерфейса. Но так как туннель до собственных серверов и маршрутов до внешних DNS в нём нет, разрешения имен не работали.</p>
<p><strong>Решение:</strong>
В файле <code>/etc/wireguard/wg0.conf</code> я закомментировал всего лишь одну строку, как потом выяснилось добавленной в конфиг по рекомендаци такой же ИИшечки:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># DNS = 1.1.1.1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Переподнял туннель:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo wg-quick down wg0
</span></span><span style="display:flex;"><span>sudo wg-quick up wg0
</span></span></code></pre></td></tr></table>
</div>
</div><p>Теперь <code>wg0</code> имеетв выводк <code>networkctl status eno1</code> <code>Current Scopes: none</code>, а все DNS-запросы идут через основной интерфейс <code>eno1</code> на публичные серверы Cloudflare и Google.</p>
<h2 id="итоги-и-выводы">Итоги и выводы</h2>
<ol>
<li><strong>WireGuard и DNS:</strong> Параметр <code>DNS</code> в конфиге WireGuard — это не просто рекомендация, а команда для системы изменить <strong>глобальные</strong> настройки резолвинга. Если ты не хочешь, чтобы туннель перехватывал все DNS-запросы, не указывай этот параметр в конфиге клиента, либо используйте более тонкие настройки <code>Domains</code> (если клиент поддерживает).</li>
<li><strong>Ubuntu 24.04 и IPv6:</strong> По умолчанию включенный IPv6 может вызывать задержки при получении адреса IPv4, если инфраструктура не готова к v6. В домашних лабораториях его часто проще отключить, чем дебажить RA и DHCPv6.</li>
<li><strong>Netplan vs systemd-networkd:</strong> Netplan удобен, но иногда прямая конфигурация <code>systemd-networkd</code> дает больше прозрачности и контроля, особенно при отладке сложных случаев с DHCP.</li>
<li><strong>systemd-networkd-wait-online:</strong> На серверах, где сеть может падать или долго подниматься, эту службу лучше маскировать, иначе она будет тормозить загрузку всей ОС.</li>
</ol>
<p>Эта ошибка в конфиге WG стоила мне нескольких часов, но теперь моя домашняя лаборатория работает стабильно, а конфиги приведены к минимальному и понятному виду, а я узнал еще что-то новенькое про любимый Линукс.</p>
<p>(Ссылка на диалог с Qwen)[https://chat.qwen.ai/s/0cfbc11b-dae3-4dba-bfaf-b0788172d07c?fev=0.2.45]</p>
]]></content:encoded></item></channel></rss>