macvlan недоступен для внешних устройств, даже с маршрутизацией IP

Вопрос или проблема

Я пытаюсь настроить контейнер Docker, который будет доступен в сети с MAC-адресом и статическим IP-адресом. Для этого я использую macvlan.

Сначала я создал сеть в Docker:

docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    --ip-range=192.168.1.64/26 \ # Чтобы избежать пересечения с текущими устройствами
    -o parent=wlp0s20f3 \ # Мое wifi-соединение
    macvlan

Затем я настроил маршруты на своем хосте (с установленным ubuntu) с помощью:

sudo ip link set wlp0s20f3 promisc on
sudo ip link add dockerrouteif link wlp0s20f3 type macvlan mode bridge
sudo ip addr add 192.168.1.249/32 dev dockerrouteif
sudo ip link set dockerrouteif2 up
sudo ip route add 192.168.1.64/26 dev dockerrouteif

И запустил контейнер, используя docker compose:

services:
  app:
    ...
    networks:
      macvlan:
        ipv4_address: 192.168.1.100
        aliases:
          - app.external
    ...
networks:
  macvlan:
    external: true
    name: macvlan

Это работает, контейнер может получать доступ к моим сетевым устройствам, мой хост может получать доступ к IP 192.168.1.100, но я не могу пинговать эту машину извне хоста.

Я отключил брандмауэры, проверил iptables, чтобы увидеть, блокирует ли что-то доступ, и после долгих поисков я получил это от arp -n, и не знаю, как дальше действовать:

? (192.168.1.100) at <incomplete> on wlp0s20f3

Во всех документациях, статьях, уроках, руководствах и видео macvlan “просто работает”, и я не могу понять, что делаю не так.

Ответ или решение

Проблема с доступом к контейнеру Docker через Macvlan

Настройка доступа к контейнеру Docker с использованием Macvlan может вызвать трудности, особенно если контейнер не доступен с внешних устройств. В данной статье мы разберемся, с чем может быть связана ваша проблема, и предложим варианты решения.

1. Проверка конфигурации сети

Первым делом стоит обратить внимание на настройки Macvlan, которые вы использовали. Убедитесь, что вы правильно задали все параметры при создании сети:

docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    --ip-range=192.168.1.64/26 \
    -o parent=wlp0s20f3 \
    macvlan

Проверьте, что wlp0s20f3 является корректным интерфейсом, и он действительно подключен к нужной сети.

2. Настройка маршрутизации

Вы также упомянули, что на хосте вы добавили несколько маршрутов:

sudo ip link set wlp0s20f3 promisc on
sudo ip link add dockerrouteif link wlp0s20f3 type macvlan mode bridge
sudo ip addr add 192.168.1.249/32 dev dockerrouteif
sudo ip link set dockerrouteif2 up
sudo ip route add 192.168.1.64/26 dev dockerrouteif

Обратите внимание на следующее:

  • Режим promiscuous: Включение режима promiscuous на интерфейсе wlp0s20f3 важно для правильной работы Macvlan. Это позволяет интерфейсу «слушать» всю проходящую мимо трафик, а не только тот, который адресован ему.

  • Маршрут и адресация: Вы добавили адрес 192.168.1.249/32. Это значит, что хост настроен на точечное обращение, что может быть недостаточно для работы с диапазоном IP-адресов 192.168.1.64/26. Убедитесь, что маршруты настроены корректно, чтобы весь трафик для соответствующих диапазонов проходил через интерфейс dockerrouteif.

3. Выявление проблемы с ARP

Вы привели вывод команды arp -n, который указывает, что для IP-адреса 192.168.1.100 получен статус <incomplete>. Это говорит о том, что запрашивающее устройство не получило ARP-ответа от контейнера. Причинами могут быть:

  • ARP-сигналы: Убедитесь, что контейнер действительно отвечает на ARP-запросы. Это может быть связано с конфигурационными настройками внутри контейнера или самой сетью.

  • MAC-адрес контейнера: Попробуйте явно указать MAC-адрес для вашего контейнера при его создании, чтобы исключить возможность конфликтов:

    app:
      ...
      networks:
        macvlan:
          ipv4_address: 192.168.1.100
          mac_address: "00:00:00:00:00:01"  # Замените на уникальный MAC-адрес

4. Проверка сетевой изоляции

Некоторые конфигурации сети могут блокировать доступ с внешних устройств. Проверьте настройки вашего маршрутизатора (или коммутатора), чтобы убедиться, что фильтры и правила не препятствуют подключению к контейнерам.

5. Мониторинг и диагностика

Если все вышеперечисленное не помогло, используйте такие инструменты, как tcpdump на интерфейсах, чтобы проанализировать проходящий трафик:

sudo tcpdump -i wlp0s20f3
sudo tcpdump -i dockerrouteif

Это даст вам понимание того, видите ли вы ARP-запросы и ответы, и поможет определить, где именно происходит потеря пакетов.

Заключение

Настройка Macvlan в Docker может быть сложной задачей, и доступ извне — это одна из самых распространенных проблем. Проверьте конфигурацию сети, маршрутизации и правила ARP. Убедитесь, что все параметры соответствуют требованиям вашей инфраструктуры. Если после всех проверок проблема остается нерешенной, рассмотрите возможность обращения за помощью к сообществу Docker или специалистам в области сетевых технологий.

Оцените материал
Добавить комментарий

Капча загружается...