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

destination MAC to use when sending to remote host (is it my router)?

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

看起来很简单... 1. 以太网 header 2. ip header 3. TCP header 4.段(可选)

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

所以这让我问了这个问题:

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

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

没错。以太网 header 中的源 MAC 地址应该是你发送的接口的 MAC 地址,目标 MAC 地址应该是你的路由器的 [=36] =] 在其连接到您的 LAN 的接口上。

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

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

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

前几天我也遇到过同样的困惑。长话短说是的,目标 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 作为一个简单的破解,或者如果您愿意,您可以设计您自己的 ARP 解析,这超出了我的知识范围来帮助您解决问题。我使用原始套接字实现自己的 ICMP ping 请求的实现如下 -

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

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