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!