簡単な例で私の問題を実証しようとします。
以下は、非常に単純な (シングル スレッドの) パケット スニファー (ICMP) です。
from scapy.all import *
m_iface = "wlan0"
m_dst = "192.168.0.1"
def print_summary(pkt):
print pkt.summary()
def plain_sniff():
sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = print_summary)
このスニファーは問題なく動作し、次の出力が得られます。
WARNING: No route found for IPv6 destination :: (no default route?)
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / Raw
...
次に、パケットをスニッフィングするための別のスレッドを作成し、キューを使用してスニファ スレッドとメイン スレッド間でキャプチャされたパケットを通信します。
from threading import Thread
from Queue import Queue, Empty
from scapy.all import *
m_iface = "wlan0"
m_finished = False
m_dst = "192.168.0.1"
def print_summary(pkt):
print pkt.summary()
def threaded_sniff_target(q):
global m_finished
sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = lambda x : q.put(x))
m_finished = True
def threaded_sniff():
q = Queue()
sniffer = Thread(target = threaded_sniff_target, args = (q,))
sniffer.daemon = True
sniffer.start()
while (not m_finished):
try:
pkt = q.get(timeout = 1)
print_summary(pkt)
except Empty:
pass
このスニファーも正常に動作し、上記と同じ出力が得られます。ただし、メイン スレッドを少しだけ変更して、send()
以下のようにパケット キューからの読み取りの間に関数を使用するようにします。
def threaded_sniff_with_send():
q = Queue()
sniffer = Thread(target = threaded_sniff_target, args = (q,))
sniffer.daemon = True
sniffer.start()
while (not m_finished):
send(IP(dst = m_dst) / ICMP()) # Here
try:
pkt = q.get(timeout = 1)
print_summary(pkt)
except Empty:
pass
次に、次の奇妙な出力が得られます (フィルターが機能していないようです)。
WARNING: No route found for IPv6 destination :: (no default route?)
Sent 1 packets.
Ether / ARP who has 192.168.0.1 says 192.168.0.9
Sent 1 packets.
Ether / ARP is at a0:21:b7:1a:7a:db says 192.168.0.1
Sent 1 packets.
Ether / IP / ICMP 192.168.0.9 > 192.168.0.1 echo-request 0
Sent 1 packets.
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0
...
3 つのスニファーのスクリプトは、ここからダウンロードできます。
私の現在のシステム構成は次のとおりです。
Python: 2.7.3
Scapy: 2.2.0
OS: Fedora 18
興味深いことに、3 つのスニファーはすべて私の古いコンピューターで問題なく動作します。
Python: 2.6.4
Scapy: 2.0.0.10 (beta)
OS: Fedora 13
最初は、Scapy / Python バージョンではないかと思いました。しかし、まったく同じバージョンを新しいコンピューターにインストールしても、動作は持続しました。
これがSOに適した質問であるかどうかは完全にはわかりません(Scapyへのバグレポートかもしれませんか?)。その際はご容赦ください。