Escrevendo para uma interface Tun / Tap

0

Recentemente, tenho usado uma interface tun para redirecionar o tráfego da Internet por meio de meus métodos. Para fazer isso, eu segui o este tutorial .

Minha idéia é ter um programa que receba os pacotes IP que vão para a interface 10.0.0.15 through tun0 e redirecione-os para customSend() , que envia o pacote para outro computador (usando outro protocolo, mas isso não é relevante). O outro computador responderia a esse pacote e customRecv() o receberia e enviaria a interface tun0 .

Aqui está uma amostra do meu código:

void customSend() {
    // whenever a packet is sent from my computer to 10.0.0.15 the
    // read method will be triggered.
    size = read(tunfd, buffer, sizeof(buffer));
    // send packet using another protocol
    write(otherProtocolSendfd, buffer, size);
}

void customRecv() {
    // whenever a packet is received from another protocol
    // this will be triggered
    size = read(otherProtocolRecvfd, buffer, sizeof(buffer));
    // redirect the packet to tun0
    write(tunfd, buffer, size);
}

void main() {
    // init the tun0 interface
    int tunfd = init_tun_interface();
    // create a thread running customSend and one running customRecv
}

Para facilitar o entendimento, mostrarei um exemplo.

  1. Workstation1 ( 10.0.0.14 ) pings Workstation2 ( 10.0.0.15 )
  2. O aplicativo ping
  3. cria um pacote ICMP e o envia por meio de tun0 .
  4. read method at customSend() intercepta o pacote ICMP.
  5. customSend() thread envia para o outro método de protocolo através de otherProtocolSendfd .
  6. O outro protocolo envia a mensagem pela rede e o pacote de ping chega à Workstation2.
  7. Workstation2 responde com uma mensagem pong.
  8. O outro protocolo recebe a mensagem de rede e a grava em otherProtocolRecvfd
  9. read mehod at customRecv() recebe o pacote de resposta e o método write envia para tun0 interface.
  10. tun0 interface fornece o pacote de resposta (pong) ao aplicativo ping.

Por enquanto, eu implementei a parte customSend() , que funciona e transmite a mensagem para o outro computador.

Minha preocupação é sobre a parte de escrita. Será que write a tunfd enviará a mensagem para a interface ou eu a receberei no método customSend() , que é o que eu esperaria. Se for o último, como posso enviar a mensagem para a interface?

Além disso, e esta é uma questão mais geral, terei problemas de simultaneidade se eu tiver um thread executando customToSend() e outro executando customRecv() , já que ambos estão usando tunfd .

Obrigado!

    
por deuseux12 09.05.2017 / 13:48

0 respostas