Mac address 发送到远程主机时要使用的目标MAC(是我的路由器吗)?

Mac address 发送到远程主机时要使用的目标MAC(是我的路由器吗)?,mac-address,raw-sockets,Mac Address,Raw Sockets,出于各种原因,我试图构造原始TCP数据包,并将其发送到具有原始套接字的远程主机(例如google.com)。我正在尝试使用pcap,因此原始套接字代码可以在某个时候移植到Windows 看起来很简单。。。 1.以太网报头 2.ip报头 3.tcp报头 4.段(可选) 2、3、4都很简单#1是难点,因为我不知道google.com的目标MAC地址应该使用什么。据我所知,ARP告诉我MAC是无用的,因为我必须连接到谷歌的路由器才能工作。障碍 所以我要问这个问题: 当发送到不在LAN中的主机时,是否应

出于各种原因,我试图构造原始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了?这是唯一听起来合理的事情

旁注,我认为这是这里的动机,但问题始终没有完全解决:
没错。ethernet报头中的源MAC地址应该是从中发送的接口的MAC地址,目标MAC地址应该是路由器在其连接到LAN的接口上的MAC地址

请务必记住,链路层地址在网络中使用(在本例中,您的MAC地址和路由器的内部接口都在LAN上),而网络层(IPv4/IPv6)地址用于将数据包从源主机路由到目标主机(这忽略了NAT和IPv4中出现的一大堆其他粗俗之处)

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

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

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

    请务必记住,链路层地址在网络中使用(在本例中,您的MAC地址和路由器的内部接口都在LAN上),而网络层(IPv4/IPv6)地址用于将数据包从源主机路由到目标主机(这忽略了NAT和IPv4中出现的一大堆其他粗俗之处)

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

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

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

  • 我使用了命令

    route -n
    
    arp -n
    
  • 然后我使用了命令

    route -n
    
    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,或者如果您愿意,您可以设计自己的ARP分辨率,这超出了我的知识范围,可以帮助您解决问题。我使用原始套接字实现自己的ICMP ping请求的实现如下-


    虽然我的回复很晚,但我希望它能帮助其他人,因为在链路层中使用原始套接字的资源很少。

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

  • 我使用了命令

    route -n
    
    arp -n
    
  • 然后我使用了命令

    route -n
    
    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
    
    现在你可以硬编码你的目标了