任务一介绍

你有没有想过,当你开机或连接新网络时,电脑是如何动态配置网络设置的?你是否曾想知道你的数据包在到达目的地前经过了多少设备和国家?你是否好奇,尽管你的ISP只给你一个IP地址,你的家庭设备是如何访问互联网的?

如果你想知道这些问题的答案,以及其他问题,这个房间就是为你准备的。

这个房间是关于计算机网络的四个房间中的第二个:

学习先修条件

为了充分利用这个房间,我们建议你了解以下内容:

  • ISO OSI 模型与图层
  • TCP/IP 模型与层
  • 以太网、IP 和 TCP 协议

换句话说,建议在“网络概念”之后开始这个房间。

学习目标

本房间的目的是教你各种标准协议和技术,这些技术将这些内容粘合在一起:

  • 动态主机配置协议(DHCP))
  • 地址解析协议(ARP))
  • 网络地址转换(NAT)
  • 互联网控制消息协议(ICMP)
    • 追踪路线
任务二DHCP:给我我的网络设置

你去了你最喜欢的咖啡店,拿了你最喜欢的热饮,打开了笔记本电脑。你的笔记本连接了店里的WiFi并自动配置了网络,这样你就可以在新的TryHackMe房间里工作了。你一个IP地址都没输入,但你的设备已经全部设置好了。让我们看看这是怎么发生的。

每当我们想要访问网络时,至少需要配置以下内容:

  • IP地址及子网掩码
  • 路由器(或网关)
  • DNS服务器

每当我们将设备连接到新的网络时,上述配置必须根据新网络进行设置。手动配置这些设置是个不错的选择,尤其是服务器。服务器通常不会切换网络;你不会随身携带域控制器,然后连接到咖啡馆的WiFi。此外,其他设备需要连接到服务器,并期望在特定IP地址找到它们。

拥有自动化配置连接设备的方法有许多优势。首先,这样可以省去手动配置网络的麻烦;这对移动设备来说尤其重要。其次,它避免了地址冲突,即当两个设备配置相同的IP地址时。IP 地址冲突会阻止相关主机使用网络资源;这适用于本地资源和互联网。解决方案在于使用动态主机配置协议(DHCP)。DHCP是一种依赖UDP的应用级协议;服务器通过UDP端口67监听,客户端从UDP端口68发送。你的智能手机和笔记本电脑默认配置为使用 DHCP

DHCP 遵循四个步骤:发现、提供、请求和确认(DORA):

  1. DHCP Discover:客户端广播 DHCPDISCOVER 消息,寻找本地 DHCP 服务器(如果存在的话)。
  2. DHCP Offer:服务器回复 DHCPOFFER 消息,并提供客户端可接受的 IP 地址。
  3. DHCP 请求:客户端回复 DHCPREQUEST 消息,表示已接受所提供的 IP。
  4. DHCP 确认:服务器会回复 DHCPACK 消息,确认该客户端已分配所提供的 IP 地址。

以下的数据包捕获展示了上述四个步骤。在这个例子中,客户端获得地址 。192.168.66.133

航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">user@TryHackMe</span></span><span style="color:#fd971f"><strong>$</strong></span> tshark <span style="color:#f8f8f2">-r</span> DHCP-G5000.pcap <span style="color:#f8f8f2">-n</span>
    1   0.000000      0.0.0.0 → 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xfb92d53f
    2   0.013904 192.168.66.1 → 192.168.66.133 DHCP 376 DHCP Offer    - Transaction ID 0xfb92d53f
    3   4.115318      0.0.0.0 → 255.255.255.255 DHCP 342 DHCP Request  - Transaction ID 0xfb92d53f
    4   4.228117 192.168.66.1 → 192.168.66.133 DHCP 376 DHCP ACK      - Transaction ID 0xfb92d53f</code></span></span></span></span>

DHCP分组交换中,我们可以注意到以下情况:

  • 客户端开始时没有任何IP网络配置。它只有一个MAC地址。在第一个和第三个数据包DHCP发现和DHCP请求中,寻找DHCP服务器的客户端仍未设置IP网络配置,也未使用DHCP服务器提供的IP地址。因此,它会将数据包从IP地址发送到广播IP地址。0.0.0.0255.255.255.255
  • 至于链路层,在第一和第三个数据包中,客户端发送到广播MAC地址(上述输出未显示)。DHCP 服务器在 DHCP 方案中提供可用的 IP 地址和网络配置。它使用客户端的目标MAC地址。(它在本示例系统中使用了拟议的IP地址。)ff:ff:ff:ff:ff:ff

DHCP流程结束时,我们的设备会获得访问网络甚至互联网所需的所有配置。特别是,我们期望DHCP服务器为我们提供了以下信息:

  • 用于访问网络资源的租用IP地址
  • 网关用来将数据包路由到局域外
  • 一个用于解析域名的DNS服务器
任务三ARP:将第3层寻址桥接到第2层寻址

当两台主机通过网络通信时,IP 数据包会被封装在数据链路框架中,并穿越第二层。请记住,我们常用的两个数据链路层是以太网(IEEE 802.3)和WiFi(IEEE 802.11)。每当一台主机需要在同一以太网或WiFi上与另一台主机通信时,必须在数据链路层帧内发送IP数据包。虽然它知道目标主机的IP地址,但需要查找目标主机的MAC地址,以便创建合适的数据链路头部。

正如你所记得的,MAC地址是一个48位数字,通常用十六进制表示;例如,和 是我网络上的两个MAC地址。7C:DF:A1:D3:8C:5C44:DF:65:D8:FE:6C

然而,同一以太网网络上的设备不必时刻知道彼此的MAC地址;他们只需在通信时知道彼此的MAC地址即可。一切都围绕着IP地址展开。考虑这样一个场景:你把设备连接到一个网络,如果网络有DHCP服务器,你的设备会自动配置使用特定的网关(路由器)和DNS服务器。因此,你的设备知道DNS服务器的IP地址,从而解析任何域名;此外,当路由器需要通过互联网发送数据包时,它还能知道路由器的IP地址。在所有这些情况下,不会透露任何MAC地址。然而,同一以太网上的两个设备在不了解彼此的MAC地址的情况下无法通信。

提醒一下,下面的截图中,我们看到一个以太网帧内的IP包。以太网帧头包含:

  • 目的MAC地址
  • 源MAC地址
  • 类型(此处为IPv4)

Wireshark showing the destination MAC address, source MAC address, and the protocol type in an Ethernet frame. The IP packet is encapsulated within this Ethernet frame.

地址解析协议(ARP)使得在以太网上找到另一设备的MAC地址成为可能。在下面的例子中,一个拥有 IP 地址的主机希望与另一个拥有 IP 地址的系统通信。它会发送一个ARP请求,要求拥有IP地址的主机响应。ARP请求从请求方的MAC地址发送到广播MAC地址,如第一个数据包所示。ARP回复很快到达,拥有IP地址的主机回复了它的MAC地址。从此,两台主机可以交换数据链路层帧。192.168.66.89192.168.66.1192.168.66.1ff:ff:ff:ff:ff:ff192.168.66.1

航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">user@TryHackMe</span></span><span style="color:#fd971f"><strong>$</strong></span> tshark <span style="color:#f8f8f2">-r</span> arp.pcapng <span style="color:#f8f8f2">-Nn</span>
    1 0.000000000 cc:5e:f8:02:21:a7 → ff:ff:ff:ff:ff:ff ARP 42 Who has 192.168.66.1? Tell 192.168.66.89
    2 0.003566632 44:df:65:d8:fe:6c → cc:5e:f8:02:21:a7 ARP 42 192.168.66.1 is at 44:df:65:d8:fe:6c</code></span></span></span></span>

如果我们使用 ,数据包的显示方式会不同。它使用了ARP请求和ARP回复这两个术语。供你参考,输出显示在下方的终端中。tcpdump

航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">user@TryHackMe</span></span><span style="color:#fd971f"><strong>$</strong></span> tcpdump <span style="color:#f8f8f2">-r</span> arp.pcapng <span style="color:#f8f8f2">-n</span> <span style="color:#f8f8f2">-v</span>
17:23:44.506615 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.66.1 tell 192.168.66.89, length 28
17:23:44.510182 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.66.1 is-at 44:df:65:d8:fe:6c, length 28</code></span></span></span></span>

ARP请求或ARP回复不会封装在UDP或IP包中;它直接封装在以太网帧中。以下ARP回复展示了这一点。

Wireshark showing an ARP Reply encapsulated directly within an Ethernet frame.

ARP被视为第二层,因为它处理MAC地址。也有人认为它是第三层的一部分,因为它支持IP作。关键是,ARP允许从第3层寻址转换为第2层寻址。

任务四ICMP:网络故障排除

互联网控制消息协议(ICMP)主要用于网络诊断和错误报告。两个流行的命令依赖ICMP,它们在网络故障排除和网络安全中起着关键作用。命令如下:

  • ping:该命令使用ICMP测试与目标系统的连接性,并测量往返时间(RTT)。换句话说,它可以用来了解目标是否还活着,并且它的回复能够传达到我们的系统。
  • traceroute: 该命令在 Linux 和类 UNIX 系统以及 MS Windows 系统上调用。它利用ICMP来发现从主机到目标的路由。traceroutetracert

你可能从未打过乒乓球(乒乓球);不过,多亏了ICMP,现在你可以用电脑玩了!该命令发送ICMP回声请求(ICMP类型)。下面的截图显示了IP包中的ICMP消息。ping8

Wireshark showing an ICMP echo request datagram encapsulated within an IP packet.

接收端的计算机以ICMP回声回复(ICMP类型)进行响应。0

Wireshark showing an ICMP echo reply datagram encapsulated within an IP packet.

很多事情可能会阻碍我们得到回复。除了目标系统可能离线或关闭外,沿路径设置防火墙可能会阻断必要的数据包以实现工作。在下面的例子中,我们过去告诉命令发送四个包后停止。ping-c 4ping

航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">user@TryHackMe</span></span><span style="color:#fd971f"><strong>$</strong></span> <span style="color:#ffaf00">ping</span> <span style="color:#ffaf00">192.168</span>.11.1 <span style="color:#f8f8f2">-c</span> <span style="color:#ffaf00">4</span>
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_seq=1 ttl=63 time=11.2 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=63 time=3.81 ms
64 bytes from 192.168.11.1: icmp_seq=3 ttl=63 time=3.99 ms
64 bytes from 192.168.11.1: icmp_seq=4 ttl=63 time=23.4 ms

--- 192.168.11.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 3.805/10.596/23.366/7.956 ms</code></span></span></span></span>

输出无丢包;此外,它还计算往返时间(RTT)的最小、平均、最大和标准差(mdev)。

追踪路线

我们如何让系统与目标系统之间的每个路由器都暴露自己?

互联网协议有一个称为“存活时间”(Time-to-Live,TTL)字段,表示数据包在丢弃前可通过的最大路由器数量。路由器在发送数据包之前,会将数据包的TTL减少1。当TTL归零时,路由器丢弃数据包并发送ICMP逾时消息(ICMP类型)。(在此语境中,“时间”是以路由器数量计量,而非秒数。)11

下面的终端输出显示了运行以发现我们系统与 之间路由器的结果。有些路由器没有响应;换句话说,它们丢弃数据包时不发送任何ICMP消息。属于我们ISP的路由器可能会响应,暴露他们的私有IP地址。此外,一些路由器会响应并显示其公共IP地址,这可以让我们查询它们的域名并发现它们的地理位置。最后,ICMP 逾时消息被阻断,始终无法送达我们。tracerouteexample.com

航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">user@TryHackMe</span></span><span style="color:#fd971f"><strong>$</strong></span> <span style="color:#ffaf00">traceroute</span> example.com
traceroute to example.com (93.184.215.14), 30 hops max, 60 byte packets
 1  _gateway (192.168.66.1)  4.414 ms  4.342 ms  4.320 ms
 2  192.168.11.1 (192.168.11.1)  5.849 ms  5.830 ms  5.811 ms
 3  100.104.0.1 (100.104.0.1)  11.130 ms  11.111 ms  11.093 ms
 4  10.149.1.45 (10.149.1.45)  6.156 ms  6.138 ms  6.120 ms
 5  * * *
 6  * * *
 7  * * *
 8  172.16.48.1 (172.16.48.1)  5.667 ms  8.165 ms  6.861 ms
 9  ae81.edge4.Marseille1.Level3.net (212.73.201.45)  50.811 ms  52.857 ms 213.242.116.233 (213.242.116.233)  52.798 ms
10  NTT-level3-Marseille1.Level3.net (4.68.68.150)  93.351 ms  79.897 ms  79.804 ms
11  ae-9.r20.parsfr04.fr.bb.gin.ntt.net (129.250.3.38)  62.935 ms  62.908 ms  64.313 ms
12  ae-14.r21.nwrknj03.us.bb.gin.ntt.net (129.250.4.194)  141.816 ms  141.782 ms  141.757 ms
13  ae-1.a02.nycmny17.us.bb.gin.ntt.net (129.250.3.17)  145.786 ms ae-1.a03.nycmny17.us.bb.gin.ntt.net (129.250.3.128)  141.701 ms  147.586 ms
14  ce-0-3-0.a02.nycmny17.us.ce.gin.ntt.net (128.241.1.14)  148.692 ms ce-3-3-0.a03.nycmny17.us.ce.gin.ntt.net (128.241.1.90)  141.615 ms ce-0-3-0.a02.nycmny17.us.ce.gin.ntt.net (128.241.1.14)  148.168 ms
15  ae-66.core1.nyd.edgecastcdn.net (152.195.69.133)  141.100 ms ae-65.core1.nyd.edgecastcdn.net (152.195.68.133)  140.360 ms ae-66.core1.nyd.edgecastcdn.net (152.195.69.133)  140.638 ms
16  93.184.215.14 (93.184.215.14)  140.574 ms  140.543 ms  140.514 ms
17  93.184.215.14 (93.184.215.14)  140.488 ms  139.397 ms  141.854 ms</code></span></span></span></span>

经过的路线可能会在我们重启命令时发生变化。

任务5布线

请考虑下方所示的网络图。它只有三个网络;然而,互联网如何弄清楚如何将数据包从网络1传递到网络2或网络3呢?虽然这是一个过于简化的图,但我们需要某种算法来弄清楚如何将网络1连接到网络2和网络3,反之亦然。

让我们来看看一个更详细的图示。互联网将由数百万台路由器和数十亿台设备组成。下面的网络只是互联网的一个小子集。移动用户可以访问网页服务器;然而,要实现这一点,路径上的每个路由器都需要通过相应链路发送数据包。显然,连接移动用户和网页服务器之间存在不止一条路径,即路由。我们需要一个路由算法,让路由器确定使用哪条链路。

路由算法超出了本房间的范围;不过,我们将简要介绍几种路由协议,帮助您熟悉它们的名称:

  • OSPF(开放最短路径优先):OSPF是一种路由协议,允许路由器共享网络拓扑信息并计算数据传输的最高效路径。它通过路由器交换其连接链路和网络状态的更新来实现这一点。这样,每个路由器都能拥有完整的网络地图,并能确定到达任何目的地的最佳路由。
  • EIGRP(增强型内部网关路由协议):EIGRP是思科专有的路由协议,结合了不同路由算法的特点。它允许路由器共享他们可访问的网络信息以及这些路由相关的成本(如带宽或延迟)。路由器随后利用这些信息选择最高效的数据传输路径。
  • BGP(边界网关协议):BGP是互联网上主要使用的路由协议。它允许不同的网络(如互联网服务提供商的网络)交换路由信息,并为这些网络之间的数据建立传输路径。BGP有助于确保数据能够高效地通过互联网路由,即使跨越多个网络。
  • RIP(路由信息协议):RIP是一种简单的路由协议,常用于小型网络。运行RIP的路由器会共享它们能到达的网络信息以及到达该网络所需的跳数(路由器)。因此,每个路由器都会基于这些信息构建路由表,选择跳数最少的路由以到达每个目的地。
任务6NAT

正如网络概念会议讨论的,我们计算出IPv4最多可支持40亿台设备。随着连接互联网的设备数量增加,从电脑、智能手机到监控摄像头和洗衣机,IPv4地址空间显然会迅速耗尽。解决地址耗尽的一个方法是网络地址转换(NAT)。

NAT的理念在于利用一个公共IP地址多个私有IP地址提供互联网访问。换句话说,如果你连接一家拥有二十台计算机的公司,你可以通过使用一个公共IP地址而非二十个公共IP地址,为所有二十台计算机提供互联网接入。(注:从技术上讲,IP地址数量总是以二的幂来表示。技术上来说,NAT是保留两个公共IP地址,而不是三十二个。因此,你本可以节省三十个公共IP地址。)

与路由不同,路由是将数据包自然路由到目的主机的方式,支持NAT的路由器必须找到跟踪当前连接的方法。因此,支持NAT的路由器维护一个表,用于在内部和外部网络之间转换网络地址。通常,内部网络使用私有IP地址范围,而外部网络使用公共IP地址。

在下图中,多个设备通过支持NAT的路由器访问互联网。路由器维护一个表,将内部IP地址和端口号映射为外部IP地址和端口号。例如,笔记本电脑可能与某个网络服务器建立了连接。从笔记本的角度来看,连接是从其IP地址从TCP源端口号发起的;然而,Web服务器会将该连接视为从TCP端口号建立,如翻译表所示。路由器会无缝完成地址转换。192.168.0.12915401212.3.4.519273

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐