<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>network &amp;mdash; Цифровой дворник</title>
    <link>https://articles.clr58.ru/tag:network</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 01:11:26 +0000</pubDate>
    <item>
      <title>Tailscale vs ZeroTier: нужен ли дому mesh-VPN, если WireGuard уже есть</title>
      <link>https://articles.clr58.ru/tailscale-vs-zerotier</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Исходные данные&#xA;&#xA;Две площадки — «дом» и «дача». Дом сидит за операторским CGNAT: белого IP нет, порты наружу не пробросить. У дачи белый адрес есть. Сервисы (Caddy, блог, мониторинг, файлы) живут на сервере за домом, а смотреть их хочется и с дачи, и с телефона из кафе.&#xA;&#xA;Поэтому между площадками у меня самопальный WireGuard: один файл конфига, пир на пир, доведённый руками маршрут до локальной сети.&#xA;&#xA;Работает. Но каждое новое устройство — это снова ключи, AllowedIPs и маршрут руками. А ещё оба конца за NAT — и тут начинаются вопросы, которые WG сам не решает.&#xA;&#xA;Что такое mesh-VPN и почему про них вспоминают&#xA;&#xA;Mesh-VPN делает то же самое — зашифрованная сеть между узлами, — но добавляет координатора, который сам знакомит узлы, пробивает NAT и подставляет relay, если напрямую не выходит.&#xA;&#xA;Два самых популярных варианта:&#xA;&#xA;Tailscale — под капотом тот же WireGuard. Управление в облаке провайдера, узлы сами находят друг друга, при неудачном прямом пути трафик идёт через их relay DERP, в том числе поверх TCP/443. Настройка — поставить клиент и залогиниться.&#xA;ZeroTier — виртуальный Ethernet-порт поверх P2P-сети: узлы видят друг друга как в одном свитче, с broadcast и multicast. Для поиска — публичные root-серверы, а если UDP режут — отдельный TCP-relay.&#xA;&#xA;Как это ложится на нашу лабу&#xA;&#xA;Собрал честную сравнительную табличку под наши вводные — «оба конца за NAT», «хочется с телефона», «ноль внешних зависимостей».&#xA;&#xA;Самопал WG: полный контроль и никакого чужого облака. Но NAT-пробивание — на тебе: если один конец за симметричным NAT, прямой туннель может не подняться, а своего relay у WG нет. Каждое устройство — руками.&#xA;&#xA;Команды, из которых у нас сейчас и состоит туннель:&#xA;&#xA;wg setconf wg0 /etc/wireguard/wg0.conf&#xA;ip addr add 10.100.0.2/30 dev wg0&#xA;ip route add 10.0.0.0/24 dev wg0&#xA;&#xA;На роутере — только пир и проброс в туннель:&#xA;&#xA;/interface wireguard peers add interface=wg-lab allowed-address=10.100.0.2/32&#xA;/ip firewall nat add chain=dstnat protocol=tcp dst-port=443 action=dst-nat to-addresses=10.100.0.2&#xA;&#xA;Tailscale: бесплатного личного тарифа хватает с запасом — до 6 пользователей, но число устройств не ограничено. Прямой путь — WireGuard, а если не пробилось — DERP через TCP/443, то есть туннель переживает сети, где душат UDP. Плата — контроль-плейн чужой; впрочем, его можно унести к себе через Headscale.&#xA;ZeroTier: бесплатный тариф урезали до 10 устройств и одной сети — для парка «телефоны + ноутбуки + домашние железки» это впритык. Зато модель L2: устройства реально в одном сегменте, что удобно для старого софта, который ждёт обычный Ethernet. Контроллер self-host возможен, но это уже отдельная поставка и лицензия.&#xA;&#xA;Мораль&#xA;&#xA;Mesh-VPN не отменяет понимания — он прячет от тебя NAT-пробивание, relay и координатора. Пока узлов два и они твои — WireGuard руками честнее и прозрачнее. Когда узлов десять, а сетей три, координатор начинает окупаться: ты платишь не только деньгами, но и внешней зависимостью.&#xA;&#xA;Мы для двух площадок остались на самопале. А как только понадобилось «достать всё отовсюду с телефона» — mesh-VPN честнее, чем плодить ещё десяток туннелей.&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-tailscale-zerotier-digclean---9d4fb9de-3353-4785-bfc2-6dcf50096cb5.jpg" alt="Обложка"></p>

<h2 id="исходные-данные">Исходные данные</h2>

<p>Две площадки — «дом» и «дача». Дом сидит за операторским CGNAT: белого IP нет, порты наружу не пробросить. У дачи белый адрес есть. Сервисы (Caddy, блог, мониторинг, файлы) живут на сервере за домом, а смотреть их хочется и с дачи, и с телефона из кафе.</p>

<p>Поэтому между площадками у меня самопальный WireGuard: один файл конфига, пир на пир, доведённый руками маршрут до локальной сети.</p>

<p>Работает. Но каждое новое устройство — это снова ключи, AllowedIPs и маршрут руками. А ещё оба конца за NAT — и тут начинаются вопросы, которые WG сам не решает.</p>

<h2 id="что-такое-mesh-vpn-и-почему-про-них-вспоминают">Что такое mesh-VPN и почему про них вспоминают</h2>

<p>Mesh-VPN делает то же самое — зашифрованная сеть между узлами, — но добавляет координатора, который сам знакомит узлы, пробивает NAT и подставляет relay, если напрямую не выходит.</p>

<p>Два самых популярных варианта:</p>
<ul><li><strong>Tailscale</strong> — под капотом тот же WireGuard. Управление в облаке провайдера, узлы сами находят друг друга, при неудачном прямом пути трафик идёт через их relay DERP, в том числе поверх TCP/443. Настройка — поставить клиент и залогиниться.</li>
<li><strong>ZeroTier</strong> — виртуальный Ethernet-порт поверх P2P-сети: узлы видят друг друга как в одном свитче, с broadcast и multicast. Для поиска — публичные root-серверы, а если UDP режут — отдельный TCP-relay.</li></ul>

<h2 id="как-это-ложится-на-нашу-лабу">Как это ложится на нашу лабу</h2>

<p>Собрал честную сравнительную табличку под наши вводные — «оба конца за NAT», «хочется с телефона», «ноль внешних зависимостей».</p>
<ul><li><strong>Самопал WG:</strong> полный контроль и никакого чужого облака. Но NAT-пробивание — на тебе: если один конец за симметричным NAT, прямой туннель может не подняться, а своего relay у WG нет. Каждое устройство — руками.</li></ul>

<p>Команды, из которых у нас сейчас и состоит туннель:</p>

<pre><code class="language-bash">wg setconf wg0 /etc/wireguard/wg0.conf
ip addr add 10.100.0.2/30 dev wg0
ip route add 10.0.0.0/24 dev wg0
</code></pre>

<p>На роутере — только пир и проброс в туннель:</p>

<pre><code class="language-bash">/interface wireguard peers add interface=wg-lab allowed-address=10.100.0.2/32
/ip firewall nat add chain=dstnat protocol=tcp dst-port=443 action=dst-nat to-addresses=10.100.0.2
</code></pre>
<ul><li><strong>Tailscale:</strong> бесплатного личного тарифа хватает с запасом — до 6 пользователей, но число устройств не ограничено. Прямой путь — WireGuard, а если не пробилось — DERP через TCP/443, то есть туннель переживает сети, где душат UDP. Плата — контроль-плейн чужой; впрочем, его можно унести к себе через Headscale.</li>
<li><strong>ZeroTier:</strong> бесплатный тариф урезали до 10 устройств и одной сети — для парка «телефоны + ноутбуки + домашние железки» это впритык. Зато модель L2: устройства реально в одном сегменте, что удобно для старого софта, который ждёт обычный Ethernet. Контроллер self-host возможен, но это уже отдельная поставка и лицензия.</li></ul>

<h2 id="мораль">Мораль</h2>

<p>Mesh-VPN не отменяет понимания — он прячет от тебя NAT-пробивание, relay и координатора. Пока узлов два и они твои — WireGuard руками честнее и прозрачнее. Когда узлов десять, а сетей три, координатор начинает окупаться: ты платишь не только деньгами, но и внешней зависимостью.</p>

<p>Мы для двух площадок остались на самопале. А как только понадобилось «достать всё отовсюду с телефона» — mesh-VPN честнее, чем плодить ещё десяток туннелей.</p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/tailscale-vs-zerotier</guid>
      <pubDate>Sat, 19 Sep 2026 03:44:53 +0000</pubDate>
    </item>
    <item>
      <title>Когда L2TP падает в 3 ночи: как Uptime Kuma не даёт мне ослепнуть</title>
      <link>https://articles.clr58.ru/kuma-tunnels</link>
      <description>&lt;![CDATA[Что будет, если L2TP‑туннель между роутерами умрёт в три часа ночи, а ты узнаешь об этом через неделю?&#xA;&#xA;Ничего хорошего. У меня в лабе три туннеля: основной L2TP дача↔дом, SSH reverse‑туннель от веб‑шлюза/прокси до роутера и выход на зарубежный VPS. Каждый — своя точка отказа, и все живут за NAT. Без мониторинга — ты просто слеп.&#xA;&#xA;Решение — поставить Uptime Kuma в отдельном контейнере. У меня 16 мониторов и алерты в Telegram. Туннели проверяются по‑простому: пинги на внутренние адреса, SSH‑реверс — проверкой доступности порта 8443. Не отвечает дольше N секунд — прилетает сообщение в телегу.&#xA;&#xA;Живые цифры: основной L2TP сейчас подключен, аптайм 3д19ч54м, IPsec cbc(aes)+hmac(sha1), MTU 1400, keepalive 60с. Дальняя сторона — hAP ac lite с 64MB RAM и MIPS 650MHz за NAT. Железо на пределе, а туннель держит.&#xA;&#xA;Мораль простая: если туннель живёт за NAT на роутере с 64MB памяти, мониторинг — не роскошь, а необходимость. Дороже всего знать, что всё ок.&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~10k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#monitoring #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Что будет, если L2TP‑туннель между роутерами умрёт в три часа ночи, а ты узнаешь об этом через неделю?</p>

<p>Ничего хорошего. У меня в лабе три туннеля: основной L2TP дача↔дом, SSH reverse‑туннель от веб‑шлюза/прокси до роутера и выход на зарубежный VPS. Каждый — своя точка отказа, и все живут за NAT. Без мониторинга — ты просто слеп.</p>

<p>Решение — поставить Uptime Kuma в отдельном контейнере. У меня 16 мониторов и алерты в Telegram. Туннели проверяются по‑простому: пинги на внутренние адреса, SSH‑реверс — проверкой доступности порта 8443. Не отвечает дольше N секунд — прилетает сообщение в телегу.</p>

<p>Живые цифры: основной L2TP сейчас подключен, аптайм 3д19ч54м, IPsec cbc(aes)+hmac(sha1), MTU 1400, keepalive 60с. Дальняя сторона — hAP ac lite с 64MB RAM и MIPS 650MHz за NAT. Железо на пределе, а туннель держит.</p>

<p>Мораль простая: если туннель живёт за NAT на роутере с 64MB памяти, мониторинг — не роскошь, а необходимость. Дороже всего знать, что всё ок.</p>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~10k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:monitoring" class="hashtag"><span>#</span><span class="p-category">monitoring</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/kuma-tunnels</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:50 +0000</pubDate>
    </item>
    <item>
      <title>Маршруты‑зомби: как субагент спас мой YouTube за минуту</title>
      <link>https://articles.clr58.ru/subagent-routes</link>
      <description>&lt;![CDATA[Боль&#xA;Разбирал конфиги двух MikroTik‑роутеров в двух точках (дом и дача). Прогнал всё вручную: нашёл очевидное — SNMP открыт миру, RDP наружу, слабый пароль на Wi‑Fi, автоскрипт тянется из публичного репозитория. Красота для чек‑листа. И всё же я прошёл мимо главного.&#xA;&#xA;Решение&#xA;Подал те же конфиги в независимую ИИ‑сессию — мой «субагент». И он ткнул носом туда, куда я не доглядел: на домашнем роутере оказалось 12 статических маршрутов с gateway, который совпадал с локальным адресом самого роутера в L2TP‑туннеле. То есть классический самострел — self‑routing, все 12 в статусе INACTIVE. Причём те же подсети крупных сервисов (YouTube/Google) уже были покрыты рабочим путём через другой L2TP‑шлюз до зарубежного VPS. Дубли чистой воды.&#xA;&#xA;Живые цифры&#xA;Проверил руками на роутере — субагент прав. Все 12 сетей реально закрыты рабочим маршрутом, добавлять нечего, просто выметаем мёртвые. Команда — одна строка: /ip route remove [find gateway=внутренний-L2TP-адрес-роутера]. Минутное дело — и таблица дышит: всего маршрутов было 147, стало 135. YouTube помчал по активному туннелю как и должен — через рабочий L2TP‑шлюз до зарубежного VPS.&#xA;&#xA;Вывод&#xA;Два мозга видят по‑разному. Я выловил явные дыры в безопасности, субагент — 12 маршрутов‑зомби. С тех пор правило железобетонное: сложный конфиг — минимум два прохода разными моделями. Независимая проверка окупается именно в такие моменты.&#xA;&#xA;---&#xA;&#xA;Технические детали&#xA;Роутер: MikroTik hAP ac lite (RB952Ui-5ac2nD), RouterOS 7.21.3&#xA;Мёртвые маршруты: 12 шт., все INACTIVE, gateway = внутренний L2TP‑адрес самого роутера (self‑routing к даче)&#xA;Затронутые сети: 12 публичных префиксов крупных сервисов (YouTube/Google), уже дублировались рабочим маршрутом&#xA;Живой шлюз: внутренний адрес L2TP‑туннеля до зарубежного VPS — покрывает все 12 сетей&#xA;Команда чистки: /ip route remove [find gateway=внутренний-L2TP-адрес-роутера] (бэкап before-routes-clean сделан заранее)&#xA;После чистки: всего маршрутов 147 → 135, YouTube ACTIVE через рабочий L2TP‑шлюз&#xA;Оценка субагента: ~50 кандидатов в «мёртвые» с дублями через рабочий шлюз; уникально мёртвых через локальный L2TP‑адрес — 12&#xA;&#xA;📊 Метрики поста: ~3k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль
Разбирал конфиги двух MikroTik‑роутеров в двух точках (дом и дача). Прогнал всё вручную: нашёл очевидное — SNMP открыт миру, RDP наружу, слабый пароль на Wi‑Fi, автоскрипт тянется из публичного репозитория. Красота для чек‑листа. И всё же я прошёл мимо главного.</p>

<p>Решение
Подал те же конфиги в независимую ИИ‑сессию — мой «субагент». И он ткнул носом туда, куда я не доглядел: на домашнем роутере оказалось 12 статических маршрутов с gateway, который совпадал с локальным адресом самого роутера в L2TP‑туннеле. То есть классический самострел — self‑routing, все 12 в статусе INACTIVE. Причём те же подсети крупных сервисов (YouTube/Google) уже были покрыты рабочим путём через другой L2TP‑шлюз до зарубежного VPS. Дубли чистой воды.</p>

<p>Живые цифры
Проверил руками на роутере — субагент прав. Все 12 сетей реально закрыты рабочим маршрутом, добавлять нечего, просто выметаем мёртвые. Команда — одна строка: <code>/ip route remove [find gateway=&lt;внутренний-L2TP-адрес-роутера&gt;]</code>. Минутное дело — и таблица дышит: всего маршрутов было 147, стало 135. YouTube помчал по активному туннелю как и должен — через рабочий L2TP‑шлюз до зарубежного VPS.</p>

<p>Вывод
Два мозга видят по‑разному. Я выловил явные дыры в безопасности, субагент — 12 маршрутов‑зомби. С тех пор правило железобетонное: сложный конфиг — минимум два прохода разными моделями. Независимая проверка окупается именно в такие моменты.</p>

<hr>

<p>Технические детали
– Роутер: MikroTik hAP ac lite (RB952Ui-5ac2nD), RouterOS 7.21.3
– Мёртвые маршруты: 12 шт., все INACTIVE, gateway = внутренний L2TP‑адрес самого роутера (self‑routing к даче)
– Затронутые сети: 12 публичных префиксов крупных сервисов (YouTube/Google), уже дублировались рабочим маршрутом
– Живой шлюз: внутренний адрес L2TP‑туннеля до зарубежного VPS — покрывает все 12 сетей
– Команда чистки: <code>/ip route remove [find gateway=&lt;внутренний-L2TP-адрес-роутера&gt;]</code> (бэкап <code>before-routes-clean</code> сделан заранее)
– После чистки: всего маршрутов 147 → 135, YouTube ACTIVE через рабочий L2TP‑шлюз
– Оценка субагента: ~50 кандидатов в «мёртвые» с дублями через рабочий шлюз; уникально мёртвых через локальный L2TP‑адрес — 12</p>

<p>📊 Метрики поста: ~3k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/subagent-routes</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>Три субагента, три модели и одна мина под NAT: как ролевой аудит уделал меня</title>
      <link>https://articles.clr58.ru/role-audit</link>
      <description>&lt;![CDATA[Боль. Сел разбирать конфиги двух наших MikroTik-роутеров. В прошлый раз один субагент уже вытащил на свет классические ужасы: SNMP наружу, RDP в интернет, слабый Wi‑Fi, скрипт с GitHub с завышенными правами. Но чувство «что-то ещё не так» не отпускало. Решил пойти в атаку иначе — ролевым аудитом.&#xA;&#xA;Решение. Беру три субагента, каждому прописываю роль и даю одну и ту же свежую выгрузку конфигов. И — важно — каждому свою модель:&#xA;&#xA;🕸 Сетевой инженер → DeepSeek Flash&#xA;🛡 Специалист по безопасности → gpt-4o-mini&#xA;⚙️ Системный администратор → DeepSeek Pro&#xA;&#xA;Все трое смотрят на один и тот же зоопарк правил. И вот где всплыли призраки.&#xA;&#xA;Сетевой инженер выстрелил первым — нашёл то, что раньше пролетало мимо:&#xA;🔴 DHCP-клиент defconf висит на WAN рядом с PPPoE. Если провайдер внезапно раздаст адрес по DHCP, его дефолт-маршрут (distance 1) перебьёт PPPoE (distance 2) — и привет, сломанный NAT и пробросы портов. Мина под NAT, тикает тихо.&#xA;🔴 Мёртвый маршрут до PVE‑lab — шлюз не существует ни в одной подключённой сети, маршрут INACTIVE, через него лаба не ходит.&#xA;🟡 Около 110 «немых» маршрутов‑дублей без комментариев — старый дамп перекрывается новыми. Дедупликация схлопнет таблицу на 25–30%.&#xA;🟡 Мусор через VPN: multicast (multicast-диапазоны) прогнан через L2TP — бессмысленно; ещё и RFC1918‑сеть через VPN конфликтует, плюс широкие блоки /8 и /12 в туннеле с MTU 1400.&#xA;🟡 Неиспользуемый туннель vpn‑office — висит без маршрутов, без NAT, с выключенными правилами.&#xA;&#xA;Администратор (DeepSeek Pro) добавил прицельно в «нагрузку и мусор»:&#xA;🟡 BFD включён на всех интерфейсах, а BGP/OSPF вообще не настроены — пустые hello‑пакеты только грузят CPU.&#xA;🟡 Address‑list для YouTube = 496 записей на роутере с 64 MB RAM, обновляется скриптом каждые 12 часов — и не используется ни одним правилом!&#xA;🟡 DHCP lease‑time = 10m — клиенты переподтверждаются фактически каждые 5 минут, лишний broadcast для слабого MIPS.&#xA;🟡 Включён авто‑шаринг SMB на самом роутере — лишний вектор в LAN.&#xA;&#xA;Безопасник (gpt‑4o‑mini) подтвердил старые дыры и подкинул деталей: проброс RDP целится в хост с динамическим DHCP‑лизом — адрес сменится, а проброс молча уедет к соседу; у GitHub‑скрипта политика с флагами reboot/password/sensitive — жирнее некуда.&#xA;&#xA;Итог: +10 новых находок к прошлому аудиту. Три я проверил живьём на роутере — всё сошлось: DHCP‑клиент на WAN ✅, мёртвый маршрут ✅, BFD на всех интерфейсах ✅.&#xA;&#xA;Вывод. Один ИИ — хорошо, а три ролевых на разных моделях — заметно лучше. Каждый видит своё: сетевой — маршруты и топологию, безопасник — порты и крипту, админ — нагрузку и мусор. Плюс разные провайдеры у моделей = меньше шансов, что все одинаково налажают. Беру в стандарт: роли × модели × живая проверка.&#xA;&#xA;---&#xA;&#xA;Бонус‑история: локальные gemma без tools (или почему «прогнать на gemma» не равно «оно правда работало локально»)&#xA;&#xA;Захотел прогнать те же три роли на локальных моделях — gemma3:12b и gemma3:4b (у нас Radeon 760M + ROCm). И тут под капотом всплыла важная деталь: ollama 0.32.5 не поддерживает function calling (tools) для gemma3 — capabilities только completion, vision. А субагентский режим без tools слепой: ни прочитать файлы, ни exec.&#xA;&#xA;Практика:&#xA;Раньше «субагенты на gemma» тихо работали на DeepSeek Pro — OpenClaw при ошибке молча делал failover на основную модель. Итог: анализ «за 12b» стоил $0.19 на DeepSeek Pro. Классика: думаешь, что локально, а реально жжёшь облако 😄&#xA;gemma3:4b падает с FailoverError: provider rejected the request schema or tool payload.&#xA;&#xA;Лекарство — прямой прогон через ollama API. Берём конфиги, даём системный промпт роли и шлём в /api/chat напрямую. Без tools — зато честно на gemma. 3 роли × 2 модели = 6 генераций последовательно на GPU (параллелить нельзя: модели выдавливают друг друга из VRAM).&#xA;&#xA;Мораль №2: проверяйте, кто реально делает работу. Если в доках у модели чего‑то «нет», не верьте отчёту — проверьте руками. Отсутствие tools у локалок — не приговор, а повод идти через прямой API.&#xA;&#xA;---&#xA;&#xA;Технические детали&#xA;&#xA;Роутеры: роутер на даче (hEX E50UG, 512 MB), домашний роутер (hAP ac lite, 64 MB MIPS)&#xA;Модели субагентов: deepseek‑v4‑flash (net), openai/gpt‑4o‑mini (sec), deepseek‑v4‑pro (adm)&#xA;Конфиги: backups/mikrotik/r1‑export‑20260805.rsc (1174 стр.), backups/mikrotik/dom‑export‑20260805.rsc (974 стр.)&#xA;Полное сравнение: backups/mikrotik/AUDIT‑COMPARE‑20260805.md&#xA;Подтверждено живьём: /ip dhcp‑client print (клиент searching), /ip route print (проблемный маршрут INACTIVE), /routing bfd configuration print (interfaces=all)&#xA;Заодно за день: BGP/OSPF off (CPU 99% → 15%), DNS static 231 → 0, удалены 12 мёртвых маршрутов на внутренний хост&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль. Сел разбирать конфиги двух наших MikroTik-роутеров. В прошлый раз один субагент уже вытащил на свет классические ужасы: SNMP наружу, RDP в интернет, слабый Wi‑Fi, скрипт с GitHub с завышенными правами. Но чувство «что-то ещё не так» не отпускало. Решил пойти в атаку иначе — ролевым аудитом.</p>

<p>Решение. Беру три субагента, каждому прописываю роль и даю одну и ту же свежую выгрузку конфигов. И — важно — каждому свою модель:</p>
<ul><li>🕸 Сетевой инженер → DeepSeek Flash</li>
<li>🛡 Специалист по безопасности → gpt-4o-mini</li>
<li>⚙️ Системный администратор → DeepSeek Pro</li></ul>

<p>Все трое смотрят на один и тот же зоопарк правил. И вот где всплыли призраки.</p>

<p>Сетевой инженер выстрелил первым — нашёл то, что раньше пролетало мимо:
1. 🔴 DHCP-клиент defconf висит на WAN рядом с PPPoE. Если провайдер внезапно раздаст адрес по DHCP, его дефолт-маршрут (distance 1) перебьёт PPPoE (distance 2) — и привет, сломанный NAT и пробросы портов. Мина под NAT, тикает тихо.
2. 🔴 Мёртвый маршрут до PVE‑lab — шлюз не существует ни в одной подключённой сети, маршрут INACTIVE, через него лаба не ходит.
3. 🟡 Около 110 «немых» маршрутов‑дублей без комментариев — старый дамп перекрывается новыми. Дедупликация схлопнет таблицу на 25–30%.
4. 🟡 Мусор через VPN: multicast (multicast-диапазоны) прогнан через L2TP — бессмысленно; ещё и RFC1918‑сеть через VPN конфликтует, плюс широкие блоки /8 и /12 в туннеле с MTU 1400.
5. 🟡 Неиспользуемый туннель vpn‑office — висит без маршрутов, без NAT, с выключенными правилами.</p>

<p>Администратор (DeepSeek Pro) добавил прицельно в «нагрузку и мусор»:
– 🟡 BFD включён на всех интерфейсах, а BGP/OSPF вообще не настроены — пустые hello‑пакеты только грузят CPU.
– 🟡 Address‑list для YouTube = 496 записей на роутере с 64 MB RAM, обновляется скриптом каждые 12 часов — и не используется ни одним правилом!
– 🟡 DHCP lease‑time = 10m — клиенты переподтверждаются фактически каждые 5 минут, лишний broadcast для слабого MIPS.
– 🟡 Включён авто‑шаринг SMB на самом роутере — лишний вектор в LAN.</p>

<p>Безопасник (gpt‑4o‑mini) подтвердил старые дыры и подкинул деталей: проброс RDP целится в хост с динамическим DHCP‑лизом — адрес сменится, а проброс молча уедет к соседу; у GitHub‑скрипта политика с флагами reboot/password/sensitive — жирнее некуда.</p>

<p>Итог: +10 новых находок к прошлому аудиту. Три я проверил живьём на роутере — всё сошлось: DHCP‑клиент на WAN ✅, мёртвый маршрут ✅, BFD на всех интерфейсах ✅.</p>

<p>Вывод. Один ИИ — хорошо, а три ролевых на разных моделях — заметно лучше. Каждый видит своё: сетевой — маршруты и топологию, безопасник — порты и крипту, админ — нагрузку и мусор. Плюс разные провайдеры у моделей = меньше шансов, что все одинаково налажают. Беру в стандарт: роли × модели × живая проверка.</p>

<hr>

<h2 id="бонус-история-локальные-gemma-без-tools-или-почему-прогнать-на-gemma-не-равно-оно-правда-работало-локально">Бонус‑история: локальные gemma без tools (или почему «прогнать на gemma» не равно «оно правда работало локально»)</h2>

<p>Захотел прогнать те же три роли на локальных моделях — gemma3:12b и gemma3:4b (у нас Radeon 760M + ROCm). И тут под капотом всплыла важная деталь: ollama 0.32.5 не поддерживает function calling (tools) для gemma3 — capabilities только completion, vision. А субагентский режим без tools слепой: ни прочитать файлы, ни exec.</p>

<p>Практика:
– Раньше «субагенты на gemma» тихо работали на DeepSeek Pro — OpenClaw при ошибке молча делал failover на основную модель. Итог: анализ «за 12b» стоил $0.19 на DeepSeek Pro. Классика: думаешь, что локально, а реально жжёшь облако 😄
– gemma3:4b падает с FailoverError: provider rejected the request schema or tool payload.</p>

<p>Лекарство — прямой прогон через ollama API. Берём конфиги, даём системный промпт роли и шлём в /api/chat напрямую. Без tools — зато честно на gemma. 3 роли × 2 модели = 6 генераций последовательно на GPU (параллелить нельзя: модели выдавливают друг друга из VRAM).</p>

<p>Мораль №2: проверяйте, кто реально делает работу. Если в доках у модели чего‑то «нет», не верьте отчёту — проверьте руками. Отсутствие tools у локалок — не приговор, а повод идти через прямой API.</p>

<hr>

<h2 id="технические-детали">Технические детали</h2>
<ul><li>Роутеры: роутер на даче (hEX E50UG, 512 MB), домашний роутер (hAP ac lite, 64 MB MIPS)</li>
<li>Модели субагентов: deepseek‑v4‑flash (net), openai/gpt‑4o‑mini (sec), deepseek‑v4‑pro (adm)</li>
<li>Конфиги: backups/mikrotik/r1‑export‑20260805.rsc (1174 стр.), backups/mikrotik/dom‑export‑20260805.rsc (974 стр.)</li>
<li>Полное сравнение: backups/mikrotik/AUDIT‑COMPARE‑20260805.md</li>
<li>Подтверждено живьём: /ip dhcp‑client print (клиент searching), /ip route print (проблемный маршрут INACTIVE), /routing bfd configuration print (interfaces=all)</li>
<li>Заодно за день: BGP/OSPF off (CPU 99% → 15%), DNS static 231 → 0, удалены 12 мёртвых маршрутов на внутренний хост</li></ul>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/role-audit</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>21 моделей против одного роутера: кто расколол конфиг быстрее пинга</title>
      <link>https://articles.clr58.ru/14-models-audit</link>
      <description>&lt;![CDATA[Боль: живёшь с одним роутером — а в нём мост из костылей, маршруты-призраки и правила firewall, которые давно смотрят в никуда. Сколько глаз нужно, чтобы увидеть всё сразу?&#xA;&#xA;Решение: дал всем одинаковый экзамен. Один и тот же реальный конфиг MikroTik (14.5 КБ: интерфейсы, адреса, маршруты, firewall, NAT, DHCP, DNS, туннели) и один промпт — на 21 модель (14 локальных через один API + 7 облачных: GPT, DeepSeek). Попросил:&#xA;1) описать устройство и топологию,&#xA;2) найти до 5 проблем,&#xA;3) предложить, что пинговать для проверки.&#xA;Потом сверил ответы с живыми пингами с самого роутера.&#xA;&#xA;Результат — как в жизни: кто-то гений, кто-то галлюцинирует, а трое молчат, пока им не дашь больше токенов.&#xA;&#xA;🏆 Лучшие находки (совпали с реальностью)&#xA;&#xA;DHCP-клиент на WAN-порту рядом с PPPoE — если провайдер вдруг выдаст адрес, дефолт-маршрут (distance 1) перебьёт PPPoE и сломает NAT. Нашёл только GPT-5. Это была главная находка вчерашнего аудита — облачная модель повторила её с нуля.&#xA;&#xA;Множественные подсети в одном bridge — три разные /24 на одном мосту. Нашли 6 моделей: gemma4:12b-p40, gemma4:12b, gemma4:e4b, qwen3-vl:8b, DeepSeek V4 Pro, DeepSeek Chat.&#xA;&#xA;Мёртвый маршрут до лаборатории — маршрут на тестовую /24 через несуществующий шлюз. Вспомнил qwen3-coder:latest — и предложил именно его пинговать.&#xA;&#xA;Маршруты «сам в себя» через адрес в туннельной подсети — 12 мёртвых маршрутов, которые мы чистили вчера. Нашли: qwen3-vl:8b-p40, DeepSeek Chat, GPT-5.&#xA;&#xA;check-gateway=none на куче маршрутов — роутер не проверяет шлюзы, мёртвые маршруты висят вечно. Заметил qwen2.5:14b.&#xA;&#xA;Несуществующий address-list wan-mgmt — на него ссылается firewall. Нашёл DeepSeek V4 Pro.&#xA;&#xA;💀 Кто облажался&#xA;&#xA;Три локальные thinking-модели вернули пустой ответ (qwen3:30b, qwen3-vl:8b, deepseek-r1:14b) — не потому что сломаны: весь лимит токенов ушёл в скрытые размышления, а финальный ответ не влез. С maxtokens=16000 все три заговорили. Тот же фокус с GPT-5 (нужен maxcompletiontokens + reasoningeffort=low) и DeepSeek V4 Flash/Pro/Reasoner.&#xA;&#xA;deepseek-coder:6.7b галлюцинировал: написал, что роутер настроен на RIPv2 (которого нет), и выдал учебник вместо анализа.&#xA;&#xA;qwen2.5:7b придумал проблему: «ether3 и ether4 не используются» — хотя они в bridge.&#xA;&#xA;llama3.1:8b-instruct-q4KM упал с 500 — не пережил конфиг.&#xA;&#xA;✅ Сверка с реальностью&#xA;&#xA;Модели предложили пинговать: публичный DNS, WAN у меня дома, WAN в офисе, шлюзы LAN, адреса туннелей. Я пропинговал всё с роутера:&#xA;Интернет, дом, офис, LAN — ✅ отвечают&#xA;Два адреса в туннельной сети — ❌ 100% loss&#xA;&#xA;Совпало с подозрениями моделей: именно туннельные адреса они помечали проблемными.&#xA;&#xA;🥇 Итоговый пьедестал&#xA;&#xA;1) GPT-5 — самая глубокая (нашла то, что другие не увидели)  &#xA;2) DeepSeek V4 Pro — сильный анализ, 16K reasoning  &#xA;3) gemma3:latest — лучшая локальная, 4.2K разбора бесплатно&#xA;&#xA;💰 Сколько это стоило&#xA;&#xA;Весь эксперимент — ~$0.23: 148K токенов промпта + 70K вывода, 30 запросов.&#xA;&#xA;GPT-5 — $0.14&#xA;DeepSeek V4 Pro — $0.05&#xA;GPT-4o — $0.02&#xA;DeepSeek Reasoner/Flash, Chat, GPT-4o mini — ~$0.01&#xA;Локальные 14 моделей — $0.00 (квота)&#xA;&#xA;Локальные не берут денег, но сожгли 91K токенов дневной квоты одним прогоном. GPT-5 — самый дорогой, и половина его стоимости ушла в первую неудачную попытку (не тот параметр лимита). Урок: дешевле сначала прочитать документацию, чем платить за ошибку 😄&#xA;&#xA;Мораль&#xA;&#xA;Разные модели — разные глаза. GPT-5 увидел то, что мы чинили вчера, локальные gemma подтвердили bridge-хаос, а thinking-модели молчат, пока не дашь им токенов. Ни одна не нашла всё, но вместе покрыли почти все реальные проблемы.&#xA;&#xA;И главное: пустой ответ модели — это не всегда «модель сломана», часто это «не хватило лимита на размышления». Прежде чем списывать — подними maxtokens.&#xA;&#xA;---&#xA;&#xA;Технические детали (для поста/комментариев)&#xA;&#xA;Локальные (14): gemma4:12b-p40, qwen3-vl:8b-p40, gemma4:12b, qwen3-vl:8b, gemma4:e4b, gemma3:latest, qwen3-coder:latest, qwen3:30b, qwen2.5:14b, qwen2.5:14b-instruct, qwen2.5:7b, deepseek-r1:14b, deepseek-coder:6.7b, llama3.1:8b&#xA;Облачные (7): GPT-5, GPT-4o, GPT-4o mini, DeepSeek V4 Flash, V4 Pro, Reasoner, Chat (V3)&#xA;Конфиг: 14.5KB, все ключевые секции&#xA;Пустые при малом лимите: qwen3:30b, qwen3-vl:8b, deepseek-r1:14b, DS V4 Flash/Pro/Reasoner, GPT-5 → все ожили с maxtokens≥16000 (gpt-5: maxcompletiontokens + reasoning_effort=low)&#xA;Время: ~30 минут на весь прогон&#xA;Живые пинги: публичный DNS ✅, WAN дома ✅, WAN офиса ✅, LAN ✅, два адреса в туннеле ❌&#xA;&#xA;💰 Стоимость эксперимента&#xA;&#xA;Всего: ~$0.23 (148K токенов промпт + 70K completion, 30 попыток)&#xA;&#xA;| Модель/группа | Промпт | Вывод | Попытки | Стоимость |&#xA;|---|---:|---:|---:|---:|&#xA;| GPT-5 | 9,898 | 12,875 | 2 | $0.1411 |&#xA;| DeepSeek V4 Pro | 10,386 | 10,103 | 2 | $0.0532 |&#xA;| GPT-4o | 4,950 | 867 | 1 | $0.0210 |&#xA;| DeepSeek Reasoner | 10,544 | 7,905 | 2 | $0.0063 |&#xA;| DeepSeek V4 Flash | 10,544 | 10,489 | 2 | $0.0044 |&#xA;| DeepSeek Chat (V3) | 5,193 | 1,597 | 1 | $0.0021 |&#xA;| GPT-4o mini | 4,950 | 827 | 1 | $0.0012 |&#xA;| Локальные (14) | 91,489 | 25,692 | 16 | $0.00 (квота) |&#xA;&#xA;Нюансы: локальные жгут дневную квоту токенов (91K промпт за прогон), но не деньги. GPT-5 самый дорогой ($0.14), из них первая неудачная попытка сожгла ~$0.10 впустую. Весь эксперимент дешевле кофе.&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — если не знаешь, напиши ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль: живёшь с одним роутером — а в нём мост из костылей, маршруты-призраки и правила firewall, которые давно смотрят в никуда. Сколько глаз нужно, чтобы увидеть всё сразу?</p>

<p>Решение: дал всем одинаковый экзамен. Один и тот же реальный конфиг MikroTik (14.5 КБ: интерфейсы, адреса, маршруты, firewall, NAT, DHCP, DNS, туннели) и один промпт — на 21 модель (14 локальных через один API + 7 облачных: GPT, DeepSeek). Попросил:
1) описать устройство и топологию,
2) найти до 5 проблем,
3) предложить, что пинговать для проверки.
Потом сверил ответы с живыми пингами с самого роутера.</p>

<p>Результат — как в жизни: кто-то гений, кто-то галлюцинирует, а трое молчат, пока им не дашь больше токенов.</p>

<h3 id="лучшие-находки-совпали-с-реальностью">🏆 Лучшие находки (совпали с реальностью)</h3>
<ul><li><p>DHCP-клиент на WAN-порту рядом с PPPoE — если провайдер вдруг выдаст адрес, дефолт-маршрут (distance 1) перебьёт PPPoE и сломает NAT. Нашёл только GPT-5. Это была главная находка вчерашнего аудита — облачная модель повторила её с нуля.</p></li>

<li><p>Множественные подсети в одном bridge — три разные /24 на одном мосту. Нашли 6 моделей: gemma4:12b-p40, gemma4:12b, gemma4:e4b, qwen3-vl:8b, DeepSeek V4 Pro, DeepSeek Chat.</p></li>

<li><p>Мёртвый маршрут до лаборатории — маршрут на тестовую /24 через несуществующий шлюз. Вспомнил qwen3-coder:latest — и предложил именно его пинговать.</p></li>

<li><p>Маршруты «сам в себя» через адрес в туннельной подсети — 12 мёртвых маршрутов, которые мы чистили вчера. Нашли: qwen3-vl:8b-p40, DeepSeek Chat, GPT-5.</p></li>

<li><p>check-gateway=none на куче маршрутов — роутер не проверяет шлюзы, мёртвые маршруты висят вечно. Заметил qwen2.5:14b.</p></li>

<li><p>Несуществующий address-list wan-mgmt — на него ссылается firewall. Нашёл DeepSeek V4 Pro.</p></li></ul>

<h3 id="кто-облажался">💀 Кто облажался</h3>
<ul><li><p>Три локальные thinking-модели вернули пустой ответ (qwen3:30b, qwen3-vl:8b, deepseek-r1:14b) — не потому что сломаны: весь лимит токенов ушёл в скрытые размышления, а финальный ответ не влез. С max<em>tokens=16000 все три заговорили. Тот же фокус с GPT-5 (нужен max</em>completion<em>tokens + reasoning</em>effort=low) и DeepSeek V4 Flash/Pro/Reasoner.</p></li>

<li><p>deepseek-coder:6.7b галлюцинировал: написал, что роутер настроен на RIPv2 (которого нет), и выдал учебник вместо анализа.</p></li>

<li><p>qwen2.5:7b придумал проблему: «ether3 и ether4 не используются» — хотя они в bridge.</p></li>

<li><p>llama3.1:8b-instruct-q4<em>K</em>M упал с 500 — не пережил конфиг.</p></li></ul>

<h3 id="сверка-с-реальностью">✅ Сверка с реальностью</h3>

<p>Модели предложили пинговать: публичный DNS, WAN у меня дома, WAN в офисе, шлюзы LAN, адреса туннелей. Я пропинговал всё с роутера:
– Интернет, дом, офис, LAN — ✅ отвечают
– Два адреса в туннельной сети — ❌ 100% loss</p>

<p>Совпало с подозрениями моделей: именно туннельные адреса они помечали проблемными.</p>

<h3 id="итоговый-пьедестал">🥇 Итоговый пьедестал</h3>

<p>1) GPT-5 — самая глубокая (нашла то, что другие не увидели)<br>
2) DeepSeek V4 Pro — сильный анализ, 16K reasoning<br>
3) gemma3:latest — лучшая локальная, 4.2K разбора бесплатно</p>

<h3 id="сколько-это-стоило">💰 Сколько это стоило</h3>

<p>Весь эксперимент — ~$0.23: 148K токенов промпта + 70K вывода, 30 запросов.</p>
<ul><li>GPT-5 — $0.14</li>
<li>DeepSeek V4 Pro — $0.05</li>
<li>GPT-4o — $0.02</li>
<li>DeepSeek Reasoner/Flash, Chat, GPT-4o mini — ~$0.01</li>
<li>Локальные 14 моделей — $0.00 (квота)</li></ul>

<p>Локальные не берут денег, но сожгли 91K токенов дневной квоты одним прогоном. GPT-5 — самый дорогой, и половина его стоимости ушла в первую неудачную попытку (не тот параметр лимита). Урок: дешевле сначала прочитать документацию, чем платить за ошибку 😄</p>

<h3 id="мораль">Мораль</h3>

<p>Разные модели — разные глаза. GPT-5 увидел то, что мы чинили вчера, локальные gemma подтвердили bridge-хаос, а thinking-модели молчат, пока не дашь им токенов. Ни одна не нашла всё, но вместе покрыли почти все реальные проблемы.</p>

<p>И главное: пустой ответ модели — это не всегда «модель сломана», часто это «не хватило лимита на размышления». Прежде чем списывать — подними max_tokens.</p>

<hr>

<h2 id="технические-детали-для-поста-комментариев">Технические детали (для поста/комментариев)</h2>
<ul><li>Локальные (14): gemma4:12b-p40, qwen3-vl:8b-p40, gemma4:12b, qwen3-vl:8b, gemma4:e4b, gemma3:latest, qwen3-coder:latest, qwen3:30b, qwen2.5:14b, qwen2.5:14b-instruct, qwen2.5:7b, deepseek-r1:14b, deepseek-coder:6.7b, llama3.1:8b</li>
<li>Облачные (7): GPT-5, GPT-4o, GPT-4o mini, DeepSeek V4 Flash, V4 Pro, Reasoner, Chat (V3)</li>
<li>Конфиг: 14.5KB, все ключевые секции</li>
<li>Пустые при малом лимите: qwen3:30b, qwen3-vl:8b, deepseek-r1:14b, DS V4 Flash/Pro/Reasoner, GPT-5 → все ожили с max<em>tokens≥16000 (gpt-5: max</em>completion<em>tokens + reasoning</em>effort=low)</li>
<li>Время: ~30 минут на весь прогон</li>
<li>Живые пинги: публичный DNS ✅, WAN дома ✅, WAN офиса ✅, LAN ✅, два адреса в туннеле ❌</li></ul>

<h2 id="стоимость-эксперимента">💰 Стоимость эксперимента</h2>

<p>Всего: ~$0.23 (148K токенов промпт + 70K completion, 30 попыток)</p>

<table>
<thead>
<tr>
<th>Модель/группа</th>
<th align="right">Промпт</th>
<th align="right">Вывод</th>
<th align="right">Попытки</th>
<th align="right">Стоимость</th>
</tr>
</thead>

<tbody>
<tr>
<td>GPT-5</td>
<td align="right">9,898</td>
<td align="right">12,875</td>
<td align="right">2</td>
<td align="right">$0.1411</td>
</tr>

<tr>
<td>DeepSeek V4 Pro</td>
<td align="right">10,386</td>
<td align="right">10,103</td>
<td align="right">2</td>
<td align="right">$0.0532</td>
</tr>

<tr>
<td>GPT-4o</td>
<td align="right">4,950</td>
<td align="right">867</td>
<td align="right">1</td>
<td align="right">$0.0210</td>
</tr>

<tr>
<td>DeepSeek Reasoner</td>
<td align="right">10,544</td>
<td align="right">7,905</td>
<td align="right">2</td>
<td align="right">$0.0063</td>
</tr>

<tr>
<td>DeepSeek V4 Flash</td>
<td align="right">10,544</td>
<td align="right">10,489</td>
<td align="right">2</td>
<td align="right">$0.0044</td>
</tr>

<tr>
<td>DeepSeek Chat (V3)</td>
<td align="right">5,193</td>
<td align="right">1,597</td>
<td align="right">1</td>
<td align="right">$0.0021</td>
</tr>

<tr>
<td>GPT-4o mini</td>
<td align="right">4,950</td>
<td align="right">827</td>
<td align="right">1</td>
<td align="right">$0.0012</td>
</tr>

<tr>
<td>Локальные (14)</td>
<td align="right">91,489</td>
<td align="right">25,692</td>
<td align="right">16</td>
<td align="right">$0.00 (квота)</td>
</tr>
</tbody>
</table>

<p>Нюансы: локальные жгут дневную квоту токенов (91K промпт за прогон), но не деньги. GPT-5 самый дорогой ($0.14), из них первая неудачная попытка сожгла ~$0.10 впустую. Весь эксперимент дешевле кофе.</p>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — если не знаешь, напиши ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/14-models-audit</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>Готовые сервисы проверки доступности: когда одного ping уже мало</title>
      <link>https://articles.clr58.ru/availability-tools</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Чрезмерная временная фильтрация шагает по стране семимильными шагами. Где-то на время включают белые списки, где-то выборочно перестают ходить отдельные протоколы, адреса, CDN или целые сети. Добавим к этому обычные аварии, ошибки DNS, неудачную маршрутизацию и бодрый антибот на стороне самого сайта — и получим современное «интернет вроде есть, но ничего не понятно».&#xA;&#xA;Поэтому мы тоже понемногу вооружаемся диагностическими сервисами.&#xA;&#xA;Сразу оговорюсь: это не рейтинг и не реклама. Инструменты решают разные задачи и хорошо дополняют друг друга. Одни смотрят на ресурс снаружи, другие проверяют его именно через проблемное подключение, третьи запоминают, когда и на сколько минут всё падало.&#xA;&#xA;Почему ping уже недостаточно&#xA;&#xA;Ping проверяет ICMP: дошёл ли специальный пакет до узла и вернулся ли ответ. Это полезно, но к открытию сайта относится довольно косвенно.&#xA;&#xA;Возможны оба варианта:&#xA;&#xA;— ping проходит, а HTTPS не работает из-за TLS, SNI, фильтрации порта, ошибки веб-сервера или недоступного CDN;&#xA;— ping не проходит, потому что ICMP отключён или ограничен, а сайт при этом прекрасно открывается.&#xA;&#xA;Иными словами, ping честно сообщает: «узел ответил на мой ICMP-запрос». Пользователь же в этот момент пытался открыть личный кабинет, посмотреть видео или получить ответ от API. Это уже совсем другой разговор.&#xA;&#xA;Для сайта полезнее смотреть хотя бы всю цепочку:&#xA;&#xA;разрешилось ли доменное имя;&#xA;установилось ли TCP-соединение;&#xA;прошёл ли TLS для HTTPS;&#xA;какой HTTP-код вернул сервер;&#xA;пришёл ли ожидаемый контент;&#xA;одинаков ли результат из разных сетей и регионов.&#xA;&#xA;Ping-Admin: подробный внешний замер&#xA;&#xA;Ping-Admin пригодится, когда нужно быстро посмотреть на сайт из большого числа внешних точек. Можно выбрать случайные узлы, отдельно российские точки или более широкий набор по разным странам.&#xA;&#xA;Это именно HTTP/HTTPS-проверка, а не просто красивый список задержек. В результате по каждой точке видны:&#xA;&#xA;— IP-адрес, в который разрешилось имя;&#xA;— полное время загрузки;&#xA;— время DNS;&#xA;— установка соединения;&#xA;— TLS/SSL;&#xA;— ожидание ответа сервера;&#xA;— редиректы;&#xA;— скорость загрузки и размер страницы.&#xA;&#xA;Такой разбор помогает отличить «долго думает сам сервер» от «долго устанавливается соединение» и «в одном регионе домен вообще указывает в другую сторону». Последнее нормально для CDN и Anycast, но иногда именно в различиях между точками и прячется проблема.&#xA;&#xA;Особенно полезен большой набор российских узлов. Если из части городов страница открывается, а из части стабильно нет, это уже намного интереснее, чем один ping с рабочего ноутбука.&#xA;&#xA;Минус очевиден: Ping-Admin проверяет сайт со своих серверов. Он ничего не знает о конкретном домашнем роутере, корпоративном DNS, Wi‑Fi, канале последней мили и маршруте проблемного пользователя. Это внешний свидетель, а не очевидец с места происшествия.&#xA;&#xA;Check-Host: быстрый ответ «а снаружи как?»&#xA;&#xA;Check-Host я обычно воспринимаю как быстрый мультитул. У него отдельно доступны проверки:&#xA;&#xA;— HTTP/HTTPS, в том числе на нестандартном порту;&#xA;— ping;&#xA;— TCP-порта;&#xA;— UDP-порта;&#xA;— DNS.&#xA;&#xA;Для первичной проверки это удобно: вставили точный URL, выбрали HTTP и через несколько секунд получили ответы из разных стран. Затем тем же ресурсом можно отдельно посмотреть TCP-порт или DNS, если HTTP-проверка показала что-то странное.&#xA;&#xA;По глубине HTTP-разбора Ping-Admin интереснее, зато Check-Host быстрее отвечает на практический вопрос: ресурс не виден вообще, не виден только по HTTP/HTTPS или проблема наблюдается лишь с отдельных точек.&#xA;&#xA;Есть и важная тонкость: проверять надо не только домен, но и тот протокол, которым реально пользуется клиент. Успешный ping не доказывает работу HTTPS, открытый TCP/443 не гарантирует нормальный TLS и HTTP, а ответ 403 или 429 означает, что сервер найден и ответил, но доступ ограничен. Для пользователя сайт всё равно может быть непригоден — просто причина уже не похожа на обрыв маршрута.&#xA;&#xA;connect-check: проверка с места происшествия&#xA;&#xA;После истории «Две недели без интернета» у нас появилась собственная утилита connect-check.&#xA;&#xA;Она отвечает на другой вопрос: не «виден ли сайт из чужого дата-центра», а «что именно работает и не работает с этого компьютера через это подключение».&#xA;&#xA;Утилита запускается локально на Windows, macOS или Linux. Готовые сборки лежат в разделе Releases, исходники открыты. В актуальном пакете диагностика и отдельные пробы встроены в GUI.&#xA;&#xA;Полный прогон проверяет не один адрес, а целый набор классов ресурсов и протоколов: базовую сеть, DNS, captive portal, время, HTTP/HTTPS, TCP, CDN, значимые российские и зарубежные ресурсы, банки, почту, облака, репозитории обновлений, игры, видео, IoT и AI-сервисы. Для некоторых сайтов проверяется не только главная страница, но и API, CDN или статический файл — потому что витрина с антиботом и реальный клиентский трафик могут вести себя совершенно по-разному.&#xA;&#xA;Если проверка ресурса провалилась, в отчёт добавляются ping и traceroute. Результат можно сохранить в HTML и отправить провайдеру или коллеге. Это уже существенно полезнее сообщения «у меня не работает интернет».&#xA;&#xA;Отдельная URL-проба умеет повторять HTTP/HTTPS-запросы с заданным интервалом и числом раундов. Она показывает время, HTTP-код, разрешившийся IP, редирект и итоговый URL. Такой режим хорошо ловит плавающую проблему: пять запросов прошли, шестой завис, ещё два получили редирект куда-то не туда.&#xA;&#xA;Но и connect-check не является абсолютным арбитром. Он показывает взгляд конкретного устройства и конкретного подключения. В этом и его достоинство, и ограничение. Если нужно понять географию проблемы, результат надо сравнить с Ping-Admin или Check-Host.&#xA;&#xA;Uptime Kuma: не проверить сейчас, а следить постоянно&#xA;&#xA;Uptime Kuma — self-hosted-мониторинг, который удобно поднять в Docker на своей ВМ или небольшом VPS.&#xA;&#xA;Он умеет постоянно проверять HTTP/HTTPS, TCP, ping, DNS, WebSocket, push-мониторы и некоторые другие типы целей. Для веб-сервисов особенно полезны проверки по ключевой строке или JSON-запросу: обычный HTTP 200 OK ещё не означает, что приложение действительно отдало нужную страницу, а не вежливую заглушку «всё сломалось».&#xA;&#xA;У Kuma есть история доступности, графики, контроль сертификатов, публичные статус-страницы и уведомления через Telegram, почту и множество других каналов. Минимальный интервал проверки, указанный в проекте, — 20 секунд.&#xA;&#xA;Главное — правильно выбрать место установки. Kuma рядом с наблюдаемым сервером хорошо замечает падение приложения, но может не увидеть региональную или операторскую фильтрацию: внутри одного дата-центра всё будет зелёным. Экземпляр на внешнем VPS лучше показывает доступность снаружи. А если важен взгляд конкретного офиса, монитор надо ставить внутри этого офиса.&#xA;&#xA;Одна точка наблюдения всегда остаётся одной точкой наблюдения. Даже если у неё очень красивый зелёный интерфейс.&#xA;&#xA;Как использовать всё это вместе&#xA;&#xA;Нормальная последовательность при жалобе «сайт не работает» выглядит примерно так.&#xA;&#xA;1. Проверяем точный URL по HTTP/HTTPS&#xA;&#xA;Начинаем с Check-Host. Вставляем именно тот адрес, который не открывается, включая https://, путь и нестандартный порт, если он есть. Смотрим, отвечает ли ресурс из разных стран.&#xA;&#xA;2. Если проблема неоднородная — идём в Ping-Admin&#xA;&#xA;Запускаем подробную проверку из нескольких российских и зарубежных точек. Сравниваем DNS, IP, соединение, TLS, ожидание сервера и редиректы.&#xA;&#xA;3. Запускаем connect-check на проблемном подключении&#xA;&#xA;Теперь получаем взгляд изнутри: как работает DNS, открываются ли соседние классы ресурсов, не сломаны ли только HTTPS, CDN, обновления, видео или отдельные сети. Сохраняем HTML-отчёт.&#xA;&#xA;Если проблема плавающая, оставляем URL-пробу на несколько раундов. Это часто продуктивнее, чем двадцать раз вручную обновлять браузер и пытаться понять, показалось или нет.&#xA;&#xA;4. Для важных сервисов включаем Uptime Kuma&#xA;&#xA;Добавляем постоянную HTTP/HTTPS-проверку. Где возможно — проверяем не только код ответа, но и ключевую строку или JSON. Настраиваем уведомления и сохраняем историю.&#xA;&#xA;Монитор лучше размещать не на том же сервере, который он наблюдает. Иначе при общей аварии они могут исчезнуть вместе, сохранив удивительное единодушие.&#xA;&#xA;Короткая шпаргалка&#xA;&#xA;| Вопрос | Что взять |&#xA;|---|---|&#xA;| Сайт прямо сейчас виден из разных городов и стран? | Check-Host или Ping-Admin |&#xA;| Где тратится время: DNS, соединение, TLS или ответ сервера? | Ping-Admin |&#xA;| Открыт ли конкретный TCP/UDP-порт? | Check-Host |&#xA;| Почему сервис не работает именно у этого пользователя? | connect-check на его подключении |&#xA;| Нужно поймать плавающие HTTP/HTTPS-сбои локально? | URL-проба connect-check |&#xA;| Когда сервис упал и сколько был недоступен? | Uptime Kuma |&#xA;| Нужны уведомления и история? | Uptime Kuma |&#xA;| Нужен внятный материал для обращения к провайдеру? | connect-check + внешняя проверка Ping-Admin/Check-Host |&#xA;&#xA;На что не наступить&#xA;&#xA;Во-первых, не вставляйте во внешние сервисы приватные URL с токенами, одноразовыми подписями, адресами внутренних панелей и другими секретами. Проверка выполняется чужой инфраструктурой, и введённый адрес перестаёт быть только вашим.&#xA;&#xA;Во-вторых, не делайте вывод по одной красной точке. Проверочный узел тоже может быть перегружен, временно потерять маршрут или попасть под ограничение самого сайта.&#xA;&#xA;В-третьих, браузер и HTTP-проба — не одно и то же. JavaScript, авторизация, антибот, API и загрузка статических файлов могут ломаться независимо. Иногда 403 означает «сервер жив, но нас не пустили», а 200 — «заглушка успешно загружена».&#xA;&#xA;И наконец, сохраняйте время проверки, адрес, IP, выбранные узлы и результаты. Фраза «13 августа с 10:15 до 10:27 HTTPS не устанавливался через такого-то провайдера, при этом из шести внешних точек работал» сильно полезнее бессмертного «у вас интернет сломался».&#xA;&#xA;Получается не один идеальный сервис, а небольшой набор инструментов:&#xA;&#xA;— Check-Host быстро подтверждает внешний симптом;&#xA;— Ping-Admin раскладывает HTTP/HTTPS по этапам и географии;&#xA;— connect-check показывает картину с проблемного подключения;&#xA;— Uptime Kuma следит за сервисом постоянно и помнит историю.&#xA;&#xA;В эпоху, когда интернет всё чаще ломается не целиком, а художественно и выборочно, такая коллекция отвёрток уже не выглядит избыточной.&#xA;&#xA;Ссылки&#xA;&#xA;— Ping-Admin: разовая проверка доступности&#xA;&#xA;— Check-Host: HTTP/HTTPS-проверка&#xA;&#xA;— connect-check: репозиторий&#xA;&#xA;— connect-check: готовые сборки&#xA;&#xA;— Uptime Kuma&#xA;&#xA;#monitoring #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-availability-tools-digclean.jpg" alt="Обложка"></p>

<p>Чрезмерная временная фильтрация шагает по стране семимильными шагами. Где-то на время включают белые списки, где-то выборочно перестают ходить отдельные протоколы, адреса, CDN или целые сети. Добавим к этому обычные аварии, ошибки DNS, неудачную маршрутизацию и бодрый антибот на стороне самого сайта — и получим современное «интернет вроде есть, но ничего не понятно».</p>

<p>Поэтому мы тоже понемногу вооружаемся диагностическими сервисами.</p>

<p>Сразу оговорюсь: это не рейтинг и не реклама. Инструменты решают разные задачи и хорошо дополняют друг друга. Одни смотрят на ресурс снаружи, другие проверяют его именно через проблемное подключение, третьи запоминают, когда и на сколько минут всё падало.</p>

<h2 id="почему-ping-уже-недостаточно">Почему ping уже недостаточно</h2>

<p>Ping проверяет ICMP: дошёл ли специальный пакет до узла и вернулся ли ответ. Это полезно, но к открытию сайта относится довольно косвенно.</p>

<p>Возможны оба варианта:</p>

<p>— ping проходит, а HTTPS не работает из-за TLS, SNI, фильтрации порта, ошибки веб-сервера или недоступного CDN;
— ping не проходит, потому что ICMP отключён или ограничен, а сайт при этом прекрасно открывается.</p>

<p>Иными словами, ping честно сообщает: «узел ответил на мой ICMP-запрос». Пользователь же в этот момент пытался открыть личный кабинет, посмотреть видео или получить ответ от API. Это уже совсем другой разговор.</p>

<p>Для сайта полезнее смотреть хотя бы всю цепочку:</p>
<ol><li>разрешилось ли доменное имя;</li>
<li>установилось ли TCP-соединение;</li>
<li>прошёл ли TLS для HTTPS;</li>
<li>какой HTTP-код вернул сервер;</li>
<li>пришёл ли ожидаемый контент;</li>
<li>одинаков ли результат из разных сетей и регионов.</li></ol>

<h2 id="ping-admin-подробный-внешний-замер">Ping-Admin: подробный внешний замер</h2>

<p><a href="https://ping-admin.com/free_test/">Ping-Admin</a> пригодится, когда нужно быстро посмотреть на сайт из большого числа внешних точек. Можно выбрать случайные узлы, отдельно российские точки или более широкий набор по разным странам.</p>

<p>Это именно HTTP/HTTPS-проверка, а не просто красивый список задержек. В результате по каждой точке видны:</p>

<p>— IP-адрес, в который разрешилось имя;
— полное время загрузки;
— время DNS;
— установка соединения;
— TLS/SSL;
— ожидание ответа сервера;
— редиректы;
— скорость загрузки и размер страницы.</p>

<p>Такой разбор помогает отличить «долго думает сам сервер» от «долго устанавливается соединение» и «в одном регионе домен вообще указывает в другую сторону». Последнее нормально для CDN и Anycast, но иногда именно в различиях между точками и прячется проблема.</p>

<p>Особенно полезен большой набор российских узлов. Если из части городов страница открывается, а из части стабильно нет, это уже намного интереснее, чем один ping с рабочего ноутбука.</p>

<p>Минус очевиден: Ping-Admin проверяет сайт со своих серверов. Он ничего не знает о конкретном домашнем роутере, корпоративном DNS, Wi‑Fi, канале последней мили и маршруте проблемного пользователя. Это внешний свидетель, а не очевидец с места происшествия.</p>

<h2 id="check-host-быстрый-ответ-а-снаружи-как">Check-Host: быстрый ответ «а снаружи как?»</h2>

<p><a href="https://check-host.net/check-http?lang=ru">Check-Host</a> я обычно воспринимаю как быстрый мультитул. У него отдельно доступны проверки:</p>

<p>— HTTP/HTTPS, в том числе на нестандартном порту;
— ping;
— TCP-порта;
— UDP-порта;
— DNS.</p>

<p>Для первичной проверки это удобно: вставили точный URL, выбрали HTTP и через несколько секунд получили ответы из разных стран. Затем тем же ресурсом можно отдельно посмотреть TCP-порт или DNS, если HTTP-проверка показала что-то странное.</p>

<p>По глубине HTTP-разбора Ping-Admin интереснее, зато Check-Host быстрее отвечает на практический вопрос: ресурс не виден вообще, не виден только по HTTP/HTTPS или проблема наблюдается лишь с отдельных точек.</p>

<p>Есть и важная тонкость: проверять надо не только домен, но и тот протокол, которым реально пользуется клиент. Успешный ping не доказывает работу HTTPS, открытый TCP/443 не гарантирует нормальный TLS и HTTP, а ответ <code>403</code> или <code>429</code> означает, что сервер найден и ответил, но доступ ограничен. Для пользователя сайт всё равно может быть непригоден — просто причина уже не похожа на обрыв маршрута.</p>

<h2 id="connect-check-проверка-с-места-происшествия">connect-check: проверка с места происшествия</h2>

<p>После истории <a href="https://articles.clr58.ru/dve-nedeli-net-interneta">«Две недели без интернета»</a> у нас появилась собственная утилита <a href="https://github.com/cooler58/connect-check">connect-check</a>.</p>

<p>Она отвечает на другой вопрос: не «виден ли сайт из чужого дата-центра», а «что именно работает и не работает с этого компьютера через это подключение».</p>

<p>Утилита запускается локально на Windows, macOS или Linux. Готовые сборки лежат в разделе <a href="https://github.com/cooler58/connect-check/releases/latest">Releases</a>, исходники открыты. В актуальном пакете диагностика и отдельные пробы встроены в GUI.</p>

<p>Полный прогон проверяет не один адрес, а целый набор классов ресурсов и протоколов: базовую сеть, DNS, captive portal, время, HTTP/HTTPS, TCP, CDN, значимые российские и зарубежные ресурсы, банки, почту, облака, репозитории обновлений, игры, видео, IoT и AI-сервисы. Для некоторых сайтов проверяется не только главная страница, но и API, CDN или статический файл — потому что витрина с антиботом и реальный клиентский трафик могут вести себя совершенно по-разному.</p>

<p>Если проверка ресурса провалилась, в отчёт добавляются ping и traceroute. Результат можно сохранить в HTML и отправить провайдеру или коллеге. Это уже существенно полезнее сообщения «у меня не работает интернет».</p>

<p>Отдельная URL-проба умеет повторять HTTP/HTTPS-запросы с заданным интервалом и числом раундов. Она показывает время, HTTP-код, разрешившийся IP, редирект и итоговый URL. Такой режим хорошо ловит плавающую проблему: пять запросов прошли, шестой завис, ещё два получили редирект куда-то не туда.</p>

<p>Но и connect-check не является абсолютным арбитром. Он показывает взгляд конкретного устройства и конкретного подключения. В этом и его достоинство, и ограничение. Если нужно понять географию проблемы, результат надо сравнить с Ping-Admin или Check-Host.</p>

<h2 id="uptime-kuma-не-проверить-сейчас-а-следить-постоянно">Uptime Kuma: не проверить сейчас, а следить постоянно</h2>

<p><a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a> — self-hosted-мониторинг, который удобно поднять в Docker на своей ВМ или небольшом VPS.</p>

<p>Он умеет постоянно проверять HTTP/HTTPS, TCP, ping, DNS, WebSocket, push-мониторы и некоторые другие типы целей. Для веб-сервисов особенно полезны проверки по ключевой строке или JSON-запросу: обычный HTTP <code>200 OK</code> ещё не означает, что приложение действительно отдало нужную страницу, а не вежливую заглушку «всё сломалось».</p>

<p>У Kuma есть история доступности, графики, контроль сертификатов, публичные статус-страницы и уведомления через Telegram, почту и множество других каналов. Минимальный интервал проверки, указанный в проекте, — 20 секунд.</p>

<p>Главное — правильно выбрать место установки. Kuma рядом с наблюдаемым сервером хорошо замечает падение приложения, но может не увидеть региональную или операторскую фильтрацию: внутри одного дата-центра всё будет зелёным. Экземпляр на внешнем VPS лучше показывает доступность снаружи. А если важен взгляд конкретного офиса, монитор надо ставить внутри этого офиса.</p>

<p>Одна точка наблюдения всегда остаётся одной точкой наблюдения. Даже если у неё очень красивый зелёный интерфейс.</p>

<h2 id="как-использовать-всё-это-вместе">Как использовать всё это вместе</h2>

<p>Нормальная последовательность при жалобе «сайт не работает» выглядит примерно так.</p>

<h3 id="1-проверяем-точный-url-по-http-https">1. Проверяем точный URL по HTTP/HTTPS</h3>

<p>Начинаем с Check-Host. Вставляем именно тот адрес, который не открывается, включая <code>https://</code>, путь и нестандартный порт, если он есть. Смотрим, отвечает ли ресурс из разных стран.</p>

<h3 id="2-если-проблема-неоднородная-идём-в-ping-admin">2. Если проблема неоднородная — идём в Ping-Admin</h3>

<p>Запускаем подробную проверку из нескольких российских и зарубежных точек. Сравниваем DNS, IP, соединение, TLS, ожидание сервера и редиректы.</p>

<h3 id="3-запускаем-connect-check-на-проблемном-подключении">3. Запускаем connect-check на проблемном подключении</h3>

<p>Теперь получаем взгляд изнутри: как работает DNS, открываются ли соседние классы ресурсов, не сломаны ли только HTTPS, CDN, обновления, видео или отдельные сети. Сохраняем HTML-отчёт.</p>

<p>Если проблема плавающая, оставляем URL-пробу на несколько раундов. Это часто продуктивнее, чем двадцать раз вручную обновлять браузер и пытаться понять, показалось или нет.</p>

<h3 id="4-для-важных-сервисов-включаем-uptime-kuma">4. Для важных сервисов включаем Uptime Kuma</h3>

<p>Добавляем постоянную HTTP/HTTPS-проверку. Где возможно — проверяем не только код ответа, но и ключевую строку или JSON. Настраиваем уведомления и сохраняем историю.</p>

<p>Монитор лучше размещать не на том же сервере, который он наблюдает. Иначе при общей аварии они могут исчезнуть вместе, сохранив удивительное единодушие.</p>

<h2 id="короткая-шпаргалка">Короткая шпаргалка</h2>

<table>
<thead>
<tr>
<th>Вопрос</th>
<th>Что взять</th>
</tr>
</thead>

<tbody>
<tr>
<td>Сайт прямо сейчас виден из разных городов и стран?</td>
<td>Check-Host или Ping-Admin</td>
</tr>

<tr>
<td>Где тратится время: DNS, соединение, TLS или ответ сервера?</td>
<td>Ping-Admin</td>
</tr>

<tr>
<td>Открыт ли конкретный TCP/UDP-порт?</td>
<td>Check-Host</td>
</tr>

<tr>
<td>Почему сервис не работает именно у этого пользователя?</td>
<td>connect-check на его подключении</td>
</tr>

<tr>
<td>Нужно поймать плавающие HTTP/HTTPS-сбои локально?</td>
<td>URL-проба connect-check</td>
</tr>

<tr>
<td>Когда сервис упал и сколько был недоступен?</td>
<td>Uptime Kuma</td>
</tr>

<tr>
<td>Нужны уведомления и история?</td>
<td>Uptime Kuma</td>
</tr>

<tr>
<td>Нужен внятный материал для обращения к провайдеру?</td>
<td>connect-check + внешняя проверка Ping-Admin/Check-Host</td>
</tr>
</tbody>
</table>

<h2 id="на-что-не-наступить">На что не наступить</h2>

<p>Во-первых, не вставляйте во внешние сервисы приватные URL с токенами, одноразовыми подписями, адресами внутренних панелей и другими секретами. Проверка выполняется чужой инфраструктурой, и введённый адрес перестаёт быть только вашим.</p>

<p>Во-вторых, не делайте вывод по одной красной точке. Проверочный узел тоже может быть перегружен, временно потерять маршрут или попасть под ограничение самого сайта.</p>

<p>В-третьих, браузер и HTTP-проба — не одно и то же. JavaScript, авторизация, антибот, API и загрузка статических файлов могут ломаться независимо. Иногда <code>403</code> означает «сервер жив, но нас не пустили», а <code>200</code> — «заглушка успешно загружена».</p>

<p>И наконец, сохраняйте время проверки, адрес, IP, выбранные узлы и результаты. Фраза «13 августа с 10:15 до 10:27 HTTPS не устанавливался через такого-то провайдера, при этом из шести внешних точек работал» сильно полезнее бессмертного «у вас интернет сломался».</p>

<p>Получается не один идеальный сервис, а небольшой набор инструментов:</p>

<p>— Check-Host быстро подтверждает внешний симптом;
— Ping-Admin раскладывает HTTP/HTTPS по этапам и географии;
— connect-check показывает картину с проблемного подключения;
— Uptime Kuma следит за сервисом постоянно и помнит историю.</p>

<p>В эпоху, когда интернет всё чаще ломается не целиком, а художественно и выборочно, такая коллекция отвёрток уже не выглядит избыточной.</p>

<h2 id="ссылки">Ссылки</h2>

<p>— <a href="https://ping-admin.com/free_test/">Ping-Admin: разовая проверка доступности</a></p>

<p>— <a href="https://check-host.net/check-http?lang=ru">Check-Host: HTTP/HTTPS-проверка</a></p>

<p>— <a href="https://github.com/cooler58/connect-check">connect-check: репозиторий</a></p>

<p>— <a href="https://github.com/cooler58/connect-check/releases/latest">connect-check: готовые сборки</a></p>

<p>— <a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a></p>

<p><a href="https://articles.clr58.ru/tag:monitoring" class="hashtag"><span>#</span><span class="p-category">monitoring</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/availability-tools</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:48 +0000</pubDate>
    </item>
    <item>
      <title>Диагностика SDN и лаборатория отказов</title>
      <link>https://articles.clr58.ru/diagnostics-lab</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;  Цикл «Виды связности и SDN», часть 13. Предыдущая часть: «SD-WAN: связность филиалов, ЦОДов и облаков».&#xA;&#xA;Сводка: диагностика по всем осям.&#xA;&#xA;SDN добавляет удобную абстракцию: логический switch, сеть, policy или service. При аварии приходится аккуратно спускаться обратно к пакетам.&#xA;&#xA;Симптом фиксируем сверху: какой клиент, к какому имени, порту и в какое время не смог подключиться. Искать причину идём снизу вверх: underlay → туннель → маршруты → политики → приложение.&#xA;&#xA;Уровень 1: underlay&#xA;&#xA;Сначала проверяем внешнюю IP-связность конечных точек:&#xA;&#xA;route lookup;&#xA;ARP/ND до next hop;&#xA;доступность внешнего адреса;&#xA;loss и latency;&#xA;ECMP;&#xA;firewall;&#xA;максимальный пакет без фрагментации;&#xA;проходят ли ICMP Fragmentation Needed и IPv6 Packet Too Big.&#xA;&#xA;Если underlay не доставляет UDP/6081, нет смысла начинать с OVN logical flows.&#xA;&#xA;Уровень 2: туннель&#xA;&#xA;Проверяем:&#xA;&#xA;создан ли интерфейс;&#xA;локальный и удалённый endpoint;&#xA;VNI или tunnel ID;&#xA;handshake и время последнего обмена;&#xA;счётчики RX/TX и drops;&#xA;прямой путь или relay;&#xA;внешний протокол и порт;&#xA;выбранный MTU.&#xA;&#xA;Дамп на внешнем интерфейсе показывает инкапсулированный поток. Дамп на интерфейсе нагрузки — исходный пакет. Снимать их полезно одновременно.&#xA;&#xA;Уровень 3: forwarding&#xA;&#xA;Для L2 смотрим FDB, MAC learning, ARP/ND и flooding.&#xA;&#xA;Для L3 — RIB/FIB, policy routing, VRF, BGP routes и next hop.&#xA;&#xA;В EVPN проверяем наличие нужного MAC/IP или prefix route и Type 3 для BUM. В Kubernetes — маршруты pod CIDR, endpoint identity и service backend.&#xA;&#xA;Уровень 4: политики&#xA;&#xA;Пакет может быть доставлен до узла и отброшен локальной ACL, NetworkPolicy, eBPF policy или distributed firewall.&#xA;&#xA;Проверяем политики с обеих сторон. В ZeroTier и некоторых mesh-системах правила применяются локально отправителем и получателем. В Kubernetes ingress и egress policies независимы.&#xA;&#xA;Уровень 5: приложение&#xA;&#xA;Только после сети проверяем listener, DNS, сертификат, proxy и само приложение.&#xA;&#xA;Лаборатория&#xA;&#xA;Для сравнения платформ используется один стенд:&#xA;&#xA;офис за NAT;&#xA;ЦОД с публичным адресом;&#xA;второй ЦОД за CGNAT;&#xA;облачная VM;&#xA;ноутбук, меняющий Wi-Fi/LTE;&#xA;два Kubernetes-узла;&#xA;два контроллера и два relay, где это поддерживается.&#xA;&#xA;Канонический список профилей — в tables/lab-protocol.md. Статья и протокол должны совпадать.&#xA;&#xA;Профили отказа&#xA;&#xA;Один публичный узел, второй за обычным NAT.&#xA;Оба участника за обычным NAT.&#xA;Оба участника за CGNAT.&#xA;Hairpin: оба за одним NAT.&#xA;Address-and-port-dependent mapping с двух сторон.&#xA;Запрещены все входящие соединения.&#xA;Полностью запрещён UDP.&#xA;Разрешены только TCP/80 и TCP/443.&#xA;Доступ наружу возможен через HTTP-прокси.&#xA;10. Недоступен публичный relay.&#xA;11. Недоступен собственный relay.&#xA;12. Недоступен контроллер.&#xA;13. Один узел меняет внешний адрес во время сессии.&#xA;14. Между площадками MTU 1400.&#xA;15. PMTUD black hole: фильтр ICMP Fragmentation Needed / IPv6 PTB.&#xA;16. Один ECMP-путь теряет пакеты.&#xA;17. Отозван узел и изменена ACL.&#xA;18. Underlay только IPv6.&#xA;&#xA;Что измерять&#xA;&#xA;время первого соединения;&#xA;прямой или relay путь;&#xA;время failover;&#xA;сохраняется ли открытый SSH;&#xA;открывается ли новый SSH;&#xA;можно ли подключить новый узел;&#xA;применяется ли новая ACL;&#xA;RTT, jitter и loss;&#xA;TCP/UDP throughput;&#xA;CPU;&#xA;рабочий inner MTU.&#xA;&#xA;Почему дата обязательна&#xA;&#xA;Поведение SaaS-контроллеров, публичных relay и операторских сетей меняется. Результат «работает через TCP/443» должен содержать версию, дату, оператора, регион, тип ограничения и фактический транспорт data plane. Без этого таблица быстро превращается в собрание воспоминаний. Чеклист свойств транспорта — в части 7.&#xA;&#xA;Набор инструментов&#xA;&#xA;ip route get, ip rule, ip neigh;&#xA;bridge fdb;&#xA;ss, conntrack;&#xA;tcpdump/Wireshark;&#xA;tracepath, ping с DF и изменяемым размером;&#xA;iperf3;&#xA;wg show;&#xA;birdc, vtysh, BGP looking glass;&#xA;ovs-vsctl, ovs-ofctl, ovn-trace;&#xA;cilium status, Hubble;&#xA;журналы контроллера, signal и relay.&#xA;&#xA;Можно использовать свой скрипт проверки доступности для регулярной проверки TCP/HTTP/HTTPS endpoints с разных узлов, но она не заменяет анализ конкретного overlay-протокола.&#xA;&#xA;Где это ломается&#xA;&#xA;Панель зелёная, а смотрели только ICMP.&#xA;Пинг есть — значит «сеть жива», при этом HTTPS рвётся на MTU.&#xA;UDP/443 записали как HTTPS.&#xA;Профиль отказа в статье не совпал с протоколом лаборатории.&#xA;Результат без даты, версии и оператора перенесли в сравнительную матрицу.&#xA;&#xA;Итог цикла&#xA;&#xA;Универсального победителя нет.&#xA;&#xA;Внутри ЦОД разумно смотреть на native routing, EVPN/VXLAN и OVN. В Kubernetes — на возможности underlay и требования к policy/observability. Для удалённых узлов за NAT — на управляемый mesh с хорошим relay. Для сервисного доступа — на identity-based overlay. Для филиалов — на SD-WAN-политику и реальные измерения каналов.&#xA;&#xA;Правильный выбор начинается не с логотипа, а с пяти вопросов: уровень, underlay, управление, топология и граница шифрования.&#xA;&#xA;Предыдущая часть: «SD-WAN: связность филиалов, ЦОДов и облаков»&#xA;&#xA;Оглавление цикла: «SDN без магии: карта видов связности»&#xA;&#xA;Следующая часть: —&#xA;&#xA;Схема&#xA;&#xA;симптом фиксируем сверху, причину ищем снизу.&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-sdn-13-cover-digclean.jpg" alt="Обложка"></p>

<blockquote><p>Цикл «Виды связности и SDN», часть 13. Предыдущая часть: <a href="https://articles.clr58.ru/sdwan">«SD-WAN: связность филиалов, ЦОДов и облаков»</a>.</p></blockquote>

<p>Сводка: диагностика по всем осям.</p>

<p>SDN добавляет удобную абстракцию: логический switch, сеть, policy или service. При аварии приходится аккуратно спускаться обратно к пакетам.</p>

<p>Симптом фиксируем сверху: какой клиент, к какому имени, порту и в какое время не смог подключиться. Искать причину идём снизу вверх: underlay → туннель → маршруты → политики → приложение.</p>

<h3 id="уровень-1-underlay">Уровень 1: underlay</h3>

<p>Сначала проверяем внешнюю IP-связность конечных точек:</p>
<ul><li>route lookup;</li>
<li>ARP/ND до next hop;</li>
<li>доступность внешнего адреса;</li>
<li>loss и latency;</li>
<li>ECMP;</li>
<li>firewall;</li>
<li>максимальный пакет без фрагментации;</li>
<li>проходят ли ICMP Fragmentation Needed и IPv6 Packet Too Big.</li></ul>

<p>Если underlay не доставляет UDP/6081, нет смысла начинать с OVN logical flows.</p>

<h3 id="уровень-2-туннель">Уровень 2: туннель</h3>

<p>Проверяем:</p>
<ul><li>создан ли интерфейс;</li>
<li>локальный и удалённый endpoint;</li>
<li>VNI или tunnel ID;</li>
<li>handshake и время последнего обмена;</li>
<li>счётчики RX/TX и drops;</li>
<li>прямой путь или relay;</li>
<li>внешний протокол и порт;</li>
<li>выбранный MTU.</li></ul>

<p>Дамп на внешнем интерфейсе показывает инкапсулированный поток. Дамп на интерфейсе нагрузки — исходный пакет. Снимать их полезно одновременно.</p>

<h3 id="уровень-3-forwarding">Уровень 3: forwarding</h3>

<p>Для L2 смотрим FDB, MAC learning, ARP/ND и flooding.</p>

<p>Для L3 — RIB/FIB, policy routing, VRF, BGP routes и next hop.</p>

<p>В EVPN проверяем наличие нужного MAC/IP или prefix route и Type 3 для BUM. В Kubernetes — маршруты pod CIDR, endpoint identity и service backend.</p>

<h3 id="уровень-4-политики">Уровень 4: политики</h3>

<p>Пакет может быть доставлен до узла и отброшен локальной ACL, NetworkPolicy, eBPF policy или distributed firewall.</p>

<p>Проверяем политики с обеих сторон. В ZeroTier и некоторых mesh-системах правила применяются локально отправителем и получателем. В Kubernetes ingress и egress policies независимы.</p>

<h3 id="уровень-5-приложение">Уровень 5: приложение</h3>

<p>Только после сети проверяем listener, DNS, сертификат, proxy и само приложение.</p>

<h3 id="лаборатория">Лаборатория</h3>

<p>Для сравнения платформ используется один стенд:</p>
<ul><li>офис за NAT;</li>
<li>ЦОД с публичным адресом;</li>
<li>второй ЦОД за CGNAT;</li>
<li>облачная VM;</li>
<li>ноутбук, меняющий Wi-Fi/LTE;</li>
<li>два Kubernetes-узла;</li>
<li>два контроллера и два relay, где это поддерживается.</li></ul>

<p>Канонический список профилей — в <code>tables/lab-protocol.md</code>. Статья и протокол должны совпадать.</p>

<h3 id="профили-отказа">Профили отказа</h3>
<ol><li>Один публичный узел, второй за обычным NAT.</li>
<li>Оба участника за обычным NAT.</li>
<li>Оба участника за CGNAT.</li>
<li>Hairpin: оба за одним NAT.</li>
<li>Address-and-port-dependent mapping с двух сторон.</li>
<li>Запрещены все входящие соединения.</li>
<li>Полностью запрещён UDP.</li>
<li>Разрешены только TCP/80 и TCP/443.</li>
<li>Доступ наружу возможен через HTTP-прокси.</li>
<li>Недоступен публичный relay.</li>
<li>Недоступен собственный relay.</li>
<li>Недоступен контроллер.</li>
<li>Один узел меняет внешний адрес во время сессии.</li>
<li>Между площадками MTU 1400.</li>
<li>PMTUD black hole: фильтр ICMP Fragmentation Needed / IPv6 PTB.</li>
<li>Один ECMP-путь теряет пакеты.</li>
<li>Отозван узел и изменена ACL.</li>
<li>Underlay только IPv6.</li></ol>

<h3 id="что-измерять">Что измерять</h3>
<ul><li>время первого соединения;</li>
<li>прямой или relay путь;</li>
<li>время failover;</li>
<li>сохраняется ли открытый SSH;</li>
<li>открывается ли новый SSH;</li>
<li>можно ли подключить новый узел;</li>
<li>применяется ли новая ACL;</li>
<li>RTT, jitter и loss;</li>
<li>TCP/UDP throughput;</li>
<li>CPU;</li>
<li>рабочий inner MTU.</li></ul>

<h3 id="почему-дата-обязательна">Почему дата обязательна</h3>

<p>Поведение SaaS-контроллеров, публичных relay и операторских сетей меняется. Результат «работает через TCP/443» должен содержать версию, дату, оператора, регион, тип ограничения и фактический транспорт data plane. Без этого таблица быстро превращается в собрание воспоминаний. Чеклист свойств транспорта — в части 7.</p>

<h3 id="набор-инструментов">Набор инструментов</h3>
<ul><li><code>ip route get</code>, <code>ip rule</code>, <code>ip neigh</code>;</li>
<li><code>bridge fdb</code>;</li>
<li><code>ss</code>, <code>conntrack</code>;</li>
<li><code>tcpdump</code>/Wireshark;</li>
<li><code>tracepath</code>, <code>ping</code> с DF и изменяемым размером;</li>
<li><code>iperf3</code>;</li>
<li><code>wg show</code>;</li>
<li><code>birdc</code>, <code>vtysh</code>, BGP looking glass;</li>
<li><code>ovs-vsctl</code>, <code>ovs-ofctl</code>, <code>ovn-trace</code>;</li>
<li><code>cilium status</code>, Hubble;</li>
<li>журналы контроллера, signal и relay.</li></ul>

<p>Можно использовать свой скрипт проверки доступности для регулярной проверки TCP/HTTP/HTTPS endpoints с разных узлов, но она не заменяет анализ конкретного overlay-протокола.</p>

<h3 id="где-это-ломается">Где это ломается</h3>
<ul><li>Панель зелёная, а смотрели только ICMP.</li>
<li>Пинг есть — значит «сеть жива», при этом HTTPS рвётся на MTU.</li>
<li>UDP/443 записали как HTTPS.</li>
<li>Профиль отказа в статье не совпал с протоколом лаборатории.</li>
<li>Результат без даты, версии и оператора перенесли в сравнительную матрицу.</li></ul>

<h3 id="итог-цикла">Итог цикла</h3>

<p>Универсального победителя нет.</p>

<p>Внутри ЦОД разумно смотреть на native routing, EVPN/VXLAN и OVN. В Kubernetes — на возможности underlay и требования к policy/observability. Для удалённых узлов за NAT — на управляемый mesh с хорошим relay. Для сервисного доступа — на identity-based overlay. Для филиалов — на SD-WAN-политику и реальные измерения каналов.</p>

<p>Правильный выбор начинается не с логотипа, а с пяти вопросов: уровень, underlay, управление, топология и граница шифрования.</p>

<p>Предыдущая часть: <a href="https://articles.clr58.ru/sdwan">«SD-WAN: связность филиалов, ЦОДов и облаков»</a></p>

<p>Оглавление цикла: <a href="https://articles.clr58.ru/sdn-map">«SDN без магии: карта видов связности»</a></p>

<p>Следующая часть: —</p>

<p><img src="https://paste.clr58.ru/13-diagnostics.jpg" alt="Схема"></p>

<p><em>симптом фиксируем сверху, причину ищем снизу.</em></p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/diagnostics-lab</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:46 +0000</pubDate>
    </item>
    <item>
      <title>SD-WAN: связность филиалов, ЦОДов и облаков</title>
      <link>https://articles.clr58.ru/sdwan</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;  Цикл «Виды связности и SDN», часть 12. Предыдущая часть: «SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes».&#xA;&#xA;Ось: область — филиалы и выбор пути (SD-WAN).&#xA;&#xA;Если между офисом и ЦОДом поднять два VPN-туннеля, мы получим резервную связность. SD-WAN появляется, когда система централизованно описывает политики, измеряет качество путей и автоматически выбирает транспорт для разных потоков.&#xA;&#xA;Underlay остаётся разным&#xA;&#xA;Филиал может иметь:&#xA;&#xA;проводного оператора;&#xA;LTE/5G;&#xA;второго локального провайдера;&#xA;спутниковый канал;&#xA;L3VPN;&#xA;обычный Интернет.&#xA;&#xA;SD-WAN строит общий overlay и скрывает различия от приложений, но учитывает реальное качество каждого канала.&#xA;&#xA;Active/standby&#xA;&#xA;Основной туннель используется постоянно, резервный включается после отказа. Просто и предсказуемо, но оплаченный резерв большую часть времени простаивает.&#xA;&#xA;Критично правильно определить отказ. Наличие линка Ethernet и даже доступность gateway не означают, что удалённый сервис достижим.&#xA;&#xA;Active/active&#xA;&#xA;Несколько путей используются одновременно. Потоки распределяются по политике, ECMP или измеренным характеристикам.&#xA;&#xA;Нельзя бездумно отправлять пакеты одного TCP-сеанса разными маршрутами с сильно отличающейся задержкой: reordering ухудшит производительность. Обычно путь выбирается на поток или применяется специальная техника packet steering.&#xA;&#xA;Пробы SLA&#xA;&#xA;Система измеряет:&#xA;&#xA;loss;&#xA;latency;&#xA;jitter;&#xA;доступность конкретного назначения;&#xA;иногда реальную производительность.&#xA;&#xA;Для голоса важны задержка и jitter, для резервного копирования — полоса, для терминального доступа — loss и latency. Один универсальный показатель «канал зелёный» недостаточен.&#xA;&#xA;Маршрутизация по приложению&#xA;&#xA;Политика может сказать:&#xA;&#xA;голос идёт по каналу с минимальным jitter;&#xA;корпоративные приложения — через ЦОД;&#xA;обновления ОС — через локальный Интернет;&#xA;backup использует дешёвый канал ночью;&#xA;при деградации SaaS трафик переключается на другого оператора.&#xA;&#xA;Для этого нужны классификация, измерения и механизм безопасно изменить forwarding.&#xA;&#xA;Локальный выход (local breakout)&#xA;&#xA;Не весь Интернет-трафик нужно возить через центральный ЦОД. Локальный выход снижает задержку и нагрузку на backbone.&#xA;&#xA;Но политики безопасности, DNS, фильтрация и журналирование должны работать одинаково на всех филиалах. Иначе local breakout превращает каждый офис в отдельный маленький периметр, который надо обслуживать.&#xA;&#xA;Топология&#xA;&#xA;Небольшая сеть может использовать два центральных хаба.&#xA;&#xA;Распределённая компания — региональные хабы и контролируемый inter-region backbone.&#xA;&#xA;Прямые dynamic tunnels между филиалами полезны для голоса и локального обмена, но не обязаны подниматься между каждой парой.&#xA;&#xA;Control plane и отказ&#xA;&#xA;Orchestrator хранит намерение (intent) и распространяет конфигурацию. Локальное устройство должно продолжать forwarding по последней рабочей политике при потере управления.&#xA;&#xA;Проверяем отдельно:&#xA;&#xA;существующие сессии;&#xA;новые сессии;&#xA;переключение при отказе underlay;&#xA;обновление политики;&#xA;возврат основного канала;&#xA;split brain между контроллерами.&#xA;&#xA;Что можно собрать самостоятельно&#xA;&#xA;Базовый вариант:&#xA;&#xA;VyOS/Linux/маршрутизатор на филиале;&#xA;туннели WireGuard или IPsec;&#xA;BGP/OSPF внутри overlay;&#xA;BFD или активные probes;&#xA;policy routing;&#xA;Ansible/API для конфигурации;&#xA;Prometheus/Zabbix для измерений.&#xA;&#xA;Это уже способно дать хорошую связность. Но придётся самостоятельно решать orchestration, безопасное обновление политик, инвентарь, откат и единое представление состояния.&#xA;&#xA;Коммерческий SD-WAN продаёт именно эту операционную упаковку, а не неизвестный науке вид туннеля.&#xA;&#xA;Где это ломается&#xA;&#xA;«Канал зелёный», потому что ping до gateway есть, а SaaS уже недоступен.&#xA;Local breakout включили без единого DNS и журналирования.&#xA;Один TCP-сеанс размазали по двум каналам с разной задержкой.&#xA;Контроллеры в split brain раздают разные политики.&#xA;Три туннеля называют SD-WAN, хотя выбора пути по SLA нет.&#xA;&#xA;В финальной части соберём программу диагностики и начнём ломать нашу лабораторию одинаковыми способами.&#xA;&#xA;Предыдущая часть: «SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes»&#xA;&#xA;Оглавление цикла: «SDN без магии: карта видов связности»&#xA;&#xA;Следующая часть: «Диагностика SDN и лаборатория отказов»&#xA;&#xA;Схема&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-sdn-12-cover-digclean.jpg" alt="Обложка"></p>

<blockquote><p>Цикл «Виды связности и SDN», часть 12. Предыдущая часть: <a href="https://articles.clr58.ru/kubernetes-sdn">«SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes»</a>.</p></blockquote>

<p>Ось: область — филиалы и выбор пути (SD-WAN).</p>

<p>Если между офисом и ЦОДом поднять два VPN-туннеля, мы получим резервную связность. SD-WAN появляется, когда система централизованно описывает политики, измеряет качество путей и автоматически выбирает транспорт для разных потоков.</p>

<h3 id="underlay-остаётся-разным">Underlay остаётся разным</h3>

<p>Филиал может иметь:</p>
<ul><li>проводного оператора;</li>
<li>LTE/5G;</li>
<li>второго локального провайдера;</li>
<li>спутниковый канал;</li>
<li>L3VPN;</li>
<li>обычный Интернет.</li></ul>

<p>SD-WAN строит общий overlay и скрывает различия от приложений, но учитывает реальное качество каждого канала.</p>

<h3 id="active-standby">Active/standby</h3>

<p>Основной туннель используется постоянно, резервный включается после отказа. Просто и предсказуемо, но оплаченный резерв большую часть времени простаивает.</p>

<p>Критично правильно определить отказ. Наличие линка Ethernet и даже доступность gateway не означают, что удалённый сервис достижим.</p>

<h3 id="active-active">Active/active</h3>

<p>Несколько путей используются одновременно. Потоки распределяются по политике, ECMP или измеренным характеристикам.</p>

<p>Нельзя бездумно отправлять пакеты одного TCP-сеанса разными маршрутами с сильно отличающейся задержкой: reordering ухудшит производительность. Обычно путь выбирается на поток или применяется специальная техника packet steering.</p>

<h3 id="пробы-sla">Пробы SLA</h3>

<p>Система измеряет:</p>
<ul><li>loss;</li>
<li>latency;</li>
<li>jitter;</li>
<li>доступность конкретного назначения;</li>
<li>иногда реальную производительность.</li></ul>

<p>Для голоса важны задержка и jitter, для резервного копирования — полоса, для терминального доступа — loss и latency. Один универсальный показатель «канал зелёный» недостаточен.</p>

<h3 id="маршрутизация-по-приложению">Маршрутизация по приложению</h3>

<p>Политика может сказать:</p>
<ul><li>голос идёт по каналу с минимальным jitter;</li>
<li>корпоративные приложения — через ЦОД;</li>
<li>обновления ОС — через локальный Интернет;</li>
<li>backup использует дешёвый канал ночью;</li>
<li>при деградации SaaS трафик переключается на другого оператора.</li></ul>

<p>Для этого нужны классификация, измерения и механизм безопасно изменить forwarding.</p>

<h3 id="локальный-выход-local-breakout">Локальный выход (local breakout)</h3>

<p>Не весь Интернет-трафик нужно возить через центральный ЦОД. Локальный выход снижает задержку и нагрузку на backbone.</p>

<p>Но политики безопасности, DNS, фильтрация и журналирование должны работать одинаково на всех филиалах. Иначе local breakout превращает каждый офис в отдельный маленький периметр, который надо обслуживать.</p>

<h3 id="топология">Топология</h3>

<p>Небольшая сеть может использовать два центральных хаба.</p>

<p>Распределённая компания — региональные хабы и контролируемый inter-region backbone.</p>

<p>Прямые dynamic tunnels между филиалами полезны для голоса и локального обмена, но не обязаны подниматься между каждой парой.</p>

<h3 id="control-plane-и-отказ">Control plane и отказ</h3>

<p>Orchestrator хранит намерение (intent) и распространяет конфигурацию. Локальное устройство должно продолжать forwarding по последней рабочей политике при потере управления.</p>

<p>Проверяем отдельно:</p>
<ul><li>существующие сессии;</li>
<li>новые сессии;</li>
<li>переключение при отказе underlay;</li>
<li>обновление политики;</li>
<li>возврат основного канала;</li>
<li>split brain между контроллерами.</li></ul>

<h3 id="что-можно-собрать-самостоятельно">Что можно собрать самостоятельно</h3>

<p>Базовый вариант:</p>
<ul><li>VyOS/Linux/маршрутизатор на филиале;</li>
<li>туннели WireGuard или IPsec;</li>
<li>BGP/OSPF внутри overlay;</li>
<li>BFD или активные probes;</li>
<li>policy routing;</li>
<li>Ansible/API для конфигурации;</li>
<li>Prometheus/Zabbix для измерений.</li></ul>

<p>Это уже способно дать хорошую связность. Но придётся самостоятельно решать orchestration, безопасное обновление политик, инвентарь, откат и единое представление состояния.</p>

<p>Коммерческий SD-WAN продаёт именно эту операционную упаковку, а не неизвестный науке вид туннеля.</p>

<h3 id="где-это-ломается">Где это ломается</h3>
<ul><li>«Канал зелёный», потому что ping до gateway есть, а SaaS уже недоступен.</li>
<li>Local breakout включили без единого DNS и журналирования.</li>
<li>Один TCP-сеанс размазали по двум каналам с разной задержкой.</li>
<li>Контроллеры в split brain раздают разные политики.</li>
<li>Три туннеля называют SD-WAN, хотя выбора пути по SLA нет.</li></ul>

<p>В финальной части соберём программу диагностики и начнём ломать нашу лабораторию одинаковыми способами.</p>

<p>Предыдущая часть: <a href="https://articles.clr58.ru/kubernetes-sdn">«SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes»</a></p>

<p>Оглавление цикла: <a href="https://articles.clr58.ru/sdn-map">«SDN без магии: карта видов связности»</a></p>

<p>Следующая часть: «Диагностика SDN и лаборатория отказов»</p>

<p><img src="https://paste.clr58.ru/12-sdwan.jpg" alt="Схема"></p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/sdwan</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:45 +0000</pubDate>
    </item>
    <item>
      <title>SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes</title>
      <link>https://articles.clr58.ru/kubernetes-sdn</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;  Цикл «Виды связности и SDN», часть 11. Предыдущая часть: «SDN в ЦОД: spine-leaf, EVPN/VXLAN и OVN».&#xA;&#xA;Ось: область — Kubernetes.&#xA;&#xA;Kubernetes задаёт простую модель: pods должны иметь сетевую связность без ручного NAT между каждым контейнером. Как именно пакет попадёт с одного узла на другой, решает CNI и нижележащая сеть.&#xA;&#xA;Режим CrossSubnet и выбор IPIP/VXLAN как транспорта — в части 4. Двойная инкапсуляция WireGuard поверх VXLAN/Geneve — в части 8. Здесь смотрим, что именно прячет слово «CNI».&#xA;&#xA;Flannel&#xA;&#xA;Flannel решает базовую задачу связности pod. Наиболее известный backend — VXLAN. Каждый узел получает свой pod CIDR, а пакеты к удалённому CIDR инкапсулируются и отправляются VTEP другого узла.&#xA;&#xA;Кроме VXLAN есть host-gw: overlay нет, underlay должен маршрутизировать pod CIDR между узлами. Есть backend WireGuard. У VXLAN есть DirectRouting — близкий родственник Calico CrossSubnet: внутри подсети напрямую, через границу — туннель.&#xA;&#xA;Linux Flannel VXLAN обычно слушает UDP/8472, Windows — 4789.&#xA;&#xA;Это хороший вариант, когда нужна понятная базовая сеть, а сложные policies реализуются отдельным компонентом. Возможностей маршрутизации, identity и observability меньше, чем у Calico или Cilium.&#xA;&#xA;Calico&#xA;&#xA;Calico сочетает networking и NetworkPolicy.&#xA;&#xA;Основные варианты data plane:&#xA;&#xA;BGP/native routing без overlay;&#xA;IPIP;&#xA;VXLAN;&#xA;VXLAN/IPIP CrossSubnet;&#xA;eBPF или стандартный Linux dataplane;&#xA;WireGuard для шифрования.&#xA;&#xA;VXLAN использует UDP/4789 и подходит большему числу сред. В VXLAN mode Calico может не использовать BGP для overlay.&#xA;&#xA;В eBPF mode Calico рекомендует native routing, а если overlay необходим — VXLAN обычно предпочтительнее IPIP. Ограничения IPIP (IPv4, protocol 4, облака) разобраны в части 4.&#xA;&#xA;Cilium&#xA;&#xA;Cilium использует eBPF для forwarding, policies, service load balancing и observability. Он может заменить kube-proxy.&#xA;&#xA;Режимы связности:&#xA;&#xA;tunnel mode с VXLAN или Geneve;&#xA;native routing через обычную таблицу Linux;&#xA;BGP control plane для анонса сетей и сервисов;&#xA;прозрачное шифрование WireGuard или IPsec.&#xA;&#xA;В tunnel mode Cilium строит сетку VXLAN/Geneve между узлами. В native mode underlay должен маршрутизировать pod CIDR.&#xA;&#xA;WireGuard не всегда заменяет tunnel protocol. При tunnel mode Cilium сначала инкапсулирует трафик pod в VXLAN/Geneve, затем защищает межузловой поток WireGuard. При native routing остаётся одна инкапсуляция WireGuard. Firewall должен пропускать UDP/51871.&#xA;&#xA;Hubble даёт наблюдаемость на уровне flows и identity, что особенно полезно, когда внешний firewall видит только зашифрованные пакеты между узлами.&#xA;&#xA;OVN-Kubernetes&#xA;&#xA;OVN-Kubernetes использует OVN и Open vSwitch: logical switches, routers, ACL и Geneve overlay. Это мощная модель, близкая к виртуальным сетям OpenStack.&#xA;&#xA;Она удобна для сложной сегментации, logical routing и интеграции с OpenShift. Цена — больше компонентов и необходимость понимать OVN databases, logical flows и поведение gateway.&#xA;&#xA;NetworkPolicy не является шифрованием&#xA;&#xA;NetworkPolicy определяет, кто может обращаться к кому. Она не обязана шифровать разрешённый поток.&#xA;&#xA;Шифрование не заменяет policy: зашифрованный пакет от неразрешённого workload всё равно должен быть заблокирован.&#xA;&#xA;Нужны обе оси:&#xA;&#xA;кто к кому может ходить;&#xA;конфиденциальность и целостность транспорта.&#xA;&#xA;Как выбирать&#xA;&#xA;Нужна простая базовая overlay-сеть: Flannel VXLAN.&#xA;&#xA;Нужны BGP, гибридные режимы и зрелая NetworkPolicy: Calico.&#xA;&#xA;Нужны eBPF, observability, service load balancing и identity-aware policy: Cilium.&#xA;&#xA;Нужна модель logical switches/routers OVN или используется OpenShift: OVN-Kubernetes.&#xA;&#xA;Но продукт выбирают после проверки среды:&#xA;&#xA;размер кластера;&#xA;IPv4/IPv6;&#xA;Windows nodes;&#xA;возможности underlay;&#xA;требования к encryption;&#xA;доступ к физическому BGP;&#xA;MTU облака;&#xA;требования к observability;&#xA;компетенции команды.&#xA;&#xA;Минимальная проверка перед production&#xA;&#xA;Pod-to-pod между узлами.&#xA;Service и NodePort при локальном и удалённом backend.&#xA;MTU и большие TCP-пакеты.&#xA;NetworkPolicy для ingress и egress.&#xA;Отказ одного node.&#xA;Смена маршрута или AZ.&#xA;Шифрование и фактический внешний transport.&#xA;Throughput, PPS и CPU.&#xA;&#xA;Где это ломается&#xA;&#xA;NetworkPolicy есть, шифрования нет — или наоборот; оси путают.&#xA;Windows-узлы и IPv6 всплывают после выбора CNI.&#xA;MTU облака не совпадает с VXLAN/WireGuard, HTTPS «иногда зависает».&#xA;Cilium tunnel + WireGuard включают как «просто шифрование» без учёта двойного заголовка.&#xA;Underlay не маршрутизирует pod CIDR, а CNI уже перевели в native routing.&#xA;&#xA;Кластер закончился, каналов между площадками несколько — дальше это уже выбор пути. В следующей части выйдем к SD-WAN.&#xA;&#xA;Предыдущая часть: «SDN в ЦОД: spine-leaf, EVPN/VXLAN и OVN»&#xA;&#xA;Оглавление цикла: «SDN без магии: карта видов связности»&#xA;&#xA;Следующая часть: «SD-WAN: связность филиалов, ЦОДов и облаков»&#xA;&#xA;Схема&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-sdn-11-cover-digclean.jpg" alt="Обложка"></p>

<blockquote><p>Цикл «Виды связности и SDN», часть 11. Предыдущая часть: <a href="https://articles.clr58.ru/datacenter-sdn">«SDN в ЦОД: spine-leaf, EVPN/VXLAN и OVN»</a>.</p></blockquote>

<p>Ось: область — Kubernetes.</p>

<p>Kubernetes задаёт простую модель: pods должны иметь сетевую связность без ручного NAT между каждым контейнером. Как именно пакет попадёт с одного узла на другой, решает CNI и нижележащая сеть.</p>

<p>Режим CrossSubnet и выбор IPIP/VXLAN как транспорта — в части 4. Двойная инкапсуляция WireGuard поверх VXLAN/Geneve — в части 8. Здесь смотрим, что именно прячет слово «CNI».</p>

<h3 id="flannel">Flannel</h3>

<p>Flannel решает базовую задачу связности pod. Наиболее известный backend — VXLAN. Каждый узел получает свой pod CIDR, а пакеты к удалённому CIDR инкапсулируются и отправляются VTEP другого узла.</p>

<p>Кроме VXLAN есть host-gw: overlay нет, underlay должен маршрутизировать pod CIDR между узлами. Есть backend WireGuard. У VXLAN есть DirectRouting — близкий родственник Calico CrossSubnet: внутри подсети напрямую, через границу — туннель.</p>

<p>Linux Flannel VXLAN обычно слушает UDP/8472, Windows — 4789.</p>

<p>Это хороший вариант, когда нужна понятная базовая сеть, а сложные policies реализуются отдельным компонентом. Возможностей маршрутизации, identity и observability меньше, чем у Calico или Cilium.</p>

<h3 id="calico">Calico</h3>

<p>Calico сочетает networking и NetworkPolicy.</p>

<p>Основные варианты data plane:</p>
<ul><li>BGP/native routing без overlay;</li>
<li>IPIP;</li>
<li>VXLAN;</li>
<li>VXLAN/IPIP CrossSubnet;</li>
<li>eBPF или стандартный Linux dataplane;</li>
<li>WireGuard для шифрования.</li></ul>

<p>VXLAN использует UDP/4789 и подходит большему числу сред. В VXLAN mode Calico может не использовать BGP для overlay.</p>

<p>В eBPF mode Calico рекомендует native routing, а если overlay необходим — VXLAN обычно предпочтительнее IPIP. Ограничения IPIP (IPv4, protocol 4, облака) разобраны в части 4.</p>

<h3 id="cilium">Cilium</h3>

<p>Cilium использует eBPF для forwarding, policies, service load balancing и observability. Он может заменить kube-proxy.</p>

<p>Режимы связности:</p>
<ul><li>tunnel mode с VXLAN или Geneve;</li>
<li>native routing через обычную таблицу Linux;</li>
<li>BGP control plane для анонса сетей и сервисов;</li>
<li>прозрачное шифрование WireGuard или IPsec.</li></ul>

<p>В tunnel mode Cilium строит сетку VXLAN/Geneve между узлами. В native mode underlay должен маршрутизировать pod CIDR.</p>

<p>WireGuard не всегда заменяет tunnel protocol. При tunnel mode Cilium сначала инкапсулирует трафик pod в VXLAN/Geneve, затем защищает межузловой поток WireGuard. При native routing остаётся одна инкапсуляция WireGuard. Firewall должен пропускать UDP/51871.</p>

<p>Hubble даёт наблюдаемость на уровне flows и identity, что особенно полезно, когда внешний firewall видит только зашифрованные пакеты между узлами.</p>

<h3 id="ovn-kubernetes">OVN-Kubernetes</h3>

<p>OVN-Kubernetes использует OVN и Open vSwitch: logical switches, routers, ACL и Geneve overlay. Это мощная модель, близкая к виртуальным сетям OpenStack.</p>

<p>Она удобна для сложной сегментации, logical routing и интеграции с OpenShift. Цена — больше компонентов и необходимость понимать OVN databases, logical flows и поведение gateway.</p>

<h3 id="networkpolicy-не-является-шифрованием">NetworkPolicy не является шифрованием</h3>

<p>NetworkPolicy определяет, кто может обращаться к кому. Она не обязана шифровать разрешённый поток.</p>

<p>Шифрование не заменяет policy: зашифрованный пакет от неразрешённого workload всё равно должен быть заблокирован.</p>

<p>Нужны обе оси:</p>
<ul><li>кто к кому может ходить;</li>
<li>конфиденциальность и целостность транспорта.</li></ul>

<h3 id="как-выбирать">Как выбирать</h3>

<p><strong>Нужна простая базовая overlay-сеть:</strong> Flannel VXLAN.</p>

<p><strong>Нужны BGP, гибридные режимы и зрелая NetworkPolicy:</strong> Calico.</p>

<p><strong>Нужны eBPF, observability, service load balancing и identity-aware policy:</strong> Cilium.</p>

<p><strong>Нужна модель logical switches/routers OVN или используется OpenShift:</strong> OVN-Kubernetes.</p>

<p>Но продукт выбирают после проверки среды:</p>
<ul><li>размер кластера;</li>
<li>IPv4/IPv6;</li>
<li>Windows nodes;</li>
<li>возможности underlay;</li>
<li>требования к encryption;</li>
<li>доступ к физическому BGP;</li>
<li>MTU облака;</li>
<li>требования к observability;</li>
<li>компетенции команды.</li></ul>

<h3 id="минимальная-проверка-перед-production">Минимальная проверка перед production</h3>
<ol><li>Pod-to-pod между узлами.</li>
<li>Service и NodePort при локальном и удалённом backend.</li>
<li>MTU и большие TCP-пакеты.</li>
<li>NetworkPolicy для ingress и egress.</li>
<li>Отказ одного node.</li>
<li>Смена маршрута или AZ.</li>
<li>Шифрование и фактический внешний transport.</li>
<li>Throughput, PPS и CPU.</li></ol>

<h3 id="где-это-ломается">Где это ломается</h3>
<ul><li>NetworkPolicy есть, шифрования нет — или наоборот; оси путают.</li>
<li>Windows-узлы и IPv6 всплывают после выбора CNI.</li>
<li>MTU облака не совпадает с VXLAN/WireGuard, HTTPS «иногда зависает».</li>
<li>Cilium tunnel + WireGuard включают как «просто шифрование» без учёта двойного заголовка.</li>
<li>Underlay не маршрутизирует pod CIDR, а CNI уже перевели в native routing.</li></ul>

<p>Кластер закончился, каналов между площадками несколько — дальше это уже выбор пути. В следующей части выйдем к SD-WAN.</p>

<p>Предыдущая часть: <a href="https://articles.clr58.ru/datacenter-sdn">«SDN в ЦОД: spine-leaf, EVPN/VXLAN и OVN»</a></p>

<p>Оглавление цикла: <a href="https://articles.clr58.ru/sdn-map">«SDN без магии: карта видов связности»</a></p>

<p>Следующая часть: «SD-WAN: связность филиалов, ЦОДов и облаков»</p>

<p><img src="https://paste.clr58.ru/11-kubernetes-routing.jpg" alt="Схема"></p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/kubernetes-sdn</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:45 +0000</pubDate>
    </item>
    <item>
      <title>SDN в ЦОД: spine-leaf, EVPN/VXLAN и OVN</title>
      <link>https://articles.clr58.ru/datacenter-sdn</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;  Цикл «Виды связности и SDN», часть 10. Предыдущая часть: «Self-hosted mesh: Headscale, NetBird, Netmaker, Nebula, ZeroTier и OpenZiti».&#xA;&#xA;Ось: область — ЦОД.&#xA;&#xA;Фабрика ЦОД строится вокруг простой идеи: underlay должен быстро и предсказуемо доставлять IP-пакеты между leaf-коммутаторами, а tenant-сети и политики живут поверх него.&#xA;&#xA;Spine-leaf&#xA;&#xA;Каждый leaf подключён к каждому spine. Сервер обычно подключают к одному leaf или к паре. Путь между стойками имеет одинаковое число L3-переходов.&#xA;&#xA;ECMP распределяет потоки по нескольким равнозначным путям. Отказ одного линка или spine уменьшает доступную полосу, но не обязан разрывать связность.&#xA;&#xA;Underlay часто использует eBGP или OSPF/IS-IS. Его задача — маршрутизация loopback/VTEP-адресов и стабильная IP-доставка.&#xA;&#xA;VXLAN data plane&#xA;&#xA;Leaf или гипервизор выступает VTEP. Ethernet или IP-трафик tenant помещается в VXLAN и идёт к удалённому VTEP.&#xA;&#xA;Underlay не хранит MAC конечных VM. Он видит только IP VTEP и UDP-потоки.&#xA;&#xA;EVPN control plane&#xA;&#xA;BGP EVPN распространяет информацию, необходимую overlay.&#xA;&#xA;Коротко по типам маршрутов, которые здесь важны:&#xA;&#xA;Type 1 — Ethernet Auto-Discovery, в том числе для ESI и multi-homing;&#xA;Type 2 — MAC и, при наличии, IP хоста (привязка ARP/ND); next-hop — VTEP, а не «IP endpoint»;&#xA;Type 3 — Inclusive Multicast Ethernet Tag, обычно ingress replication для BUM;&#xA;Type 4 — Ethernet Segment;&#xA;Type 5 — IP prefix routes для L3.&#xA;&#xA;EVPN уменьшает flood-and-learn, но BUM не исчезает: Type 3 как раз про него. Type 2 убирает unknown-unicast learning и даёт ARP suppression, а не «больше никакого flooding».&#xA;&#xA;L2VNI и L3VNI&#xA;&#xA;L2VNI соответствует логическому Ethernet-сегменту.&#xA;&#xA;L3VNI связывается с VRF и используется для маршрутизации между сетями. Tenant может иметь несколько L2VNI внутри одной VRF.&#xA;&#xA;Distributed anycast gateway размещает одинаковый gateway IP/MAC на leaf. VM отправляет пакет ближайшему leaf, и inter-VLAN routing происходит локально.&#xA;&#xA;Symmetric и asymmetric IRB&#xA;&#xA;IRB — Integrated Routing and Bridging: leaf одновременно коммутирует внутри сегмента и маршрутизирует между сегментами.&#xA;&#xA;При asymmetric IRB ingress leaf должен знать L2VNI назначения. Он маршрутизирует пакет и затем передаёт кадр в удалённый L2-сегмент.&#xA;&#xA;При symmetric IRB оба leaf делают IP lookup, а между ними ходит L3VNI. Egress leaf переводит пакет в нужный L2VNI. Такая модель обычно лучше масштабируется по числу tenant-сегментов: ingress не обязан знать все удалённые L2VNI.&#xA;&#xA;Border leaf&#xA;&#xA;Overlay должен соединяться с внешним миром: Интернетом, MPLS, firewall, физическими серверами и legacy VLAN. Это выполняют border leaf или gateway routers.&#xA;&#xA;Именно здесь часто появляется централизованный транзит, NAT, service chaining и дополнительная точка отказа. Красивый distributed east-west не отменяет проектирование north-south.&#xA;&#xA;OVN и виртуальная сеть гипервизоров&#xA;&#xA;OVN создаёт logical switches, logical routers, ACL, DHCP и DNS поверх Open vSwitch.&#xA;&#xA;Distributed logical router реализуется на гипервизорах. East-west пакет может маршрутизироваться на исходном compute, не проходя через центральный network node. Для выхода к физической сети используются gateway chassis.&#xA;&#xA;В OpenStack Neutron ML2/OVN создаёт tenant networks, ports, routers и security groups, а OVN переводит желаемую модель в logical flows и правила OVS.&#xA;&#xA;Geneve удобен OVN из-за передачи metadata. VXLAN применяется при взаимодействии с VTEP и в отдельных сценариях.&#xA;&#xA;Связь EVPN и OVN&#xA;&#xA;Это не взаимоисключающие системы.&#xA;&#xA;EVPN/VXLAN может работать в физической fabric.&#xA;OVN создаёт overlay между гипервизорами.&#xA;Gateway связывает виртуальные logical networks с физическими VLAN/VXLAN/EVPN.&#xA;Более новые интеграции позволяют динамически рекламировать маршруты через BGP.&#xA;&#xA;Главное — не построить два независимых control plane, каждый из которых считает себя главным владельцем одного маршрута.&#xA;&#xA;Что резервировать&#xA;&#xA;spine и leaf links;&#xA;BGP route reflectors, если используются;&#xA;border leaf;&#xA;OVN Northbound/Southbound databases;&#xA;gateway chassis;&#xA;внешние BGP-сессии;&#xA;DHCP/DNS и metadata services;&#xA;физические подключения storage и management.&#xA;&#xA;Где это ломается&#xA;&#xA;Два control plane рекламируют один и тот же маршрут в разные стороны.&#xA;EVPN включили, а Type 3/BUM и ARP suppression не проверили.&#xA;Anycast gateway есть, а north-south всё равно едет в один незарезервированный border leaf.&#xA;Все RR и контроллеры OVN стоят в одной стойке.&#xA;MTU фабрики оставили 1500 при VXLAN между leaf.&#xA;&#xA;В следующей части перенесём эти понятия в Kubernetes, где роль endpoints выполняют pods, а выбор между VXLAN, Geneve, IPIP и native routing часто скрыт за одной настройкой CNI.&#xA;&#xA;Предыдущая часть: «Self-hosted mesh: Headscale, NetBird, Netmaker, Nebula, ZeroTier и OpenZiti»&#xA;&#xA;Оглавление цикла: «SDN без магии: карта видов связности»&#xA;&#xA;Следующая часть: «SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes»&#xA;&#xA;Схема&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-sdn-10-cover-digclean.jpg" alt="Обложка"></p>

<blockquote><p>Цикл «Виды связности и SDN», часть 10. Предыдущая часть: <a href="https://articles.clr58.ru/selfhosted-mesh">«Self-hosted mesh: Headscale, NetBird, Netmaker, Nebula, ZeroTier и OpenZiti»</a>.</p></blockquote>

<p>Ось: область — ЦОД.</p>

<p>Фабрика ЦОД строится вокруг простой идеи: underlay должен быстро и предсказуемо доставлять IP-пакеты между leaf-коммутаторами, а tenant-сети и политики живут поверх него.</p>

<h3 id="spine-leaf">Spine-leaf</h3>

<p>Каждый leaf подключён к каждому spine. Сервер обычно подключают к одному leaf или к паре. Путь между стойками имеет одинаковое число L3-переходов.</p>

<p>ECMP распределяет потоки по нескольким равнозначным путям. Отказ одного линка или spine уменьшает доступную полосу, но не обязан разрывать связность.</p>

<p>Underlay часто использует eBGP или OSPF/IS-IS. Его задача — маршрутизация loopback/VTEP-адресов и стабильная IP-доставка.</p>

<h3 id="vxlan-data-plane">VXLAN data plane</h3>

<p>Leaf или гипервизор выступает VTEP. Ethernet или IP-трафик tenant помещается в VXLAN и идёт к удалённому VTEP.</p>

<p>Underlay не хранит MAC конечных VM. Он видит только IP VTEP и UDP-потоки.</p>

<h3 id="evpn-control-plane">EVPN control plane</h3>

<p>BGP EVPN распространяет информацию, необходимую overlay.</p>

<p>Коротко по типам маршрутов, которые здесь важны:</p>
<ul><li>Type 1 — Ethernet Auto-Discovery, в том числе для ESI и multi-homing;</li>
<li>Type 2 — MAC и, при наличии, IP хоста (привязка ARP/ND); next-hop — VTEP, а не «IP endpoint»;</li>
<li>Type 3 — Inclusive Multicast Ethernet Tag, обычно ingress replication для BUM;</li>
<li>Type 4 — Ethernet Segment;</li>
<li>Type 5 — IP prefix routes для L3.</li></ul>

<p>EVPN уменьшает flood-and-learn, но BUM не исчезает: Type 3 как раз про него. Type 2 убирает unknown-unicast learning и даёт ARP suppression, а не «больше никакого flooding».</p>

<h3 id="l2vni-и-l3vni">L2VNI и L3VNI</h3>

<p>L2VNI соответствует логическому Ethernet-сегменту.</p>

<p>L3VNI связывается с VRF и используется для маршрутизации между сетями. Tenant может иметь несколько L2VNI внутри одной VRF.</p>

<p>Distributed anycast gateway размещает одинаковый gateway IP/MAC на leaf. VM отправляет пакет ближайшему leaf, и inter-VLAN routing происходит локально.</p>

<h3 id="symmetric-и-asymmetric-irb">Symmetric и asymmetric IRB</h3>

<p>IRB — Integrated Routing and Bridging: leaf одновременно коммутирует внутри сегмента и маршрутизирует между сегментами.</p>

<p>При asymmetric IRB ingress leaf должен знать L2VNI назначения. Он маршрутизирует пакет и затем передаёт кадр в удалённый L2-сегмент.</p>

<p>При symmetric IRB оба leaf делают IP lookup, а между ними ходит L3VNI. Egress leaf переводит пакет в нужный L2VNI. Такая модель обычно лучше масштабируется по числу tenant-сегментов: ingress не обязан знать все удалённые L2VNI.</p>

<h3 id="border-leaf">Border leaf</h3>

<p>Overlay должен соединяться с внешним миром: Интернетом, MPLS, firewall, физическими серверами и legacy VLAN. Это выполняют border leaf или gateway routers.</p>

<p>Именно здесь часто появляется централизованный транзит, NAT, service chaining и дополнительная точка отказа. Красивый distributed east-west не отменяет проектирование north-south.</p>

<h3 id="ovn-и-виртуальная-сеть-гипервизоров">OVN и виртуальная сеть гипервизоров</h3>

<p>OVN создаёт logical switches, logical routers, ACL, DHCP и DNS поверх Open vSwitch.</p>

<p>Distributed logical router реализуется на гипервизорах. East-west пакет может маршрутизироваться на исходном compute, не проходя через центральный network node. Для выхода к физической сети используются gateway chassis.</p>

<p>В OpenStack Neutron ML2/OVN создаёт tenant networks, ports, routers и security groups, а OVN переводит желаемую модель в logical flows и правила OVS.</p>

<p>Geneve удобен OVN из-за передачи metadata. VXLAN применяется при взаимодействии с VTEP и в отдельных сценариях.</p>

<h3 id="связь-evpn-и-ovn">Связь EVPN и OVN</h3>

<p>Это не взаимоисключающие системы.</p>
<ul><li>EVPN/VXLAN может работать в физической fabric.</li>
<li>OVN создаёт overlay между гипервизорами.</li>
<li>Gateway связывает виртуальные logical networks с физическими VLAN/VXLAN/EVPN.</li>
<li>Более новые интеграции позволяют динамически рекламировать маршруты через BGP.</li></ul>

<p>Главное — не построить два независимых control plane, каждый из которых считает себя главным владельцем одного маршрута.</p>

<h3 id="что-резервировать">Что резервировать</h3>
<ul><li>spine и leaf links;</li>
<li>BGP route reflectors, если используются;</li>
<li>border leaf;</li>
<li>OVN Northbound/Southbound databases;</li>
<li>gateway chassis;</li>
<li>внешние BGP-сессии;</li>
<li>DHCP/DNS и metadata services;</li>
<li>физические подключения storage и management.</li></ul>

<h3 id="где-это-ломается">Где это ломается</h3>
<ul><li>Два control plane рекламируют один и тот же маршрут в разные стороны.</li>
<li>EVPN включили, а Type 3/BUM и ARP suppression не проверили.</li>
<li>Anycast gateway есть, а north-south всё равно едет в один незарезервированный border leaf.</li>
<li>Все RR и контроллеры OVN стоят в одной стойке.</li>
<li>MTU фабрики оставили 1500 при VXLAN между leaf.</li></ul>

<p>В следующей части перенесём эти понятия в Kubernetes, где роль endpoints выполняют pods, а выбор между VXLAN, Geneve, IPIP и native routing часто скрыт за одной настройкой CNI.</p>

<p>Предыдущая часть: <a href="https://articles.clr58.ru/selfhosted-mesh">«Self-hosted mesh: Headscale, NetBird, Netmaker, Nebula, ZeroTier и OpenZiti»</a></p>

<p>Оглавление цикла: <a href="https://articles.clr58.ru/sdn-map">«SDN без магии: карта видов связности»</a></p>

<p>Следующая часть: «SDN в Kubernetes: Flannel, Calico, Cilium и OVN-Kubernetes»</p>

<p><img src="https://paste.clr58.ru/10-dc-fabric.jpg" alt="Схема"></p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/datacenter-sdn</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:44 +0000</pubDate>
    </item>
  </channel>
</rss>