本篇是计算机网络系列的第三篇,主要讲 DHCP 和内网穿透。在探索广阔的外网之前,先把内网相关的内容做个收尾。

其余几篇的目录:


局域网的自动配置:DHCP 的世界

任何设备要接入网络,首要任务是获取一个有效的网络配置,包括 IP 地址、子网掩码等信息。手动为每台设备配置这些信息不仅效率低下,还极易出错。为此,DHCP(动态主机配置协议)应运而生,它实现了网络参数的自动化分配。

DHCP 的工作流程 (DORA)

DHCP (Dynamic Host Configuration Protocol) 是一种基于 UDP 的网络管理协议,其核心工作流程包含四个步骤,通常简称为 DORA 过程:

  1. Discover (发现):客户端设备启动并接入网络后,以广播形式发送一个 DHCP Discover 报文,在物理网段内寻找可用的 DHCP 服务器。
  2. Offer (提供):所有收到 Discover 报文的 DHCP 服务器,会从其地址池中选择一个可用的 IP 地址,并连同其他网络配置一起,构建一个 DHCP Offer 报文,发送给客户端。
  3. Request (请求):客户端选择一个 Offer(通常是第一个收到的),然后向网络广播一个 DHCP Request 报文,正式请求使用该地址,并告知所有服务器它的选择。
  4. Acknowledge (确认):被选择的 DHCP 服务器收到 Request 报文后,执行最终的绑定操作,并发送 DHCP Acknowledge 报文给客户端,正式确认配置生效。租约开始计时。

整个过程可以用下面的序列图来概括:

DHCP 在实践中的角色

理论上,DHCP 服务可以由网络中的任何服务器提供。在绝大多数家庭和小型网络中,DHCP 服务器功能都集成在路由器内。这台我们熟悉的设备,其实在扮演着两个截然不同的角色:

  • 对内(LAN)是 DHCP 服务器:它管理着一个私网地址池(如 192.168.1.0/24),为所有接入的电脑、手机等设备分配内网 IP 地址和相关配置。
  • 对外(WAN)是 DHCP 客户端:那么,路由器自身的公网 IP 又是从何而来的呢?很多情况下,它同样是通过 DHCP 获取的。此时,路由器扮演一个客户端,向您的互联网服务提供商(ISP)的 DHCP 服务器发起请求。ISP 的服务器从其管理的公网 IP 地址池中,取出一个地址“租”给您的路由器。

因此,DHCP 是一个通用的地址分配协议,既被 ISP 用来分配公网 IP,也被路由器用来分配私网 IP。当然,除 DHCP 外,ISP 也常用 PPPoE(需要账户密码拨号)等方式来分配公网 IP。

DHCP 的核心:参数详解与实践

DHCP 在 Acknowledge 阶段提供的“大礼包”中,包含了以下至关重要的网络参数。理解这些参数的理论和实践,是掌握网络配置的关键。

IP 地址

设备在网络中的唯一数字标识,用于寻址和数据包路由。DHCP 分配的通常是私有 IP 地址,仅在局域网(LAN)内有效。

子网掩码 (Subnet Mask)

子网掩码是一个 32 位数值,其核心功能是划分 IP 地址的网络部分和主机部分,是设备进行路由决策的基础。

历史背景:从有类地址到子网划分

在早期,IP 地址根据其第一个八位字节被划分为 A、B、C 等有类(Classful)地址,每个类别有固定的网络位和主机位。这种方式缺乏灵活性,常常导致大量 IP 地址被浪费。

例如,早期的有类网络划分如下:

  • A 类地址 (首位为0,范围 1-126): 默认子网掩码 255.0.0.0。一个 A 类网络可容纳超过 1600 万台主机,若分配给仅需数百地址的组织,是巨大的浪费。
  • B 类地址 (首位为10,范围 128-191): 默认子网掩码 255.255.0.0。一个 B 类网络可容纳 65,534 台主机,对很多组织来说依然过大。
  • C 类地址 (首位为110,范围 192-223): 默认子网掩码 255.255.255.0。一个 C 类网络仅能容纳 254 台主机,对于需要稍多设备(如 300 台)的组织来说又太小。

正是为了解决这种“要么太大,要么太小”的僵化问题,子网掩码应运而生,它允许网络管理员根据实际需求,灵活地将大网络划分为多个小子网 (Subnet),极大地提高了 IP 地址的利用率。

核心原理:网络地址与主机地址

子网掩码通过按位与 (bitwise AND) 运算来提取网络地址。这是设备进行路由决策的根本依据。

计算网络地址:
假设 IP 地址为 192.168.1.100,子网掩码为 255.255.255.0 (/24)。

  11000000.10101000.00000001.01100100  (IP: 192.168.1.100)
& 11111111.11111111.11111111.00000000  (Mask: 255.255.255.0)
------------------------------------
  11000000.10101000.00000001.00000000  (Network ID: 192.168.1.0)

运算的核心在于,子网掩码中为 1 的部分会保留 IP 地址的位,为 0 的部分会将 IP 地址的位清零,从而得到纯粹的网络地址。

那么如何计算主机地址呢?与计算网络地址相对应,我们也可以计算出地址中的主机部分。这需要对子网掩码进行“按位非”(NOT)运算(即 1001),得到反掩码,然后再与原 IP 地址进行“按位与”。

  • 反掩码: NOT 255.255.255.0 -> 0.0.0.255
  • 运算: 192.168.1.100 AND 0.0.0.255 -> 0.0.0.100

这个 100 就是这台设备在该子网中的主机标识。完整的 IP 地址可以看作是网络地址 (192.168.1.0) + 主机地址 (0.0.0.100) 的结果。

CIDR 表示法

在现代网络中,使用无类别域间路由 (CIDR) 表示法来指定子网掩码更为常见。它在 IP 地址后附加一个斜杠和数字(如 /24),表示子网掩码中前 24 位为 1

网络容量与扩容问题

子网掩码的设定直接决定了网络的容量。例如,/24 (255.255.255.0) 的网络,主机位有 8 位,最多支持 2^8 - 2 = 254 台设备。

当地址池被用尽后,新设备将无法获取 IP 地址。其 DHCP Discover 请求会因服务器无地址可供 Offer 而石沉大海。最终,新设备可能会获取一个 169.254.x.x 的自动专用地址(无法访问互联网),或直接提示 IP 配置失败。

网络设计有一个核心原则:稳定性与确定性。子网掩码作为网络的基础架构定义,其变更属于架构级调整,必须由管理员进行统一规划和手动实施。自动扩容会因无法通知到所有老设备、可能与现有网络规划冲突等原因,造成网络混乱和安全问题,因此在设计上是不被允许的。

默认网关 (Default Gateway)

默认网关是局域网连接到其他网络的“出口”,物理上通常是路由器的内网接口 IP。其核心作用是路由转发

数据包的旅程:一个完整的故事

为了理解默认网关的真正作用,我们来完整地追踪一个数据包从内网主机 A 到外网服务器 B 的旅程。

主角:

  • 主机 A: 你的电脑,IP 地址 192.168.1.100
  • 默认网关: 你的路由器,IP 地址 192.168.1.1
  • 服务器 B: 远端网站服务器,IP 地址 8.8.8.8

第一步:主机 A 的“思考”—— 我该把信交给谁?

主机 A 想要发送数据给 8.8.8.8。它首先要解决一个问题:“这个目标是在我的局域网内,还是在互联网上?”

它通过自己的子网掩码 (255.255.255.0) 进行计算,发现 8.8.8.8 并不和自己在同一个网络(192.168.1.0)内。于是,主机 A 得出结论:不能直接把数据发送给目标,必须先把数据交给默认网关,让它负责转发。

第二步:主机 A 的“打包”—— 准备好信封和快递盒

现在主机 A 知道,逻辑上要把数据发给网关 192.168.1.1。但在局域网这个物理世界里,数据传输依靠的是硬件的物理地址(MAC 地址)。

  1. 寻找物理地址 (ARP): 如果主机 A 不知道网关的 MAC 地址,它会先通过 ARP (地址解析协议) 在局域网里广播:“请问谁的 IP 是 192.168.1.1?请把你的 MAC 地址告诉我。” 路由器会回应:“是我的,我的 MAC 地址是 AA:BB:CC:DD:EE:FF。”

  2. 进行双层封装: 主机 A 现在开始打包数据。这是一个精妙的双层结构:

    • 内层信封 (IP 数据包): 这里写的是最终目标
      • 收件人 IP: 8.8.8.8
      • 发件人 IP: 192.168.1.100
    • 外层快递盒 (以太网帧): 这里写的是下一跳目标
      • 收件人 MAC: AA:BB:CC:DD:EE:FF (网关的 MAC 地址)
      • 发件人 MAC: 主机 A 自己的 MAC 地址

第三步:网关的“转发”—— 拆开快递盒,送出信封

主机 A 将这个“快递盒”发送到局域网上。网络中的所有设备都会看到它,但只有 MAC 地址为 AA:BB:CC:DD:EE:FF 的路由器会接收并拆开它。

  1. 路由器拆开“外层快递盒”(以太网帧)。
  2. 它看到里面的“内层信封”(IP 数据包),发现收件人是 8.8.8.8,不是自己。
  3. 于是,路由器执行它的核心功能:路由。它会查询自己的路由表,找到通往 8.8.8.8 的最佳路径(比如指向 ISP 的下一个路由器)。
  4. 最后,它将这个原始的 IP 数据包(里面的 IP 地址不变)拿出来,套上一个新的快递盒(新的以太网帧,目标 MAC 地址是下一个路由器的 MAC 地址),然后发往互联网。

这个“拆包-查路-重新打包”的过程会在每一跳的路由器上重复,直到数据包最终抵达服务器 B。下面的序列图清晰地展示了这一旅程:

DNS 服务器地址

DHCP 同样会分配 DNS 服务器的地址,使设备能将域名解析为 IP 地址。

DNS 的分配模式:直接下发与代理转发

在实践中,路由器上的 DHCP 服务分配 DNS 时,通常有两种模式:

  • 直接下发 (Passthrough):路由器将从 ISP 获取到的上游 DNS 地址(如 8.8.8.8)直接分配给内网设备。
  • 代理转发 (Proxy/Forwarder):路由器将自身 IP (192.168.1.1) 作为 DNS 服务器分配给内网设备。设备向路由器查询,路由器再向上游 DNS 查询,并可缓存结果以加速后续访问。

跨越网关:内网穿透技术

现在,我们的设备已通过 DHCP 在局域网中完美运行。但如果我们想从公司、酒店或任何外部网络,访问这台内网中的设备(如 NAS、Web 服务器),就会遇到 NAT 的阻碍。内网穿透就是解决这个问题的技术集合。

端口映射 (Port Forwarding)

这是最基础和常用的穿透方式。它在路由器上创建一条静态转发规则,将 路由器公网IP:外部端口 收到的访问请求,转发到 内网指定设备IP:内部端口

与 DHCP 的关键结合点:静态 IP 分配

端口映射的规则是写死的,它需要内网设备的 IP 地址永远不变。但 DHCP 默认分配的 IP 地址是有租期的,可能会变化。

对于大多数家庭用户来说,公网 IP 本身也是动态变化的,这为端口映射带来了另一个挑战,也是后续 VPN 和第三方服务方案的优势之一

解决方案就是使用路由器的 DHCP 静态地址分配 (Static DHCP Lease) 功能,通过 MAC 地址绑定,确保特定设备永远获得同一个 IP 地址。这是实现可靠内网穿透的重要前提。

UPnP (通用即插即用)

UPnP (Universal Plug and Play) 是一种更为便捷的穿透技术,它的目标是实现“零配置”的网络连接。

UPnP 是什么?

它是一系列协议的组合,允许局域网中的设备(如电脑、游戏机、打印机、摄像头)彼此自动发现,并动态地建立网络服务。在内网穿透的场景下,我们主要利用的是它的 IGD (Internet Gateway Device) 协议

它是如何工作的?

UPnP IGD 可以看作是自动化的端口映射。其工作流程如下:

  1. 内网中一个支持 UPnP 的应用程序(如游戏、下载软件)启动后,会先在局域网中寻找支持 UPnP IGD 的网关设备(即你的路由器)。
  2. 找到路由器后,应用程序会向路由器发送一个请求,例如:“你好,我是 192.168.1.101,请帮我把你的公网 XXXX 端口,映射到我自己的 YYYY 端口上。”
  3. 路由器接收到这个请求后,如果开启了 UPnP 功能,就会自动在自己的 NAT 表中添加这条端口映射规则,无需任何人工干预。
  4. 应用程序还可以通过 UPnP 查询路由器当前的公网 IP,以及检查映射是否成功。

便利性与风险

  • 优点:极其方便,用户完全无感,应用程序可以自行完成所有穿透配置,大大提升了联机游戏、P2P 下载等应用的体验。
  • 缺点:存在安全风险。由于该过程是自动的,局域网中的任何程序(包括恶意软件)都有可能利用 UPnP 在你不知情的情况下打开路由器的端口,将内部服务暴露于公网,从而带来安全隐患。因此,很多对安全性要求较高的用户会选择手动关闭路由器的 UPnP 功能。

基于隧道的解决方案:代理与 VPN

当手动配置端口映射不便或不可行时(例如,你没有路由器的管理权限,或者你的 ISP 不提供公网 IP),基于隧道技术的穿透方案便成为了主流选择。它们的本质都是在内网设备与一台公网服务器之间,建立一条稳定、加密的“隧道”,所有流量都通过这个隧道进行转发。

反向代理隧道 (frp, Ngrok)

这类工具的核心思想是暴露单个服务

  • 原理:你在内网的机器上运行一个客户端,主动连接到一台你部署在公网的 frp 服务端或 Ngrok 的公共服务器。连接成功后,服务端会提供一个公网地址(域名或 IP)和端口,并将所有访问这个公网地址的请求,通过已经建立好的隧道,原封不动地转发给内网的客户端,客户端再将请求发给本地的 Web 服务或 SSH 服务。

  • 适用场景:非常适合临时或长期地将某个特定的 Web 服务、API 或远程桌面分享出去。其工作原理如下图所示:

VPN 与 WireGuard

VPN 的目标则更为宏大,它致力于构建一个安全的虚拟局域网,将你的所有设备都“拉”进这个虚拟网络中,让它们如同真的在同一个房间里一样可以互相通信。WireGuard 是实现这一目标的现代化、高性能的 VPN 协议。

未来我们将更加详细地介绍 WireGuard,此处先简单介绍一下。

  • 原理:与 frp 类似,你也需要一台拥有公网 IP 的服务器作为所有设备的“汇集点”。所有设备(家里的 NAS、公司的电脑、你的手机)都作为客户端,通过加密隧道连接到这台服务器。成功后,每个设备都会被分配一个全新的、虚拟的 IP 地址(例如 10.0.0.x)。
  • 区别与优势
    • 全网络访问:一旦连上 WireGuard VPN,你访问的就不再是单个服务,而是整台设备。你可以通过 10.0.0.x 这个虚拟 IP,访问到设备上的任何端口和服务(Web、SSH、文件共享等),就像在本地访问一样。
    • 极高的安全性:你只需要在公网服务器上开放一个 UDP 端口给 WireGuard 使用,就能访问内网设备的所有服务,极大地减小了公网暴露面。
    • 性能卓越与配置简单:WireGuard 以其高性能、低延迟和简洁的配置著称,非常适合个人和团队自建使用。

总的来说,如果你只想快速分享一个应用,frp/Ngrok 这类反向代理隧道更轻便;如果你希望安全、全面地远程管理和访问你的整个内网环境,构建一个 WireGuard VPN 是目前最优的实践之一。下图描绘了这种虚拟网络的拓扑结构:

总结

至此,我们完成了计算机网络系列中关于内网部分的探索。现在,让我们将三篇文章的知识点串联起来,回顾一台设备从开机到成功访问 www.google.com 的完整流程:

  1. 路由器就位:路由器开机后,首先作为客户端,通过 DHCPPPPoE 从互联网服务提供商(ISP)处获取到公网 IP 和上游 DNS 服务器地址

  2. 设备入网:你的电脑开机并连接 Wi-Fi,它会立即发送 DHCP Discover 广播。路由器作为 DHCP 服务器响应,为你分配一个内网 IP(如 192.168.1.100)、子网掩码默认网关(通常是路由器自身地址 192.168.1.1)。

  3. 域名解析:你在浏览器输入 www.google.com。操作系统会向路由器(或上游 DNS)发起 DNS 查询,通过层层解析,最终将域名翻译成服务器的公网 IP 地址,例如 142.250.199.68

  4. 访问公网

    • 电脑通过子网掩码计算,发现目标 IP 142.250.199.68 并不在本地局域网。
    • 它将数据包的目标 IP 设为 142.250.199.68,但数据链路层的目标 MAC 地址则设为默认网关(路由器)的 MAC 地址。
    • 数据包被发往路由器,路由器执行 NAT,将数据包的源 IP 从你的内网 IP 替换为家庭的公网 IP,然后发往互联网。

通过这一系列的流程,你的请求才得以顺利抵达远方的服务器。