Primeiro, se você não tentou o proxy arp sozinho, você deve tentar o proxy arp.
echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
Opção 1: alguma configuração de rota connmark / política
Se o proxy arp sozinho não funcionasse, não posso garantir que isso funcionará, mas vale a pena um tiro, eu acho. O que estou prestes a descrever é como configurar o roteamento de políticas para vincular respostas com base na interface de entrada usando o conntrack. Descreverei como configurá-lo para duas interfaces e será fácil expandir para qualquer número. Por outro lado, em vez de funcionar, ele pode ficar muito confuso e não fazer nada (provavelmente porque a tabela de arp do kernel não sabe se deve armazenar em cache pares ip / mac por dispositivo). Se isso acontecer, tente o segundo método mais feio.
Primeiro, configure algumas regras de mangle do connmark:
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
Em / etc / iproute2 / rt_tables adicionar duas tabelas, 100 e 101, rotulá-las usb0 e usb1
100 usb0
101 usb1
Para cada uma dessas tabelas, adicione o seguinte (substitua < N > pelo número apropriado):
ip route add 192.168.2.0/24 dev usb<N> table usb<N>
ip rule add fw <N> table usb<N>
iptables -t mangle -A PREROUTING -i usb<N> -j MARK --set-mark <N>
Não tenho certeza, mas você pode precisar configurar uma interface fictícia para que seu daemon tftp escute:
modprobe dummy
ifconfig dummy0 192.168.2.100/32 up
echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
sysctl net.ipv4.ip_forward=1
iptables -I FORWARD -s 192.168.2.100 -j ACCEPT
iptables -I FORWARD -d 192.168.2.100 -j ACCEPT
Agora teste com dois dispositivos. Se funcionar, excelente, caso contrário, tente o próximo método:
Opção 2: contêiner kvm por dispositivo de rede usb
A opção 2 é mais feia, envolvendo alguma ponte e qemu / kvm. virt-manager
é provavelmente a maneira mais fácil de criar essas coisas.
Crie dispositivos de toque e pontes, um por interface usb.
tunctl -t tap<N>
brctl addbr usb<N>br
brctl addif usb<N>br tap<N>
brctl addif usb<N>br usb<N> # this may need to be done each time the usb device is connected/disconnected.
Crie um arquivo de imagem kvm ou um CD de inicialização projetado para ser somente de leitura e hospede seu servidor tftp e imagem ... ou omita somente leitura e crie um arquivo de imagem por vm (usar instantâneos para isso seria melhor, mas isso está mais fora do escopo do que esta resposta está ficando).
Execute um kvm usando a interface de toque e seu arquivo de imagem e teste a conectividade de rede usb.
Comparação
Se a rota connmark / policy funcionar, é muito mais fácil manter o repositório tftp em sincronia. Com o KVM, talvez seja necessário ter um repositório por imagem de VM (a menos que você passe um diretório somente leitura para cada VM, o que é factível). O Connmark / policy route é um pouco mais meticuloso, mas também requer apenas um servidor tftp, embora se suas portas não forem aleatórias o suficiente, o conntrack pode ficar confuso e sobrescrever se houver uma sobreposição de porta (ou talvez não). Por outro lado, colmatar a kvms requer muito mais memória; uma VM inteira por dispositivo USB conectado, mas é muito mais provável que funcione sempre porque a VM tem uma pilha de rede isolada inteira para trabalhar enquanto o kernel do host precisa passar pacotes de uma ponte para outra, especialmente se a filtragem de ponte está desligado.
Espero que um desses dois funcione para você.