我们知道要使网络包能够在设备间正确地传输,则要求每台设备都应该有一个唯一且不重复的地址。就好像快递配送一样,如果每个人的地址都一样,那么快递员就无法知道应该把快件送给谁。早期的互联网就是这么设计的。比如,公司内网需要接入互联网时,应该向地址管理机构申请IP地址,并将它们分配给公司里的每台设备。此时,没有内网和外网之分,所有客户端都是直接连接到互联网。
但随着互联网的普及,接入互联网的设备也变得越来越多。如果还采用早期的互联网接入方式,可以预见的是,在不久的将来,可分配的固定地址被用光,新的设备无法接入互联网……
私有地址与公有地址
为了解决固定地址易被分配完的问题,互联网采用了私有地址(用于内网分配的地址)和公有地址(原固定地址)分别管理的方式。假设有A、B两家公司,它们的内网是完全独立的,即两家公司的内网之间不会有网络包传输。在这样的情况下,就算A公司的某台机器和B公司的某台机器具有相同的IP地址也没有关系。只要在每家公司自己的局域网内,地址不重复即可。
如此一来,公司内部设备就无需分配固定地址,从而节省了大量的IP地址。当然,就算公司内网,也不可以随意分配地址,这需要符合一定的规则,其中可以用于内网分配的地址,我们称之为私有地址,而原来的固定地址则称为公有地址。
下面展示了可用于内网中的私有地址范围:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
上面的这些私有地址没有什么特别之处,它们只不过是将公有地址中还没有分配的一部分拿出来规定只能在内网中使用而已。地址管理机构不会对这些私有地址进行管理,它们不需要申请,任何人都可以自由使用。但是,如果在同一内网中存在相同的地址就无法传输网络包,故必须避免在同一内网中出现相同的地址。
我们采用私有地址和公有地址后,虽然节省了一部分地址,但我们知道,实际上各个公司内网之间不是完全独立的,而是需要借助互联网进行相互通信。此时问题就出现了,因为在网络中出现了相同的地址,所以包就无法正确传输。
为了解决这个问题,公司内网采用了如下结构,即将公司内网分成两部分,一部分是对互联网开放的服务器,另一部分则是对互联网隔离的内部设备。其中对互联网开放的部分分配了公有地址,因为分配的是公有地址,所以可以和互联网直接通信。而公司内部设部则分配了私有地址,因此内网中的设备不能和互联网直接收发网络包,而是需要通过一种机制才能和互联网连通,这种机制就是地址转换。
地址转换原理
地址转换的基本原理是在转发网络包时对IP头部中的IP地址和端口号(TCP、UDP)进行改写。
下面我们通过在公司内网访问互联网中的某个Web服务,来分析包是如何传输的。
首先,公司内网设备与Web服务进行TCP连接操作的第一个包被转发到互联网时,地址转换设备(路由器,或某些防火墙)会将发送方IP地址从私有地址改写成公有地址(地址转换设备的互联网连接地址),并将端口号改写成随机一个空闲的端口号。然后,改写前的私有地址和端口号,以及改写后的公有地址和端口号,会作为一组相对应的记录保存在地址转换设备内部的一张地址和端口对应表中。
之后,被改写后的包就被发送至互联网,最终到达Web服务器,然后服务器返回一个响应包。因为发送给Web服务器的包是通过地址转换设备改写过后的包,所以Web服务器返回的包也只会被地址转换设备接收。
接下来,地址转换设备会从地址和端口对应表中通过公有地址和端口号找到相对应私有地址和端口号,并改写接收方信息,然后将包发给公司内网中的原始发送方设备。
在随后的包收发过程中,地址转换设备只需根据地址和端口对应表中的对应记录,在改写地址和端口号后,再对包进行转发即可。当访问互联网的操作全部完成后,地址对应表中的该条记录就会被删除。
在对外只能使用一个公有地址的情况下,可以用不同的端口号来区别内网中不同的终端。
从互联网访问公司内网
对于从公司内网访问互联网的网络包,即使发送方私有地址和端口号没有保存在地址转换设备的地址和端口对应表中也可以正常转发。因为用来改写的公有地址就是地址转换设备自身的地址,而端口号只要随便选一个空闲的端口就可以了,这些都可以由地址转换设备自行判断。然而,对于从互联网访问公司内网的包,如果在地址和端口对应表中没有记录就无法正常转发。因为如果地址和端口对应表中没有记录,就意味着地址转换设备无法判断公有地址与私有地址之间的对应关系。
所以也就是说,除非公司主动允许,否则无法从互联网向公司内网发送网络包。这种机制具有防止非法入侵的效果。
如果想要能够从互联网访问公司内网(从互联网访问到私有地址的服务器),则可以通过以下两种方式进行配置:
- 将用于外网访问的服务器放在地址转换设备的外面,并为它分配一个公有地址。
- 将服务器的私有地址手动添加到地址转换设备的地址和端口对应表中。此外,如果是通过域名访问的话,还需要将这个地址转换设备的公有地址添加到DNS服务器中。