Eu tenho um robô executando o Linux com adaptadores com e sem fio. Quando eu inicializo, ele se conecta à rede sem fio. Quando atribuo um IP ao com fio (estaticamente ou com DHCP), parece que funciona. Como ifconfig
mostra , mostra um IP adequado e route
mostra rotas adequadas. No entanto, quando faço uma solicitação ARP do IP com fio, a resposta ARP contém o MAC sem fio.
??? Não há ponte rodando no robô, então por que não consigo o MAC com fio ???
Quando o fio é desconectado, o IP com fio responde ao ping ...
Por que o robô está respondendo pela interface sem fio a solicitações de IP no fio ???
EDIT: os adaptadores com e sem fio na mesma sub-rede IP. Eu faço uma solicitação ARP de um computador (tentado com computadores diferentes) na mesma sub-rede IP.
saída ifconfig relevante:
eth0 Link encap:Ethernet HWaddr 00:01:C0:04:BD:F7
inet addr:192.168.0.110 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ra0 Link encap:Ethernet HWaddr 24:3C:20:06:3E:6D
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:59 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:31023598 (29.5 MiB) TX bytes:85640627 (81.6 MiB)
saída relevante da rota:
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ra0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
É um linux muito reduzido, então não tenho ferramentas como artptables, iptables, sysctl, brctl, etc.
EDIT: diagrama conforme solicitado
EDIT: Estou despejando tráfego e olhando para a tabela ARP. Uma solicitação ARP de 192.168.0.110 retorna uma resposta ARP contendo 24: 3C: 20: 06: 3E: 6D. O MAC de origem do pacote de resposta ARP também é 24: 3C: 20: 06: 3E: 6D. Eu tentei mexer com _filter, _ignore e _announce, como mencionado aqui , mas sem sucesso.
EDIT: configurar um gateway (em qualquer interface) não faz diferença (como não deveria).
EDIT: funcionou bem em uma versão anterior do sistema operacional (baseada em openembedded). é possível que eles mudaram alguma coisa?
Respostas:
O que você está vendo é um comportamento normal quando você tem duas interfaces na mesma rede. É descrito neste artigo do LWN .
fonte
Quando você diz que obtém uma resposta ARP para a interface incorreta, está realmente despejando tráfego ou apenas olhando para a tabela ARP resultante? É possível que você esteja recebendo respostas ARP para ambas as interfaces ...
Enfim, acredito que a resposta para o seu problema está em manipular adequadamente
rp_filter
earp_filter
. A documentação para cada um deles está incluída abaixo.Sugiro primeiro tentar isso:
Você pode precisar fazer essa alteração, bem como:
Para um tratamento mais completo, consulte este artigo:
http://www.embedded-bits.co.uk/tag/rp_filter/
fonte
Sei que esse é um problema antigo, mas recentemente encontrei exatamente a mesma situação com um dispositivo incorporado. O dispositivo possui uma interface Ethernet e Wi-Fi e os requisitos são que ambas as interfaces possam estar ativas e na mesma rede a qualquer momento, mas o tráfego de rede deve ser roteado através da interface "preferida".
A maioria dos usuários não configuraria os dispositivos dessa maneira, mas, em teoria, deveria ser possível.
Primeiro, resolvemos os problemas com os roteadores Netgear porque eles relatariam um conflito de endereço IP - 2 endereços MAC estavam compartilhando um único IP. Aparentemente, o roteador começaria a se comportar mal nesse cenário e atrapalharia a rede de usuários.
Criei uma rede privada que continha apenas o roteador (ethernet + wifi), o laptop Windows (apenas Ethernet) e o dispositivo incorporado (ethernet + wifi). Usando o wireshark, o tcpdump no dispositivo e o arp no windows, vejo o seguinte comportamento:
Acredito que o item 3 é causado pelo item 5. As tabelas arp estão sendo alteradas porque o wln está respondendo a mensagens arp às quais apenas eth0 deve responder. Acredito que o item 4 também seja causado pelo item 5. O ping é enviado com base no endereço MAC e, como a última mensagem arp recebida foi do wln dizendo que ele possui o IP eth0, os pings são roteados incorretamente para a interface wln.
Depois de muita pesquisa e teste, a solução era realmente muito simples. Veja este artigo - http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html
Os drivers de rede do kernel Linux são configurados de maneira que, quando uma solicitação arp é recebida para uma interface conhecida (mesmo que recebida em outra interface), ela responde ao arp.
Essa configuração resolve o problema:
echo 1 > /proc/sys/net/ipv4/conf/wln/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
Explicação:
fonte
Como isso funcionou bem em uma versão anterior do sistema operacional (baseada em openembedded), minha solução foi aguardar a próxima versão do sistema operacional. Meu melhor palpite foi que o módulo do kernel sem fio era de buggy.
fonte
Seguindo o comentário da Insyte.
Vamos fazer alguns nomes:
Para você ter seu robô acessível a partir dos 3 PCs, por meio de mídia com e sem fio. E, como eles estão na mesma sub-rede, você não pode dizer com certeza de que maneira a solicitação do arp para sua mídia com fio passou. Por que o que eu quero dizer é quando as transmissões de comutação para um pedido ARP, o robô recebe em ambas as interfaces [referindo-se ao seu diagrama] assim para ele recebe a solicitação ARP para o IP na mídia com fio nos meios sem fio também chances são ele respondeu com o endereço físico da mídia sem fio da caixa que possui esse IP configurado
Eu tive esse problema no passado, não era exato para o seu, mas era semelhante. Por padrão, o linux responde com o endereço físico da interface, recebe a solicitação arp, independentemente da interface em que o IP está configurado. Portanto, no seu caso, conecte o PC3 à interface eth0 do robô diretamente e faça uma solicitação arp para 192.168.0.101. Ele responderá com o endereço físico da interface eth0 em vez de ra0.
Meu cenário de implantação foi:
[RTR] | ------------ eth0 --- [servidor]
| -------- | switch1 | ----- eth1 ----- [servidor]
É o mesmo switch, ao qual ambas as interfaces se conectam. Espero que isso ajude você.
O roteador tinha o endereço IP primário e secundário configurado em sua interface para duas redes diferentes nas duas interfaces diferentes no servidor. Mas, ao receber uma solicitação arp no eth1 para o endereço IP de eth0, ele respondeu com o endereço físico de eth1
Para impedi-lo, o seguinte até agora funcionou para mim
coloque-o em algum lugar do seu robô para que você possa aplicá-lo na inicialização.
Recomendações: eu recomendaria que você configurasse duas sub-redes diferentes (por exemplo, 192.168.1.x / 24 no ra0 e 192.168.2.x / 24 no eth0), você pode usar aliases de IP em seus PCs e seu robô estará acessível em qualquer dos dois IPs. Você não pode ter dois caminhos de saída para a mesma sub-rede em um mesmo host. A menos que exista algo que faça seu robô preferir um ao outro. Seu robô pode seguir apenas um caminho para enviar pacotes dele.
Algumas leituras: arp_announce , arp_ignore
fonte
Eu acho que há uma configuração incorreta entre o seu AP sem fio e o seu switch. switch e AP estão ficando confusos para onde enviar pacotes. não tenho certeza sobre isso embora. Além disso, acho que você deve tentar definir um gateway no qual os programas possam saber para onde enviar pacotes. algo como
route add default gw 192.168.0.1
fonte