У меня есть следующая настройка сети.
Я использую хост с 2 vms. На каждой виртуальной машине работает Debian с cri-o, запущено несколько контейнеров. Каждый контейнер имеет IP-адрес в подсети 10.200.0.0/24. Один гость использует ips в подсети 10.200.0.0.0/16, а другой использует ips в подсети 10.200.1.0/16.
Хост имеет мостовой интерфейс, бр0
. Гостья eth0
интерфейс привязан к бр0
и сетевые карты vms также являются частью этого моста, поэтому им назначаются IP-адреса в подсети моей локальной сети (192.168.1.0/24).
Хост имеет следующие значения sysctl, поэтому iptables не должен влиять на трафик моста.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
Я хочу, чтобы контейнеры могли соединяться друг с другом (10.200.0.4 в/из 10.200.1.2).Это работает, если я настраиваю пользовательские маршруты для каждого гостя:
# в гостях 01
ip маршрут добавить 10.200.1.0/24 через 192.168.1.243
# в гостях 02
ip маршрут добавить 10.200.0.0/24 через 192.168.1.242
И тогда я могу пинговать другие контейнеры из каждого контейнера, но я не хочу настраивать статические маршруты для каждого гостя, так как мне придется делать это для каждого гостя каждый раз, когда что-то меняется.
Если я удалю эти маршруты и добавлю несколько статических маршрутов на свой хост, я смогу пропинговать все контейнеры с этого хоста:
ip маршрут добавить 10.200.0.0/24 через 192.168.1.242
ip маршрут добавить 10.200.1.0/24 через 192.168.1.243
# таблица маршрутизации гостей остается прежней с маршрутом по умолчанию через br0/eth0
# для 192.168.1.243
по умолчанию через 192.168.1.1 dev enp1s0
10.200.1.0/24 dev cni0 proto kernel scope link src 10.200.1.1
192.168.1.0/24 dev enp1s0 прото-область ядра ссылка src 192.168.1.243
Но самое главное, контейнеры не могут добраться друг до друга. Я ожидаю, что трафик будет идти из контейнеров в br0, в eth0, который затем перенаправит этот трафик обратно в br0, в .242 или .243, как настроено с помощью ip маршрут добавить
.
С помощью tcpdump я вижу, что трафик достигает br0 и eth0 на хосте, но не перенаправляется обратно на br0, а просто возвращается на мой маршрутизатор, который не знает, как маршрутизировать 10.200.0.0/16. Если я добавлю статический маршрут к своему маршрутизатору, 10.200.0.0/16 через 192.168.103
, это действительно работает, так как мой хост (.103) знает, как перенаправить этот трафик на br0 и на .242 или .243 в соответствии с настроенными вручную статическими маршрутами.
Итак, кажется, что трафик правильно маршрутизируется, когда он поступает из-за пределов eth0/br0, но не из гостей. Я понимаю, что мост работает на L2, поэтому трафик нужно куда-то маршрутизировать на L3, но почему он перенаправляется правильно, когда он исходит извне гостей, а не из гостей?