【问题标题】:Determine next hop MAC address in C#在 C# 中确定下一跳 MAC 地址
【发布时间】:2010-11-22 22:23:25
【问题描述】:

我正在编写一个使用SharpPcap 注入数据包的应用程序。

但是,由于我自己构建数据包并且只知道目标的 IP 地址,因此我必须确定下一跳的物理地址。我总是可以向远程IP address 发送ping,嗅探它,然后从嗅探的数据包中获取MAC address。不过,我希望在C# 中有一种不那么复杂的方法。

显然,获取下一跳的 IP 地址也会很有帮助,因为我可以使用 SendArp 来确定其 MAC 地址。

获取路由表就可以了。我如何使用代码获得它?

【问题讨论】:

    标签: c# networking mac-address


    【解决方案1】:

    物理地址由Address Resolution Protocol 解析 - 只需发送一个带有要解析的 IP 地址的 ARP Reuest

    如果目的地不在本地网络中,则必须将数据包发送到标准网关,并且必须对标准网关执行 ARP 请求。标准网关可以通过System.Net.NetworkInformation命名空间中的方法获得。

     NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses
    

    【讨论】:

    • 如果目标机器在我的局域网上,那就是真的。您如何确定到远程机器的路由中的第一个网关(及其 mac 地址)(在代码中,不使用 traceroute)
    • 获取本机默认网关即可。可以在 System.Net.NetworkInformation 命名空间中找到这方面的方法。
    • 如果有一组网络地址通过其他网关路由,而不是默认网关会发生什么?有没有办法访问路由表并查询它?
    【解决方案2】:

    执行此操作的完全骇人听闻的方法是运行命令“arp -a”并读取和解析命令的结果(使用 Windows 已经拥有的 ARP 缓存)。

    否则,您需要在协议栈中包含 ARP。这就是您的系统本身如何确定将帧发送到何处的方式。或者最后,如果您不担心效率低下,您可以将您的以太网目的地设置为:FF:FF:FF:FF:FF:FF 并让与您在同一个 LAN 上的所有人。当有响应或您收到数据包时,自行缓存它以获得正确的目标 MAC 地址。

    就个人而言,如果您在我的网络上进行了所有人的洪水攻击,我会伤害您,但根据您的情况,这可能是一个相当容易的黑客攻击。然而,做一个 100% 全栈实现是相当复杂的,因为有很多边缘情况应该得到很好的支持(例如处理代理 ARP、免费 ARP 等)。

    【讨论】:

    • 假设我调用“arp -a”。如何确定路由中下一个网关的 ip 地址 74.125.43.104 (google.com)?
    • 我看到您为自己找到了一个可行的解决方案,但您还需要查看您绑定到哪个接口的路由表,并确定您的默认网关是什么。
    • 我认为默认网关会自动添加为目标为 0.0.0.0 和掩码为 0.0.0.0 的路由条目,所以我应该在扫描路由表时检查它们
    【解决方案3】:

    我在使用 WMI 时遇到了一些问题(似乎无法将 Win32_IP4RouteTable 中的接口索引与实际设备关联起来;MSDN 文档有误,并且其他更骇人听闻的技术在某些计算机上失败了)。

    所以,我选择使用非托管GetBestRoute,这实际上为我节省了很多时间,因为它让 Windows 自己做路由决策,并返回下一跳的 IP 地址和指向该地址的 NIC 标识符.它也比对 WMI 运行查询快得多。

    然后您可以通过在GetAdaptersInfo 返回的列表中查找该标识符来找到 NIC 本身。

    希望对你有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多