随着实验室规模不断扩大,对外IP渐渐不够用。于是在原有网络的基础上,重新划出一块区域作为实验室“内网”,这面临着两个需求:内网机器必须访问互联网;实验室其他外网IP的机器能够访问内网机器。以下是规划中的网络拓扑图:
概念
路由
路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动。这里需要明确两点:
路由不等于路由器,很多人一提起路由,就想到路由器,实际上这是不对的。路由器仅仅作为路由的一个硬件实现,同样,我们还可以借助一些软件实现“软路由”。
既然路由是通过互联的网络把信息从源地址传输到目的地址的活动,那么存在着从源地址到目标地址的“路径”,至于这个“路径”是如何找到的,可以通过一系列算法得到动态路由,或者直接手动设置静态路由。
我们平常设定的“网关”,实际上就相当于手动设置的静态路由。
路由器
路由器(router)是路由的实现者,它工作在OSI第三层(网络层)上、具有连接不同类型网络的能力并能够选择数据传送路径的网络设备。路由器有三个特征:工作在网络层上、能够连接不同类型的网络、能够选择数据传递路径。它能理解数据中的IP地址,如果它接收到一个数据包,就检查其中的IP地址,如果目标地址是本地网络的就不理会,如果是其他网络的,就将数据包转发出本地网络。
TTL
TTL(Time To Live)是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。一个解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
NAT
NAT,网络地址转换(Network Address Translation),是通过将专用网络地址(如企业内部网Intranet)转换为公用地址(如互联网Internet),从而对外隐藏了内部管理的 IP 地址。这样,通过在内部使用非注册的 IP 地址,并将它们转换为一小部分外部注册的 IP 地址,从而减少了IP 地址注册的费用以及节省了目前越来越缺乏的地址空间(即IPV4)。同时,这也隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。
在一个典型的配置中,一个本地网络使用一个专有网络的指定子网(比如192.168.x.x或10.x.x.x)和连在这个网络上的一个路由器。这个路由器占有这个网络地址空间的一个专有地址(比如 192.168.0.1),同时它还通过一个或多个因特网服务提供商提供的公有的IP地址(叫做“过载” NAT)连接到因特网上。当信息由本地网络向因特网传递时,源地址被立即从专有地址转换为公用地址。由路由器跟踪每个连接上的基本数据,主要是目的地址和端口。 当有回复返回路由器时,它通过输出阶段记录的连接跟踪数据来决定该转发给内部网的哪个主机;如果有多个公用地址可用,当数据包返回时,TCP或UDP客户机的端口号可以用来分解数据包。对于因特网上的一个系统,路由器本身充当通信的源和目的地址。
我们通常使用的路由器一般都自动集成了NAT。
LAN路由
Windows Server 系列,可以在路由和远程访问中设置LAN 路由,这仅仅是路由的一个实现,不存在NAT功能。
最初规划
最初,我采用最简单的路由器组网方式,来组建实验室网络:在网络中接入路由器,设置路由器WAN端IP地址为222.200.176.144,对内网段为10.96.32.*。这时,内网地址能轻松访问外网机器,但是,外网机器却不能访问内网机器:
执行tracert命令,结果如下:
这说明,tracert试图通过默认路由(222.200.176.254)来查找路径,这显然到达不了目标。
既然我们的内网是通过222.200.176.144这个IP连接互联网的,因此我需要在我的机器里手动添加一条静态路由,告诉网络,如果访问10.96.32.*段的东西,直接从222.200.176.144这个地址寻找就好了,不要麻烦222.200.176.254。
route add -p 10.96.32.0 mask 255.255.255.0 222.200.176.144
在执行tracert,结果……
#@¥#@!¥@
这是为什么呢?
请教某网络牛人,得到答案如下:
路由器上是做了NAT的,当信息由本地网络向因特网传递时,源地址被立即从专有地址转换为公用地址。由路由器跟踪每个连接上的基本数据,主要是目的地址和端口。当有回复返回路由器时,它通过输出阶段记录的连接跟踪数据来决定该转发给内部网的哪个主机。这就意味着,NAT和路由冲突!或者说,路由器下的网络,只允许内网主动连接外网,不允许外网直接访问内网。
解决办法一
既然知道原因,就寻求解决方案,牛人给出的方案有两个:
- 取消路由器的NAT功能,改用CCProxy之类的代理提供内网机器连接互联网。
- 在路由器上开设端口映射。
不过,以上两个方案都是无法接受的:CCProxy共享版只支持有限的客户端,而且,对于某些不支持代理服务器的软件,使用该方案无疑断送了这些软件上网的可能!至于第二种方案,很多服务所使用的端口是不确定的(例如FTP的被动模式),根本无法一一设定这些端口。
添加双网卡服务器
既然上述的两个解决方案都出局了,还有其他的途径吗?这个问题如鲠在喉,不吐不行。为此我在网上查了些资料,终于想到了一个可行的解决方案:既然外网机器无法通过路由器(222.200.176.144)访问内网,那么是不是可以开辟另一条路呢?于是我在内外网间增加一台Server 2008服务器,该服务器有两块网卡,一块接入外网(222.200.176.148),另一块则接入内网(10.96.32.148)。同时,在路由和远程连接中添加“LAN路由”:
在本机的静态路由修改为:
route add -p 10.96.32.0 mask 255.255.255.0 222.200.176.148
再执行tracert,结果:
再度 #@¥#@!¥@
这是为什么呢?
牛人联系不上,只好自己解决。从上图tracert的记录,数据包到了222.200.176.148,就不知道该如何发送到目标了。按理说,在222.200.176.148的机器上,开启了LAN路由服务,应该没什么问题啊?百思不得其解。
不是办法的办法
最后,只能采用以下方案,暂时解决了问题:
在内网的机器上添加一条静态路由,指明:通过IP10.96.32.148访问222.200.176.*网段:
route add -p 222.200.176.0 mask 255.255.255.0 10.96.32.148
尝试一下在本机tracert 10.96.32.144,奇迹般的可以了!
最后的网络拓扑图如下:
小节
我在内网和实验室外网间,设置了两个节点——路由器和部署了LAN路由的双网卡服务器——如果内网的机器想访问Internat(非实验室外网),则以路由器为网关,进行网络地址转换。如果内网机器想和实验室外网互联,则通过双网卡服务器进行地址交换。在一定程度上解决了NAT和LAN路由不能共存的问题。