Рейтинг:1

Как запустить dnsmasq внутри QEMU, предоставляя услугу сетевой загрузки другим виртуальным машинам

флаг ph

РЕДАКТИРОВАТЬ: WIP: Основная причина описанных ниже сбоев связана с тем, что я не запустил интерфейсы TAP хоста в нужное время, если я позволю QEMU обрабатывать создание устройств ответвления, все будет работать так, как ожидалось. Я рассмотрю сбой более подробно и предоставлю более четкое объяснение проблемы, когда она у меня появится. Спасибо @anx за советы!

Цель: запустить dnsmasq внутри хоста QEMU VM, который обслуживает сетевую загрузку с другой виртуальной машины QEMU, работающей на хосте.

Я хотел бы, чтобы виртуальная машина dnsmasq действовала как шлюз с одним сетевым адаптером в качестве восходящий интерфейс WAN, с восходящим DHCP-сервером, а другой interface частный интерфейс локальной сети, к которому будут подключены другие виртуальные машины. "подключен" и будет загружаться по сети из dnsmasq, прослушивающего этот частный интерфейс локальной сети.

Во-первых, чтобы позволить виртуальным машинам общаться друг с другом, я создаю свой собственный мост. на хосте,

ip ссылка добавить имя vivianbr0 тип мост
ip link set vivianbr0 up

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

ip tuntap добавить режим tap tap0 user cturner
ip tuntap добавить режим tap tap1 user cturner
ip ссылка настроить tap0 up
ip link установить tap1 up
ip link set tap0 master vivianbr0
ip link set tap1 master vivianbr0

Для виртуальной машины шлюза я использую ISO-образ Arch Linux для целей тестирования, виртуальная машина загружается с двумя сетевыми картами, таким образом,

 qemu-система-x86_64 \
    -drive file=arch-disk.qcow2,if=none,id=nvm \
    -устройство nvme,serial=deadbeef,drive=nvm \
    -cdrom archlinux-2021.09.01-x86_64.iso \
    -загрузочный д\
    -device virtio-net-pci,romfile=,netdev=net0,mac="DE:AD:BE:EF:00:11" \
    -device virtio-net-pci,romfile=,netdev=net1,mac="DE:AD:BE:EF:00:12" \
    `# Имитация подключенного «восходящего» кабеля в сети пользовательского режима` \
    -netdev user,id=net0,hostfwd=tcp::60022-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:8000,hostfwd=tcp::2375-:2375 \
    `# А теперь неподключенный с, с сетями TAP` \
    -netdev tap,id=net1,ifname=tap0,script=нет,downscript=нет \
-net bridge,br=vivianbr0 \
    -м 4G \
    -включить-квм

Как только эта машина загрузится, я вижу следующее в конфигурации моста:

brctl показать vivianbr0 

имя моста идентификатор моста интерфейсы с поддержкой STP
vivianbr0 8000.46954a1ad851 без крана0
                            кран1
                            кран2

я предполагаю кран2 был создан QEMU...

Внутри этой виртуальной машины есть два интерфейса iFace. энс4 с МАК DE:AD:BE:EF:00:11 и ens5 с MAC DE:AD:BE:EF:00:12. Внутри этого ВМ, я начинаю dnsmasq,

IP-адрес добавить 10.42.0.1/24 dev ens5
dnsmasq -d --dhcp-range=10.42.0.10,10.42.0.100 --dhcp-script=/bin/echo --enable-tftp=ens5 --interface=ens5

Это запускается без ошибок.

Теперь я пытаюсь загрузить по сети другую виртуальную машину, запущенную на хосте вот так,

qemu-система-x86_64 \
-машина pc-q35-6.0,accel=kvm\
-m 1024 -smp 2, сокеты = 2, ядра = 1, потоки = 1 \
-netdev tap,id=net0,ifname=tap1,script=нет,downscript=нет \
-device virtio-net-pci,netdev=net0,bootindex=1,mac=DE:AD:BE:EF:00:13 \
-net bridge,br=vivianbr0 \
-включить-квм \
-vga виртио

Но не получается загрузиться. я слежу за вивианбр0 с использованием tcpdump и DHCP-запросы вижу, но ответов нет, до dnsmasq, работающего внутри первой ВМ, ничего не доходит,

tcpdump -i vivianbr0 -nN
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на vivianbr0, тип канала EN10MB (Ethernet), длина снимка 262144 байт
12:21:39.585229 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:13, длина 397
12:21:40.587741 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:13, длина 397
12:21:40.700038 IP6 fe80::6ce2:2aff:fe94:ba48.5353 > ff02::fb.5353: 0 [7q] PTR (QM)? _nfs._tcp.local. ПТР (QM)? _ftp._tcp.local. ПТР (QM)? _webdav._tcp.local. ПТР (QM)? _webdavs._tcp.local. ПТР (QM)? _sftp-ssh._tcp.local. ПТР (QM)? _smb._tcp.local. ПТР (QM)? _afpovertcp._tcp.local. (118)
12:21:42.619968 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:13, длина 397
12:21:46.684448 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:13, длина 397
12:22:30.609555 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:12, длина 289
12:23:33.796148 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:12, длина 289
12:24:38.673364 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, запрос от de:ad:be:ef:00:12, длина 289

Как ни странно, я вижу запросы BOOTP от де:объявление:быть:эф:00:13 (MAC-адрес виртуальной машины с сетевой загрузкой) и из де:объявление:быть:эф:00:12 (частный сетевой адаптер виртуальной машины шлюза), что указывает на то, что что-то неправильно настроено.

Как я могу заставить это работать?

Nikita Kipriyanov avatar
флаг za
Что, если вы прослушиваете трафик DHCP на tap0 (порт моста)? Он должен показать thaffic, какой код моста переключился на этот порт. Также проверяйте таблицу МАС-адресов моста во время запросов; он заполняется необходимыми MAC-адресами? Кстати, bridge по умолчанию выставляет стандартные задержки STP, а значит, порт начинает пересылать трафик только через 30 секунд после того, как он был разорван «вверх». В вашей настройке моста я нигде не видел, чтобы вы меняли это или отключали STP. И, наконец, виртуальная машина, которая должна загружаться с виртуальной машины dnsmasq: какой порт моста она использует? Внутри моста должен быть еще один интерфейс tap для второй виртуальной машины.
флаг ph
@anx Что касается `-netdev brdige`, как это отвечает на вопрос? Это позволяет мне прикреплять ответвительные устройства к мосту *с другим именем*, но проблема в том, что мне нужно, чтобы QEMU проксировал гостевое устройство на хост-мост, чтобы dnsmasq внутри виртуальной машины мог обслуживать запросы, обрабатываемые хост-мостом.
флаг ph
@NikitaKipriyanov Я ответил на ваш первый вопрос в редактировании. STP не работает на мосту. Я не знаю, как проверить таблицу MAC-адресов моста во время запросов. Это кажется более простой проблемой, когда интерфейсы не могут быть подняты.
флаг ph
@anx Относительно вызова dnsmasq.Это немного сложно разбить, но моя виртуальная машина шлюза называет два интерфейса на основе этого правила: тот интерфейс, который отвечает на запрос DHCP, называется «общедоступным», другой — «частным». В рабочем развертывании общедоступный интерфейс подключен к вышестоящему DHCP-серверу, а частный интерфейс — нет. Тогда команда `dnsmasq` такая же, как я написал в своем вопросе, но с `--interface=private`
anx avatar
флаг fr
anx
Мне нравится, что в вашем вопросе упоминаются все предпринятые шаги, но я подозреваю, что ключевые факты несколько затемнены разными версиями... постарайтесь добавить к вашему вопросу непротиворечивый снимок текущей ситуации (обе командные строки qemu, командная строка dnsmasq и все 3 выходы из `ip a l`)?
флаг ph
@anx Да, мне действительно нужно самому управлять крановыми устройствами. Я старался быть максимально кратким, но у меня не очень получается, так что достаточно сказать... На то есть причины :)
флаг ph
@anx «dnsmasq для гостя» просто не может работать по той же причине, по которой не работает dnsmasq для «tap0», а не «br0». Это был минимизированный пример по вашему запросу. Если я запускаю dnsmasq внутри виртуальной машины QEMU с помощью `-netdev tap,id=net1,ifname=tap0,script=no,downscript=no`, то это то же поведение, что и в примере, который я привел в своем вопросе, только есть дополнительный уровень косвенного между сетевым интерфейсом гостя и краном хоста.
Tom Yan avatar
флаг in
Вы действительно не имеете никакого смысла. Привязка dnsmasq к крану на хосте (который в любом случае не имеет смысла, который, как ожидается, НЕ будет работать) не имеет НИЧЕГО общего с наличием виртуальной машины, на которой запущен dnsmasq (который привязывается к виртуализированной сетевой карте внутри виртуальной машины), независимо от того, можете ли вы иметь последний за работой. С вашим «упрощенным» подходом нет смысла тестировать / перепроверять / устранять неполадки, поскольку это НЕ упрощение вообще.
Tom Yan avatar
флаг in
Первое, что приходит мне на ум, это то, что qemu не перечисляет и не рандомизирует MAC-адрес каждой виртуальной машины.Это всегда `52:54:00:12:34:56`, если явно не установлено/изменено с помощью опции qemu. Возможно, вы захотите убедиться, что у вас это исправлено, с соответствующей опцией qemu или настроить систему виртуальных машин для настройки самих «поддельных». Убедитесь, что вы снова не запутались с MAC-адресами кранов на хосте.
Tom Yan avatar
флаг in
Кстати, вы действительно хотите подчистить свой вопрос (удалив всю не относящуюся к делу ерунду), если вы все еще хотите / нуждаетесь в дополнительной помощи.
флаг ph
@TomYan Я полностью переписал свой вопрос. Надеюсь, теперь вам стало понятнее. Я попытался обеспечить уникальность MAC-адресов, хотя, возможно, я тоже сделал это неправильно.
Tom Yan avatar
флаг in
Во-первых, вам не нужно использовать `-net(dev) bridge` *в дополнение* к `-net(dev) tap`. Они не дополняют друг друга, скорее, первый автоматически добавляет кран для вас, а второй использует существующий кран. Я рекомендую использовать ярлык `-nic bridge,model=virtio,mac=SO:ME:MA:CA:DD:RE`, чтобы заменить все другие параметры, связанные с сетью, которые у вас есть сейчас. (`-nic` также можно использовать с `user` и его `hostfwd между прочим.)
Tom Yan avatar
флаг in
Далее, «...и из de:ad:be:ef:00:12 (частная сетевая карта виртуальной машины шлюза), что указывает на то, что что-то плохо сконфигурировано», это ложное предположение. Видите ли вы DHCP-запросы от «узла шлюза», зависит от того, работает ли он DHCP-клиент. Arch ISO использует для этого `systemd-networkd`, и по умолчанию он включает DHCP (клиент) на всех сетевых адаптерах Ethernet IIRC.
Tom Yan avatar
флаг in
Наконец, хотя я не знаком с netboot, но почему вы ожидаете, что он будет работать как «из коробки», пока в сети есть хост-сервер dnsmasq/DHCP? И в любом случае, почему бы вам просто не начать с загрузки Arch ISO, чтобы убедиться, что, по крайней мере, часть назначения адресов DHCP работает в первую очередь? См. https://wiki.archlinux.org/title/Netboot, кстати. (Обратите внимание, что инструкции внутри не имеют ничего общего с виртуализацией, поэтому все они должны применяться *внутри* виртуальной машины, а не хоста.)
Рейтинг:0
флаг fr
anx

Ваши шаги для двух гостей в порядке, я только что воспроизвел вашу настройку до момента сдачи в аренду адресов.Я мог раздать IP-адреса одной виртуальной машины, на которой работает dnsmasq, одной виртуальной машине, на которой работает клиент dhcp.

Проверьте это:

  • не может вызывать неприсоединенные крановые устройства
    • видно из ВНИЗ государство в IP а л вывод хоста (должен сказать НЕИЗВЕСТНЫЙ или же ВВЕРХ)
      • если вы позволите qemu создать кран-устройство, qemu-мост-помощник подниму это
      • если вы используете скрипт =, поднимите туда устройство
      • в противном случае вы должны установить ip ссылку некоторое время после запуска vm
  • MAC-адреса должны быть уникальными
    • видимый в эфир адрес в IP а л в гостях
    • список изученных (не хостовых) компьютеров Mac, например. brctl showmacs br0 должен иметь два записи с ненулевым таймером старения
  • сброс пакетов через iptables
    • проверять /proc/sys/net/bridge/bridge-nf-call* и будь то br_netfilter модуль загружен
    • добавить правило ведения журнала, для IPv4 что-то вроде iptables -A FORWARD -j LOG --log-prefix "переадресация удалена" перед удалением или перед политикой DROP в таблице FORWARD
    • игнорировать /sys/класс/сеть/br*/мост/nf_call_* (я не знаю, почему эти может быть выключенным, когда включена фильтрация)

Другие примечательные вещи, которые я обнаружил во время тестирования:

  • Кему добавил vnet_hdr вариант на моих устройствах крана. Это кажется разумным, и при желании его можно было бы отключить в командной строке qemu.
  • Иногда мой (ссылка на область) маршрут для моста пропадал. Мне еще предстоит определить, как это вообще могло произойти.

Насчет вашей попытки упростить тестирование привязкой к крановому устройству..

dnsmasq будет работать внутри виртуальной машины QEMU.

Устройства постоянного касания AFAIK непригодны для использования до тех пор, пока они не будут подключены. Таким образом, вы можете только осмысленно протестировать полную настройку:

  • Вы хотите запустить dnsmasq на хосте?
    • затем прикрепите его к мостовому устройству
  • или вы хотите запустить dnsmasq внутри виртуальной машины?
    • затем подключите его к соответствующему сетевому интерфейсу внутри эта виртуальная машина

--интерфейс=tap0

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

флаг ph
Мой вопрос касается запуска dnsmasq * внутри виртуальной машины *, примеры host-dnsmasq были только для того, чтобы дать вам более простой пример проблемы. Если вы знаете, как заставить dnsmasq *внутри виртуальной машины* предлагать аренду другой виртуальной машине с сетевой загрузкой, мне было бы очень интересно это узнать!
флаг ph
Чтобы быть еще более явным, я снова отредактировал свой вопрос, чтобы привести пример dnsmasq в гостевом подходе, который я пытаюсь
anx avatar
флаг fr
anx
Я *думал*, что знаю, как это сделать, потому что делал это много лет... но потом я повозился и нашел *три* разные тривиальные причины, по которым это может не сработать.
флаг ph
Большое спасибо @anx, я добился некоторого прогресса благодаря вашим заметкам.Кажется, причиной моих проблем является то, что я не запускаю вручную созданные крановые устройства в нужное время. Если я позволю QEMU справиться с ними, сетевая загрузка действительно сработает. Я обновлю свой вопрос и, возможно, предложу более четкое объяснение сбоя, как только я немного углублюсь в то, как правильно обрабатывать мой вариант использования. Большое спасибо, я должен вам несколько бутылок пива!

Ответить или комментировать

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