Постановка проблемы
У меня есть мост с именем cni0
, который подключен к контейнерам в их собственных сетевых пространствах имен.
Когда я пытаюсь создать статический маршрутк одному из этих контейнеров более старые версии ядра Linux будут маршрутизировать и соединять трафик с этим контейнером (протестировано с помощью ping и tcpdump).Более новые версии этого не делают.
Действия по воспроизведению
У меня есть мостовой интерфейс на cni0
, который прослушивает 10.5.2.19
внутри сетевого пространства имен.Тот же интерфейс также прослушивает 10.233.1.18
.У меня также есть внешний интерфейс eth1
, на котором ничего нет или адрес не связан.У cni0
есть адрес 10.233.64.1/24
с обычным локальным маршрутом и маршрутом 10.233.64.0/24
, указывающим на него.
В пространстве имен хоста я создаю маршрут следующим образом: ip route add 10.5.2.19 via 10.233.1.18
Я могу пропинговать 10.5.2.19
из пространства имен хоста, и пакеты прибывают в пространство имен сети на всех версиях ядра, которые я тестировал.
Используя статический ARP, я не могу пропинговать с удаленного хоста на некоторых более новых версияхядро.ICMP-пакеты поступают по интерфейсу eth1
и затем никуда не идут.Там нет ни капли на счетчиках, которые я смог найти.Я не вижу выдачи ARP, пытающихся найти 10.5.2.19
, что происходит, если я пытаюсь перенаправить на обычный интерфейс, такой как eth3
.
У меня все интерфейсы установлены с rp_filter=0
, log_martians=1
и accept_local=1
.(а также all
и default
) Марсиане не зарегистрированы.
Я проверил, и в ebtables
и iptables
нет ничего, что могло бы помешать.ip route show table 0 | grep 10.5.2.19
показывает только маршрут, который я добавил выше.
Рабочие и нерабочие версии ядра
Версия ядра, которая работает: 3.10.0-862.14.4.el7.x86_64 # Centos 7.5.1804
предыдущие версии в этой строке ядер также работают.
Версия ядра, которая не работает:
3.10.0-957.1.3.el7.x86.64 #CENTOS 7.6.1810
Также не работает: 4.11.x
из линии Fedora, протестированной как не работающая
(Учитывая, как RedHat Cherrypicks меня не удивит, если они недавно вернули что-то из 4.x).
Так что повторить мой вопрос : Почему маршрутизация к мосту использовалась, и больше не работает на более новых версиях ядра?Это потому, что это не поддерживается в Linux, и мне просто повезло раньше?