РЕДАКТИРОВАТЬ :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
(шлюза Частный сетевой адаптер виртуальной машины ), указывающий на то, что что-то неправильно настроено.
Как заставить это работать?
Ваши шаги для двух гостей в порядке, я только что воспроизвел вашу настройку до момента аренды адресов. Я мог раздать IP-адреса одной виртуальной машины, на которой работает dnsmasq, одной виртуальной машине, на которой работает клиент dhcp.
Отметьте, что эти:
DOWN
в ip a l
выводе хоста (должно быть указано UNKNOWN
или UP
)
qemu-bridge-helper
вызовет его ip link set tapN up
через некоторое время после запуска виртуальной машиныether
адрес в ip a l
в списке гостейbrctl showmacs br0
должно быть две записи с не-нулевым таймером устаревания/proc/sys/net/bridge/bridge-nf-call*
и загружен ли br_netfilter
модульiptables -A FORWARD -j LOG --log-prefix "forward dropped"
перед удалением или перед политикой DROP в таблице FORWARD/sys/class/net/br*/bridge/nf_call_*
(делаю не знаю, почему эти могут быть отключены, когда включена фильтрация)Другие примечательные элементы, которые я обнаружил во время тестирования:
vnet_hdr
на мои тач-устройства. Это кажется разумным, и при желании его можно было бы отключить в командной строке qemu.По поводу вашей попытки упростить тестирование за счет привязки к крановому устройству..
dnsmasq будет работать внутри виртуальной машины QEMU.
Устройства с постоянным подключением, насколько мне известно, нельзя использовать до тех пор, пока они не будут подключены. Таким образом, вы можете осмысленно протестировать только полную настройку:
--interface=tap0
Подсказка:Используйте --bind-interfaces
, чтобы указать dnsmasq переключиться с простого отбрасывания трафика с других интерфейсов на на самом деле пытается выполнить привязку, поэтому подробно завершает работу при запуске с непригодными для использования настройками.