
私は、PC の物理インターフェイス用の tun デバイス インターフェイスを作成する C プログラムを作成しようとしています。このプログラムを作成する際の全体的な考え方は、トンネル デバイスに生のパケットを書き込むと、それが実際の物理インターフェイスに配置されるというものです。私の質問は、tun デバイスを実際の物理インターフェイスにマップするにはどうすればよいかということです。
たとえば、私の eth1 の IP アドレスは 10.16.1.152 です。eth1 インターフェイスで読み取り/書き込みができるように、tun デバイスを作成するにはどうすればよいでしょうか。同じ IP アドレスを指定する必要があるのでしょうか、それとも別の IP アドレスを指定する必要がありますか。ルートは、tun デバイスにパケットを書き込み、tun デバイスのデフォルト ゲートウェイを phy デバイスとして持つルートを作成する唯一の方法です。
私はフォローしていますこの例ですが、その概念についてはまだよく分かりません。
次のコマンドでトンネル デバイスを作成しました。私の PC には実際のイーサネット インターフェイスが 1 つあります。このイーサネット インターフェイスの IP アドレスは 10.16.1.152 で、多数の PC に接続され、その後ゲートウェイ サーバーに接続されてインターネットにアクセスします。
OSPF hello パケットをインターフェースに書き込む C プログラムを作成しようとしています。
そのために、OSPF hello パケットを書き込めるトンネル デバイスを作成しています。ただし、その前に、トンネル デバイスを確認しています。ここで、私のトンネル デバイスは 11.11.11.2/24 で、ルートを 10.16.1.152 に設定しています。実際のインターフェイス (つまり、10.16.1.152) で受信または送信されるすべてのパケットは、IP アドレスが 11.11.11.2 であるこのトンネル デバイス インターフェイスによって受信されると理解しています。ただし、10.16.1.152 に ping を実行すると、受信された RX/Tx パケットは依然としてゼロです。したがって、トンネルはパケットを受信していないと思います。
ip tuntap add mode tun dev tun0
ip addr add 11.11.11.2/24 dev tun0
ip link set dev tun0 up
ip route get 10.16.1.152
ここで何か概念が抜けているでしょうか? どうすれば抜けているでしょうか? トンネル デバイスの概念を明確にするのにまだ苦労しています。
答え1
tun
インターフェースを使用して「既存のインターフェースに実際のパケットを配置する」ことはできません。tun
インターフェースは常に新しいネットワーク インターフェースであり、既存のすべてのインターフェースとは異なります。
しかし、パケットソケット既存のネットワークインターフェースに生のパケットを書き込む(またはそこから生のパケットを読み取る)ことができます。man 7 packet
詳細については、を参照してください。ただし、これによりすべてのプロトコル層をバイパスするため、正しいプロトコルの動作を自分で実装する必要があります。本当に自分が何をしているのか分かっているなら、そんなことはしないでください。
あなたは実際に何を達成したいのかを述べていませんし、概念について少し混乱しているようですので、これはXY問題tun
インターフェースもパケット ソケットも実際には必要ではない可能性も十分にあります。