最近、私はtun
私の方法でインターネットトラフィックをリダイレクトするインターフェイスを使用しています。このために私は従うこれマップ時間。
10.0.0.15
私の考えは、インターフェイスを介して着信IPパケットを受信し、tun0
それをリダイレクトしてパケットをcustomSend()
別のコンピュータに送信するプログラムを持つことです(他のプロトコルを使用しますが、関係ありません)。他のコンピュータはパケットに応答してパケットを取得し、インターフェイスにcustomRecv()
送信します。tun0
私のコード例は次のとおりです。
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
}
理解を深めるために例を示します。
- ワークステーション 1(
10.0.0.14
) ping ワークステーション 2(10.0.0.15
) - pingアプリケーションはICMPパケットを生成することによって
tun0
。 read
メソッドはcustomSend()
ICMPパケットを傍受します。customSend()
別のプロトコルメソッドに送信してスレッドしますotherProtocolSendfd
。- 他のプロトコルがネットワークを介してメッセージを送信し、ping パケットが Workstation2 に到着します。
- Workstation2は卓球メッセージで応答します。
- 別のプロトコルはネットワークメッセージを受信し、次のように書き込みます。
otherProtocolRecvfd
read
メソッドはcustomRecv()
応答パケットを受信し、このwrite
メソッドはそれをtun0
インターフェイスに送信します。tun0
インターフェイスはpingアプリケーションに応答(ポン)パケットを提供します。
これでその部分を実装したので、customSend()
実際に動作し、メッセージを別のコンピュータに送信します。
私が気にする部分は書く部分です。メッセージはwrite
実際にtunfd
インターフェイスに送信されますか、それともメソッドからメッセージが受信されますか?customSend()
これが私が期待するものです。後者の場合、どのようにインターフェイスにメッセージを送信しますか?
また、これはより一般的な質問です。一方のスレッドが実行され、customToSend()
別のスレッドが実行されている場合は両方を使用するため、customRecv()
並行性の問題は発生しますかtunfd
?
ありがとうございます!