上位層のペイロードなしでイーサネットフレームを生成し、sendp()を使用してレイヤー2で送信すると、"Mac address to reach destination not found. Using broadcast."
警告が表示され、フレームに接続されたフレームは実際にff:ff:ff:ff:ff:ffを使用します。宛先MACアドレスとして。なぜそうなのですか? Scapyは私が作成したフレームを正確に送信するべきではありませんか?
私の細工したパッケージは以下のとおりです。
>>> ls(x)
dst : DestMACField = '01:00:0c:cc:cc:cc' (None)
src : SourceMACField = '00:11:22:33:44:55' (None)
type : XShortEnumField = 0 (0)
>>> sendp(x, iface="eth0")
WARNING: Mac address to reach destination not found. Using broadcast.
.
Sent 1 packets.
>>>
この問題が発生したほとんどの人は、send()
(またはsr()
、sr1()
を誤って使用しています、srloop()
)sendp()
(またはsrp()
、srp1()
、 srploop()
)。ちなみに、send()
のような "without -p
"関数は、レイヤー3パケット(send(IP())
)を送信するためのものであり、 "with -p
"バリアントはレイヤー2パケットを送信するためのものです(sendp(Ether() / IP())
)。
以下のようにx
を定義し、sendp()
(send()
ではなく)を使用してもこの問題が発生する場合は、おそらく最新バージョンを試してみてください。プロジェクトのgitリポジトリ( https://github.com/secdev/scapy を参照)。
私はもう試した:
>>> x = Ether(src='01:00:0c:cc:cc:cc', dst='00:11:22:33:44:55')
>>> ls(x)
dst : DestMACField = '00:11:22:33:44:55' (None)
src : SourceMACField = '01:00:0c:cc:cc:cc' (None)
type : XShortEnumField = 0 (0)
>>> sendp(x, iface='eth0')
.
Sent 1 packets.
同時に、tcpdumpを実行していました。
# tcpdump -eni eth0 ether Host 00:11:22:33:44:55
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:33:47.774570 01:00:0c:cc:cc:cc > 00:11:22:33:44:55, 802.3, length 14: [|llc]