Проблемы пересылки и маршрутизации с использованием моста Linux

У меня работают два контейнера (A и B) внутри виртуальной машины (Ubuntu 18.04). Для целей моделирования сети я маршрутизирую пакеты от A к B (эта часть работает). Что я хочу сделать, так это позволить А и Б общаться с внешним миром. Таким образом, у меня было бы:

A ---- B ---- Host VM --- Host --- Internet

Я сделал это до сих пор:

ip link add name br_routing type bridge
ip link set dev br_routing up

Затем добавьте еще один виртуальный интерфейс, чтобы у контейнера B был интерфейс для доступа к сети хоста vm:

ip link add vm_side_iface type veth peer name containerb_side_iface

Добавить интерфейс к мосту

ip link set dev vm_side_iface master br_routing

Установить ips для мост и интерфейс внутри контейнера

ip addr add 192.168.10.1/24 dev br_routing
ip addr add 192.168.10.2/24 dev vm_side_iface

Активировать интерфейс на стороне виртуальной машины

ip link set vm_side_iface up
ip link set containerb_side_iface netns $container_pid

Затем внутри сетевого пространства имен контейнера B:

ip addr add 192.168.10.2/24 broadcast 192.168.10.255 dev containerb_side_iface
ip route add default via 192.168.10.1 dev containerb_side_iface

На этом этапе я могу выполнить эхо-запрос A и B с виртуальной машины хоста

Однако я не могу пинговать за мостом от А или Б. Кажется, что ошибка связана с маршрутизацией, поэтому вот она: Таблица маршрутизации B:

10.11.1.0/24 dev eth0  proto kernel  scope link  src 10.11.1.2
10.22.0.0/16 via 10.11.1.1 dev eth0
192.168.10.0/24 dev containerb_side_iface  proto kernel  scope link  src 192.168.10.2

Таблица маршрутизации виртуальных машин хоста:

default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
10.0.2.0/24 dev  enp0s3 proto kernel scope link src 10.0.2.15 metric 100 #Irrelevant here
10.11.0.0/16 via 192.168.10.2 dev br_routing #Route to reach B
10.22.0.0/16 via 192.168.10.2 dev br_routing #Route to reach A
192.168.10.0/24 dev br_routing proto kernel scope link src 192.168.10.1 #This seems odd
192.168.10.0/24 dev router_0 proto kernel scope link src 192.168.10.2 #This seems odd

Второе предположение - это мои таблицы маршрутизации, это то, что я пробовал:

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -A FORWARD -i enp0s3 -o vm_side_iface, -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i vm_side_iface, -o enp0s3 -j ACCEPT
iptables -A FORWARD -i enp0s3 -o vm_side_iface, -j ACCEPT

Я также попытался заменить vm_side_iface на br_routing , но в любом случае это не сработает. Более того, правила не используются (0 принятых пакетов, 0 отброшенных). Это единственные правила, которые настраиваются на виртуальной машине. Тем не менее, эхо-запрос от Host VM к A / B работает без этих правил.

Наконец, modprobe br_netfilter и очистка файлов внутри / etc / sys / net / bridge ничего не меняют.

Что не работает:

ping from A or B to HOST VM
ping from A or B to vm_side_iface
ping from A or B to br_routing

Что работает:

ping from HOST VM to A or B

Я заметил, что сообщения попадают на мост (tcpdump -i br_routing), но не пересылаются на интерфейс enp0s3.

Есть предположения?

0
задан 28 November 2018 в 13:23
1 ответ

Мне удалось заставить его работать, используя Мост docker0, который создается по умолчанию при запуске контейнеров докеров без сетевых параметров

docker run -itd image_name

Мост такой же, как и созданный мной, но каким-то образом этот работает.

0
ответ дан 5 December 2019 в 05:01

Теги

Похожие вопросы