在 内网IP和外网IP 中,我们利用 VPN 技术,实现了不同专用网之间的通信,这里,我们来研究内网 IP 的主机如何上网,访问到因特网上的某一台主机,比如单位 A 网络的主机 C ,想要访问因特网上的主机 D ,这时我们需要用到网络地址转换 (NAT) 这个技术。
要使用 NAT ,首先要在路由器上安装 NAT 软件,这种安装有 NAT 软件的路由器,我们称之为 NAT 路由器。在 NAT 路由器里面,和单位网络连接的接口,可以分配一个内网 IP ,和因特网连接的接口,需要给它分配一个全球的公网 IP 。主机 C 要去访问因特网上的主机 D ,目的 IP 地址是 213.18.0.3 ,源 IP 地址是 192.168.0.35 ,不在同一个网络里面,所以由路由器转发,这个分组会转发到 NAT 路由器里面,因为这时需要去访问因特网, NAT 路由器会走全球公网 IP 这个地址,因为 192.168.0.35 是一个内网 IP ,它是不能放到公网上去的,所以 NAT 路由器要把这个 IP 分组里面的源 IP ,转换成路由器的公网 IP ,也就是 125.23.2.7 ,然后数据才可以在公网上传输,最终会到达目的 IP 所在的网络,把数据给到主机 D , D 收到消息,解析之后,回给主机 C ,这时,回包分组对应的目的 IP 地址是 125.23.2.7 ,也就是 NAT 路由器的公网 IP 地址,因为主机 C 这个 IP 是内网 IP 地址,目的 IP 地址不能是内网的,只能是路由器对应的公网 IP 地址,源 IP 地址是 213.18.0.3 ,这个数据是可以在因特网上传输的,然后来到路由器的接口,路由器要把目的 IP 地址转换成内网 IP 地址,也就是主机 C 对应的 192.168.0.35 ,然后数据就可以在内网里面传输,把数据最终传给主机 C 。
路由器收到了消息之后,怎么知道这个消息,是传给 192.168.0.35 的呢?内网里面,还有其他的主机,还有其他的内网 IP ,为什么路由器就知道把这个数据传给主机 C ?这是因为装有 NAT 软件的路由器里面,维护了一张表,叫 NAT 地址转换表,这张表里面会记录方向,出表示离开私网,比如 C 发消息给主机 D ,这个时候,是要离开私网的,一旦离开私网,我们就把源的内网 IP 地址 192.168.0.35 转换成路由器的公网 IP 地址 125.23.2.7 , NAT 地址转换表里面会记录这个转换。回来的时候,主机 D 把数据发给主机 C ,这时就是进入私网,方向是入,我们会把目的 IP 地址,从公网的 IP 地址 125.23.2.7 ,在 NAT 地址转换表里面,对应的转换成新的 IP 地址 192.168.0.35 。当出去的时候,会有一条旧 IP 地址与新 IP 地址的记录映射,当回来的时候,如果还是这个公网 IP 回来,数据就送还给对应的内网 IP 。因为 NAT 路由器里面,维护了 NAT 地址转换表,可以使得,哪一台主机,出去了数据,最终收到的数据,也会进入到这台主机上面。这张表只记录了 192.168.0.35 ,和公网 IP 地址 125.23.2.7 的映射关系,如果这时候 主机 A 想上网,但公网 IP 地址已经被占用了,主机 A 就上不了网了,实际上,路由器可能会有几个公网 IP ,路由器不一定有两个接口,但是它可以有两个 IP ,一台主机也可以有多个 IP ,那么我们假设这个路由器有两个公网 IP ,主机 A 出去,走公网 IP 182.2.2.19 ,回来的时候,如果目的 IP 是 182.2.2.19 ,数据会给到 192.168.0.23 。那主机 B 就不能上网了?就是说 NAT 路由器中有 n 个公网 IP ,专用网内最多可以同时有 n 个主机接入到因特网。这样子就可以使专用网内较多数量的主机,轮流使用 NAT 路由器中有限数量的全球 IP 地址。比如 C 不上网了, C 的两条记录就没了,这张表是动态生成、动态变化的,内网主机轮流使用 NAT 路由器中有限数量的全球 IP 地址,这样可以使得专用网内较多数量的主机,轮流使用公网 IP 地址,但是这个同时上网是有限制的,假设只有两个公网 IP ,同时三个人上网,有个人上不了也挺难受的。
所以,有另外一个技术,网络地址与端口号转换 (NAPT) ,为了更加有效的利用 NAT 路由器上的全球 IP 地址,现在常用的 NAT 转换表,把传输层的端口号也利用上,传输层的端口号主要是为了标识进程,这样,就可以使多个拥有本地地址的主机,共用一个 NAT 路由器上的全球 IP 地址,因而可以同时和因特网上的不同主机进行相互通信。比如 192.168.0.35 有一个进程,需要访问因特网,这时,在 NAT 路由器里面,我们使用的 IP 地址,是 125.23.2.7 ,不过,它的端口使用 40001 ,同时, 192.168.0.23 也要上网,用的 IP 也是 125.23.2.7 ,端口号是 40002 ,端口号不一样,这样可以区分开,这时,如果因特网过来的数据, IP 是 125.23.2.7 ,端口号是 40001 ,我们就把数据给到 192.168.0.35 ,如果端口号是 40002 ,我们就把数据给到 192.168.0.23 ,这样也可以完成转换映射关系。这时,在路由器里面,只要有一个公网 IP ,我们就可以支持同时多个主机访问因特网。
这就是内网 IP 如何通过 NAT 路由器的地址转换表,实现因特网访问的过程。
对于私网 IP 和公网 IP ,我们还需要注意一点,公网上其他网络的主机,是不能直接访问私网 IP 的,也就是说,这种专用网内部的主机,不能充当服务器用,如果主机 C 是服务器,那么全世界各地的网络,都可以访问你,但是如果你只有内网 IP 的话,是不能充当服务器的,别人都访问不到你。因此因特网上的客户,无法请求专用网内的服务器提供的服务,访问不到,如果我们想让单位 A 里面的某一台主机 C 对外提供服务,这个时候需要申请一个公网 IP ,给到这台主机,比如说申请 120.1.2.11 这个公网 IP ,有了公网 IP 之后,因特网上的其他主机,就可以通过公网 IP 访问你,当然,路由器的对应接口,也需要有一个公网 IP ,假设是 120.1.2.19 ,这时,单位 A 实际上有一个公网的网络地址,因特网上的其他主机,就可以通过这个公网的网络地址,来访问单位内部的公网 IP 。一般来说,机器在企业内部的话,在外网是连接不到的。
微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。关注【老罗说AI】公众号,后台回复【文章】,获得整理好的【老罗说AI】文章全集。