Диагностика

Сервер флапает при двух IP в одной подсети: ARP flux

Вход есть, выхода нет: интерфейсы анонсируют чужие IP, свитч хостера рубит «спуфные» пакеты. ARP-гигиена, policy-routing и фикс на стороне хостера.

8 мин чтения

Симптом

Хостер выдал два IPv4 как две отдельные сетевухи (eth0/eth1) в одной подсети /24. Дальше начинается странное: сервер в панели то connected, то disconnected — «поднимается на 10 секунд и тухнет» при здоровом контейнере. Один IP снаружи не пингуется и не пускает SSH, второй стабилен. После ребута входящий SSH работает, а исходящий трафик мёртв: пинг наружу — 100% потерь, curl возвращает 000.

Это ARP-конфликт, а не взлом, не перегруз и не поломка ноды.

Корень: ARP flux

Два IP на двух интерфейсах в одной подсети при дефолтных arp_ignore=0 / arp_announce=0 дают ARP flux: интерфейсы отвечают и анонсируют за чужой IP, шлюз выучивает IP на неверный MAC. Свитч хостера с anti-spoofing рубит «спуфные» исходящие пакеты — выход в интернет умирает. Вдобавок два default-маршрута дерутся за исходящие. Асимметрия «вход есть, выхода нет» — прямой признак именно этого класса.

Диагностика, только чтение:

ip -br addr                    # сколько IPv4 на скольких eth в одной подсети
ip route | grep default        # ДВА default = беда
sysctl net.ipv4.conf.all.arp_ignore net.ipv4.conf.all.arp_announce   # 0/0 → flux
curl -4 -m6 --interface <IP_A> https://<внешний-хост>   # код 000 на обоих IP = свитч рубит исходящие

Лечение (runtime)

GW=<gateway>
# 1) ARP-гигиена: каждый интерфейс отвечает и анонсит только за свой IP
sysctl -w net.ipv4.conf.{all,eth0,eth1}.arp_ignore=1
sysctl -w net.ipv4.conf.{all,eth0,eth1}.arp_announce=2
# 2) policy-routing: каждый src-IP выходит через свой NIC
ip rule add from <IP_eth0> lookup 100; ip route replace default via $GW dev eth0 table 100
ip rule add from <IP_eth1> lookup 101; ip route replace default via $GW dev eth1 table 101
# 3) один чистый main default через активный интерфейс
ip route replace default via $GW dev eth1
ip route del default via $GW dev eth0 2>/dev/null

Закрепление, чтобы пережило ребут: sysctl-значения в /etc/sysctl.d/99-arp-fix.conf — важны и all, и default, потому что per-interface значения могут не примениться до поднятия интерфейса. Плюс идемпотентный скрипт восстановления маршрутов и правил в oneshot-сервисе After=network-online.target.

Подводные камни

Вывод. Флап ноды плюс асимметрия «вход есть, выхода нет» при двух IP в одной подсети — это ARP flux от дефолтных arp_ignore/arp_announce и двух default-маршрутов. Лечится ARP-гигиеной, policy-routing по src-IP и одним чистым default, закреплёнными boot-сервисом. Не ребутить наугад; правильнее всего попросить хостера выдать второй IP алиасом.

Как подключиться за 2 минуты
Частые вопросы

Частые вопросы

Почему сервер то пропадает, то появляется в панели при двух IP в одной подсети?
Это ARP flux: при дефолтных arp_ignore=0 и arp_announce=0 оба интерфейса отвечают и анонсируют за чужой IP, шлюз запоминает неверный MAC, а свитч хостера с anti-spoofing рубит такие исходящие пакеты.
Как отличить этот ARP-конфликт от взлома или перегруза сервера?
Характерный признак — асимметрия: входящий SSH работает, а исходящий трафик (ping, curl наружу) при этом полностью мёртв.
Как подтвердить гипотезу ARP flux, ничего не меняя на сервере?
Посмотреть ip -br addr на число IPv4 на интерфейсах, ip route на количество default-маршрутов и sysctl arp_ignore/arp_announce — значения 0/0 подтверждают flux.
Как вылечить ARP flux без переустановки сервера?
ARP-гигиеной (arp_ignore=1, arp_announce=2 по интерфейсам), policy-routing по src-IP и одним чистым default-маршрутом, закреплёнными через sysctl.d и boot-сервис.
Стоит ли перезагружать флапающую ноду, чтобы её починить?
Нет, мульти-NIC после ребута часто поднимается криво и может убить исходящий трафик — ребутить только с готовой rescue-консолью под рукой. Правильнее попросить хостера выдать второй IP алиасом на одном интерфейсе.
Похожее

Ещё в базе знаний

Подключите рабочий VPN

Инструкции базы знаний написаны под ключи VPN PRO: ключ выдаёт Telegram-бот за минуту, работоспособность гарантируем. Промокод VPN10 — 10 дней бесплатно, без карты.

Промокод VPN10 — 10 дней бесплатно · до 31 августа · передавайте друзьям