Preciso conectar os dois dispositivos robóticos ao meu computador e, para isso, gostaria de usar as duas placas de rede conectadas a essas diferentes peças de hardware. Ambos os dispositivos usaram a mesma rede (endereços IP 10.0.0.70 e 10.0.0.21, máscara de rede 255.255.255.0 em ambos os casos).
Descobri que se eu configurar e colocar a rede de qualquer placa única, não funciona sem problemas: posso pingar o dispositivo robótico e tenho todas as outras conectividades com ele. No entanto, assim que coloco o segundo cartão, apenas um dos dois está funcionando. Tentei dar ao computador principal endereços IP diferentes, tentei dar o mesmo, não faz diferença. Tentei especificar o endereço IP do computador host como gateway, diferente para cada placa, o mesmo, sem diferença alguma. Mesmo o ping não funciona em um dos cartões quando ambos estão ativos, e mesmo se eu especificar ao pingar qual interface usar.
Meu kernel é 4.15.0-39-generic #42~16.04.1-Ubuntu SMP qua 24 de outubro 17:09:54 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux.
Ambas as placas de rede podem funcionar juntas se eu as atribuir a redes diferentes. No entanto, seria preferível não alterar as configurações de rede na lateral dos dispositivos robóticos. Não preciso rotear pacotes entre essas duas placas.
Aqui está a configuração de trabalho que recebi:
enp3s0 Link encap:Ethernet HWaddr 18:d6:c7:00:d9:3e
inet addr:10.0.1.30 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16929681 errors:0 dropped:0 overruns:0 frame:0
TX packets:56504 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1219898415 (1.2 GB) TX bytes:5267812 (5.2 MB)
enp6s0 Link encap:Ethernet HWaddr 18:d6:c7:01:69:35
inet addr:10.0.0.22 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::1ad6:c7ff:fe01:6935/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:52316 errors:0 dropped:0 overruns:0 frame:0
TX packets:16935487 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4325056 (4.3 MB) TX bytes:1220948325 (1.2 GB)
Ele para de funcionar assim que eu mudo o IP do primeiro dispositivo para 10.0.0.30 (e o endereço de broadcast muda para 10.0.0.255).
Acabei de tentar na distribuição ao vivo do Kali Linux, mesmo lá não funciona. Sob Kali Linux
ifconfig eth0 10.0.0.21 netmask 255.255.255.0 up
ifconfig eth1 10.0.0.70 netmask 255.255.255.0 up
Novamente, eu esperaria que pelo menos ping -eu deveria funcionar, mas não, para pingar qualquer um, outro deve estar inativo. Como um switch simples pode ter várias portas físicas conectadas à mesma rede e um computador grande não?
Por padrão, o driver de protocolo IP do Linux usa uma otimização que tem o nome técnico de "modelo de sistema final fraco" ou "modelo de host fraco". Veja esta pergunta para mais detalhes.
O que se resume é que, quando você configura duas NICs com combinações de IP/máscara de rede que pertencem ao mesmo bloco de espaço de endereço IP, o código responsável pelo roteamento de endereços IP de saída assumirá que significa que ambas as NICs estão conectadas ao mesmo segmento de rede física e, portanto, qualquer um deles pode ser usado para conversar com qualquer host que tenha endereço IP nesse bloco. E então ele apenas usa a interface que está listada primeiro na tabela de roteamento para todo o tráfego de saída para esse segmento de rede. Ele não tem o conceito de várias redes físicas distintas usando cópias do mesmo espaço de endereço IP.
Se o seu sistema tiver o filtro de caminho reverso (
/proc/sys/net/ipv4/conf/*/rp_filter
) ativado, ele poderá impedir que você execute ping em um dos robôs mesmo se você especificar a interface de rede (digamoseth1
): quando a resposta chegar por meio deeth1
, o filtro de caminho reverso verá que o normal o roteamento para esse IP de origem passariaeth0
e, portanto, esse pacote de entradaeth1
deve ser falso. Você pode ver se isso está acontecendo se habilitar a configuração log_martians :Em seguida, tente executar ping em seus robôs e verifique o final da
dmesg
saída: você poderá ver mensagens sobre pacotes descartados.Sua situação exigiria que o roteamento levasse em consideração o endereço IP de origem ao decidir qual NIC usar para pacotes de saída e, portanto, se comportasse de acordo com o que é chamado de "modelo de sistema final forte" ou "modelo de host forte". Bem, o Linux pode fazer isso usando a funcionalidade de "roteamento avançado", mas definitivamente não é o padrão e é bastante complicado de configurar. Veja minha resposta na pergunta acima mencionada para uma receita de configuração, se você realmente quiser fazê-lo.
No entanto, como os endereços IP dos robôs não se sobrepõem, a solução mais simples em termos de configuração de software seria obter um pequeno switch de rede barato (ou mesmo um hub) e conectar os dois robôs e um cabo de rede do computador nele.
Ou se você deseja simplicidade em termos de quantidade mínima de hardware, basta configurar os robôs para usar diferentes segmentos de IP se quiser conectá-los diretamente a várias NICs no mesmo computador.
Como os dispositivos do robô possuem um IP diferente, a maneira mais simples seria criar uma ponte Linux com as duas interfaces ethernet como portas. Algo na linha de
Em seguida, defina um único endereço IP na
br0
interface voltada internamente:e você deve estar pronto para ir, sem um interruptor pendurado na cauda da caixa, mas tudo ainda na mesma rede.
E por favor, por favor , não use o Kali Linux para essas coisas. Leia isto e faça um favor a si mesmo e mude para alguma distro (baseada em Debian, já que Kali também é baseada em Debian) destinada ao trabalho diário. Você terá muito menos problemas. E todas as ferramentas brilhantes que Kali tem também podem ser instaladas.
Para 21 e 70, você pode usar duas sub-redes não sobrepostas 10.0.0.0/26 e 10.0.0.64/26 (/26 = máscara 255.255.255.192). Supondo que nenhuma outra interface inclua 10.0.0.0/25.