18

如果我生成一个没有任何上层有效负载的以太网帧并使用 sendp() 在第二层发送它,那么我会收到"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.
>>> 
4

1 回答 1

19

大多数遇到此问题的人都错误地使用send()(or sr(), sr1(), srloop())而不是sendp()(or srp(), srp1(), srploop())。作为记录,“with- p”函数send()用于发送第 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]
于 2014-02-22T11:38:47.333 回答