Supondo que você esteja executando as VMs em um único host e não em vários hosts, a maneira mais simples de estabelecer uma rede entre as VMs do QEMU e outras VMs (ou hosts reais) é usar dispositivos de toque em vez de multicast. toque nos dispositivos e adicione suas interfaces de contêineres Docker (ou o que você quiser) à ponte.
BTW, a descrição da sintaxe e da rede no link que você forneceu é obsoleta e desaparecerá em algum estágio. Em particular, o conceito de vlans do QEMU desaparecerá. Na sintaxe atual, use algo como
-netdev tap,ifname=qemu0
e depois (como root)
ip link add br_qemu type bridge
ip link set br_qemu up
ip link set qemu0 master br_qemu
ip link set qemu1 master br_qemu
Se você criar a ponte antes de lançar as VMs, também poderá usar -netdev bridge,br=br_qemu
para que o QEMU adicione as interfaces de toque à ponte.
Se você precisa especificamente de multicast porque suas VMs estão sendo executadas em hosts físicos diferentes, isso será mais complicado. O primeiro passo seria descobrir o formato no qual o QEMU envia os pacotes (não é o pacote bruto, mas eu não procurei mais), e o segundo para escrever um proxy que une o grupo multicast e encaminhar entre esse grupo. e uma interface de toque.
Como alternativa (mas com menos eficiência), você pode executar uma VM do QEMU dedicada com duas placas de rede, uma multicast e uma única, que é configurada para não fazer nada além de avançar entre elas.
Uma alternativa ainda melhor seria implementar a comunicação entre os diferentes hosts físicos de uma maneira diferente (túnel, VLANs na LAN física (VLANs reais 801.q, não QAVs)) e manter as interfaces de toque. / p>
Editar
Para adicionar uma VLAN à sua LAN, digamos, em eth0
no host, faça
ip link add link eth0 name eth0.5 type vlan id 5
onde 5
é a tag de VLAN que você escolheu. Em seguida, adicione essa interface à ponte
ip link set eth0.5 master br_qemu
e você está pronto para ir. Você pode colocar esses dois comandos em um script que você usa para iniciar as VMs. Alternativamente, coloque o equivalente a isto em /etc/network/interfaces
(google ou leia manpage para detalhes). Sim, requer um pouco de configuração no host.
Editar
Ok, eu dei uma olhada no formato dos pacotes multicast que o QEMU envia, e é apenas o frame ethernet. Então você pode fazer algo parecido com
socat UDP4-DATAGRAM:230.0.0.1:1234,sourceport=1234,ip-add-membership=230.0.0.1:10.0.0.2 TUN:10.2.3.1/24,tun-type=tap,iff-no-pi,iff-up
no host que possui o contêiner docker, em que 10.0.0.2
é um endereço IP válido para o host em relação ao grupo multicast, por exemplo, o endereço IP de eth0
. Isto lhe dará uma interface tap
(nível 2) onde você pode enviar pacotes Ethernet e recebê-los do grupo multicast. Agora você só precisa unir / rotear esses itens ao contêiner do Docker.
Em vez de socat
, você também pode escrever seu próprio programa C curto, etc., se quiser e achar que é mais eficiente.