Envie tráfego para a rede física através do Ubuntu

5

Eu tenho uma porta ethernet de duas portas e digamos que eu conectei ambas as portas em um loop e atribui os seguintes IPs às duas interfaces ethernet:

  • eth2 - > 192.168.2.1
  • eth3 - > 192.168.3.1

Eu quero enviar tráfego de uma das portas para a outra pela rede física, por exemplo, ping 192.168.3.1 de 192.168.2.1 . No entanto, a pilha TCP / IP no kernel do Linux reconhece que esses dois endereços são locais e, em vez disso, envia o tráfego para o adaptador de loopback, portanto, o tráfego nunca atinge a rede física.

O mais próximo que eu tenho de uma solução é o send-to-self patch de Anastasov, que infelizmente tem sido descontinuado desde o kernel 3.6, então não funcionará no Ubuntu 13.10 (kernel 3.11) para mim. Eu tentei reescrever o patch para o 3.11, mas não consigo localizá-los na distribuição do Ubuntu:

  • include / linux / inetdevice.h
  • net / ipv4 / devinet.c
  • net / ipv4 / fib_frontend.c
  • net / ipv4 / route.c
  • Documentação / rede / ip-sysctl.txt

Existe uma maneira de eu conseguir que o remetente enviar para auto funcione ou uma solução alternativa?

    
por elleciel 29.03.2014 / 00:56

2 respostas

2

Ainda não tentei isso, mas acho que há várias possibilidades de soluções alternativas:

máquinas virtuais

Resolva o problema da pilha IP separando pelo menos uma das NICs da pilha IP do host: atribua-a a uma máquina virtual. Para testes de desempenho, isso pode não ser desejável, no entanto. Mas se houver potência de CPU suficiente, talvez a camada de software adicional não se torne um gargalo (mas como você sabe?).

endereços de destino diferentes

Você quer que o pacote seja transferido na camada 2 apenas para um teste de desempenho da NIC, eu acho. Assim, você pode usar pacotes IP com um endereço IP diferente (um não-local para que os pacotes sejam enviados pelo cabo em qualquer caso). E então você trapaceia: Você usa ip neigh para criar uma entrada ARP permanente que mapeia esse endereço IP falso para o outro endereço MAC das NICs.

Você pode até fazer conexões IP dessa maneira. Mas você teria que usar iptables com SNAT e DNAT para que ambos os NICs acreditem que estão falando com um dos dois IPs falsos necessários.

acesso bruto

Se você estiver disposto a fazer alguma programação não-trivial, então você pode abrir sockets raw e criar os frames Ethernet você mesmo. Esta provavelmente seria a solução mais rápida.

    
por 29.03.2014 / 01:41
1

Crie um namespace de rede e mova uma das interfaces para ele:

ip netns add test
ip link set eth1 netns test

Inicie um shell no novo namespace:

ip netns exec test bash

Em seguida, proceda como se você tivesse duas máquinas. Quando terminar, saia do shell e exclua o namespace:

ip netns del test
    
por 17.04.2015 / 20:09