具有多个子网的网络
在上一篇文章中,我提到了具有多个子网的网络。
在这个网络中有3台路由器,各种设备分散在它们构成的3个子网中。
与交换机的即插即用不同,在不进行任何配置的情况下这3个子网是不完全联通的,要想让他们以一定的规则联通或者隔离,则需要配置相应的路由表和防火墙规则。
其中的静态路由的原理和配置方法在本文根据上面图中的网络进行说明。
尝试从PC访问NAS
假设我们现在要从PC访问NAS。
PC的默认网关是RouterC,也就是说默认情况下将数据发送到RouterC。
但是此发往NAS的IP报文的目的IP是10.0开头的LAN地址,不能被发送到Internet,所以这个包会被RouterC丢弃,或者被提供商的终端设备丢弃。
因此为了访问NAS,需要做的第一件事就是告诉PC:“发往NAS的数据应该发给RouterB而不是RouterC”。
PC路由表(网关)设置
操作系统都有一个自己的路由表,主要用来记录网关(默认网关以外的),以及管理多个网口。
以Windows为例,在Windows 10中,可以使用以下命令将静态路由添加到路由表中。
route -p add 10.0.0.0 mask 255.255.0.0 10.1.0.1
这条命令在Windows中添加了一条“把目的ip为10.0.x.x的IP包发往10.1.0.1”的静态路由规则。
对于符合路由表中某条规则的IP报文,Windows会按照这条记录的规则发送,而没有相应静态路由的报文才会发送到默认网关,所以添加了这条静态路由之后发送给NAS的报文将会被首先发送到RouterB,而不是被设为默认网关的RouterC。
这是解决问题的第一步。
路由器B
RouterB直接连接到NAS所在的SubnetA,可以学习到SubnetA的存在,自动生成通往SubnetA的路由表,因此不需要任何手动设置。
请注意,RouterB处于局域网随,所以没有配置NAT地址转换。经过RouterB转发的报文的源地址仍为PC的IP地址。
source | 10.1.0.2 |
destination | 10.0.0.3 |
来自NAS的回复
RouterB的SubnetA侧接口(实际使用的是家用路由器,说是“WAN口”可能更好理解。但是因为没有配置NAT,路由器本身并没有内外之分)和NAS位于同一子网,所以可以通过ARP协议学习到NAS的MAC地址。因此来自PC的IP报文在通过RouterB后被RouterA的交换机部分直接转发给NAS。
到此为止,来自PC的访问终于抵达了NAS。但是NAS必须将处理后的相应返回给PC。
首先NAS生成如下的IP报文:
source | 10.0.0.3 |
destination | 10.1.0.2 |
NAS连接在RouterA的LAN上,所以一般会把默认网关设置为RouterA。但是真实的网络拓扑是NAS连接一台交换机,这台交换机上还连接了RouterA和RouterB,对于NAS来说两台路由器是一样的,没有WAN/LAN之分。对于路由器也一样,两边是对称的,只是一边固定连接了一台交换机而已。
如果NAS的默认网关就是RouterB,那么就没有任何问题。不过如果NAS的网关是RouterA,则需要一些设置,这些返回的IP报文才能顺利抵达PC
主要有两种设置方法:
设置NAS的静态路由表
这与之前在PC上做所的设置相同。
即在NAS上添加静态路由规则,把发往10.1.x.x的报文发送给RouterB的SubnetA侧端口10.0.0.2。
在RouterA上配置静态路由
或者,在不更改NAS设置的情况下,在RouterA上配置静态路由,让RouterA接收到发往10.1.x.x的报文时不是按照默认动作发往Internet或者直接丢弃,而是发给RouterB的SubnetA一侧的端口,即10.0.0.2。
我这里的RouterA是一台思科企业级路由器,需要通过IOS命令来配置,具体说明请参见之关于思科路由器配置的文章。
Router(config)# ip route 10.1.0.0/16 10.0.0.2
参数分别是目的子网,子网长度(子网掩码)和下一跳地址。和Windows的命令思路完全相同。
两种方法之间的区别
这两种方法的结果相同,区别只是通信路径略有不同:
- 在诸如NAS之类的终端设备上设置静态路由可以缩短通信路径(不通过默认网关路由),并且不会在RouterA上产生不必要的流量。
- 在路由器上设置静态路由会增加一些通信量,但是泛用性更强,不需要对子网中的每个设备一一进行配置。
关于NAT
以上设置基于一个前提:不在RouterB上启用NAT。
如果在RouterB上启用了NAT,则来自PC的IP报文的source地址将被RouterB的SubnetA侧地址代替。对于NAS来说完全等同于子网内的通信,所以不需要对NAS或者RouterA进行配置。
但是这样本来对称的路由器就有了内/外之分,SubnetA(外部)中的设备将无法直接访问SubnetB(内部)中的设备(尽管配置端口映射可以一定程度上解决)。
而且NAT本身是解决IP地址短缺的一种办法,并不应该在IP地址充足的局域网中滥用。