私は Python を使用して、TAP インターフェイスにパケットを送信しようとしています。Wireshark を使用して TAP インターフェイスを監視していますが、パケットは受信されていません。これは主に、VPN、イーサネット ブリッジング、および Python でのソケット プログラミングの理解を深めるための練習として行っています。
私のシステム設定は次のとおりです。
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
まず、タップを次のように設定します。
sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up
これにより、tap0 インターフェイスが起動し、tap0 経由で 10.0.0.1/24 へのカーネル ルーティング ルールが作成されます。
ルートテーブルは次のとおりです。
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.255.255.0 U 0 0 0 tap0
192.168.1.6 * 255.255.255.0 U 1 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
次に、Python Interactive を起動し、単純な UDP ソケットを作成します。
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))
私は、tap0 で Wireshark モニタリングを使用して sendto コマンドを実行します。現在、ネットワーク上の 10.0.0.2 にホストはありませんが、少なくとも tap0 インターフェイスで送信トラフィックがいくつか表示されるはずです。これを Windows でも再現しましたが、問題なく動作するようです。
問題は Linux の tap0 インターフェイスの設定のどこかにあるとしか考えられません。あるいは、このことに関する私の理解が不十分なのかもしれません。
ありがとう
答え1
は、OpenVPN でのブリッジ トンネリングを目的としています。 などを使用してtap
、これをブリッジに接続する必要があります。 br0
brctl
この考え方は、たとえばtap0
と をブリッジに配置できるというものです。すると、ブロードキャスト トラフィックがこのブリッジを通過します。( から入ってくるブロードキャスト トラフィックは に転送され、その逆も行われますが、ルーティングされた標準的な状況では転送されません。) 経由の OpenVPN トンネルはに「ルーティング」されるのではなく、 に「切り替え」られます。 全体がIP を取得し、またはの代わりに を処理します。 eth0
br0
tap0
eth0
tap0
eth0
br0
br0
eth0
tap0
インターフェースを 1 つだけ持つブリッジを作成し、brctl
必要に応じてインターフェースを追加/削除することも可能です。
したがって、tap0
ブリッジに入れてブリッジ インターフェイスを処理するか、tun
インターフェイスを使用します。
iptables
ルールが干渉している 可能性もあります。
更新 - こちらをご覧ください:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 特にこの抜粋:
タップ インターフェイスと tun インターフェイスの違いは、タップ インターフェイスは完全なイーサネット フレームを出力 (および提供) するのに対し、tun インターフェイスは生の IP パケットを出力 (および提供) する (カーネルによってイーサネット ヘッダーが追加されない) ことです。インターフェイスが tun インターフェイスのように機能するか、タップ インターフェイスのように機能するかは、インターフェイスの作成時にフラグで指定します。
したがって、完全なイーサネット フレームを tap0 に送信しないと、上記の理由により期待どおりに動作しないようです。