我们此前说过,把iptables扮演成为网络防火墙也无非就是找一台iptables启用起来的服务器主机,它一定是位于我们的本地网络所有数据报文与非本地网络主机之间进行通信时必经的网络接口上或者叫网络上。
因此对于内网主机来讲,都要把这个主机的内网接口当做网关,而这个主机它有一个外网接口能够与互联网上(或外部网络)的其它主机通信。
我们知道,一旦我们把这台主机上的核心转发功能打开,它其实就扮演一个路由器或网关设备的角色。但这个路由设备有一个不好或不完善的地方在于它没有路由表它的默认路由表只有根本的几个,就是它自己本地的直连网络,即每一个网络接口所在的网络它可以到达。所以如果说本地内网的一台主机与另外一个网络中的主机通信时,如果是非本地网络的就要将报文发送给路由器了,路由器只能够知道如果对方请求的目标地址是另外一个接口所连接的另外一个主机的话是没有任何问题的。但是如果说路由器也不知道那个接口在哪就只能经过默认路由向外转发就可以了。但现在有一个问题,它通过默认路由转发出去了,假如说这个主机它所拥有的是一个互联网上的公网地址,对于这个内网中的来讲,想象一个基本问题,如果说互联网上有一个基本主机,比如test域的Web服务器()收到这个请求报文了,那接下来就应该予以响应了。
它收到这个请求报文后,这个请求报文的源地址应该是内网中的客户端IP,而它请求的目标地址是这个外网服务器的地址,假如称为SIP(Server IP),而源地址是CIP。很显然,当这个客户端发出请求走到路由器的时候,请求报文源地址是CIP,目标地址是SIP。路由器收到之后发现打开了核心转发,于是查找本地的默认路由的路由表,它也能转发出去,如果没有默认路由路由表就转发不出去了。如果有默认路由路由表,于是它有可能也会交给下一跳等等转发,中间可能经过n个路由设备,最终送达到了这台服务器,服务器一看目标地址是自己,于是接收下来请求、处理请求、构建响应报文。在它响应时,源地址成了目标地址,目标地址成了源地址了,所以此时源地址是SIP,目标地址是CIP,CIP如果是一个私有地址的话,而私网地址是不可能在互联网上被路由的,互联网上的任何一个路由器的路由表都不会添加私网地址的,也就意味着如果说本地主机的一个通信目标是一个私有地址段中的地址,那结果是它只在本地中找私有地址网段,而不会通过互联网的公网路由器发送的或者说公网上的路由器压根就识别不了这样的网络,即便识别这样的网络它也只认为这是本地的。
因此,这个报文无路如何能送给通过公网连接起来的这台主机吗?显然是不可能的,那接下来会带来什么结果呢?请求报文能送出但响应报文回不来,并不是服务器端不响应,服务器端只要有源地址都会响应的,但是响应时由于目标地址是一个私网地址,我们公网上的路由器设备是不会对私网地址在互联网上进行路由的,所以你的响应报文将无法通过公网路由会送到客户端地址。
如上图,我们可以想象成左边为一个本地网络,右边作为公网服务器来讲,它也有可能是一个局域网络。我们说过,互联网就是把各个局域网络连接起来的一个大网络而已,是一个连接各局域网的网络,所以我们把它叫做局域网的互联网(Internet)也是这个道理。
各位还需要想的一个问题是,路由器在网络和网络之间进行连接时必须要用的一个基本设备,网络和网络之间进行连接时要层层执行路由转发的。那这些路由有的是公网路由,它里边所添加的只是能识别互联网上公网的网络所可达路径的路由器,或者我们运营商所提供的路由,我们可以理解为就是这样一个路由。但是还有一类路由设备是我们的私网路由,它只是在我们的局域网内部、公司内部或组织内部自己构建时让多个网络可以彼此之间互相联通的。如上图:本地网络中左侧有个小网络是192.168.0,右侧有一个172.16.0,那很显然它们两个不在同一个网络当中,所以这个时候我们要让它们两个网络中通信就需要在自己的私网当中架设一个路由设备,让这两个网络之间的主机能够互相通信,中间它有可能经过多条路由设备,但不管怎么讲,在两个路由设备上面所配置的就是私网地址的路由信息。所以我们说,它们无论怎么路由都无法穿越我们本地的这么一个局域网网络。按照我们TCP/IP的规范,它们是不可以也不可能在公网路由器上被配置的路由条目,因此若本地网络中的主机发送的是私有地址请求的话那它只可能在本地局域网内所有的私网路由所能送达的位置,是不可能能够通过公网路由能够送出去的。