7

次のtun\tapサンプルプログラムを見つけましたが、動作させることができません。

http://www.secdev.org/projects/tuntap_udp/files/tunproxy.py

次の行を変更しました。

f = os.open("/dev/tun0", os.O_RDWR)
ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE))
ifname = ifs[:16].strip("\x00")

最初の行は、ドライバーの実際の場所を反映するように変更されました。もともとは

f = os.open("/dev/net/tun", os.O_RDWR)

実行すると、次のエラーが発生します。

 sudo ./tuntap.py -s 9000
 Password:
 Traceback (most recent call last):
   File "./tuntap.py", line 65, in <module>
     ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE))
 IOError: [Errno 25] Inappropriate ioctl for device

http://tuntaposx.sourceforge.net/download.xhtmlからインストールされた最新のtun\tapドライバーを使用しています

4

2 に答える 2

8

OSX tun/tap ドライバーの動作は少し異なるようです。Linux の例では、少なくとも同じ方法ではなく、OSX では機能しない tun インターフェイスを動的に割り当てます。

コードを取り除いて、各パケットをコンソールに出力し、自己選択した tun デバイスを使用して OSX で tun を使用する方法の基本的な例を作成しました。きれいな印刷の依存関係としてScapyを追加しましたが、必要に応じて生のパケット ダンプに置き換えることができます。

import os, sys
from select import select
from scapy.all import IP

f = os.open("/dev/tun12", os.O_RDWR)
try:
    while 1:
        r = select([f],[],[])[0][0]
        if r == f:
            packet = os.read(f, 4000)
            # print len(packet), packet
            ip = IP(packet)
            ip.show()
except KeyboardInterrupt:
    print "Stopped by user."

これをルートとして実行するかsudo chown your_username /dev/tun12、デバイスを開くことができるようにする必要があります。

ポイントツーポイント インターフェイスとして構成するには、次のように入力します。

$ sudo ifconfig tun12 10.12.0.2 10.12.0.1

このインターフェイスは、 が開いている間、つまりプログラムの実行中tun12にのみ使用できることに注意してください。/dev/tun12プログラムを中断すると、tun インターフェースが消えてしまうので、次にプログラムを実行するときにもう一度設定する必要があります。

エンドポイントに ping を実行すると、パケットがコンソールに出力されます。

$ ping 10.12.0.1

ping 要求に応答するトンネル エンドポイントがないため、ping 自体が要求のタイムアウトを出力します。

于 2013-02-28T15:46:15.927 に答える