<?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>Netplan on dedinit()</title><link>https://dedinit.ru/tags/netplan/</link><description>Recent content in Netplan on dedinit()</description><generator>Hugo -- 0.165.0</generator><language>ru-ru</language><lastBuildDate>Sun, 03 May 2026 01:26:20 +0300</lastBuildDate><atom:link href="https://dedinit.ru/tags/netplan/index.xml" rel="self" type="application/rss+xml"/><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>