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


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 rodar o programa em C, quando um socket 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, eu noto a transmissão do host 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, portanto, o desenvolverá para o host errado (que também está se comunicando com o host 192.168 .0.101 nos cenários do programa C e do programa 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 o ARP solicitar a transmissão no segundo cenário, levando a uma entrega errada?


Longa história:

Eu tenho três laptops em uma WLAN, A e C usa 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 sequestro de TCP e, em seguida, modifiquei 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 ele 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.

Depois de alguma investigação, 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, eu 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?


2


origem


(1) Eu confio que você está reiniciando entre experimentos (para limpar a informação em cache). (2) Qual OS (s) você está usando? (3) Você já tentou executar os programas em strace (ou ferramenta comparável)? - G-Man
como você está verificando o que está acontecendo com arp? o windows tem um comando arp -a. O Wireshark pode ser mais claro que o tcpdump. Dado que você diz que seu programa no caso c ++ tem o mac errado para o ip, verifique se a tabela arp tem o mac correto / errado para esse ip. se errado, vá para wireshark e termine as informações que o colocaram lá. A tabela arp não preenche sem arp req / response / broadcasts. - barlop


Respostas: