本文的题目有些可疑,有些不可理解!但是如果我说出一个简单而基本的原则之后,你就不会困惑了,那就是:你的外联路由器外网口的地址并不是分给你的,只有你的外联路由器的内网的地址才是分给你的!熟悉Linux NAT MASQUERADE的人可能对此有些不解,这是显然的,因为MASQUERADE控制下的NAT并不是一个真正的NAT,它只是一个地址代理!这听起来有些不可思议,不可思议的原因是因为大家都在用这种NAT,因为它方便!
如下图所示:
你认为addr1是谁的地址?是运营商分配给企业路由器的内网地址还是运营商本身的地址?如果路由器部署在公网边缘,那么答案是前者,如果路由器部署在企业内部,可能答案是后者。现在我们考虑第一种情况,假如运营商分给企业一个地址段addrX/maskX,那么该addrX/maskX要作为Secondary IP/mask配置在图中add2的那个接口上,此时addr1仅仅作为一种寻址的需要而存在,如果此时路由器是一个Linux路由器,使用了MASQUERADE规则,那么所有发出的数据包的源地址将全部被转换为addr1,而addr1无论在管理还是在实际的其它控制方面,都不是一个应该出现的源地址,重申一遍,它仅为寻址而存在,它并不代理任何客户的访问!鉴于运营商管理的方便,一般的运营商仅将addr1作为寻址需要而分配,真正分配给企业的地址段配置在addr2对应的接口。
因此,很多的情况下,在企业出口路由器的内网口将会配置两个地址,一个是内网地址,Secondary IP则是运营商分配给该企业的地址段中的一个,内网数据包外出时,将其源地址转换为运营商分配给该企业的地址段地址池中的随机一个。
但是一般的IT企业内部网管人员或者研发人员却不这么想,他们认为运营商分配的网段处在addr1的那个网口上,实则这些人的想法仅仅将路由器看成了一个代理,代理所有的内网用户,并且选择其源地址为外网地址即addr1。这是一种误会,十足的误会,实际上,addr1侧的地址仅仅是作为寻址需要的,这也方便了运营商,他们仅仅需要配置到达某个自己客户网络的下一跳即可,而这个下一跳就是各个企业外联路由器的外网口地址。这是一种真正的互联网路由方式,但是不知道什么时候,有人将NAT扩展成了代理,进而在Linux上产生了MASQUERADE,虽然我在这句话中用了“虽然”这个词,然而这不是一种悲哀,这只是一个特定的应用。
真正的NAT需要配置一个pool,实施NAT的路由器的地址不必在这个pool中,路由器的内网口配置两个地址,一个内网地址,另一个是运营商分配的地址段中的地址-不在pool中,注意,这个运营商分配的地址段不会配置在路由器的外网口,如果玩过Cisco设备,inside,outside将能解释这一切!如果你没有玩过,那么就沉湎于Linux吧,better later than never!