Назад | Перейти на главную страницу

Хост Linux случайным образом перестает отвечать на запросы запроса соседей ipv6

Я в своем уме, поэтому приветствую любую помощь.

У меня есть хост IPv6 (Linux 4.15.1-gentoo SMP x86_64), который случайным образом перестает отправлять объявления соседям. Запуск tcpdump показывает множество запросов соседей и почти нулевую реакцию на эти запросы. Иногда хост все равно отправляет NA, но только после пары десятков игнорируемых запросов NS. Очевидно, это полностью нарушает подключение IPv6.

Не знаю, актуально ли это, но IPv6 настроен на интерфейсе моста (пара контейнеров lxc также работает на этом мосту). Мост представляет собой типичный мост brctl с отключенным STP.

IPv6 настроен статически (как хост, так и шлюз).

Ручное заполнение сети нежелательной рекламой соседей (с использованием ndsend из vzctl например) может немного смягчить проблему, но, очевидно, не является решением.

Что еще страннее, отключение и повторное включение ipv6 на интерфейсе через procfs (/proc/sys/net/ipv6/conf/br0/disable_ipv6) и перенастроив его (ip -6 addr addи т. д.) временно «устраняет» проблему. Но это случится снова через день или два.

Для полноты картины на хосте работает брандмауэр nftables, но он явно разрешает весь трафик icmpv6 (через ip6 nexthdr ipv6-icmp accept где угодно). Отключение брандмауэра при проявлении проблемы ничего не меняет.

Итак, вот вопрос: что я могу сделать, чтобы определить основную проблему?

ОБНОВИТЬ: Для меня проблема исчезла после нескольких обновлений ядра, но есть сообщения об аналогичных проблемах в более поздних версиях ядра, особенно с большими таблицами маршрутизации и / или большим количеством соседей. Сообщается, что одним из возможных виновников этого является небольшое ограничение на размер кеша маршрута / соседнего IPv6 в ядре. Если у вас возникли похожие проблемы, попробуйте поднять net.ipv6.route.max_size sysctl на относительно большое значение (например, 1048576), например, запустив sysctl -w net.ipv6.route.max_size=1048576 и / или путем редактирования /etc/sysctl.conf. Вы также, вероятно, захотите поднять net.ipv6.route.gc_thresh чтобы не запускать сборщик мусора слишком часто. Также проверьте net.ipv6.neigh.default.gc_thresh1, net.ipv6.neigh.default.gc_thresh2 и net.ipv6.neigh.default.gc_thresh3 если у вас особенно много записей в соседнем кеше. Видеть https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt для чего нужны все эти варианты.

У меня была такая же проблема с ядром 4.16.2-gentoo. Но в моем случае это оказалось совершенно не связано с ядром.

Рассматриваемый ящик служил IPv6 VPN-шлюзом и имел стабильное соединение. Даже маршрутизатор подсети за ним был в полном порядке, только сама маршрутизируемая подсеть постоянно теряла соединение.

TL; DR;
Firewalld был виновником в моем случае. IPv6 rpfilter настройка отфильтровала запросы соседей моего маршрутизатора подсети.

Узнал об этом включив авторизацию /etc/firewalld/firewalld.conf

LogDenied=all

что привело к появлению таких логов (MAC и SRC сокращены и запутаны):

kernel: rpfilter_DROP: IN=enp6s0.100 OUT= MAC=XX:…:XX SRC=fe80:…:beaf DST=ff02:0000:0000:0000:0000:0001:ff00:0001 LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0

Я только что отключил ipv6 rpfilter, пока не смогу выяснить, почему это происходит. Настройка довольно проста, и мне все кажется хорошо, но, возможно, проблема в интерфейсе, являющемся vlan ...