【问题标题】:destination MAC to use when sending to remote host (is it my router)?发送到远程主机时使用的目标 MAC(是我的路由器)?
【发布时间】:2019-04-08 06:25:29
【问题描述】:

出于各种原因,我正在尝试使用原始套接字构建原始 TCP 数据包并将其发送到远程主机(例如 google.com)。我正在尝试使用 pcap,因此原始套接字代码可以在某些时候移植到 Windows。

看起来很简单... 1. 以太网头 2.ip头 3.tcp头 4. 细分(可选)

2,3,4 很简单。 #1 是问题,因为我不知道 google.com 的目标 MAC 地址应该使用什么。据我所知,ARP 对告诉我 MAC 毫无用处,因为我必须连接到谷歌的路由器才能使其工作。障碍。

所以这让我问这个问题:

当发送到不在 LAN 中的主机时,我应该使用我路由器的 MAC 作为以太网标头中的目标 MAC 地址吗?当数据包被转发时,它命中的每个路由器是否都会撕掉那个以太网报头并用适当的源/目标 MAC 替换它,以便它到达 Google.com?这是唯一听起来合理的事情。

旁注,我认为这是这里的动机,但问题从未完全提出: how to determinate destination MAC address

【问题讨论】:

    标签: mac-address raw-sockets


    【解决方案1】:

    没错。以太网标头中的源 MAC 地址应该是您发送的接口的 MAC 地址,而目标 MAC 地址应该是连接到 LAN 的路由器接口上的 MAC 地址。

    请务必记住,链路层地址用于网络内(在这种情况下,您的 MAC 地址和路由器的内部接口都在您的 LAN 上),而网络层 (IPv4/IPv6) 寻址用于路由您的从源主机到目标主机的数据包(这忽略了 NAT 和 IPv4 中出现的一大堆其他问题)。

    当您从接口发送以太网帧时会发生以下情况:

    1. 您的路由器将在经过 0 个或多个交换机后以帧结束,这些交换机知道您的路由器的内部 MAC 地址在哪里从过去接收流量。您的路由器知道该帧是给它的,因为它的内部 MAC 地址是目标 MAC。
    2. 您的路由器将剥离以太网标头。然后,它将检查目标 IP 地址,并根据该地址确定如何转发该数据包。如果我们谈论的是您的家庭路由器,它可能还会更改源 IP 地址(称为网络地址转换或 NAT),但由于它不在您的问题范围内,我将不理会它。
    3. 在将数据包转发到通往目标 IP 地址的路径上的下一个路由器之前,路由器需要在 IP 数据报上放回另一个 Link-Layer 标头,因为它剥离了您放在它上面的那个。因此,它将使用其传出接口的 MAC 地址作为源 MAC,并将下一个路由器的内部 MAC 地址的 MAC 地址作为目标,创建一个新的 Link-Layer 标头。这样,Link-Layer 报头被“逐跳”重写。

    【讨论】:

      【解决方案2】:

      甚至在我面临同样困惑的前几天。长话短说,是的,目标 MAC 地址将是网关路由器 MAC 地址。至于我是如何确定的——像这样——

      1. 我使用了命令

        route -n
        
      2. 然后我用了命令

        arp -n
        

      输出如你所见-

      goutbose@####:~$ route -n
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      0.0.0.0         10.39.51.1      0.0.0.0         UG    0      0        0 enp2s0f0 
      goutbose@###:~$ arp -n
      Address                  HWtype  HWaddress           Flags Mask            Iface
      10.39.51.130             ether   00:1a:c5:01:12:94   C                     enp2s0f0
      

      现在您可以在数据包中硬编码您的目标 MAC,就像我作为一个简单的 hack 所做的那样,或者如果您愿意,您可以设计自己的 ARP 解析,这超出了我的知识范围来帮助您。我使用原始套接字实现自己的 ICMP ping 请求的实现如下 -

      https://github.com/Goutam1511/Socket-Programming-with-C/blob/master/myping.c

      虽然回复晚了,但我希望它可以帮助其他人,因为在链接层中使用原始套接字相关的资源非常少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2011-10-22
        • 2017-01-03
        • 2020-01-07
        • 2011-03-03
        • 1970-01-01
        • 2016-09-21
        相关资源
        最近更新 更多