古有关圣爷过五关斩六将,今有小小网络包过网关闯世界。今天帅天给大家剖析一下,从局域网发出的网络包是如何跋山涉水到达外面的世界的。

如何到达网关

在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?需要 CIDR 和子网掩码。(关于 CIDR 和 子网 掩码的知识请看帅天之前写的文章)

如果是同一个网段,那就不需要通过网关,直接在局域网内部通信,将源地址和目标地址放入 IP 头中,然后通过 ARP 获得 MAC 地址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。

如果不是同一网段,比如访问淘宝,这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。一般都是第一个,例如192.168.1.0/24 这个网段,Gateway 往往会是 192.168.1.1/24。

如何发往默认网关呢?因为网关和源 IP 肯定是同一个网段的,将源地址和目标 IP 地址放入 IP 头中,通过 ARP 获得网关的 MAC 地址,将源 MAC 和网关的 MAC 放入 MAC头 中,发送出去。这和局域网内部通信方式一样。网关所在的端口,例如 192.168.1.1/24 将网络包收进来,然后接下来怎么做,就完全看网关的了。

网关如何转发

网关转发 IP 包的过程中,可能会对网络包中的 IP 头 和 MAC 头进行修改。具体是如何操作的呢?请看下面两个例子。

第一个例子,IP 头始终保持不变。

在整个过程中,IP 头里面的地址都是不变的。IP 地址在三个局域网都可见,在三个局域网之间的网段都不会冲突。在三个网段之间传输包,IP 头不改变。

如下图所示:

服务器 A 要访问服务器 B。首先,服务器 A 会思考,192.168.4.101和我不是一个网段的,因而需要先发给网关。那网关是谁呢?已经静态配置好了,网关是 192.168.1.1。网关的 MAC 地址是多少呢?发 送 ARP 获取网关的 MAC 地址,然后发送包。包的内容是这样的:

  • 源 MAC:服务器 A 的 MAC

  • 目标 MAC:192.168.1.1 这个网口的 MAC

  • 源 IP:192.168.1.101

  • 目标 IP:192.168.4.101

包到达 192.168.1.1这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

在路由器 A 中配置了静态路由之后,要想访问 192.168.4.0/24,要从192.168.56.1 这个口出去,下一跳为 192.168.56.2。

于是,路由器 A 思考的时候,匹配上了这条路由,要从 192.168.56.1 这个口发出去,发给 192.168.56.2,那 192.168.56.2 的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址 ,然后发送包。包的内容是这样的:

  • 源 MAC:192.168.56.1的 MAC 地址

  • 目标 MAC:192.168.56.2的 MAC 地址

  • 源 IP:192.168.1.101

  • 目标 IP:192.168.4.101

包到达 192.168.56.2 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

在路由器 B 中配置了静态路由,要想访问 192.168.4.0/24,要从 192.168.4.1 这个口出去,没有下一跳了。因为我右手这个网卡,就是这个网段的,我是最后一跳了。

于是,路由器 B 思考的时候,匹配上了这条路由,要从 192.168.4.1 这个口发出去,发给 192.168.4.101。那 192.168.4.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取 192.168.4.101 的 MAC 地 址,然后发送包。包的内容是这样的:

  • 源 MAC:192.168.4.1 的 MAC 地址

  • 目标 MAC:192.168.4.101 的 MAC 地址

  • 源 IP:192.168.1.101

  • 目标 IP:192.168.4.101

包到达服务器 B,MAC 地址匹配,将包收进来。

通过这个过程可以看出,每到一个新的局域网,MAC 都是要变的,但是 IP 地址都不变。在 IP 头里面,不会保存任何网关的 IP 地址。

第二个例子,IP 头会变。

看下图,服务器 A 想访问服务器 B,但是细心的同学可能已经发现和上面的例子不同之处在于,服务器 A 的地址和 服务器 B 的 地址是相同的(不同局域网内)。

怎么解决这个问题呢?既然局域网之间没有商量过,各管各的 IP 分配,那到国际上,就需要使用另外的地址。打个比方,就像出国,仅仅使用国内的身份证是不行的,必须得使用护照。

首先,目标服务器 B 在国际上要有一个国际的身份,我们给它一个192.168.56.2。在网关 B 上,我们记下来,国际身份 192.168.56.2 对应国内身份 192.168.1.101。凡是要访问 192.168.56.2,都转成 192.168.1.101。

于是,源服务器 A 要访问目标服务器 B,要指定的目标地址为 192.168.56.2。这是它的国际身份。服务器 A 想,192.168.56.2 和我不是一个网段的,因而需要发给网关,网关是谁?已经静态配置好了, 网关是 192.168.1.1,网关的MAC 地址是多少?发送 ARP 获取网关的 MAC 地址,然后发送包。包的内容是这样的:

  • 源 MAC:服务器 A 的 MAC

  • 目标 MAC:192.168.1.1 这个网口的 MAC

  • 源 IP:192.168.1.101

  • 目标 IP:192.168.56.2

包到达 192.168.1.1 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

在路由器A中配置了静态路由:要想访问 192.168.56.2/24,要从192.168.56.1 这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。

于是,路由器 A 思考的时候,匹配上了这条路由,要从 192.168.56.1 这个口发出去,发给 192.168.56.2。那 192.168.56.2 的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址 。

当网络包发送到中间的局域网的时候,服务器 A 也需要有个国际身份,因而在国际上,源 IP 地址也不能用 192.168.1.101,需要改成 192.168.56.1。发送包的内容是这样的:

  • 源 MAC:192.168.56.1 的 MAC 地址

  • 目标 MAC:192.168.56.2 的 MAC 地址

  • 源 IP:192.168.56.1

  • 目标 IP:192.168.56.2

包到达 192.168.56.2 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

路由器 B 是一个 NAT 网关,它上面配置了,要访问国际身份 192.168.56.2 对应国内身份 192.168.1.101,于是改为访问 192.168.1.101。

在路由器 B 中配置了静态路由:要想访问 192.168.1.0/24,要从 192.168.1.1 这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。

于是,路由器 B 思考的时候,匹配上了这条路由,要从 192.168.1.1 这个口发出去,发给 192.168.1.101。

那 192.168.1.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取192.168.1.101 的 MAC 地址,然后发送包。内容是这样的:

  • 源 MAC:192.168.1.1 的 MAC 地址

  • 目标 MAC:192.168.1.101 的 MAC 地址

  • 源 IP:192.168.56.1

  • 目标 IP:192.168.1.101

包到达服务器 B,MAC 地址匹配,将包收进来。

从服务器 B 接收的包可以看出,源 IP 为服务器 A 的国际身份,因而发送返回包的时候,也发给这个国际身份,由路由器 A 做 NAT,转换为国内身份。

从这个过程可以看出, IP 地址也会变。这个就是 Network Address Translation,简称 NAT

小结

本节描述了网络包经由网关转发的过程,重点阐述了 NAT 场景下 IP 包头部的变化,对网络包经由网关的动作做了详细的拆解,给大家一个深刻感性的认知,方便记忆与理解。