por que o sistema não faz o ARP solicitar broadcast antes de enviar um pacote IP?

2

Primeiro, deixe-me descrever o problema brevemente. Eu tenho dois programas que enviam pacotes IP de um host (192.168.0.101) para outro host (192.168.0.106). Esses dois programas são escritos respectivamente com C e C ++, mas possuem as mesmas funcionalidades.

Se eu executar o programa em C, quando um soquete bruto for enviar pacotes IP (o programa faz o pacote IP sem cabeçalho MAC / Ethernet) com o IP de destino 192.168.0.106, dos pacotes capturados pelo tcpdump, host transmitir uma consulta ARP para o MAC de 192.168.0.106, e assim ele pode entregar com sucesso os pacotes para aquele host.

Se eu executar o programa C ++, ele não transmitirá o ARP para consultar o MAC de 192.168.0.106 e adicionará um cabeçalho MAC errado aos pacotes IP e, assim, o desenvolverá para o host errado (que também está se comunicando com o host 192.168.0.101 nos cenários dos programas C e C ++)

Estou realmente confuso com o fato de que a transmissão ARP acontece no primeiro cenário, mas não no segundo cenário, há alguma razão potencial para tal diferença? por que o sistema não faz a transmissão de solicitação ARP no segundo cenário, levando a uma entrega errada?

Longa história:

Eu tenho três laptops em uma WLAN, A e C usam wlan0, mas B está conectado ao roteador sem fio via cabo e usa eth0.

Eu escrevi um programa em C para fazer um experimento de seqüestro de TCP e, em seguida, modifiquei-o para o programa C ++.

  1. A estabelece uma conexão TCP com B
  2. C executa o programa e se disfarça como B, então envia pacotes com src_ip = IP (B) e dst_ip = IP (A)
  3. Eu uso o tcpdump para capturar pacotes em A, B e C
  4. Espera-se que o tcpdump em A possa capturar o spoofing de IP pacotes. Com o programa C original, este é o caso. Mas quando eu corro o Programa C ++, é estranho que o tcpdump em B capture os pacotes mas o tcpdump em A não pode.

Após algumas investigações, notei que é devido ao endereço MAC. Quando o programa C ++ é executado, o kernel / sistema adiciona o endereço MAC de B como MAC de destino aos pacotes de spoofing de IP (espera-se que o kernel adicione o endereço MAC de A porque o endereço IP de destino é de A). No entanto, escrevi pacotes no nível IP e usei um soquete bruto como abaixo no programa C e no programa C ++:

send_sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW));
...
sendto(send_sd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);

É estranho que quando eu corri estes dois programas, o kernel / sistema adicionou diferentes endereços MAC de destino. Quais são as possíveis causas?

    
por lily 19.11.2015 / 00:59

0 respostas