前言

这一章主要介绍了网络地址的分配和转换。地址分配可以分为静态和动态,地址转换可以分为IPv4和IPv6。


地址分配

我们在之前已经学习到了如何给终端设备静态分配地址,在网络适配器中可以自行调整。但是这对于用户来说不仅需要知道当前网络的网关信息、子网掩码等等,无疑加大了普通用户的难度。使用IP地址动态分配可以减轻IP地址分配的管理负担。

常见的动态地址分配协议是DHCP(Dynamic Host Configuration Protocol, 动态主机配置协议),DHCP以客户端/服务器模式工作,可用于IPv4和IPv6.

DHCP使用UDP作为其传输协议。DHCPv4客户端通过端口67向DHCPv4服务器发送消息。服务器通过端口68向客户端发送消息。从服务器发送的DHCPv6消息使用UDP端口546客户端使用UDP端口547向服务器发送DHCPv6消息。

在DHCP中,动态分配的IP具有一定的租期(lease),租期由服务器设置。客户端向服务器申请IP的时候一般分为4步,以v4为例。

  1. 客户端通过发送广播DHCPDISCOVER来定位DHCPv4服务器,广播DHCPDISCOVER可能到达多个服务器。
  2. 如果DHCPv4服务器可以提供客户端IP配置(可能包括IP地址、默认网关、DNS服务器和租用时间),则它将通过发送单播DHCPOFFER进行回复。
  3. 客户机通过发送广播DHCPREQUEST,让所有服务器知道接受了哪个服务器提供的IP配置。
  4. 服务器发送单播确认DHCPACK,使配置正式生效。

如果客户端检测到该地址已经在本地网段上使用,它会发送一个DHCPDECLINE消息,然后重新开始该过程。

动态分配的IP租赁时间到期时,客户端必须重新申请,称为续期(lease renewal),服务器一般会重新分配相同的地址给同一个客户端。此时只需要重复上述第三第四步即可。

如果客户端不再需要IP地址,客户端将向服务器发送DHCPRELEASE消息。

我们在实际网络拓扑中,可能存在客户端和 DHCPv4 服务器不在同一网段上并被路由器隔开的情况,此时路由器会进行DHCPv4中继,将广播请求转发到指向DHCPv4服务器的地址上。此时信息的MAC地址会变化,如图:


地址转换

IPv4转换

由于IPv4地址的数量有限,不能满足所有设备的需求,尤其是在大型组织或公司中。同时地址转换也提高了安全性,内部网络的设备使用的是私有IP地址,外部攻击者就无法直接访问到内部网络的设备。此外,如果需要更换ISP或更改网络结构,只需要更改少量的公共IP地址,而不需要更改内部网络中的私有IP地址。

地址转换通常使用NAT(Network Address Translation)技术,它可以将主机的内部私有IP地址转换为外部可路由的公共IP地址。

当数据包通过边界路由器时,源 IP 地址会从内部专用地址转换为可路由的公共地址。当回复数据包返回时,目的 IP 地址字段中的公共地址又会被转换回内部专用地址,以便在内部网络内传送。私有地址和公有地址之间的映射关系由边关路由器的NAT表控制。

NAT中对于一个内网设备,存在以下四种地址:

  1. Inside Local Address:这是内部网络中设备的实际IP地址。这些地址通常是私有IP地址,如192.168.1.2。

  2. Inside Global Address:这是内部网络设备在公有地址。这通常是分配给路由器的公网IP地址。

  3. Outside Local Address:这是外部设备在内部网络中的表示地址。在基本的NAT配置中,Outside Local Address通常与Outside Global Address相同

  4. Outside Global Address:这是外部设备在公共网络上的实际地址

我们通过一个例子来展示它们之间的区别。

假设我们有一个内部网络,其中一个设备PC2的内网IP是192.168.1.2。这个设备通过一个NAT路由器连接到互联网。NAT路由器的公有IP地址(Inside Global Address)是200.200.200.1。现在,这个内部设备想要访问一个在互联网上的服务器。这个服务器的IP地址是154.51.100.1。如图,对于这个PC2来说,可以得到这些地址:

  • Inside Local Address是192.168.1.2(PC2的实际地址)。
  • Inside Global Address是200.200.200.1(内部设备在公共网络上的表示地址)。
  • Outside Local Address是154.51.100.1(外部服务器在内部网络中的表示地址)。
  • Outside Global Address也是154.51.100.1(外部服务器在公共网络上的实际地址)。

当内部设备发送数据包到外部服务器时,数据包的源IP地址会从Inside Local Address(192.168.1.2)被转换为Inside Global Address(200.200.200.1),目标IP地址保持不变(154.51.100.1)。当外部服务器回应时,数据包的目标IP地址会从Inside Global Address(200.200.200.1)被转换回Inside Local Address(192.168.1.2),源IP地址保持不变(154.51.100.1)。这样,内部设备就可以通过NAT路由器与外部服务器进行通信。

因为此时外部服务器的地址为公网地址,所以Outside Local Address = Outside Global Address。

在某些情况下,Outside Local Address和Outside Global Address可能不同。这通常发生在一种称为双重NAT或多层NAT的情况下,其中多个NAT设备位于数据包的传输路径上。

NAT根据不同的情况有多种转换类型:

  • 静态NAT(Static NAT)
  • 动态NAT(Dynamic NAT)
  • 动态NAT重载(Dynamic NAT Overloading)或端口地址转换(PAT, Port Address Translation)
  • 静态NAT重载或端口转发(Static NAT Overloading or port forwarding)

静态NAT是一种一对一的映射,它将一个内部IP地址映射到一个公共IP地址。例如,一个内部网络中的设备可能有一个私有IP地址(如192.168.1.201),而在公共网络上,它被表示为一个公共IP地址(如200.0.0.1)。这种映射是固定的,不会随着时间或会话的变化而变化。静态NAT通常用于将公共IP地址映射到需要从Internet访问的内部服务器,例如Web服务器或邮件服务器。

动态NAT是一种多对一或多对多的映射,它将多个内部IP地址映射到一个或多个公共IP地址(NAT IP池)。这种映射是动态的,可以根据需要或会话的变化而变化。公共IP池中,内部地址的映射会选择一个没有使用的公共IP,当IP池中没有没被使用的公共IP则无法映射。内部地址的映射存在租期,租期到了后自动释放映射关系。动态NAT通常用于大型企业网络,其中有大量的内部设备需要访问Internet,但没有足够的公共IP地址供每个设备使用。

动态NAT可以动态分配映射关系,但在公共IP较少的情况下,大大限制了向外访问的能力。于是在动态NAT之上,提出了端口地址转换PAT。PAT不仅将内部IP地址映射到公共IP地址,还将内部端口号映射到公共端口号。这允许一个公共IP地址支持多个并发会话,每个会话都有一个唯一的公共端口号。这是家庭和小型企业网络中最常见的NAT类型,因为它允许多个设备共享一个公共IP地址。

同时,除了动态的PAT外,我们也有静态的端口转发。它允许外部设备通过指定的公共IP地址和端口号访问内部网络中的特定设备和服务。例如,你可能在家庭网络中有一个Web服务器,你希望从Internet上访问。你可以设置端口转发,将所有到达你的公共IP地址的HTTP请求(通常在端口80)转发到你的Web服务器的私有IP地址。这种映射是固定的,不会随着时间或会话的变化而变化。


IPv6过渡与地址转换

IPv4和IPv6之间因为协议而无法互相访问,随着互联网的发展,IPv4越来越少,越来越多的服务将使用IPv6。故为了实现IPv4到IPv6的过渡和访问,需要进行一些地址转换。

从IPv4过渡到IPv6有三种常见的方法:

  1. 双栈 (Dual Stack):双栈方法是在同一设备上同时运行IPv4和IPv6协议。这种方法的优点是它允许IPv4和IPv6网络无缝地共存,而不需要任何特殊的转换或隧道技术。设备可以根据目标地址或网络策略选择使用IPv4或IPv6。例如,一个双栈路由器可能有一个IPv4地址(如200.0.0.1)和一个IPv6地址(如2001:abcd:ef::1)。它可以根据目标地址或网络策略选择使用IPv4或IPv6来发送和接收数据包。

  2. 隧道技术 (Tunneling)隧道技术是一种将IPv6数据包封装在IPv4数据包中进行传输的方法。这种方法的优点是它允许IPv6设备通过IPv4网络进行通信,即使这些设备并不直接连接到IPv6网络。例如,一个IPv6设备可能在一个IPv4网络中,但它需要访问一个IPv6网络。在这种情况下,设备可以创建一个IPv6在IPv4的隧道,将IPv6数据包封装在IPv4数据包中,然后通过IPv4网络将数据包发送到目标IPv6网络。

  3. 协议转换 (Protocol Translation)协议转换是一种将IPv6数据包转换为IPv4数据包(反之亦然)的方法。这种方法的优点是它允许IPv4和IPv6设备直接进行通信,即使它们使用的是不同的IP版本。例如,一个IPv4设备可能需要访问一个IPv6网络。在这种情况下,一个协议转换网关可以将IPv4数据包转换为IPv6数据包,然后将数据包发送到目标IPv6网络。同样,当IPv6设备回应时,网关可以将IPv6数据包转换回IPv4数据包,然后将数据包发送回原来的IPv4设备。

隧道技术,就是在两个分隔的网络之间建立一个通道使得数据可以流通。例如,假设你有一个IPv6网络在地理位置A,而你需要在地理位置B的另一个IPv6网络上发送数据,但在这两个地方之间的网络只支持IPv4。在这种情况下,你可以在位置A创建一个IPv6到IPv4的隧道你将IPv6数据包封装在IPv4数据包中,然后通过IPv4网络将数据包发送到位置B在位置B,数据包被解封装,原始的IPv6数据包被提取并发送到目标网络。

有一些常见的隧道技术:

  1. 手动隧道 (Manual Tunnel):这是最基本的隧道技术,需要手动在两个端点上配置隧道。这种方法简单,但不适合大规模部署,因为每个隧道都需要单独配置。

  2. GRE (Generic Routing Encapsulation):GRE是一种通用的隧道协议,可以封装各种网络层协议。GRE隧道可以用于封装IPv6数据包在IPv4网络上的传输,也可以用于其他应用。

  3. 6to4:6to4是一种自动隧道技术,它使用特殊的IPv6地址,这些地址的前32位是固定的(2002::/16),后32位是IPv4地址。6to4隧道允许IPv6网络通过任意的IPv4网络进行通信。

  4. 6RD(IPv6 Rapid Deployment)是一种使用IPv4基础设施快速部署IPv6服务的方法。它是基于6to4隧道技术的一种改进,它允许使用任何范围的IPv6地址。
  5. ISATAP (Intra-Site Automatic Tunnel Addressing Protocol):ISATAP是一种在IPv4网络内部创建IPv6隧道的方法。它允许IPv6设备通过IPv4网络进行通信,即使这些设备并不直接连接到IPv6网络。

IPv6的协议转换常常与NAT地址转换在一起操作,称为NAT-PT(Network Address Translation-Protocol Translation)。它不仅可以转换包头中的地址,还可以转换协议本身,使IPv4主机能够与IPv6主机进行通信,反之亦然。

静态NAT-PT:在静态NAT-PT中,网络管理员手动配置IPv4和IPv6地址之间的一一映射。这意味着每个IPv4地址都有一个对应的IPv6地址,反之亦然。这种方式的优点是它可以提供稳定的地址映射,但缺点是它不适合大规模部署,因为每对地址都需要单独配置。

动态NAT-PT:在动态NAT-PT中,IPv4和IPv6地址之间的映射是动态生成的。当一个IPv4主机需要与IPv6主机进行通信时,NAT-PT设备会自动为其分配一个IPv6地址。同样,当一个IPv6主机需要与IPv4主机进行通信时,NAT-PT设备也会自动为其分配一个IPv4地址。这种方式的优点是它可以自动处理地址映射,无需手动配置。但缺点是地址映射可能会频繁改变,这可能会影响到某些需要稳定地址的应用。


但是NAT-PT设备需要处理大量的地址转换和协议转换,这会增加网络延迟,并可能导致某些应用无法正常工作。因此,NAT-PT通常只在IPv6部署的过渡阶段使用,最终目标仍然是全面部署IPv6。