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インタラクティブを開始し、単純な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インターフェースのセットアップのどこかにあるとしか思えません。それか、このことについての私の平凡な理解。
ありがとう
tap
は、OpenVPNでのブリッジトンネリング用です。brctl
を使用してbr0
などのブリッジにジャンクションすることになっています。
たとえば、tap0
とeth0
をブリッジbr0
に配置して、ブロードキャストトラフィックがこのブリッジを通過できるようにするという考え方です。 (tap0
から着信するブロードキャストトラフィックはeth0
に転送され、その逆も同様ですが、ルーティングされた標準的な状況では転送されません。)次に、tap0
経由のOpenVPNトンネルはに「切り替え」られます。 eth0
に「ルーティング」する代わりに。 br0
全体がIPを取得し、br0
またはeth0
の代わりにtap0
を処理します。
インターフェースが1つしかないブリッジを作成し、必要に応じてbrctl
を使用してインターフェースを追加/削除することは完全に可能です。
したがって、tap0
をブリッジに入れて、代わりにブリッジインターフェイスを処理するか、tun
インターフェイスを使用します。
iptables
ルールが干渉している可能性もあります。
更新-ここを見てください: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ -特にこの抜粋:
タップインターフェイスとtunインターフェイスの違いは、tapインターフェイスは完全なイーサネットフレームを出力する(そして指定する必要がある)のに対し、tunインターフェイスは生のIPパケットを出力する(指定する必要がある)ことです(カーネルによってイーサネットヘッダーは追加されません)。 )。インターフェイスがtunインターフェイスのように機能するか、tapインターフェイスのように機能するかは、インターフェイスの作成時にフラグで指定されます。
したがって、完全なイーサネットフレームをtap0に送信しないと、上記の理由で期待どおりに機能しないように見えます。