我正在开发一个嵌入式系统,它必须通过 10Base-T 以太网与外界通信。我已经构建了服务网页所需的所有功能,包括 ARP、IP、TCP、ICMP (ping)、HTTP 和部分 FTP。现在,我需要构建其余代码,这将允许我充当客户端。几个月来,从服务器的角度来看,所有上述协议都运行良好。
现在,我需要构建这些协议的客户端一半,以从其他服务器请求数据。第 1 步是通过 ARP 获取远程服务器的硬件地址。据我了解,由于服务器位于另一个网络上,因此我的网关应该使用其 MAC 地址进行响应,以便我知道将发往该 IP 的所有数据包传递到我的网关。问题来了:
我的设备(192.168.1.251,子网掩码 255.255.255.0)没有从我的网关(192.168.1.1)或网络外的任何机器获得 ARP 响应。但是,我的设备 (X.251) 确实从同一路由器下的笔记本电脑 (192.168.1.100) 收到了 ARP 响应。
我确定我的基本 ARP 以太网帧结构是正确的,因为我每次都正确回复 ARP 请求。不同之处在于 OPERATION 字段,它是 1 或 2,具体取决于 REQUEST 或 REPLY。
这是我的设备(192.168.1.251)对网关(192.168.1.1)的请求,没有得到响应:
FF FF FF FF FF <-- destination MAC - broadcast (also tried 0x00)
00 04 A3 7F C1 57 <-- source MAC - my device
08 06 <-- ARP
00 01 <-- ethernet
08 00 <-- IP
06 <-- 6 byte MAC addresses
04 <-- 4 byte IP addresses
00 01 <-- request (2 = reply)
00 04 A3 7F C1 57 <-- sender MAC - mine
C0 A8 01 FB <-- sender IP - mine = 192.168.1.251
00 00 00 00 00 00 <-- target MAC - unknown, reason for request
C0 A8 01 01 <-- target IP - gateway = 192.168.1.1
00 00 00 00 ..... 00 00 00 <-- trailer of 18 sets of 00 for padding
现在,我的设备 (192.168.1.251) 与我的笔记本电脑 (192.168.1.100) 几乎相同的请求得到了有效响应:
FF FF FF FF FF <-- destination MAC - broadcast (also tried 0x00)
00 04 A3 7F C1 57 <-- source MAC - my device
08 06 <-- ARP
00 01 <-- ethernet
08 00 <-- IP
06 <-- 6 byte MAC addresses
04 <-- 4 byte IP addresses
00 01 <-- request (2 = reply)
00 04 A3 7F C1 57 <-- sender MAC - mine
C0 A8 01 FB <-- sender IP - mine = 192.168.1.251
00 00 00 00 00 00 <-- target MAC - unknown, reason for request
C0 A8 01 64 <-- target IP - laptop = 192.168.1.100
00 00 00 00 ..... 00 00 00 <-- trailer of 18 sets of 00 for padding
可能重要也可能不重要的旁注:
如果我猜对了,你将你的 ARP 请求发布到你的笔记本上,而笔记本不允许回答该 ARP 请求。通常每个设备都只为自己负责。尝试为您的路由器输入目标 ip 192.168.1.1。那应该有用。
顺便说一句,您无法获取子网之外的任何设备的 MAC 地址。每个包都需要将目标 ip 地址发送到网关 mac 地址。
我会尝试通过以下方式解决此问题:
使用 scapy 之类的工具,从您的笔记本电脑创建一个 ARP 请求,请求网关的 MAC,并将其发送到广播 MAC。看看是否回复了请求
然后,使用 scapy 在笔记本电脑上创建 ARP 请求,但将源 MAC 设置为设备的 MAC 地址,并向广播 MAC 发送网关 MAC 的请求。这实质上是在模拟您的设备在笔记本电脑上的发送。如果您可以暂时将笔记本电脑的 mac 更改为设备的 MAC,您应该会在笔记本电脑上收到回复。
如果上述步骤工作正常,那么您将在笔记本电脑上模拟了设备的确切行为,并且实际设备也将正常工作。