<?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>Wireguard on dedinit()</title><link>https://dedinit.ru/tags/wireguard/</link><description>Recent content in Wireguard 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/wireguard/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><item><title>Запуск wireguard для связи серверов</title><link>https://dedinit.ru/2026/%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-wireguard-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2/</link><pubDate>Thu, 05 Mar 2026 08:47:16 +0300</pubDate><guid>https://dedinit.ru/2026/%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-wireguard-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2/</guid><description>&lt;p&gt;Привет, товарищ!&lt;/p&gt;
&lt;p&gt;Сейчас я занимаюсь построением инфраструктуры для своей домашней лаборатории. В планах задействовать три сервера: один локальный машину дома и два VPS от разных провайдеров. Соответственно мне нужно организовать между ними защищенный канал связи для взаимодействия без лишних открытых наружу портов. Открыть порты сервисов наружу не хочется, поэтому лучшим решением стала виртуальная частная сеть на базе WireGuard.&lt;/p&gt;
&lt;p&gt;Я пробовал разные варианты, но пришел к выводу, что лучше всего ставить WireGuard нативно прямо на хост-систему Ubuntu. Вариант с Docker тоже возможен, но он добавляет лишнюю сложность с пробросом портов и правами доступа. Нативная установка работает быстрее, управляется через стандартный systemd и проще интегрируется с фаерволом.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Привет, товарищ!</p>
<p>Сейчас я занимаюсь построением инфраструктуры для своей домашней лаборатории. В планах задействовать три сервера: один локальный машину дома и два VPS от разных провайдеров. Соответственно мне нужно организовать между ними защищенный канал связи для взаимодействия без лишних открытых наружу портов. Открыть порты сервисов наружу не хочется, поэтому лучшим решением стала виртуальная частная сеть на базе WireGuard.</p>
<p>Я пробовал разные варианты, но пришел к выводу, что лучше всего ставить WireGuard нативно прямо на хост-систему Ubuntu. Вариант с Docker тоже возможен, но он добавляет лишнюю сложность с пробросом портов и правами доступа. Нативная установка работает быстрее, управляется через стандартный systemd и проще интегрируется с фаерволом.</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>sudo apt update
</span></span><span style="display:flex;"><span>sudo apt install wireguard wireguard-tools -y
</span></span></code></pre></td></tr></table>
</div>
</div><p>После установки проверим, что модуль ядра загружен командой wg. Если увидели справку или пустой список интерфейсов, значит все прошло успешно.</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>wg
</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><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>cd /etc/wireguard
</span></span><span style="display:flex;"><span>umask <span style="color:#a5d6ff">077</span>
</span></span><span style="display:flex;"><span>wg genkey | tee privatekey | wg pubkey &gt; publickey
</span></span></code></pre></td></tr></table>
</div>
</div><p>Сохраните содержимое файлов privatekey и publickey в надежное место. Для примера в статье я буду использовать заглушки вида PRIVATE_KEY_HERE и PUBLIC_KEY_HERE.</p>
<p>Теперь создадим конфигурацию. Допустим, мы выделили под нашу сеть подсеть 10.8.0.0/24. Серверу с белым IP адресом назначим 10.8.0.1, а клиентам адреса вроде 10.8.0.2 и 10.8.0.3.</p>
<p>На сервере с белым IP создаем файл /etc/wireguard/wg0.conf. В секции Interface указываем его приватный ключ и слушаемый порт. В секции Peer добавляем публичные ключи клиентов.</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></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">[Interface]</span>
</span></span><span style="display:flex;"><span>PrivateKey <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">SERVER_PRIVATE_KEY_HERE</span>
</span></span><span style="display:flex;"><span>Address <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10.8.0.1/24</span>
</span></span><span style="display:flex;"><span>ListenPort <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">51820</span>
</span></span><span style="display:flex;"><span>PostUp <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT</span>
</span></span><span style="display:flex;"><span>PostDown <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Peer]</span>
</span></span><span style="display:flex;"><span>PublicKey <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">CLIENT1_PUBLIC_KEY_HERE</span>
</span></span><span style="display:flex;"><span>AllowedIPs <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10.8.0.2/32</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Peer]</span>
</span></span><span style="display:flex;"><span>PublicKey <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">CLIENT2_PUBLIC_KEY_HERE</span>
</span></span><span style="display:flex;"><span>AllowedIPs <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10.8.0.3/32</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Обратите внимание на строки PostUp и PostDown. Они нужны для того, чтобы при подъеме интерфейса автоматически применялись правила фаервола, разрешающие пересылку пакетов.</p>
<p>На клиенте, который находится за NAT (например, домашний сервер), конфигурация будет проще. Ему нужно знать публичный ключ сервера и его белый IP адрес.</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></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">[Interface]</span>
</span></span><span style="display:flex;"><span>PrivateKey <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">CLIENT1_PRIVATE_KEY_HERE</span>
</span></span><span style="display:flex;"><span>Address <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10.8.0.2/24</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>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Peer]</span>
</span></span><span style="display:flex;"><span>PublicKey <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">SERVER_PUBLIC_KEY_HERE</span>
</span></span><span style="display:flex;"><span>Endpoint <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">203.0.113.10:51820</span>
</span></span><span style="display:flex;"><span>AllowedIPs <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10.8.0.0/24</span>
</span></span><span style="display:flex;"><span>PersistentKeepalive <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">25</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Параметр PersistentKeepalive важен для клиентов за натом. Он отправляет служебные пакеты каждые 25 секунд, чтобы роутер не забывал об открытом соединении.</p>
<p>Прежде чем запускать туннель, нужно подготовить сеть. На сервере обязательно включаем пересылку пакетов (IP Forwarding), иначе трафик не будет ходить между интерфейсами.</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>echo <span style="color:#a5d6ff">&#34;net.ipv4.ip_forward=1&#34;</span> | sudo tee -a /etc/sysctl.conf
</span></span><span style="display:flex;"><span>sudo sysctl -p
</span></span></code></pre></td></tr></table>
</div>
</div><p>Также нужно настроить фаервол. Если у вас активен UFW, откройте порт UDP 51820 и разрешите маршрутизацию для интерфейса wg0.</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>sudo ufw allow 51820/udp
</span></span><span style="display:flex;"><span>sudo ufw route allow in on wg0 out on wg0
</span></span><span style="display:flex;"><span>sudo ufw route allow in on wg0 out on eth0
</span></span><span style="display:flex;"><span>sudo ufw route allow in on eth0 out on wg0
</span></span></code></pre></td></tr></table>
</div>
</div><p>В командах выше замените eth0 на имя вашего основного сетевого интерфейса.</p>
<p>Теперь самый важный момент, на котором я лично споткнулся. После любого изменения файла конфигурации wg0.conf необходимо перезапускать сервис интерфейса. Правила PostUp выполняются только в момент создания интерфейса. Если вы просто отредактировали файл и забыли перезапустить службу, новые правила фаервола не применятся, и соединения не будет.</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>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>Или через системную службу:</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 wg-quick@wg0
</span></span></code></pre></td></tr></table>
</div>
</div><p>Не пренебрегайте этим шагом. Именно отсутствие перезагрузки часто приводит к тому, что интерфейс поднят, ключи верны, но пакеты теряются по пути.</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></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 enable wg-quick@wg0
</span></span></code></pre></td></tr></table>
</div>
</div><p>Для диагностики состояния туннеля используйте команду wg show. Запустите ее в режиме мониторинга, чтобы видеть изменения в реальном времени:</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>watch -n <span style="color:#a5d6ff">1</span> wg show
</span></span></code></pre></td></tr></table>
</div>
</div><p>Смотрите на поле latest handshake. Если время там постоянно обновляется (например, 5 seconds ago, 10 seconds ago), значит соединение активно и пакеты ходят. Если время застыло или указано none, значит пакеты не доходят. Проверьте фаерволы и убедитесь, что порт открыт у провайдера VPS.</p>
<p>Также проверяйте счетчики трафика transfer. Если при пинге счетчик received растет, значит пакеты доходят до интерфейса WireGuard. Если пинга нет, но трафик есть, проблема скорее всего в маршрутизации внутри системы или блокировке ICMP фаерволом.</p>
<p>В итоге вы получите безопасную сеть, где серверы видят друг друга по внутренним IP адресам. Сервисы вроде баз данных можно слушать только на интерфейсе туннеля, и они будут недоступны из внешнего интернета.</p>
<p>Удачи в построении вашей лаборатории!</p>
]]></content:encoded></item></channel></rss>