У меня работают два контейнера (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.
Есть предположения?
Мне удалось заставить его работать, используя Мост docker0, который создается по умолчанию при запуске контейнеров докеров без сетевых параметров
docker run -itd image_name
Мост такой же, как и созданный мной, но каким-то образом этот работает.