Tun/Tap インターフェイスへの書き込み

Tun/Tap インターフェイスへの書き込み

最近、私は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. ワークステーション 1( 10.0.0.14) ping ワークステーション 2( 10.0.0.15)
  2. pingアプリケーションはICMPパケットを生成することによってtun0
  3. readメソッドはcustomSend()ICMPパケットを傍受します。
  4. customSend()別のプロトコルメソッドに送信してスレッドしますotherProtocolSendfd
  5. 他のプロトコルがネットワークを介してメッセージを送信し、ping パケットが Workstation2 に到着します。
  6. Workstation2は卓球メッセージで応答します。
  7. 別のプロトコルはネットワークメッセージを受信し、次のように書き込みます。otherProtocolRecvfd
  8. readメソッドはcustomRecv()応答パケットを受信し、このwriteメソッドはそれをtun0インターフェイスに送信します。
  9. tun0インターフェイスはpingアプリケーションに応答(ポン)パケットを提供します。

これでその部分を実装したので、customSend()実際に動作し、メッセージを別のコンピュータに送信します。

私が気にする部分は書く部分です。メッセージはwrite実際にtunfdインターフェイスに送信されますか、それともメソッドからメッセージが受信されますか?customSend()これが私が期待するものです。後者の場合、どのようにインターフェイスにメッセージを送信しますか?

また、これはより一般的な質問です。一方のスレッドが実行され、customToSend()別のスレッドが実行されている場合は両方を使用するため、customRecv()並行性の問題は発生しますかtunfd

ありがとうございます!

ベストアンサー1

おすすめ記事