web-dev-qa-db-ja.com

Scapyを理解する「宛先に到達するためのMacアドレスが見つかりません。ブロードキャストを使用しています。」警告

上位層のペイロードなしでイーサネットフレームを生成し、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.
>>> 
16
Martin

この問題が発生したほとんどの人は、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]
15
Pierre