VLAN 间的路由
我们在 VLAN 的实验中学习到 VLAN 能够很好的隔离网路,减小广播域,但是隔离了网络的广播域也就意味着它们将处于不同的网络之中,这样仅仅依靠数据链路层的帧是无法相互通信的。所以若是我们需要 VLAN 间能够相互通信就必须得依靠网络的第三层网络层,通过路由的功能来连接两个不同网络使之相互通信。
使两个 VLAN 相互通信我们称之为 VLAN 间的路由,而实现这一功能的方法有两个:
单臂路由
SVI 接口
单臂路由的实现
单臂路由(one-armed router 或者 router-on-a-stick)是指在路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同 VLAN(虚拟局域网)之间的互联互通。
单臂路由就是依靠的路由器的路由功能,因为二层交换机没有办法实现路由。同时一个接口只能接收来自一个 VLAN 的数据(因为一个接口不能隶属于多个 VLAN),传统的 VLAN 间路由方式便是在 Switch 与 Router 之间连接多个端口以保证多个接收多个 VLAN 的数据,但是当 VLAN 很多的情况下,Router 不可能满足这么多端口,所以出现了子端口的实现,这是一种依靠软件实现的逻辑上的端口。这样便只需要通过一根物理连接线来实现多个 VLAN 接口的连接。
我们通过这样的一个实验来实现单臂路由的功能:
实验目的:配置实现单臂路由
实验材料:三台交换机、一台路由器
实验方法:
拖动三台交换机、一台路由器至画布,两台用作模拟PC,一台用所模拟 Switch,一台用作 Router
配置路由器、交换机的名字与连接线路
配置交换机中的 vlan,以及三个接口的模式
配置两台 PC 的 IP 地址与默认网关(下文详解),他们处于不同的 VLAN 中
配置路由器的子接口,以及子接口的 IP 地址
尝试使用 PC 相互 ping 通
1.构建实验环境,在画布中拖出三台交换机与一台路由器,并修改他们的设备名称,同时修改两台用作模拟 PC 的交换机图标,然后相互连接。结构如图所示:
2.配置交换机相关的内容,在 Switch1 中配置两个 VLAN,分别为 vlan 2:test2、vlan 3:test3。同时将与 PC 连接的两个端口分别配置为 access vlan 2 与 access vlan 3,还有与路由器相连接的端口配置为 trunk 模式。若是与路由器相连接的端口不配置成 trunk 模式将无法发送多个 vlan 的数据包。
#创建两个 vlan
Switch1#conf t
Switch1(config)#vlan 2
Switch1(config-vlan)#name test2
Switch1(config-vlan)#ex
Switch1(config)#vlan 3
Switch1(config-vlan)#name test3
Switch1(config-vlan)#ex
#修改三个端口的模式
Switch1(config)#int e0/0
Switch1(config-if)#switch trun en do
Switch1(config-if)#switch mode trun
Switch1(config-if)#no sh
Switch1(config-if)#exit
Switch1(config)#int e0/1
Switch1(config-if)#switch access vlan 2
Switch1(config-if)#no sh
Switch1(config-if)#ex
Switch1(config)#int e0/2
Switch1(config-if)#switch access vlan 3
Switch1(config-if)#no sh
3.修改 PC 端口的 IP 地址
# PC1 的 IP 地址
PC1(config)#int e0/0
PC1(config-if)#no switch
PC1(config-if)#ip add 192.168.1.1 255.255.255.0
PC1(config-if)#no sh
# PC2 的 IP 地址
PC2(config)#int e0/0
PC2(config-if)#no switch
PC2(config-if)#ip add 192.168.2.1 255.255.255.0
PC2(config-if)#no sh
此时我们可以尝试通过 PC1 去 ping PC2,我们会发现肯定是 ping 不通的,因为他们处于不同的网段同时处于不同的 VLAN 中。
3.为两台 PC 配置默认网关(默认网关用于将数据包发送至路由端口,下文详解)
#配置 PC1 的默认网关
#首先关闭此设备的路由协议
PC1(config)#no ip routing
#配置默认网关
PC1(config)#ip default-gateway 192.168.1.2
#配置 PC2 的默认网关
#首先关闭此设备的路由协议
PC2(config)#no ip routing
#配置默认网关
PC2(config)#ip default-gateway 192.168.2.2
可用回到特权模式中,通过 show ip route 查看,是否成功配置:
4.在路由器中配置逻辑子接口,分别用于接收 vlan2 与 vlan3 的数据。因为是接收来自交换机发来的信息,所以该子接口的数据封装模式与交换机中的相同,交换机此处 trunk 模式使用的是 dot1q 的封装方法,所以子接口中的也必须是这个方法。(还记得在 VLAN 划分实验中我们将到 trunk 模式主要作用是添加 VLAN 标签)
#进入端口配置
Router1(config)#int e0/0
#创建第一个子端口
Router1(config-if)#int e0/0.2
#开启服务
Router1(config-if)#no sh
#设置封装的方式与关联的 vlan ID
Router1(config-subif)#encapsulation dot1Q 2
#设置该端口的 IP 地址
Router1(config-subif)#ip add 192.168.1.2 255.255.255.0
#创建第二个子端口
Router1(config-subif)#int e0/0.3
#设置封装的方式与关联的 vlan ID
Router1(config-subif)#en do 3
#设置该端口的 IP 地址
Router1(config-subif)#ip add 192.168.2.2 255.255.255.0
这样我们就成功的配置好了我们的子端口,我们可以通过 show ip int brief 查看接口信息中是否有这两个子接口的配置,还可以通过 show vlans 查看子接口的状态,以及通过 show ip route 命令来查看当前的路由信息,若是有两个直连路由表项,说明我们配置成功的生效了:
5.完成了所有的配置,准备工作,我们再次尝试通过使用 PC1 去 Ping PC2 发现 5个点都变成了感叹号,表示所有的 ICMP 包(ping 工具使用的是 ICMP 协议)都得到了响应,PC1 可以与 PC2 正常通信了:
通过整个的配置过程我们会发现交换机会把所有的数据包都通过那条单链路发送给 Router,让 Router 为我们提供路由的功能。虽然这样我们实现了 VLAN 间的路由但是存在着两个弊端:
Switch 与 Router 之间是单链路连接,很容易出现单点故障。若是该链路出现问题或者相关的两个端口出现故障,那么所有的 VLAN 之间将无法通信。
为了实现路由功能需要单独添加一台 Router 设备,增加了成本。
SVI的实现
由上述的两个原因,为此出现了一种新的功能,便是在三层交换上的 SVI 接口,这样便不需要单独添加一台路由器了。
SVI 是 Switch Virtual Interface 的简称。它是三层交换机上的一个虚拟端口,类似于 Router 上的子端口,由软件实现。每个 SVI 只能关联一个 VLAN,设置一个 IP 地址。
基于上个实验,我们做出这样的修改:
去除 Router 设备
设置 SVI 接口地址
我们将去除 Router 设备,由我们的三层交换机来实现相关的功能,将之前的网关地址设置为 SVI 的 IP 地址即可
1.去除 Router 设备,关闭 Switch 上的 e0/0 接口,同时配置 SVI 的 IP 地址:
Switch1(config)#int e0/0
#关闭端口
Switch1(config-if)#sh
#进入 vlan 2 的配置模式
Switch1(config)#int vlan 2
#为 vlan 2 的 SVI 配置 IP 地址
Switch1(config-if)#ip add 192.168.1.2 255.255.255.0
#激活该接口
Switch1(config-if)#no sh
#退出 vlan 2 的 SVI 配置
Switch1(config-if)#ex
#进入 vlan 3 的配置模式
Switch1(config)#int vlan 3
#为 vlan 3 的 SVI 配置 IP 地址
Switch1(config-if)#ip add 192.168.2.2 255.255.255.0
#激活该接口
Switch1(config-if)#no sh
Switch1(config-if)#ex
#开启路由功能
Switch1(config)#ip routing
#关闭 cef 的数据包转发机制(在实际的设备中不需要该命令)
Switch1(config)#no ip cef
如此便完成了 SVI 的配置,我们可以在 Switch 的特权模式中使用 show ip route 可以看到此时我们有两个直连的路由信息。同时我们还可以尝试使用 PC1 去 ping PC2。(若是配置与我完全一致,但是 ping 不通,可以尝试在 Switch 的全局模式中使用 no ip cef 命令)
此处使用 no ip cef 命令关闭转发机制便是该版本的镜像并没有很好的在 Linux 中实现其提供的功能,可能该镜像的设备本是使用硬件辅助实现该功能等等。若是不关闭 cef 的转发机制,将导致你明明配置无误,却无法正常的通信。
由此我们便成功的配置了单臂路由与 SVI 接口来成功的实现 VLAN 之间的相互通信了。
默认网关
在之前的实验中我们经常提到默认网关之一名词,接下来我们便来了解一下该名词的含义。
默认网关由两个词组成默认与网关。其中什么叫做网关呢?
网关(Gateway)就是一个网络与另一个网络连接的关口。
比如成都市与广州市都只有一个邮局,而每个邮局前都会有一个专职的负责人,此时若是成都市的小明想与广州市的小红联系只能通过这样的一个过程:
首先将写好的信交给邮局的专职负责人,
邮局的专职负责人查看信封上的地址,发现该地址并不是本省中的地址,并且邮编写的是广东省的地址。
成都的邮局专职负责人便将该消息转发送给广州的邮局专职负责人,让他交给收件人
广州的邮局专职负责人收到信封后,发现目的地址便是本省中的地址,便寻找该地址将消息送到收件人的手中。
在这个例子中邮局的专职负责人便是网关。负责将本网段中的消息发送给其他网段的网关的接口。
默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。只要指定了默认网关之后,只要主机在发送数据包之前由目的地址与其子网掩码做 AND 运算得出的网络号与本机的网络号不同,便将数据发送给默认网关,由默认网关处理数据该如何发送。
在全局模式中我们可以通过这样的命令来实现默认网关的配置:
ip default-gateway 192.168.1.2
通过 show ip route 我们可以看到这样的结果:
路由协议的分类
我们了解到数据包发送到其他网段是通过查询路由表,然后决定下一跳发送的路径。而路由表中的表项是如何得来的呢?
首先以路由的角度将协议分为:
可路由协议(Routed Protocol):利用网络层完成通信的协议,例如 IP、IPX 等,该对象是被路由的。
路由协议(Routing Protocol):主要用于创建与维护路由表,本质是实现路由功能,该对象是路由其他对象的,例如 RIP、OSPF、IGRP、IS-IS 等等。
而路由表中的信息分为两大类:
直连路由:也就是该设备中的接口所配置的 IP 地址与其所处的网络
远程路由:也就是发向其他路由设备所处的 IP 地址与其所处的网络
直连路由是在 IP 接口地址配置后便自动添加的,而远程路由的信息来源又会分为两大类:
静态路由:由人工配置的下一跳地址,在网络拓扑发生变化时同样需要人工修改,但是配置完成之后并不会占用过多的系统资源,与网络的带宽。在静态路由中有缺省路由(也就是默认路由)、浮动路由的存在。适用于小型网络与末梢网络
动态路由:通过动态路由协议,设备与设备之间相互通信,相互学习。再由某种路由算法计算出下一跳的路径,当有多条路径的时候还有优先级的排序,并且在网络拓扑发生变化的时候,会自动学习网络中的变化适当改变路径,适用于大型网络。
其中动态路由协议有这样几种分类的标准:
按算法分为:距离矢量(典型的协议有 RIP、IGRP、BGP)、链路状态(典型的协议有 OSPF IS-IS)、混合算法(典型的协议有 EIGRP)
按照是否发送子网掩码分为:有类(典型的有 RIP、IGRP)与无类(支持子网划分与路由汇总,典型的有 OSPF 等)
按照使用的网络规模分为:IGP(Interior gateway protocol),内部网关协议,几乎所有的路由协议都属于内部网关协议)与 EGP(Exterior Gateway Protocol),外部网关协议,BGP 用于自治系统之间的路由计算)
其中按照算法分的距离矢量表示的是根据源到目的的跳数来计算(之前有提过,下一跳表示去往下一个路由);所谓的链路状态便是多方面考虑如链路的开销、链路上的所有的相邻路由器、网络带宽,网络拥塞等等综合考虑;所谓的混合算法便是这两个的结合考虑。
其中的自治系统是表示属于某一个特定的网络机构中路由集合。在自治系统内部使用的路由协议就是内部网关协议,而自治系统之间的是外部网关协议。
反应路由性能的参考对象主要还是收敛时间与管理距离(在上一节实验我们都提到过):
收敛时间(convergence time):从网络拓扑变化到网络中所有的路由器都知道这个变化的时间就叫收敛时间;
管理距离(administrative distance):用于综合评价路由协议性能参数,描述路由协议计算路由条目的准确度与可信度。
静态路由的配置
所谓的静态路由便是由纯手工的配置在路由表项中,这样的配置路由方式非常的耗时,效率不高,并且在网络拓扑发生改变的时候需要手工的一项一项的修改,十分的麻烦,事情总是利弊双面的,有弊就有利,虽然麻烦但是就因为不会自动学习修改所以不会发送通告占用带宽,也不会占用太多的 CPU 与 RAM 这样的系统资源。并且可以手工控制数据包的转发路径,因此静态路由在小型企业中还是十分常用。
静态路由的配置很简单,只需要通过这样的一条命令即可:
ip route 目的网络 掩码 网关地址 [接口ID 可选]
我们可以通过这样的例子来学习静态路由的配置:
还是使用上述 SVI 的实验环境,我们在 Switch 上添加一个路由,并且配置为 202.203.0.0 这个网段下:
#配置 Switch
Switch1(config)#conf t
Switch1(config)#int e0/0
Switch1(config-if)#no switch
Switch1(config-if)#ip add 202.203.0.1 255.255.255.0
Switch1(config-if)#no sh
Switch1(config-if)#ex
#配置 Router
Router1(config)#int e0/0
Router1(config-if)#ip add 202.203.0.2 255.255.255.0
Router1(config-if)#no sh
Router1(config-if)#ex
此时 PC 肯定是无法 ping 通 202.203.0.2 地址的,因为虽然在 Switch 中有该网段的路由表项(因为是直连网段),但是数据包在 Router 接收到之后,响应时发现路由表中无 192.168.1.0 网段表项,不知道怎么转发回来,便只有丢弃该数据包了。
此时我们在 Router 中配置一条静态路由,指定一条线路使得接收到 202.203.0.0 这个网段的数据包可以转发给 192.168.1.0 网段:
#Router 配置
Router1(config)#ip route 192.168.1.0 255.255.255.0 202.203.0.1
通过 show ip route 我们可以看到静态路由成功的添加了:
并且此时可以 ping 通对端的 IP 地址:
这便是静态路由的添加,手动为返回的数据包指明下一跳。所以静态路由的格式便是:IP 的目的地址以及子网掩码的表示符合条件便转发向指定的对端接口 IP 地址。当然静态路由的配置后面的 IP 地址可以改成出端口 ID,例如上述的指令同样可以写成:
Router1(config)#ip route 192.168.1.0 255.255.255.0 e0/0
这只是一条记录,并且只是 192.168.1.0 网段可以 ping 通,若是 PC2 去 ping 还是会不通,因为 PC2 在 192.168.2.0 网段,路由表中没有可以匹配的项。此时我们发现所有的地址都会通过 Switch,基本设备都是围绕它来的,他知道所有的路由路径,我便可以直接设置一个默认路由,也就是只要路由表中没有目的地址所匹配的表项,就都丢给默认路由。
既然如此也就代表着默认路由要匹配所有项,因为表中一旦无匹配就让他路由,换个角度就代表他得匹配所有项,而匹配所有项的地址便是 0.0.0.0,同时子网掩码也是这个值。因为 0 表示的是任意的(wildcard)
默认路由就是一种特殊的静态路由,所以若是要配置默认路由只需要将上述的命令中的目的地址与子网掩码改成 0.0.0.0 0.0.0.0 即可。
Router1(config)#ip route 0.0.0.0 0.0.0.0 202.203.0.1
我们可以在刚刚的环境中实验一次,先擦除原先的静态路由然后再配置:
#试试此时 PC1 能通,而 PC2 不能通 202.203.0.2
#然后擦除这条静态路由
Router1(config)#no ip route 192.168.1.0 255.255.255.0 202.203.0.1
#然后我们可以退出查看下路由表,使用 PC1、PC2 再次 ping 202.203.0.2
#会都是点,表示不通
#添加默认路由
Router1(config)#ip route 0.0.0.0 0.0.0.0 202.203.0.1
#在尝试 ping 202.203.0.2,此时 PC1、PC2 都是感叹号
这就是便是默认路由只要路由表中没有匹配的项就让它来路由。
当然按照我们之前所说的冗余思想,避免单点故障使得一个数据包到达目的地可能有多条路径,此时我们便可以配置浮动路由,所谓的浮动路由便是当优先级较高的路径出现问题时,还有一条路径能够及时的替补上来。而优先级的体现在于我们上节实验中所提到的 AD,当值越小的时候其优先级便越高。
浮动路由的配置很简单,就是在添加备选路径时,把静态路由命令的网关地址修改以及后面添加 AD 值,该值的取值范围是 0~255。例如:
Router1(config)#ip route 192.168.1.0 255.255.255.0 202.203.0.1
Router1(config)#ip route 192.168.1.0 255.255.255.0 202.204.0.1 100
但是三层交换机并不支持浮动路由,需要路由器才能实现。
课程作业
在画布中拖动两台路由器,实现这样的拓扑结构,同时配置浮动路由使得在一条线路断掉时,还是可以工作。(需要借助环回接口,在全局模式中 int loopback 0(这个为编号,自取) 便可以像配置端口一般为其配置 IP 地址了)
验证方式:
首先查看路由表中的静态路由是 192.168.1.2,并且能够 Router 设备能够 ping 通 202.204.1.1
然后 shutdown s2/0 端口,再次 ping 202.204.1.1 还是能通,并且此时的路由表的静态路由项发生变化
# Router 配置
conf t
int s2/0
ip add 192.168.1.1 255.255.255.0
no sh
exit
int s2/1
ip add 202.203.1.1 255.255.255.0
no sh
exit
ip route 202.204.1.0 255.255.255.0 192.168.1.2
ip route 202.204.1.0 255.255.255.0 202.203.1.2 100
# Router2 配置
conf t
int s2/0
ip add 192.168.1.2 255.255.255.0
no sh
exit
int s2/1
ip add 202.203.1.2 255.255.255.0
no sh
exit
#配置环回接口0
int loo 0
ip add 202.204.1.1 255.255.255.0
注意:此处使用的两个都是串口,因为 GNS3 的路由串口实现没有问题,浮动路由只需要一个端口断开,另外一边不通就知道断开了便启用浮动路由。但是若是使用的以太口,GNS3 实现出来与真实设备不同,不同之处在 GNS3 用以太口实现的话检测不出对端断开了,必须同时断开此端口与对端端口才行,所以此处使用串口。