<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ospf &amp;mdash; Цифровой дворник</title>
    <link>https://articles.clr58.ru/tag:ospf</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 01:16:05 +0000</pubDate>
    <item>
      <title>OSPF маршрут видит, а абонент — нет: как proxy ARP вернул связность на MikroTik</title>
      <link>https://articles.clr58.ru/mt-ospf-proxy-arp</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Практический разбор операторской сети с IPoE, PPPoE, OSPF и NAT.&#xA;&#xA;  Все названия узлов, интерфейсов и IP-адреса изменены. Для примеров используется документационный диапазон 198.51.100.0/24. Сетевая логика и последовательность диагностики сохранены.&#xA;&#xA;Иногда диагностика выглядит почти издевательски. На MikroTik есть маршрут до нужного адреса. OSPF-соседи в состоянии Full. С самого маршрутизатора цель доступна. Но абонент говорит: «не работает», и он тоже прав.&#xA;&#xA;В нашем случае пакет проигрывал не в OSPF, не в firewall и даже не в NAT. Он вообще не добирался до маршрутизатора: CPE решил, что адрес назначения находится рядом с ним в одном L2-сегменте, отправил ARP-запрос и остался ждать ответа.&#xA;&#xA;Разберём по порядку: как к этому привели общая публичная /24, тысячи изолированных VLAN и arp=reply-only, почему помог proxy-arp, какие побочные эффекты у такого лечения — и уже после разбора кейса пройдёмся по всем режимам ARP в RouterOS как по справочнику.&#xA;&#xA;Исходная схема&#xA;&#xA;В сети было несколько MikroTik-шлюзов. Между ними работал OSPF, через который распространялись абонентские /32 и другие нужные маршруты.&#xA;&#xA;Одновременно на общей uplink-сети использовался публичный блок 198.51.100.0/24. Адреса из него встречались сразу в нескольких ролях:&#xA;&#xA;IPoE-абоненты в отдельных PON/VLAN-сегментах;&#xA;PPPoE-клиенты с адресом peer /32;&#xA;публичные адреса на uplink, используемые для src-nat и dst-nat;&#xA;служебные адреса самих шлюзов.&#xA;&#xA;Упрощённая топология: четыре шлюза, OSPF, IPoE, PPPoE и NAT&#xA;&#xA;IPoE-клиенту DHCP выдавал адрес из этого блока, шлюз и маску /24. Физически соседние адреса могли находиться на разных VLAN и даже на разных маршрутизаторах, но CPE об этом не знал: для него весь 198.51.100.0/24 выглядел одной локальной сетью.&#xA;&#xA;Это и было заложенной миной.&#xA;&#xA;Симптом&#xA;&#xA;Типичная жалоба: IPoE-абонент 198.51.100.70 не пингует 198.51.100.123. На шлюзе при этом виден маршрут 198.51.100.123/32, полученный через OSPF.&#xA;&#xA;Логика инженера понятна:&#xA;&#xA;маршрут есть;&#xA;next hop доступен;&#xA;значит, пакет должен уйти на соседний GW.&#xA;&#xA;Но CPE с маской /24 рассуждает иначе:&#xA;&#xA;адрес назначения входит в мою локальную сеть;&#xA;шлюз мне не нужен;&#xA;сначала узнаю MAC-адрес 198.51.100.123 через ARP.&#xA;&#xA;ARP broadcast остаётся внутри абонентского VLAN. Настоящего владельца адреса там нет. Ответить за него мог бы маршрутизатор, но на интерфейсе был включён arp=reply-only.&#xA;&#xA;До исправления: ARP-запрос остаётся без ответа, а OSPF даже не получает пакет&#xA;&#xA;Именно поэтому хороший маршрут не помогал: маршрутизация начинается только после того, как CPE сформировал Ethernet-кадр. Без MAC-адреса назначения кадра нет, IP-пакет не уходит со стороны клиента, и OSPF в этой сцене просто не получает реплики.&#xA;&#xA;Что именно делал reply-only&#xA;&#xA;Тут важна аккуратная формулировка. reply-only — не режим «отвечать только за адрес шлюза». В RouterOS он отключает динамическое ARP-обучение и опирается на заранее заданные соответствия IP/MAC в /ip arp. Такой режим часто используют вместе с DHCP add-arp=yes, чтобы неизвестное устройство не могло свободно подменить адрес.&#xA;&#xA;Но reply-only не делает маршрутизатор ARP-посредником для адресов за другими интерфейсами. Валидный клиент может обращаться к самому шлюзу, однако на ARP-запрос о чужом 198.51.100.x маршрутизатор своим MAC не ответит.&#xA;&#xA;Короткая памятка:&#xA;&#xA;| Режим | Что происходит | Где уместен |&#xA;|---|---|---|&#xA;| enabled | Обычное динамическое ARP-обучение | Стандартный L2-сегмент |&#xA;| reply-only | Работа по статическим IP/MAC-записям, без динамического обучения | Контролируемый access с DHCP add-arp=yes или ручными ARP-записями |&#xA;| proxy-arp | Роутер отвечает своим MAC за адрес, путь к которому лежит через другой интерфейс | Разнесённые L2-сегменты, которым выдали адреса из общего IP-префикса |&#xA;| local-proxy-arp | Роутер проксирует ARP между узлами на одном и том же интерфейсе | Изоляция клиентов внутри общего интерфейса/сегмента |&#xA;&#xA;В нашем кейсе адрес назначения находился за другим интерфейсом, поэтому нужен был именно proxy-arp, а не local-proxy-arp.&#xA;&#xA;Как сработал proxy-arp&#xA;&#xA;Proxy ARP — приём, описанный ещё в RFC 1027: маршрутизатор отвечает своим MAC-адресом на ARP-запросы о тех IP, которые лежат не в этом сегменте, а за другими его интерфейсами, и до которых у него есть маршрут. Хост получает ответ, считает, что цель находится рядом на канальном уровне, и отправляет кадр маршрутизатору. Тот, ничего не меняя в IP-заголовке, делает обычный L3-forwarding.&#xA;&#xA;Важно, что «склейка» происходит не на канальном уровне, а через таблицу маршрутизации: маршрутизатор отвечает не за всё подряд, а только за адреса с активным маршрутом, и только если маршрут указывает не на тот интерфейс, откуда пришёл запрос.&#xA;&#xA;На выбранных абонентских VLAN режим ARP сменили на proxy-arp, и последовательность стала такой:&#xA;&#xA;CPE спрашивает: «Кто такой 198.51.100.123?»&#xA;MikroTik проверяет таблицу маршрутизации и видит путь к адресу через другой интерфейс.&#xA;Маршрутизатор отвечает собственным MAC.&#xA;CPE отправляет Ethernet-кадр на MikroTik, хотя IP-адрес назначения остаётся прежним.&#xA;После этого начинается обычный L3-forwarding: маршрут /32, OSPF, соседний GW и нужный абонентский интерфейс.&#xA;&#xA;После исправления: MikroTik отвечает своим MAC и передаёт пакет по маршруту&#xA;&#xA;Пример точечной настройки:&#xA;&#xA;/interface vlan print detail where arp=reply-only&#xA;/interface vlan set [find where name=&#34;access-101&#34;] arp=proxy-arp&#xA;/interface vlan print detail where name=&#34;access-101&#34;&#xA;&#xA;Соблазн сразу выполнить что-то вроде set [find arp=reply-only] понятен, особенно когда VLAN несколько тысяч. Но сначала нужно определить, какие интерфейсы действительно относятся к этой модели IPoE: reply-only мог быть включён осознанно как часть защиты IP/MAC, а глобальное переключение изменит поведение всей сети доступа.&#xA;&#xA;Если проксировать нужно буквально несколько адресов, RouterOS позволяет создать точечную опубликованную ARP-запись вместо включения proxy ARP для всего интерфейса:&#xA;&#xA;/ip arp add address=198.51.100.123 interface=access-101 published=yes&#xA;&#xA;Устройство ответит за этот IP только при наличии активного маршрута до него. Для тысяч динамически размещённых абонентов такой способ быстро превращается в отдельную систему учёта, но для единичного сервисного адреса он бывает аккуратнее — и, что важно, не отменяет reply-only для остальных адресов сегмента.&#xA;&#xA;Перед массовой правкой стоит:&#xA;&#xA;сохранить export и список исходных ARP-режимов;&#xA;отобрать интерфейсы по понятным именам, спискам или комментариям;&#xA;проверить один тестовый VLAN;&#xA;убедиться, что фильтры forward по-прежнему обеспечивают нужную изоляцию абонентов;&#xA;подготовить обратное переключение для каждого изменяемого интерфейса.&#xA;&#xA;Что получилось после изменения&#xA;&#xA;| Сценарий | До | После proxy-arp на IPoE-VLAN |&#xA;|---|---|---|&#xA;| IPoE ↔ IPoE, разные VLAN/GW | CPE ждёт ARP, пакет не доходит до GW | CPE отправляет кадр на MAC шлюза, дальше работает L3 |&#xA;| PPPoE ↔ PPPoE | Обычно работало через peer /32 | По сути без изменений |&#xA;| PPPoE ↔ IPoE | Часто ломался обратный путь на стороне IPoE | Работает при корректных маршрутах и firewall |&#xA;| IPoE ↔ публичный NAT IP | Выглядело как поломка связи двух абонентов | ARP-часть исправлена, но результат всё ещё зависит от NAT/firewall |&#xA;&#xA;Последняя строка таблицы — не формальность: именно на ней разбор чуть не увёл в неверную сторону.&#xA;&#xA;Ловушка: адрес выглядит абонентским, но это NAT&#xA;&#xA;Во время разбора попалась пара адресов, которая сначала казалась идеальным тестом:&#xA;&#xA;198.51.100.70 — настоящий IPoE-клиент на одном GW;&#xA;198.51.100.210 — «белый IP», который ожидали увидеть у другого абонента.&#xA;&#xA;Но второй адрес оказался назначен uplink-интерфейсу другого маршрутизатора и использовался как внешний адрес для NAT частного пула. Никакого CPE с адресом .210 не существовало.&#xA;&#xA;Это меняет смысл проверки. Пинг «абонент ↔ абонент» внезапно становится проверкой «IPoE-клиент ↔ адрес самого GW или сервис за dst-nat», а результат зависит уже от правил NAT, firewall и того, есть ли вообще трансляция для ICMP.&#xA;&#xA;Четыре разных сценария, которые снаружи выглядят как связь между адресами одной /24&#xA;&#xA;Поэтому перед выводом «абоненты друг друга не видят» полезно установить владельца каждого IP:&#xA;&#xA;/ip address print detail where address~&#34;198.51.100.210&#34;&#xA;/ip arp print detail where address=198.51.100.210&#xA;/ppp active print detail where address=198.51.100.210&#xA;/ip firewall nat print detail where dst-address~&#34;198.51.100.210&#34;&#xA;&#xA;А затем проверить, есть ли для него host route и где он был получен.&#xA;&#xA;При чём здесь OSPF&#xA;&#xA;OSPF в этой истории не был причиной поломки — он лишь доставлял между шлюзами информацию о том, где находится конкретный абонентский /32. Но чтобы proxy-arp заработал, должны выполняться два условия:&#xA;&#xA;нужный /32 действительно должен присутствовать в RIB/FIB выбранного MikroTik;&#xA;маршрут должен указывать через другой интерфейс, иначе обычный proxy-arp не решит задачу.&#xA;&#xA;Для RouterOS v7 маршрут удобно смотреть так:&#xA;&#xA;/routing route print detail where dst-address=198.51.100.123/32&#xA;/routing ospf neighbor print detail&#xA;&#xA;В RouterOS v6 таблица маршрутов проверяется через:&#xA;&#xA;/ip route print detail where dst-address=198.51.100.123/32&#xA;&#xA;Если /32 не анонсируется, соседство застряло в ExStart/Exchange или маршрут отфильтрован, proxy-arp проблему не исправит: он помогает клиенту передать пакет маршрутизатору, но маршрут до цели всё равно должен существовать. Это прямое следствие механики режима — решение об ARP-ответе принимается по таблице маршрутизации, поэтому пустая FIB означает тишину в ответ на who-has.&#xA;&#xA;Практический порядок диагностики&#xA;&#xA;Из всего этого сложилась рабочая последовательность.&#xA;&#xA;1. Проверить логику CPE&#xA;&#xA;Посмотреть выданную маску. Если клиент получил /24, он будет ARP-ить любой адрес из этой /24, даже если оператор разнёс адреса по разным VLAN.&#xA;&#xA;2. Посмотреть ARP на access-интерфейсе&#xA;&#xA;/interface vlan print detail where name=&#34;access-101&#34;&#xA;/tool sniffer quick interface=access-101 mac-protocol=arp&#xA;&#xA;Характерный симптом: от CPE приходит who-has, но ответа за удалённый адрес нет.&#xA;&#xA;3. Проверить маршрут до точного адреса&#xA;&#xA;Смотреть нужно не только общий connected /24, но и специфичный /32. Иначе трафик может уйти на общий uplink или не к тому GW.&#xA;&#xA;4. Установить реального владельца IP&#xA;&#xA;Адрес может принадлежать IPoE-клиенту, PPP-сессии, интерфейсу маршрутизатора, NAT-пулу или вообще быть свободным. Одинаковая запись в заявке «белый IP» ещё не означает одинаковую сетевую сущность.&#xA;&#xA;5. Проверить OSPF и обратный путь&#xA;&#xA;Соседство должно быть Full, нужный /32 — установлен, а обратный маршрут — симметричен или хотя бы допустим правилами firewall и rp-filter.&#xA;&#xA;6. Только после этого включать proxy-arp&#xA;&#xA;Сначала на одном VLAN, затем на небольшой группе, и лишь потом — массово. После изменения проверяются ARP, ping, TCP-сессия и счётчики firewall в обоих направлениях.&#xA;&#xA;Как устроен proxy ARP: режимы RouterOS&#xA;&#xA;Кейс на этом закрыт. Дальше — справочная часть: что именно RouterOS делает с ARP в каждом режиме и почему в нашей ситуации выбор был безальтернативным.&#xA;&#xA;Начать стоит с логики хоста. Собираясь отправить IP-пакет, он сначала решает, «локальный» адрес назначения или нет: применяет свою маску к своему и к целевому адресу. Если адреса попали в одну подсеть, шлюз не используется вовсе — хост рассылает широковещательный ARP-запрос who-has и ждёт, кто отзовётся своим MAC. Ethernet-кадр без MAC назначения не собирается, поэтому при отсутствии ответа никакого IP-трафика просто не появляется.&#xA;&#xA;Proxy ARP в RFC 1027 прямо называли «ARP-хаком» для подсетей: механизм придумали для стеков, которые не умели работать с подсетями. Живёт он ровно по той же причине, что и в нашем кейсе: адреса одной подсети оказались разнесены по разным линкам, VLAN или тоннелям, а хосты об этом не знают. Побочный эффект хорошо видно в ARP-таблице клиента: десятки разных IP там отображаются на один и тот же MAC шлюза.&#xA;&#xA;Теперь по режимам, которые RouterOS позволяет задать на интерфейсе (подробности — в официальной документации по ARP):&#xA;&#xA;enabled — поведение по умолчанию. Маршрутизатор отвечает на запросы о своих адресах, сам рассылает who-has, когда нужно, и динамически учит соответствия IP/MAC. Подходит для обычного доверенного сегмента: серверная сеть, офисный LAN, транзитный линк.&#xA;disabled — ARP на интерфейсе не работает совсем: ни ответов, ни обучения. Связность возможна только со статическими записями в /ip arp с обеих сторон. Применяется в жёстко зафиксированных схемах и на линках, где ARP не нужен по своей природе (PPP-подобные точка-точка).&#xA;reply-only — компромисс между контролем и удобством: динамического обучения нет, маршрутизатор работает исключительно по статическим и добавленным DHCP-сервером записям. Отсюда и связка с параметром add-arp=yes: клиент получил адрес по DHCP — запись появилась; сменил IP или MAC вручную — не общается ни с кем. Это ровно тот режим, который и стоял на наших access-VLAN.&#xA;proxy-arp — маршрутизатор дополнительно отвечает своим MAC за адреса, достижимые через другие интерфейсы. Именно этот режим нужен, когда хосты одной подсети физически раскиданы по разным сегментам, а переделать маску на всех CPE нельзя.&#xA;local-proxy-arp — маршрутизатор проксирует ARP между узлами того же интерфейса: клиент A спрашивает про клиента B, находящегося в том же VLAN или бридже, и получает MAC шлюза, после чего весь трафик между ними идёт через маршрутизатор. Так делают, когда на L2 включена изоляция портов (bridge horizon, PON client isolation), но соседи всё же должны видеть друг друга — уже под контролем firewall и учёта.&#xA;&#xA;Разница между двумя proxy-режимами — исключительно в том, где находится цель: за другим интерфейсом или в том же сегменте. Подменить один другим не получится, это отдельные значения параметра, и на интерфейсе действует одно из них. Соответственно, включая proxy-arp, вы отказываетесь от строгости reply-only на этом интерфейсе, и защиту от подмены адресов приходится переносить на DHCP snooping, ACL и firewall.&#xA;&#xA;Когда proxy-arp полезен&#xA;&#xA;Несмотря на репутацию «костыля», у режима есть сценарии, где он не просто работает, а является наиболее логичным решением.&#xA;&#xA;Адреса одной /24 разнесены по разным VLAN и интерфейсам, а CPE считает их локальными — наш случай. Клиент никогда не отправит пакет шлюзу, потому что по своей маске он «уже дома»; единственный способ вклиниться в этот диалог — ответить ему на ARP.&#xA;Тоннели и мосты, где удалённая подсеть должна выглядеть локальной. Через EoIP, GRE или IPIP приходят адреса того же префикса, и хостам на одной стороне нужно ARP-разрешать адреса другой; proxy ARP позволяет не растягивать broadcast-домен и не поднимать полноценный L2-мост, оставив стык на маршрутизации.&#xA;Быстрое восстановление связности без миграции адресации. Переразметка сети с /24 на per-subscriber /32 — это проект на недели, с перевыпуском DHCP-опций и правкой профилей; включение proxy-arp на нужных интерфейсах возвращает сервис за минуты и не требует прикасаться к абонентскому оборудованию.&#xA;Единичные «белые» адреса и сервисы для устройств с зашитой маской. Старый принтер, терминал или контроллер с жёстко прописанными адресом и /24 физически не умеет ходить через шлюз к соседнему префиксу; proxy ARP (а лучше — точечная опубликованная ARP-запись) делает такой адрес достижимым, не требуя перенастройки самого устройства.&#xA;Ситуации, где local-proxy-arp не подходит. Если цель находится за другим интерфейсом, а не среди соседей по сегменту, локальный вариант не сработает вообще: он рассчитан на проксирование внутри одного интерфейса и не смотрит на маршруты за его пределы.&#xA;&#xA;Цена решения&#xA;&#xA;proxy-arp оказался рабочим операционным исправлением, но он не превращает исходный дизайн в идеальный. Что приходится учитывать:&#xA;&#xA;маршрутизатор становится обязательным посредником между адресами, которые CPE считает локальными;&#xA;ARP-таблицы и uplink могут стать шумнее;&#xA;при неоднозначной маршрутизации несколько GW способны отвечать за один адрес, поэтому нужны специфичные /32 и аккуратная фильтрация анонсов;&#xA;клиентская изоляция теперь должна явно обеспечиваться firewall, а не случайным отсутствием ARP-ответа;&#xA;широкое включение proxy-arp частично меняет исходную модель защиты reply-only.&#xA;&#xA;«Костылём» этот режим называют вполне обоснованно. Во-первых, он поощряет клиента ARP-ить весь префикс: каждое новое направление добавляет запись в ARP-кэш CPE и порождает широковещательный запрос в сегменте, а на масштабе тысяч VLAN и десятков тысяч устройств это заметная фоновая нагрузка и раздутые таблицы соседств. Во-вторых, он размывает границу между L2 и L3: логически адреса маршрутизируются, но топология в голове хоста остаётся плоской, из-за чего диагностика перестаёт совпадать со схемой — «локальный» по мнению CPE адрес фактически лежит через два хопа и чужой firewall. В-третьих, страдает изоляция: пока ARP-ответа не было, соседи по префиксу физически не могли достучаться друг до друга, а теперь между ними есть исправно работающий посредник, и единственное, что их разделяет, — правила в forward.&#xA;&#xA;Отдельная категория неприятностей — неоднозначность. Если один и тот же префикс присутствует на нескольких шлюзах, за один и тот же адрес потенциально может ответить не тот маршрутизатор, у которого лучший путь, а тот, чей ARP-ответ пришёл первым; клиент закрепит в кэше «случайный» MAC на время жизни записи. Дальше подключается асимметрия: трафик уходит через одного GW, возвращается через другого, и rp-filter вместе с connection tracking начинают отбрасывать вполне легитимные пакеты, а причина выглядит как «иногда работает, иногда нет». Всё это лечится специфичными /32, аккуратной фильтрацией анонсов OSPF и предсказуемой политикой обратного пути.&#xA;&#xA;И всё же в операторских IPoE-сетях proxy-arp регулярно оказывается единственным быстрым фиксом. Абонентские устройства оператору не принадлежат, маску и шлюз в них меняет только DHCP, а массовое переучивание парка CPE на новую адресную модель — это согласования, окна работ и обращения в поддержку. Когда связность нужна сейчас, а адресация исторически плоская, включение прокси на нужных access-интерфейсах даёт результат в пределах одной сессии в терминале и оставляет время на нормальный редизайн.&#xA;&#xA;Стратегически чище выдавать абоненту /32 с маршрутом через gateway либо использовать адресную модель, в которой CPE не считает весь публичный блок своим L2-сегментом. PPPoE изначально ближе к этой логике: у клиента есть peer, и чужой адрес сразу отправляется маршрутизатору.&#xA;&#xA;Но миграция адресации — отдельный проект. Когда сеть уже построена на общей /24, а простоя быть не должно, точечно включённый proxy-arp позволяет восстановить связность без переделки всех CPE за одну ночь.&#xA;&#xA;Вывод&#xA;&#xA;Главный урок этого случая простой: наличие маршрута ещё не доказывает, что пакет дошёл до уровня маршрутизации. При слишком широкой маске CPE сначала ищет удалённый адрес через ARP, и с reply-only этот запрос остаётся без ответа. proxy-arp подставляет MAC шлюза, после чего уже начинают работать OSPF, NAT и привычная L3-диагностика.&#xA;&#xA;В следующий раз, когда OSPF уверенно показывает нужный /32, а абонент всё равно никого не видит, стоит посмотреть не только route print, но и один скромный who-has, который так и не получил ответа.&#xA;&#xA;---&#xA;&#xA;Официальная документация MikroTik: ARP и режимы proxy/reply-only, DHCP и параметр add-arp, OSPF в RouterOS, Packet Sniffer, отличия маршрутизации RouterOS v6 и v7. Термин proxy ARP и исходное описание механизма — RFC 1027.&#xA;&#xA;#network #mikrotik #ospf&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-mt-ospf-proxy-arp-digclean.jpg" alt="Обложка"></p>

<p><em>Практический разбор операторской сети с IPoE, PPPoE, OSPF и NAT.</em></p>

<blockquote><p>Все названия узлов, интерфейсов и IP-адреса изменены. Для примеров используется документационный диапазон <code>198.51.100.0/24</code>. Сетевая логика и последовательность диагностики сохранены.</p></blockquote>

<p>Иногда диагностика выглядит почти издевательски. На MikroTik есть маршрут до нужного адреса. OSPF-соседи в состоянии Full. С самого маршрутизатора цель доступна. Но абонент говорит: «не работает», и он тоже прав.</p>

<p>В нашем случае пакет проигрывал не в OSPF, не в firewall и даже не в NAT. Он вообще не добирался до маршрутизатора: CPE решил, что адрес назначения находится рядом с ним в одном L2-сегменте, отправил ARP-запрос и остался ждать ответа.</p>

<p>Разберём по порядку: как к этому привели общая публичная <code>/24</code>, тысячи изолированных VLAN и <code>arp=reply-only</code>, почему помог <code>proxy-arp</code>, какие побочные эффекты у такого лечения — и уже после разбора кейса пройдёмся по всем режимам ARP в RouterOS как по справочнику.</p>

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

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

<p>Одновременно на общей uplink-сети использовался публичный блок <code>198.51.100.0/24</code>. Адреса из него встречались сразу в нескольких ролях:</p>
<ul><li>IPoE-абоненты в отдельных PON/VLAN-сегментах;</li>
<li>PPPoE-клиенты с адресом peer <code>/32</code>;</li>
<li>публичные адреса на uplink, используемые для <code>src-nat</code> и <code>dst-nat</code>;</li>
<li>служебные адреса самих шлюзов.</li></ul>

<p><img src="https://paste.clr58.ru/01-topology.jpg" alt="Упрощённая топология: четыре шлюза, OSPF, IPoE, PPPoE и NAT"></p>

<p>IPoE-клиенту DHCP выдавал адрес из этого блока, шлюз и маску <code>/24</code>. Физически соседние адреса могли находиться на разных VLAN и даже на разных маршрутизаторах, но CPE об этом не знал: для него весь <code>198.51.100.0/24</code> выглядел одной локальной сетью.</p>

<p>Это и было заложенной миной.</p>

<h2 id="симптом">Симптом</h2>

<p>Типичная жалоба: IPoE-абонент <code>198.51.100.70</code> не пингует <code>198.51.100.123</code>. На шлюзе при этом виден маршрут <code>198.51.100.123/32</code>, полученный через OSPF.</p>

<p>Логика инженера понятна:</p>
<ol><li>маршрут есть;</li>
<li>next hop доступен;</li>
<li>значит, пакет должен уйти на соседний GW.</li></ol>

<p>Но CPE с маской <code>/24</code> рассуждает иначе:</p>
<ol><li>адрес назначения входит в мою локальную сеть;</li>
<li>шлюз мне не нужен;</li>
<li>сначала узнаю MAC-адрес <code>198.51.100.123</code> через ARP.</li></ol>

<p>ARP broadcast остаётся внутри абонентского VLAN. Настоящего владельца адреса там нет. Ответить за него мог бы маршрутизатор, но на интерфейсе был включён <code>arp=reply-only</code>.</p>

<p><img src="https://paste.clr58.ru/02-reply-only-problem.jpg" alt="До исправления: ARP-запрос остаётся без ответа, а OSPF даже не получает пакет"></p>

<p>Именно поэтому хороший маршрут не помогал: маршрутизация начинается только после того, как CPE сформировал Ethernet-кадр. Без MAC-адреса назначения кадра нет, IP-пакет не уходит со стороны клиента, и OSPF в этой сцене просто не получает реплики.</p>

<h2 id="что-именно-делал-reply-only">Что именно делал <code>reply-only</code></h2>

<p>Тут важна аккуратная формулировка. <code>reply-only</code> — не режим «отвечать только за адрес шлюза». В RouterOS он отключает динамическое ARP-обучение и опирается на заранее заданные соответствия IP/MAC в <code>/ip arp</code>. Такой режим часто используют вместе с DHCP <code>add-arp=yes</code>, чтобы неизвестное устройство не могло свободно подменить адрес.</p>

<p>Но <code>reply-only</code> <strong>не делает маршрутизатор ARP-посредником для адресов за другими интерфейсами</strong>. Валидный клиент может обращаться к самому шлюзу, однако на ARP-запрос о чужом <code>198.51.100.x</code> маршрутизатор своим MAC не ответит.</p>

<p>Короткая памятка:</p>

<table>
<thead>
<tr>
<th>Режим</th>
<th>Что происходит</th>
<th>Где уместен</th>
</tr>
</thead>

<tbody>
<tr>
<td><code>enabled</code></td>
<td>Обычное динамическое ARP-обучение</td>
<td>Стандартный L2-сегмент</td>
</tr>

<tr>
<td><code>reply-only</code></td>
<td>Работа по статическим IP/MAC-записям, без динамического обучения</td>
<td>Контролируемый access с DHCP <code>add-arp=yes</code> или ручными ARP-записями</td>
</tr>

<tr>
<td><code>proxy-arp</code></td>
<td>Роутер отвечает своим MAC за адрес, путь к которому лежит через другой интерфейс</td>
<td>Разнесённые L2-сегменты, которым выдали адреса из общего IP-префикса</td>
</tr>

<tr>
<td><code>local-proxy-arp</code></td>
<td>Роутер проксирует ARP между узлами на одном и том же интерфейсе</td>
<td>Изоляция клиентов внутри общего интерфейса/сегмента</td>
</tr>
</tbody>
</table>

<p>В нашем кейсе адрес назначения находился <strong>за другим интерфейсом</strong>, поэтому нужен был именно <code>proxy-arp</code>, а не <code>local-proxy-arp</code>.</p>

<h2 id="как-сработал-proxy-arp">Как сработал <code>proxy-arp</code></h2>

<p>Proxy ARP — приём, описанный ещё в <a href="https://datatracker.ietf.org/doc/html/rfc1027">RFC 1027</a>: маршрутизатор отвечает <strong>своим</strong> MAC-адресом на ARP-запросы о тех IP, которые лежат не в этом сегменте, а за другими его интерфейсами, и до которых у него есть маршрут. Хост получает ответ, считает, что цель находится рядом на канальном уровне, и отправляет кадр маршрутизатору. Тот, ничего не меняя в IP-заголовке, делает обычный L3-forwarding.</p>

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

<p>На выбранных абонентских VLAN режим ARP сменили на <code>proxy-arp</code>, и последовательность стала такой:</p>
<ol><li>CPE спрашивает: «Кто такой <code>198.51.100.123</code>?»</li>
<li>MikroTik проверяет таблицу маршрутизации и видит путь к адресу через другой интерфейс.</li>
<li>Маршрутизатор отвечает собственным MAC.</li>
<li>CPE отправляет Ethernet-кадр на MikroTik, хотя IP-адрес назначения остаётся прежним.</li>
<li>После этого начинается обычный L3-forwarding: маршрут <code>/32</code>, OSPF, соседний GW и нужный абонентский интерфейс.</li></ol>

<p><img src="https://paste.clr58.ru/03-proxy-arp-fix.jpg" alt="После исправления: MikroTik отвечает своим MAC и передаёт пакет по маршруту"></p>

<p>Пример точечной настройки:</p>

<pre><code class="language-routeros">/interface vlan print detail where arp=reply-only
/interface vlan set [find where name=&#34;access-101&#34;] arp=proxy-arp
/interface vlan print detail where name=&#34;access-101&#34;
</code></pre>

<p>Соблазн сразу выполнить что-то вроде <code>set [find arp=reply-only]</code> понятен, особенно когда VLAN несколько тысяч. Но сначала нужно определить, какие интерфейсы действительно относятся к этой модели IPoE: <code>reply-only</code> мог быть включён осознанно как часть защиты IP/MAC, а глобальное переключение изменит поведение всей сети доступа.</p>

<p>Если проксировать нужно буквально несколько адресов, RouterOS позволяет создать точечную опубликованную ARP-запись вместо включения proxy ARP для всего интерфейса:</p>

<pre><code class="language-routeros">/ip arp add address=198.51.100.123 interface=access-101 published=yes
</code></pre>

<p>Устройство ответит за этот IP только при наличии активного маршрута до него. Для тысяч динамически размещённых абонентов такой способ быстро превращается в отдельную систему учёта, но для единичного сервисного адреса он бывает аккуратнее — и, что важно, не отменяет <code>reply-only</code> для остальных адресов сегмента.</p>

<p>Перед массовой правкой стоит:</p>
<ul><li>сохранить export и список исходных ARP-режимов;</li>
<li>отобрать интерфейсы по понятным именам, спискам или комментариям;</li>
<li>проверить один тестовый VLAN;</li>
<li>убедиться, что фильтры <code>forward</code> по-прежнему обеспечивают нужную изоляцию абонентов;</li>
<li>подготовить обратное переключение для каждого изменяемого интерфейса.</li></ul>

<h2 id="что-получилось-после-изменения">Что получилось после изменения</h2>

<table>
<thead>
<tr>
<th>Сценарий</th>
<th>До</th>
<th>После <code>proxy-arp</code> на IPoE-VLAN</th>
</tr>
</thead>

<tbody>
<tr>
<td>IPoE ↔ IPoE, разные VLAN/GW</td>
<td>CPE ждёт ARP, пакет не доходит до GW</td>
<td>CPE отправляет кадр на MAC шлюза, дальше работает L3</td>
</tr>

<tr>
<td>PPPoE ↔ PPPoE</td>
<td>Обычно работало через peer <code>/32</code></td>
<td>По сути без изменений</td>
</tr>

<tr>
<td>PPPoE ↔ IPoE</td>
<td>Часто ломался обратный путь на стороне IPoE</td>
<td>Работает при корректных маршрутах и firewall</td>
</tr>

<tr>
<td>IPoE ↔ публичный NAT IP</td>
<td>Выглядело как поломка связи двух абонентов</td>
<td>ARP-часть исправлена, но результат всё ещё зависит от NAT/firewall</td>
</tr>
</tbody>
</table>

<p>Последняя строка таблицы — не формальность: именно на ней разбор чуть не увёл в неверную сторону.</p>

<h2 id="ловушка-адрес-выглядит-абонентским-но-это-nat">Ловушка: адрес выглядит абонентским, но это NAT</h2>

<p>Во время разбора попалась пара адресов, которая сначала казалась идеальным тестом:</p>
<ul><li><code>198.51.100.70</code> — настоящий IPoE-клиент на одном GW;</li>
<li><code>198.51.100.210</code> — «белый IP», который ожидали увидеть у другого абонента.</li></ul>

<p>Но второй адрес оказался назначен uplink-интерфейсу другого маршрутизатора и использовался как внешний адрес для NAT частного пула. Никакого CPE с адресом <code>.210</code> не существовало.</p>

<p>Это меняет смысл проверки. Пинг «абонент ↔ абонент» внезапно становится проверкой «IPoE-клиент ↔ адрес самого GW или сервис за <code>dst-nat</code>», а результат зависит уже от правил NAT, firewall и того, есть ли вообще трансляция для ICMP.</p>

<p><img src="https://paste.clr58.ru/04-scenarios.jpg" alt="Четыре разных сценария, которые снаружи выглядят как связь между адресами одной /24"></p>

<p>Поэтому перед выводом «абоненты друг друга не видят» полезно установить владельца каждого IP:</p>

<pre><code class="language-routeros">/ip address print detail where address~&#34;198.51.100.210&#34;
/ip arp print detail where address=198.51.100.210
/ppp active print detail where address=198.51.100.210
/ip firewall nat print detail where dst-address~&#34;198.51.100.210&#34;
</code></pre>

<p>А затем проверить, есть ли для него host route и где он был получен.</p>

<h2 id="при-чём-здесь-ospf">При чём здесь OSPF</h2>

<p>OSPF в этой истории не был причиной поломки — он лишь доставлял между шлюзами информацию о том, где находится конкретный абонентский <code>/32</code>. Но чтобы <code>proxy-arp</code> заработал, должны выполняться два условия:</p>
<ul><li>нужный <code>/32</code> действительно должен присутствовать в RIB/FIB выбранного MikroTik;</li>
<li>маршрут должен указывать через другой интерфейс, иначе обычный <code>proxy-arp</code> не решит задачу.</li></ul>

<p>Для RouterOS v7 маршрут удобно смотреть так:</p>

<pre><code class="language-routeros">/routing route print detail where dst-address=198.51.100.123/32
/routing ospf neighbor print detail
</code></pre>

<p>В RouterOS v6 таблица маршрутов проверяется через:</p>

<pre><code class="language-routeros">/ip route print detail where dst-address=198.51.100.123/32
</code></pre>

<p>Если <code>/32</code> не анонсируется, соседство застряло в <code>ExStart/Exchange</code> или маршрут отфильтрован, <code>proxy-arp</code> проблему не исправит: он помогает клиенту передать пакет маршрутизатору, но маршрут до цели всё равно должен существовать. Это прямое следствие механики режима — решение об ARP-ответе принимается по таблице маршрутизации, поэтому пустая FIB означает тишину в ответ на <code>who-has</code>.</p>

<h2 id="практический-порядок-диагностики">Практический порядок диагностики</h2>

<p>Из всего этого сложилась рабочая последовательность.</p>

<h3 id="1-проверить-логику-cpe">1. Проверить логику CPE</h3>

<p>Посмотреть выданную маску. Если клиент получил <code>/24</code>, он будет ARP-ить любой адрес из этой <code>/24</code>, даже если оператор разнёс адреса по разным VLAN.</p>

<h3 id="2-посмотреть-arp-на-access-интерфейсе">2. Посмотреть ARP на access-интерфейсе</h3>

<pre><code class="language-routeros">/interface vlan print detail where name=&#34;access-101&#34;
/tool sniffer quick interface=access-101 mac-protocol=arp
</code></pre>

<p>Характерный симптом: от CPE приходит <code>who-has</code>, но ответа за удалённый адрес нет.</p>

<h3 id="3-проверить-маршрут-до-точного-адреса">3. Проверить маршрут до точного адреса</h3>

<p>Смотреть нужно не только общий connected <code>/24</code>, но и специфичный <code>/32</code>. Иначе трафик может уйти на общий uplink или не к тому GW.</p>

<h3 id="4-установить-реального-владельца-ip">4. Установить реального владельца IP</h3>

<p>Адрес может принадлежать IPoE-клиенту, PPP-сессии, интерфейсу маршрутизатора, NAT-пулу или вообще быть свободным. Одинаковая запись в заявке «белый IP» ещё не означает одинаковую сетевую сущность.</p>

<h3 id="5-проверить-ospf-и-обратный-путь">5. Проверить OSPF и обратный путь</h3>

<p>Соседство должно быть Full, нужный <code>/32</code> — установлен, а обратный маршрут — симметричен или хотя бы допустим правилами firewall и <code>rp-filter</code>.</p>

<h3 id="6-только-после-этого-включать-proxy-arp">6. Только после этого включать <code>proxy-arp</code></h3>

<p>Сначала на одном VLAN, затем на небольшой группе, и лишь потом — массово. После изменения проверяются ARP, ping, TCP-сессия и счётчики firewall в обоих направлениях.</p>

<h2 id="как-устроен-proxy-arp-режимы-routeros">Как устроен proxy ARP: режимы RouterOS</h2>

<p>Кейс на этом закрыт. Дальше — справочная часть: что именно RouterOS делает с ARP в каждом режиме и почему в нашей ситуации выбор был безальтернативным.</p>

<p>Начать стоит с логики хоста. Собираясь отправить IP-пакет, он сначала решает, «локальный» адрес назначения или нет: применяет свою маску к своему и к целевому адресу. Если адреса попали в одну подсеть, шлюз не используется вовсе — хост рассылает широковещательный ARP-запрос <code>who-has</code> и ждёт, кто отзовётся своим MAC. Ethernet-кадр без MAC назначения не собирается, поэтому при отсутствии ответа никакого IP-трафика просто не появляется.</p>

<p>Proxy ARP в RFC 1027 прямо называли «ARP-хаком» для подсетей: механизм придумали для стеков, которые не умели работать с подсетями. Живёт он ровно по той же причине, что и в нашем кейсе: адреса одной подсети оказались разнесены по разным линкам, VLAN или тоннелям, а хосты об этом не знают. Побочный эффект хорошо видно в ARP-таблице клиента: десятки разных IP там отображаются на один и тот же MAC шлюза.</p>

<p>Теперь по режимам, которые RouterOS позволяет задать на интерфейсе (подробности — в официальной документации по <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/100892687/ARP">ARP</a>):</p>
<ul><li><strong><code>enabled</code></strong> — поведение по умолчанию. Маршрутизатор отвечает на запросы о своих адресах, сам рассылает <code>who-has</code>, когда нужно, и динамически учит соответствия IP/MAC. Подходит для обычного доверенного сегмента: серверная сеть, офисный LAN, транзитный линк.</li>
<li><strong><code>disabled</code></strong> — ARP на интерфейсе не работает совсем: ни ответов, ни обучения. Связность возможна только со статическими записями в <code>/ip arp</code> с обеих сторон. Применяется в жёстко зафиксированных схемах и на линках, где ARP не нужен по своей природе (PPP-подобные точка-точка).</li>
<li><strong><code>reply-only</code></strong> — компромисс между контролем и удобством: динамического обучения нет, маршрутизатор работает исключительно по статическим и добавленным DHCP-сервером записям. Отсюда и связка с параметром <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/24805500/DHCP"><code>add-arp=yes</code></a>: клиент получил адрес по DHCP — запись появилась; сменил IP или MAC вручную — не общается ни с кем. Это ровно тот режим, который и стоял на наших access-VLAN.</li>
<li><strong><code>proxy-arp</code></strong> — маршрутизатор дополнительно отвечает своим MAC за адреса, достижимые через <strong>другие</strong> интерфейсы. Именно этот режим нужен, когда хосты одной подсети физически раскиданы по разным сегментам, а переделать маску на всех CPE нельзя.</li>
<li><strong><code>local-proxy-arp</code></strong> — маршрутизатор проксирует ARP между узлами <strong>того же</strong> интерфейса: клиент A спрашивает про клиента B, находящегося в том же VLAN или бридже, и получает MAC шлюза, после чего весь трафик между ними идёт через маршрутизатор. Так делают, когда на L2 включена изоляция портов (bridge horizon, PON client isolation), но соседи всё же должны видеть друг друга — уже под контролем firewall и учёта.</li></ul>

<p>Разница между двумя proxy-режимами — исключительно в том, где находится цель: за другим интерфейсом или в том же сегменте. Подменить один другим не получится, это отдельные значения параметра, и на интерфейсе действует одно из них. Соответственно, включая <code>proxy-arp</code>, вы отказываетесь от строгости <code>reply-only</code> на этом интерфейсе, и защиту от подмены адресов приходится переносить на DHCP snooping, ACL и firewall.</p>

<h2 id="когда-proxy-arp-полезен">Когда <code>proxy-arp</code> полезен</h2>

<p>Несмотря на репутацию «костыля», у режима есть сценарии, где он не просто работает, а является наиболее логичным решением.</p>
<ul><li><strong>Адреса одной <code>/24</code> разнесены по разным VLAN и интерфейсам, а CPE считает их локальными</strong> — наш случай. Клиент никогда не отправит пакет шлюзу, потому что по своей маске он «уже дома»; единственный способ вклиниться в этот диалог — ответить ему на ARP.</li>
<li><strong>Тоннели и мосты, где удалённая подсеть должна выглядеть локальной.</strong> Через EoIP, GRE или IPIP приходят адреса того же префикса, и хостам на одной стороне нужно ARP-разрешать адреса другой; proxy ARP позволяет не растягивать broadcast-домен и не поднимать полноценный L2-мост, оставив стык на маршрутизации.</li>
<li><strong>Быстрое восстановление связности без миграции адресации.</strong> Переразметка сети с <code>/24</code> на per-subscriber <code>/32</code> — это проект на недели, с перевыпуском DHCP-опций и правкой профилей; включение <code>proxy-arp</code> на нужных интерфейсах возвращает сервис за минуты и не требует прикасаться к абонентскому оборудованию.</li>
<li><strong>Единичные «белые» адреса и сервисы для устройств с зашитой маской.</strong> Старый принтер, терминал или контроллер с жёстко прописанными адресом и <code>/24</code> физически не умеет ходить через шлюз к соседнему префиксу; proxy ARP (а лучше — точечная опубликованная ARP-запись) делает такой адрес достижимым, не требуя перенастройки самого устройства.</li>
<li><strong>Ситуации, где <code>local-proxy-arp</code> не подходит.</strong> Если цель находится за другим интерфейсом, а не среди соседей по сегменту, локальный вариант не сработает вообще: он рассчитан на проксирование внутри одного интерфейса и не смотрит на маршруты за его пределы.</li></ul>

<h2 id="цена-решения">Цена решения</h2>

<p><code>proxy-arp</code> оказался рабочим операционным исправлением, но он не превращает исходный дизайн в идеальный. Что приходится учитывать:</p>
<ul><li>маршрутизатор становится обязательным посредником между адресами, которые CPE считает локальными;</li>
<li>ARP-таблицы и uplink могут стать шумнее;</li>
<li>при неоднозначной маршрутизации несколько GW способны отвечать за один адрес, поэтому нужны специфичные <code>/32</code> и аккуратная фильтрация анонсов;</li>
<li>клиентская изоляция теперь должна явно обеспечиваться firewall, а не случайным отсутствием ARP-ответа;</li>
<li>широкое включение <code>proxy-arp</code> частично меняет исходную модель защиты <code>reply-only</code>.</li></ul>

<p>«Костылём» этот режим называют вполне обоснованно. Во-первых, он поощряет клиента ARP-ить весь префикс: каждое новое направление добавляет запись в ARP-кэш CPE и порождает широковещательный запрос в сегменте, а на масштабе тысяч VLAN и десятков тысяч устройств это заметная фоновая нагрузка и раздутые таблицы соседств. Во-вторых, он размывает границу между L2 и L3: логически адреса маршрутизируются, но топология в голове хоста остаётся плоской, из-за чего диагностика перестаёт совпадать со схемой — «локальный» по мнению CPE адрес фактически лежит через два хопа и чужой firewall. В-третьих, страдает изоляция: пока ARP-ответа не было, соседи по префиксу физически не могли достучаться друг до друга, а теперь между ними есть исправно работающий посредник, и единственное, что их разделяет, — правила в <code>forward</code>.</p>

<p>Отдельная категория неприятностей — неоднозначность. Если один и тот же префикс присутствует на нескольких шлюзах, за один и тот же адрес потенциально может ответить не тот маршрутизатор, у которого лучший путь, а тот, чей ARP-ответ пришёл первым; клиент закрепит в кэше «случайный» MAC на время жизни записи. Дальше подключается асимметрия: трафик уходит через одного GW, возвращается через другого, и <code>rp-filter</code> вместе с connection tracking начинают отбрасывать вполне легитимные пакеты, а причина выглядит как «иногда работает, иногда нет». Всё это лечится специфичными <code>/32</code>, аккуратной фильтрацией анонсов OSPF и предсказуемой политикой обратного пути.</p>

<p>И всё же в операторских IPoE-сетях <code>proxy-arp</code> регулярно оказывается единственным быстрым фиксом. Абонентские устройства оператору не принадлежат, маску и шлюз в них меняет только DHCP, а массовое переучивание парка CPE на новую адресную модель — это согласования, окна работ и обращения в поддержку. Когда связность нужна сейчас, а адресация исторически плоская, включение прокси на нужных access-интерфейсах даёт результат в пределах одной сессии в терминале и оставляет время на нормальный редизайн.</p>

<p>Стратегически чище выдавать абоненту <code>/32</code> с маршрутом через gateway либо использовать адресную модель, в которой CPE не считает весь публичный блок своим L2-сегментом. PPPoE изначально ближе к этой логике: у клиента есть peer, и чужой адрес сразу отправляется маршрутизатору.</p>

<p>Но миграция адресации — отдельный проект. Когда сеть уже построена на общей <code>/24</code>, а простоя быть не должно, точечно включённый <code>proxy-arp</code> позволяет восстановить связность без переделки всех CPE за одну ночь.</p>

<h2 id="вывод">Вывод</h2>

<p>Главный урок этого случая простой: наличие маршрута ещё не доказывает, что пакет дошёл до уровня маршрутизации. При слишком широкой маске CPE сначала ищет удалённый адрес через ARP, и с <code>reply-only</code> этот запрос остаётся без ответа. <code>proxy-arp</code> подставляет MAC шлюза, после чего уже начинают работать OSPF, NAT и привычная L3-диагностика.</p>

<p>В следующий раз, когда OSPF уверенно показывает нужный <code>/32</code>, а абонент всё равно никого не видит, стоит посмотреть не только <code>route print</code>, но и один скромный <code>who-has</code>, который так и не получил ответа.</p>

<hr>

<p>Официальная документация MikroTik: <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/100892687/ARP">ARP и режимы proxy/reply-only</a>, <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/24805500/DHCP">DHCP и параметр add-arp</a>, <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/9863229/OSPF">OSPF в RouterOS</a>, <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/8323088/Packet%2BSniffer">Packet Sniffer</a>, <a href="https://help.mikrotik.com/docs/spaces/ROS/pages/30474256/Moving%2Bfrom%2BROSv6%2Bto%2Bv7%2Bwith%2Bexamples">отличия маршрутизации RouterOS v6 и v7</a>. Термин proxy ARP и исходное описание механизма — <a href="https://datatracker.ietf.org/doc/html/rfc1027">RFC 1027</a>.</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:mikrotik" class="hashtag"><span>#</span><span class="p-category">mikrotik</span></a> <a href="https://articles.clr58.ru/tag:ospf" class="hashtag"><span>#</span><span class="p-category">ospf</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/mt-ospf-proxy-arp</guid>
      <pubDate>Tue, 08 Sep 2026 17:09:36 +0000</pubDate>
    </item>
    <item>
      <title>Почему OSPF не пошёл по «дешёвому» линку: Junos, VRF и состояние 2Way</title>
      <link>https://articles.clr58.ru/ospf-2way</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Есть такие сетевые задачи, которые на первый взгляд выглядят абсолютно прямолинейно.&#xA;&#xA;Есть два линка между маршрутизаторами.  &#xA;На одном OSPF cost 50.  &#xA;На другом OSPF cost 10.&#xA;&#xA;Кажется очевидным: маршрут должен пойти через линк с cost 10.&#xA;&#xA;Но сеть, как обычно, решила напомнить, что «кажется» — это не метод диагностики.&#xA;&#xA;Исходная картина&#xA;&#xA;Есть Juniper с routing-instance, условно назовём его vrf-inet.&#xA;&#xA;В нём крутится OSPF. Один из маршрутов приходит как внешний OSPF-маршрут:&#xA;&#xA;192.0.2.0/24   *[OSPF/150], metric 60&#xA;                  to 198.51.100.195 via xe-0/0/0.100&#xA;&#xA;И вот это metric 60 сначала немного смущает.&#xA;&#xA;На экспортирующем роутере для этого маршрута уже поставили external metric 10.  &#xA;На альтернативном интерфейсе OSPF cost тоже 10.&#xA;&#xA;Но маршрут всё равно идёт через старый интерфейс, у которого cost 50.&#xA;&#xA;Возникает нормальный человеческий вопрос:&#xA;&#xA;  почему оно не идёт через интерфейс, где cost 10?&#xA;&#xA;Первая ловушка: export metric и interface cost — это разные вещи&#xA;&#xA;В OSPF важно не смешивать две разные сущности:&#xA;&#xA;OSPF cost интерфейса — стоимость пути внутри OSPF-топологии.&#xA;External metric — метрика внешнего маршрута, который мы редистрибутим в OSPF через export policy.&#xA;&#xA;Если маршрут экспортируется в OSPF как external type 1, итоговая метрика считается примерно так:&#xA;&#xA;external metric + internal cost до ASBR&#xA;&#xA;То есть если мы задали external metric 10, а до ASBR роутер видит путь cost 50, то в таблице маршрутизации вполне логично появится:&#xA;&#xA;metric 60&#xA;&#xA;И это как раз хорошая подсказка.&#xA;&#xA;Не «OSPF сошёл с ума», а наоборот: он честно сложил 10 + 50.&#xA;&#xA;Вторая ловушка: смотреть OSPF надо внутри routing-instance&#xA;&#xA;На Junos, если OSPF работает не в default instance, а внутри routing-instance, то команда:&#xA;&#xA;show ospf neighbor&#xA;&#xA;может ответить:&#xA;&#xA;OSPF instance is not running&#xA;&#xA;И это не значит, что OSPF умер. Это значит, что мы смотрим не туда.&#xA;&#xA;Правильно так:&#xA;&#xA;show ospf neighbor instance vrf-inet&#xA;show ospf interface instance vrf-inet&#xA;show ospf route instance vrf-inet&#xA;&#xA;Для конкретных интерфейсов:&#xA;&#xA;show ospf interface xe-0/0/0.100 detail instance vrf-inet&#xA;show ospf interface xe-0/0/1.200 detail instance vrf-inet&#xA;&#xA;И вот тут началось интересное.&#xA;&#xA;Что показала диагностика&#xA;&#xA;На старом интерфейсе картина была нормальная:&#xA;&#xA;Interface: xe-0/0/0.100&#xA;Type: LAN&#xA;Cost: 50&#xA;Adj count: 2&#xA;&#xA;Соседи есть, adjacency есть, OSPF живёт полноценной жизнью.&#xA;&#xA;А на новом «дешёвом» интерфейсе было так:&#xA;&#xA;Interface: xe-0/0/1.200&#xA;Type: LAN&#xA;Cost: 10&#xA;Priority: 0&#xA;Adj count: 0&#xA;&#xA;И в соседях:&#xA;&#xA;neighbor 198.51.100.121 via xe-0/0/1.200 state 2Way&#xA;&#xA;Вот тут и спряталась причина.&#xA;&#xA;Cost 10 на интерфейсе есть.  &#xA;Но полноценной OSPF-смежности нет.  &#xA;Сосед виден, hello принимаются, но состояние только 2Way, а не Full.&#xA;&#xA;А если нет Full, то этот линк не становится нормальным маршрутом через OSPF для нужного расчёта SPF.&#xA;&#xA;Почему оно зависло в 2Way&#xA;&#xA;Интерфейс был типа LAN, то есть OSPF воспринимал его как broadcast-сегмент.&#xA;&#xA;На broadcast-сети OSPF не обязан строить Full adjacency со всеми подряд. Там есть DR/BDR, и полноценные соседства строятся через них.&#xA;&#xA;Но на линке /30 между двумя роутерами это обычно не то поведение, которое мы хотим.&#xA;&#xA;В нашем случае ещё и priority был 0.&#xA;&#xA;Условно:&#xA;&#xA;Type: LAN&#xA;Priority: 0&#xA;DR: 0.0.0.0&#xA;BDR: 0.0.0.0&#xA;Adj count: 0&#xA;&#xA;Получается типичная ситуация:&#xA;&#xA;интерфейс маленький, фактически point-to-point;&#xA;OSPF считает его LAN/broadcast;&#xA;priority 0;&#xA;DR/BDR не выбирается;&#xA;соседство остаётся в 2Way;&#xA;cost 10 вроде есть, но маршрут через этот линк не строится.&#xA;&#xA;Очень жизненно. Вроде всё настроено, но нет.&#xA;&#xA;Решение&#xA;&#xA;Для /30-линка между двумя маршрутизаторами логичнее явно сказать OSPF, что это point-to-point.&#xA;&#xA;На первом конце:&#xA;&#xA;configure&#xA;set routing-instances vrf-inet protocols ospf area 0.0.0.0 interface xe-0/0/1.200 interface-type p2p&#xA;commit&#xA;&#xA;На втором конце — то же самое на соответствующем интерфейсе:&#xA;&#xA;configure&#xA;set routing-instances vrf-inet protocols ospf area 0.0.0.0 interface xe-0/0/1.200 interface-type p2p&#xA;commit&#xA;&#xA;После этого проверяем:&#xA;&#xA;show ospf neighbor instance vrf-inet | match &#34;xe-0/0/1.200|198.51.100.121&#34;&#xA;show ospf interface xe-0/0/1.200 detail instance vrf-inet&#xA;show ospf route instance vrf-inet | match &#34;192.0.2.0|router-id&#34;&#xA;show route 192.0.2.0&#xA;&#xA;Нормальная картина после исправления:&#xA;&#xA;neighbor 198.51.100.121 via xe-0/0/1.200 state Full&#xA;&#xA;И маршрут должен пересчитаться уже через новый интерфейс.&#xA;&#xA;Если external metric 10, а cost линка 10, то для external type 1 можно ожидать итоговую метрику около:&#xA;&#xA;10 + 10 = 20&#xA;&#xA;Разумеется, если нет других ASBR, forwarding-address и дополнительных особенностей топологии.&#xA;&#xA;Что ещё стоит проверить&#xA;&#xA;Если после перевода в p2p маршрут всё равно не пошёл куда надо, я бы проверял уже вот это:&#xA;&#xA;show ospf database external 192.0.2.0 extensive instance vrf-inet&#xA;show route 192.0.2.0 extensive&#xA;show ospf route instance vrf-inet&#xA;show route router-id или forwarding-address&#xA;&#xA;Особенно важно посмотреть:&#xA;&#xA;Advertising router&#xA;Forwarding address&#xA;External type&#xA;Metric&#xA;&#xA;Потому что для external route OSPF выбирает путь не «к префиксу в вакууме», а к ASBR или forwarding address. И если forwarding address резолвится через другой интерфейс, маршрут тоже может уйти не туда, куда мы глазами ожидали.&#xA;&#xA;Важный момент про export policy&#xA;&#xA;В этом кейсе export policy тоже фигурировала.&#xA;&#xA;Изначально маршрут экспортировался в OSPF без явного external metric, поэтому в таблице была метрика 0.&#xA;&#xA;Потом для exported route задали:&#xA;&#xA;then external type 1&#xA;then metric 10&#xA;&#xA;После этого метрика стала 60.&#xA;&#xA;И это было правильно: Junos начал считать E1 как external metric плюс internal cost до ASBR.&#xA;&#xA;Но попытка менять export policy на принимающем роутере не влияет на то, как он выбирает next-hop для уже полученного OSPF-маршрута.&#xA;&#xA;То есть:&#xA;&#xA;set policy-options policy-statement rp-ospf-export ...&#xA;&#xA;на принимающей стороне влияет только на то, что этот роутер сам экспортирует в OSPF.&#xA;&#xA;А выбор next-hop для полученного маршрута — это уже SPF, соседства, cost, ASBR и forwarding-address.&#xA;&#xA;Короткая памятка&#xA;&#xA;Если OSPF-маршрут не идёт через интерфейс с меньшим cost:&#xA;&#xA;1. Проверь, в каком instance живёт OSPF&#xA;&#xA;show ospf neighbor instance instance-name&#xA;&#xA;2. Проверь состояние соседа&#xA;&#xA;show ospf neighbor instance instance-name&#xA;&#xA;Нужно Full, а не просто 2Way.&#xA;&#xA;3. Проверь тип интерфейса&#xA;&#xA;show ospf interface interface detail instance instance-name&#xA;&#xA;Если это /30 или /31 между двумя роутерами, часто правильнее:&#xA;&#xA;interface-type p2p&#xA;&#xA;4. Проверь, до кого реально строится путь&#xA;&#xA;show ospf database external prefix extensive instance instance-name&#xA;show route forwarding-address или router-id&#xA;&#xA;5. Не путай external metric и interface cost&#xA;&#xA;Для E1:&#xA;&#xA;итоговая метрика = external metric + internal cost до ASBR&#xA;&#xA;Для E2 логика другая: внешняя метрика обычно доминирует, а internal cost используется иначе при сравнении. Но это не означает, что E2 «заставит» маршрут пойти через нужный интерфейс. Next-hop всё равно зависит от SPF и достижимости ASBR/forwarding-address.&#xA;&#xA;Вывод&#xA;&#xA;В этой истории проблема была не в том, что Junos неправильно считал метрику.&#xA;&#xA;Он как раз считал её очень честно:&#xA;&#xA;10 external + 50 до ASBR = 60&#xA;&#xA;Проблема была в том, что альтернативный линк с cost 10 не имел полноценной OSPF adjacency. Он висел в 2Way, потому что интерфейс был LAN/broadcast, priority был 0, DR/BDR не выбрался, а Full-соседство не построилось.&#xA;&#xA;После перевода интерфейса в point-to-point всё стало на свои места.&#xA;&#xA;Мораль простая: если OSPF «не хочет» идти по дешёвому пути, сначала убедитесь, что этот путь вообще существует для SPF, а не просто красиво выглядит в конфиге.&#xA;&#xA;---&#xA;&#xA;#networking #junos #ospf #juniper #routing #nsp&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-ospf-2way-digclean.jpg" alt="Обложка"></p>

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

<p>Есть два линка между маршрутизаторами.<br>
На одном OSPF cost <code>50</code>.<br>
На другом OSPF cost <code>10</code>.</p>

<p>Кажется очевидным: маршрут должен пойти через линк с cost <code>10</code>.</p>

<p>Но сеть, как обычно, решила напомнить, что «кажется» — это не метод диагностики.</p>

<h2 id="исходная-картина">Исходная картина</h2>

<p>Есть Juniper с routing-instance, условно назовём его <code>vrf-inet</code>.</p>

<p>В нём крутится OSPF. Один из маршрутов приходит как внешний OSPF-маршрут:</p>

<pre><code class="language-text">192.0.2.0/24   *[OSPF/150], metric 60
                &gt; to 198.51.100.195 via xe-0/0/0.100
</code></pre>

<p>И вот это <code>metric 60</code> сначала немного смущает.</p>

<p>На экспортирующем роутере для этого маршрута уже поставили external metric <code>10</code>.<br>
На альтернативном интерфейсе OSPF cost тоже <code>10</code>.</p>

<p>Но маршрут всё равно идёт через старый интерфейс, у которого cost <code>50</code>.</p>

<p>Возникает нормальный человеческий вопрос:</p>

<blockquote><p>почему оно не идёт через интерфейс, где cost 10?</p></blockquote>

<h2 id="первая-ловушка-export-metric-и-interface-cost-это-разные-вещи">Первая ловушка: export metric и interface cost — это разные вещи</h2>

<p>В OSPF важно не смешивать две разные сущности:</p>
<ol><li><strong>OSPF cost интерфейса</strong> — стоимость пути внутри OSPF-топологии.</li>
<li><strong>External metric</strong> — метрика внешнего маршрута, который мы редистрибутим в OSPF через export policy.</li></ol>

<p>Если маршрут экспортируется в OSPF как external type 1, итоговая метрика считается примерно так:</p>

<pre><code class="language-text">external metric + internal cost до ASBR
</code></pre>

<p>То есть если мы задали external metric <code>10</code>, а до ASBR роутер видит путь cost <code>50</code>, то в таблице маршрутизации вполне логично появится:</p>

<pre><code class="language-text">metric 60
</code></pre>

<p>И это как раз хорошая подсказка.</p>

<p>Не «OSPF сошёл с ума», а наоборот: он честно сложил <code>10 + 50</code>.</p>

<h2 id="вторая-ловушка-смотреть-ospf-надо-внутри-routing-instance">Вторая ловушка: смотреть OSPF надо внутри routing-instance</h2>

<p>На Junos, если OSPF работает не в default instance, а внутри routing-instance, то команда:</p>

<pre><code class="language-bash">show ospf neighbor
</code></pre>

<p>может ответить:</p>

<pre><code class="language-text">OSPF instance is not running
</code></pre>

<p>И это не значит, что OSPF умер. Это значит, что мы смотрим не туда.</p>

<p>Правильно так:</p>

<pre><code class="language-bash">show ospf neighbor instance vrf-inet
show ospf interface instance vrf-inet
show ospf route instance vrf-inet
</code></pre>

<p>Для конкретных интерфейсов:</p>

<pre><code class="language-bash">show ospf interface xe-0/0/0.100 detail instance vrf-inet
show ospf interface xe-0/0/1.200 detail instance vrf-inet
</code></pre>

<p>И вот тут началось интересное.</p>

<h2 id="что-показала-диагностика">Что показала диагностика</h2>

<p>На старом интерфейсе картина была нормальная:</p>

<pre><code class="language-text">Interface: xe-0/0/0.100
Type: LAN
Cost: 50
Adj count: 2
</code></pre>

<p>Соседи есть, adjacency есть, OSPF живёт полноценной жизнью.</p>

<p>А на новом «дешёвом» интерфейсе было так:</p>

<pre><code class="language-text">Interface: xe-0/0/1.200
Type: LAN
Cost: 10
Priority: 0
Adj count: 0
</code></pre>

<p>И в соседях:</p>

<pre><code class="language-text">neighbor 198.51.100.121 via xe-0/0/1.200 state 2Way
</code></pre>

<p>Вот тут и спряталась причина.</p>

<p>Cost <code>10</code> на интерфейсе есть.<br>
Но полноценной OSPF-смежности нет.<br>
Сосед виден, hello принимаются, но состояние только <code>2Way</code>, а не <code>Full</code>.</p>

<p>А если нет <code>Full</code>, то этот линк не становится нормальным маршрутом через OSPF для нужного расчёта SPF.</p>

<h2 id="почему-оно-зависло-в-2way">Почему оно зависло в 2Way</h2>

<p>Интерфейс был типа <code>LAN</code>, то есть OSPF воспринимал его как broadcast-сегмент.</p>

<p>На broadcast-сети OSPF не обязан строить Full adjacency со всеми подряд. Там есть DR/BDR, и полноценные соседства строятся через них.</p>

<p>Но на линке <code>/30</code> между двумя роутерами это обычно не то поведение, которое мы хотим.</p>

<p>В нашем случае ещё и priority был <code>0</code>.</p>

<p>Условно:</p>

<pre><code class="language-text">Type: LAN
Priority: 0
DR: 0.0.0.0
BDR: 0.0.0.0
Adj count: 0
</code></pre>

<p>Получается типичная ситуация:</p>
<ul><li>интерфейс маленький, фактически point-to-point;</li>
<li>OSPF считает его LAN/broadcast;</li>
<li>priority <code>0</code>;</li>
<li>DR/BDR не выбирается;</li>
<li>соседство остаётся в <code>2Way</code>;</li>
<li>cost <code>10</code> вроде есть, но маршрут через этот линк не строится.</li></ul>

<p>Очень жизненно. Вроде всё настроено, но нет.</p>

<h2 id="решение">Решение</h2>

<p>Для <code>/30</code>-линка между двумя маршрутизаторами логичнее явно сказать OSPF, что это point-to-point.</p>

<p>На первом конце:</p>

<pre><code class="language-bash">configure
set routing-instances vrf-inet protocols ospf area 0.0.0.0 interface xe-0/0/1.200 interface-type p2p
commit
</code></pre>

<p>На втором конце — то же самое на соответствующем интерфейсе:</p>

<pre><code class="language-bash">configure
set routing-instances vrf-inet protocols ospf area 0.0.0.0 interface xe-0/0/1.200 interface-type p2p
commit
</code></pre>

<p>После этого проверяем:</p>

<pre><code class="language-bash">show ospf neighbor instance vrf-inet | match &#34;xe-0/0/1.200|198.51.100.121&#34;
show ospf interface xe-0/0/1.200 detail instance vrf-inet
show ospf route instance vrf-inet | match &#34;192.0.2.0|router-id&#34;
show route 192.0.2.0
</code></pre>

<p>Нормальная картина после исправления:</p>

<pre><code class="language-text">neighbor 198.51.100.121 via xe-0/0/1.200 state Full
</code></pre>

<p>И маршрут должен пересчитаться уже через новый интерфейс.</p>

<p>Если external metric <code>10</code>, а cost линка <code>10</code>, то для external type 1 можно ожидать итоговую метрику около:</p>

<pre><code class="language-text">10 + 10 = 20
</code></pre>

<p>Разумеется, если нет других ASBR, forwarding-address и дополнительных особенностей топологии.</p>

<h2 id="что-ещё-стоит-проверить">Что ещё стоит проверить</h2>

<p>Если после перевода в <code>p2p</code> маршрут всё равно не пошёл куда надо, я бы проверял уже вот это:</p>

<pre><code class="language-bash">show ospf database external 192.0.2.0 extensive instance vrf-inet
show route 192.0.2.0 extensive
show ospf route instance vrf-inet
show route &lt;router-id или forwarding-address&gt;
</code></pre>

<p>Особенно важно посмотреть:</p>

<pre><code class="language-text">Advertising router
Forwarding address
External type
Metric
</code></pre>

<p>Потому что для external route OSPF выбирает путь не «к префиксу в вакууме», а к ASBR или forwarding address. И если forwarding address резолвится через другой интерфейс, маршрут тоже может уйти не туда, куда мы глазами ожидали.</p>

<h2 id="важный-момент-про-export-policy">Важный момент про export policy</h2>

<p>В этом кейсе export policy тоже фигурировала.</p>

<p>Изначально маршрут экспортировался в OSPF без явного external metric, поэтому в таблице была метрика <code>0</code>.</p>

<p>Потом для exported route задали:</p>

<pre><code class="language-bash">then external type 1
then metric 10
</code></pre>

<p>После этого метрика стала <code>60</code>.</p>

<p>И это было правильно: Junos начал считать E1 как external metric плюс internal cost до ASBR.</p>

<p>Но попытка менять export policy на принимающем роутере не влияет на то, как он выбирает next-hop для уже полученного OSPF-маршрута.</p>

<p>То есть:</p>

<pre><code class="language-bash">set policy-options policy-statement rp-ospf-export ...
</code></pre>

<p>на принимающей стороне влияет только на то, что этот роутер сам экспортирует в OSPF.</p>

<p>А выбор next-hop для полученного маршрута — это уже SPF, соседства, cost, ASBR и forwarding-address.</p>

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

<p>Если OSPF-маршрут не идёт через интерфейс с меньшим cost:</p>

<h3 id="1-проверь-в-каком-instance-живёт-ospf">1. Проверь, в каком instance живёт OSPF</h3>

<pre><code class="language-bash">show ospf neighbor instance &lt;instance-name&gt;
</code></pre>

<h3 id="2-проверь-состояние-соседа">2. Проверь состояние соседа</h3>

<pre><code class="language-bash">show ospf neighbor instance &lt;instance-name&gt;
</code></pre>

<p>Нужно <code>Full</code>, а не просто <code>2Way</code>.</p>

<h3 id="3-проверь-тип-интерфейса">3. Проверь тип интерфейса</h3>

<pre><code class="language-bash">show ospf interface &lt;interface&gt; detail instance &lt;instance-name&gt;
</code></pre>

<p>Если это <code>/30</code> или <code>/31</code> между двумя роутерами, часто правильнее:</p>

<pre><code class="language-bash">interface-type p2p
</code></pre>

<h3 id="4-проверь-до-кого-реально-строится-путь">4. Проверь, до кого реально строится путь</h3>

<pre><code class="language-bash">show ospf database external &lt;prefix&gt; extensive instance &lt;instance-name&gt;
show route &lt;forwarding-address или router-id&gt;
</code></pre>

<h3 id="5-не-путай-external-metric-и-interface-cost">5. Не путай external metric и interface cost</h3>

<p>Для E1:</p>

<pre><code class="language-text">итоговая метрика = external metric + internal cost до ASBR
</code></pre>

<p>Для E2 логика другая: внешняя метрика обычно доминирует, а internal cost используется иначе при сравнении. Но это не означает, что E2 «заставит» маршрут пойти через нужный интерфейс. Next-hop всё равно зависит от SPF и достижимости ASBR/forwarding-address.</p>

<h2 id="вывод">Вывод</h2>

<p>В этой истории проблема была не в том, что Junos неправильно считал метрику.</p>

<p>Он как раз считал её очень честно:</p>

<pre><code class="language-text">10 external + 50 до ASBR = 60
</code></pre>

<p>Проблема была в том, что альтернативный линк с cost <code>10</code> не имел полноценной OSPF adjacency. Он висел в <code>2Way</code>, потому что интерфейс был LAN/broadcast, priority был <code>0</code>, DR/BDR не выбрался, а Full-соседство не построилось.</p>

<p>После перевода интерфейса в <code>point-to-point</code> всё стало на свои места.</p>

<p>Мораль простая: если OSPF «не хочет» идти по дешёвому пути, сначала убедитесь, что этот путь вообще существует для SPF, а не просто красиво выглядит в конфиге.</p>

<hr>

<p><a href="https://articles.clr58.ru/tag:networking" class="hashtag"><span>#</span><span class="p-category">networking</span></a> <a href="https://articles.clr58.ru/tag:junos" class="hashtag"><span>#</span><span class="p-category">junos</span></a> <a href="https://articles.clr58.ru/tag:ospf" class="hashtag"><span>#</span><span class="p-category">ospf</span></a> <a href="https://articles.clr58.ru/tag:juniper" class="hashtag"><span>#</span><span class="p-category">juniper</span></a> <a href="https://articles.clr58.ru/tag:routing" class="hashtag"><span>#</span><span class="p-category">routing</span></a> <a href="https://articles.clr58.ru/tag:nsp" class="hashtag"><span>#</span><span class="p-category">nsp</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/ospf-2way</guid>
      <pubDate>Fri, 28 Aug 2026 18:22:50 +0000</pubDate>
    </item>
  </channel>
</rss>