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

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

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

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

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

ip link add name vivianbr0 type bridge
ip link set vivianbr0 up

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

ip tuntap add mode tap tap0 user cturner
ip tuntap add mode tap tap1 user cturner
ip link set tap0 up
ip link set tap1 up
ip link set tap0 master vivianbr0
ip link set tap1 master vivianbr0

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

 qemu-system-x86_64 \
    -drive file=arch-disk.qcow2,if=none,id=nvm \
    -device nvme,serial=deadbeef,drive=nvm \
    -cdrom archlinux-2021.09.01-x86_64.iso \
    -boot d \
    -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" \
    `# Simulate the plugged in "upstream" cable with user-mode networking` \
    -netdev user,id=net0,hostfwd=tcp::60022-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:8000,hostfwd=tcp::2375-:2375 \
    `# And now the unplugged one with, with TAP networks` \
    -netdev tap,id=net1,ifname=tap0,script=no,downscript=no \
-net bridge,br=vivianbr0 \
    -m 4G \
    -enable-kvm

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

brctl show vivianbr0 

bridge name     bridge id               STP enabled     interfaces
vivianbr0               8000.46954a1ad851       no              tap0
                            tap1
                            tap2

Я предполагаю, что tap2был создан QEMU...

Внутри этой виртуальной машины, есть два айфейса. ens4с МАС DE:AD:BE:EF:00:11 и ens5с MAC DE:AD:BE:EF:00:12. Внутри этого VM, я запускаю dnsmasq,

ip addr add 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-system-x86_64 \
-machine pc-q35-6.0,accel=kvm \
-m 1024 -smp 2,sockets=2,cores=1,threads=1 \
-netdev tap,id=net0,ifname=tap1,script=no,downscript=no \
-device virtio-net-pci,netdev=net0,bootindex=1,mac=DE:AD:BE:EF:00:13 \
-net bridge,br=vivianbr0 \
-enable-kvm \
-vga virtio

Но она не загружается. Я отслеживаю vivianbr0с помощью tcpdumpи могу видеть запросы DHCP, но нет ответов, ничего не достигает dnsmasq, работающего внутри первой виртуальной машины,

tcpdump -i vivianbr0 -nN
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on vivianbr0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
12:21:39.585229 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:40.587741 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:40.700038 IP6 fe80::6ce2:2aff:fe94:ba48.5353 > ff02::fb.5353: 0 [7q] PTR (QM)? _nfs._tcp.local. PTR (QM)? _ftp._tcp.local. PTR (QM)? _webdav._tcp.local. PTR (QM)? _webdavs._tcp.local. PTR (QM)? _sftp-ssh._tcp.local. PTR (QM)? _smb._tcp.local. PTR (QM)? _afpovertcp._tcp.local. (118)
12:21:42.619968 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:46.684448 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:22:30.609555 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289
12:23:33.796148 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289
12:24:38.673364 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289

как ни странно, я вижу запросы BOOTP отde:ad:be:ef:00:13(MAC-адрес виртуальных машин с сетевой загрузкой)и отde:ad:be:ef:00:12(шлюза Частный сетевой адаптер виртуальной машины ), указывающий на то, что что-то неправильно настроено.

Как заставить это работать?

1
задан 19 September 2021 в 18:47
1 ответ

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

Отметьте, что эти:

  • не могут вызывать неприсоединенные ответвительные устройства.
    • видно из состояния DOWNв ip a lвыводе хоста (должно быть указано UNKNOWNили UP)
      • , если вы позволите qemu создать устройство ответвления, qemu-bridge-helperвызовет его
      • , если вы используете script=, поднимите устройство туда
      • в противном случае вам нужно ip link set tapN upчерез некоторое время после запуска виртуальной машины
  • MAC-адреса должны быть уникальными
    • видимый в etherадрес в ip a lв списке гостей
    • узнал (не-хост)Mac, например. brctl showmacs br0должно быть две записи с не-нулевым таймером устаревания
  • сброс пакетов через iptables
    • проверить /proc/sys/net/bridge/bridge-nf-call*и загружен ли br_netfilterмодуль
    • добавить правило ведения журнала, для IPv4 что-то вроде iptables -A FORWARD -j LOG --log-prefix "forward dropped"перед удалением или перед политикой DROP в таблице FORWARD
    • игнорировать/sys/class/net/br*/bridge/nf_call_*(делаю не знаю, почему эти могут быть отключены, когда включена фильтрация)

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

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

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

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

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

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

--interface=tap0

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

0
ответ дан 20 September 2021 в 16:09

Теги

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