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.
10.0.0.14 ) pings Workstation2 ( 10.0.0.15 ) tun0 . read method at customSend() intercepta o pacote ICMP. customSend() thread envia para o outro método de protocolo através de otherProtocolSendfd . otherProtocolRecvfd
read mehod at customRecv() recebe o pacote de resposta e o método write envia para tun0 interface. 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!