作者:一天,公众号:网络之路博客(ID:NetworkBlog)。让你的网络之路不在孤单,一起学习,一起成长。
新的改变
随着时间的推移,之前的办公区2租户离开了,办公区一与三由于业务关系合并成一个团队,顺便把办公区二区域一起一起租用下来了,原有的网络结构不变,但是带来了一个问题,由于业务的需要,网段之间需要进行互访,比如Client2也需要访问办公区三下面的server,接下来就来了解一个新的技术VLAN间路由,会从早期的解决方案以及目前主流的解决方案来进行介绍。
先来介绍一个常见疑惑
很多朋友都会在疑惑,最开始大家都在一个局域网(同一个网段),然后为了安全性进行了VLAN划分(顺便把网段也隔开了),现在又希望把网段之间打通,就会觉得这不是没事找事,搞的这么麻烦;其实不是这样的,我们要先分清楚问题所在。
在同一个局域网内随着主机的增多,带来的广播域就越大,对于资源的浪费以及安全性都是一个很大的问题,在这个基础上面划分了VLAN
划分VLAN后,把一个大的局域网,隔离成了几个小的逻辑局域网,这样很好的解决了广播域带来的资源浪费,以及如果某个VLAN出现问题,不会影响到其他的VLAN。
现在需要互通,跟之前一个大的局域下互通是不一样的,之前大的互通会遇到上面说的问题,但是现在是VLAN隔离后在互通是解决了上面的问题的前提下在进行互通,意义是不一样的,所以实现VLAN互通既能让二层的广播域以及影响传播范围进行控制,又能进行互通。
在实际环境中这样的需求很常见,比如打印机在VLAN 10里面,其他VLAN区域的终端想使用打印服务,对于一个中小型来说,不可能说每个区域都去放一台打印机,另外就是服务器区域,实际中可能服务器为了安全性单独一个VLAN,其他用户又需要去访问这个服务器的资源。
路由器是如何让两个网段之间互通的
在网络基础里面我们知道路由器的接口工作在三层模式,天生就隔离广播域,假设我们把路由器的2个接口当成2个VLAN来看待(每个VLAN之间就是一个独立的广播域),那路由器是如何让两个网段之间互通的呢?
简单一个小实验来看看,左边是一个网段,PC1的地址192.168.10.1,网关192.168.10.254,右边PC2的地址192.168.11.1,网关192.168.11.254,网关地址都配置在路由器上面,PC各自设置好地址跟网关。
[Huawei]interface g0/0/0
[Huawei-GigabitEthernet0/0/0]ip address 192.168.10.254 24
#设置接口地址为192.168.10.254
[Huawei]interface g0/0/1
[Huawei-GigabitEthernet0/0/1]ip add 192.168.11.254 24
#设置接口地址为192.168.11.254
通了,我们来看看它如何通的。
(1)PC1 ping 192.168.11.1,通过计算发现对方与自己不再一个网段,于是准备把数据包发给网关,但是并不知道网关的MAC地址。
(2)PC1发送ARP请求报文,询问192.168.10.254的MAC是多少,路由器收到后进行ARP回应
(3)PC1知道了MAC后,记录自己的ARP表里面,于是可以开始封装,把这个ICMP数据包发送出去。
(4)路由器收到以后,开始解封装,发现找目标MAC找的是自己,三层的目的IP不是,但是它带有路由功能,于是它会执行一个操作,查询路由表。(如果是PC收到,但是目的IP不是自己就直接丢弃了)
<Huawei>display ip routing-table //通过该命令可以查看设备的路由表
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 10 Routes : 10
Destination/Mask Proto Pre Cost Flags NextHop Interface
127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0
127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0
127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
192.168.10.0/24 Direct 0 0 D 192.168.10.254 GigabitEthernet0/0/0
192.168.10.254/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0
192.168.11.0/24 Direct 0 0 D 192.168.11.254 GigabitEthernet0/0/1
192.168.11.254/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/1
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
查询的内容为,IP包里面的目的IP地址在路由表里面是否有对应信息存在,路由器发现路由表中有一个条目是匹配的 192.168.11.0/24是包含了192.168.11.1,来单独看看这条的内容。
[Huawei]display ip routing-table 192.168.11.0
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Table : Public
Summary Count : 1
Destination/Mask Proto Pre Cost Flags NextHop Interface
192.168.11.0/24 Direct 0 0 D 192.168.11.254 GigabitEthernet0/0/1
Destiantion/Mask:目的网络与掩码,192.168.11.0/24,表示整个192.168.11.0的网段,如果有192.168.11.1~192.168.11.254的流量过来就会匹配上这个条目。
Proto:路由协议,表示这个路由条目是什么方式学习到的,该里面为Direct(直连),直连的意思就是接口上面我们手动配置的地址,它会自动的生成一个直连的路由条目。路由协议还很多,后续会慢慢接触。
NexthHop:下一跳,指的是当数据包匹配上这条路由的时候交给谁处理。
Flags:路由标记,通常为D,这个参数暂时可以不用了解。
Interface:出接口,从哪个接口发出去。
这个路由条目的整体意思是,当一个数据包过来匹配上了该条目,路由器发现该条目属于直连路由,表示目标地址就在自己的身后,从G0/0/1发送出去,直连路由的下一跳你会发现就是自己本身。
(5)路由器查询后,知道192.168.11.1在G0/0/1的身后网络,准备把这个数据包发送给192.168.11.1,但是它查询ARP表,并没有对应的缓存,于是它发起ARP请求,从G0/0/1发出去
(6)PC2收到以后,发现请求的是自己的MAC,ARP响应,最终路由器学习到了PC2的MAC,在ARP表项里面可以看到,重新封装二层,源MAC为自己出接口地址,目标MAC为PC2,然后ICMP包发送过去。
(7)PC2收到ICMP数据包后,进行ICMP replay。
PC2发现,192.168.10.1与自己不再一个网段,于是把数据交给路由器处理,注意这个时候它是可以直接封装的,因为在之前路由器来请求自己MAC的时候,已经知道了路由器的MAC是多少,会记录下来,直接通过查询ARP表看网关的MAC地址多少。
(8)路由器收到后,会解封装,发现二层的MAC是自己,三层不是,于是查询路由表。
<Huawei>display ip routing-table 192.168.10.0
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Table : Public
Summary Count : 1
Destination/Mask Proto Pre Cost Flags NextHop Interface
192.168.10.0/24 Direct 0 0 D 192.168.10.254 GigabitEthernet0/0/0
发现匹配了一条路由,该路由是直连,路由器就知道192.168.10.1就在自己的身后,于是从路由表记录中找到出接口,重新把二层封装,源MAC为出接口,目的MAC为PC1,把数据发送出去。
这个时候同样它不需要去请求PC1的MAC地址,因为之前PC1在请求的时候,路由器也学习到了PC1的MAC
(9)最终PC1收到回应,把回显信息在窗口显示出来。
从这个小实验中能够得到的信息
(1)只要路由器配置了接口地址,它会自动的去生成一个直连的路由表信息,它的作用就是当有数据抵达路由器的时候,发现找的目标网络在路由表的条目中为直连网络,路由器就知道访问的目标网络在自己的身后,这样路由器就可以直接处理,把数据包从对应的条目出接口发送出去。如果没有直连路由的话,那数据包过来以后,路由器发现自己的路由表里面没有对应条目就会丢弃了。
假设我把G0/0/0口个关掉后
对应的直连路由就消失了,因为接口都关闭了,这个路由条目自然就失效了。
(2)只要是带有路由特性功能的设备,它具有一个其他设备不具备的功能,就是通过路由表来转发,比如上面的192.168.10.1访问11.1,到了路由器后, 路由器会查询路由表,通过路由表中给的信息定位到出接口发送出去,并且二层信息重新封装。而其他不具备这个特性设备收到这样的一个数据包后,解封二层发现是自己,解析解封装三层,发现目的地址找的不是自己,就丢弃了。
(3)路由表的路由条目可以从很多方式学习到,其中优先级最高的就是直连,这种路由我们称为直连路由,这个很形象,PC1与PC2都是直连在路由器上面的,而且路由器具备路由特性,所以能够完成两个不同网段之间的通信。
(4)路由器还很多功能,目前我们只是慢慢接触到了路由表,其余的功能后面会慢慢接触。
理想中解决方案
像这样同时有三个VLAN需要互访,如果按照一个VLAN一个接口网段来说的话,路由器需要三个接口才能够完成这三个VLAN的对接,比如VLAN10的对应路由器1号口(网关192.168.255.254),VLAN20对接路由器的2号口(网关192.168.254.254),VLAN30对应路由器的3号口(192.168.253.254),这样一旦接口配置了对应的信息,又具备路由功能,就可以通过路由表转发完成整个VLAN间的通信,那我们就来实际操作一下。
注意的是,路由器要选用(Router)型号的,否则接口不够,这个型号正好自带4个3层接口,这里接口对应关系
实现的方法是在路由器的三个接口分别配置三个VLAN的网关地址,然后把交换机的三个接口分别对应access vlan 10、vlan 20、vlan 30,这样当对应VLAN的流量过来就能够通过路由器进行转发。
(1)VLAN以及链路类型配置说明
这个拓扑是引用的之前的,所以办公区一、二三以及核心对接的配置是一样的,可以直接引用之前的,这里就不在详细讲解了,就给出配置。
办公区1交换机配置
sysname bg1
#
vlan batch 10 30
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20 30
#
interface Ethernet0/0/2
port link-type access
port default vlan 10
#
interface Ethernet0/0/3
port link-type access
port default vlan 30
办公区2交换机配置
sysname bg2
#
vlan batch 20
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20 30
#
interface Ethernet0/0/2
port link-type access
port default vlan 20
#
interface Ethernet0/0/3
port link-type access
port default vlan 20
办公区3交换机配置
sysname bg3
#
vlan batch 10 30
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20 30
#
interface Ethernet0/0/2
port link-type access
port default vlan 30
#
interface Ethernet0/0/3
port link-type access
port default vlan 10
核心交换机配置
sysname Core
#
vlan batch 10 20 30
#
#
interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20 30
#
interface GigabitEthernet0/0/2
port link-type trunk
port trunk allow-pass vlan 10 20 30
#
interface GigabitEthernet0/0/3
port link-type trunk
port trunk allow-pass vlan 10 20 30
这个就是整体之前的一个配置了,当前实现的只是VLAN内同一个网段的互访。
(2)交换机上行的三个口配置
interface GigabitEthernet0/0/22
port link-type access
port default vlan 30
#
interface GigabitEthernet0/0/23
port link-type access
port default vlan 20
#
interface GigabitEthernet0/0/24
port link-type access
port default vlan 10
这个配置大家应该能够明白为什么要这样配置了,当vlan 10的PC需要访问vlan 20的PC,流量会交给网关,网关在路由器上面,所以用access把标签去掉,然后交给路由器,这样路由器可以直接处理。
(3)路由器的配置
路由器配置
[Huawei]sysname GW
[GW]interface GigabitEthernet0/0/0
[GW-GigabitEthernet0/0/0]ip add 192.168.255.254 24
[GW-GigabitEthernet0/0/0]int g0/0/1
[GW-GigabitEthernet0/0/1]ip add 192.168.254.254 24
[GW-GigabitEthernet0/0/1]int g0/0/2
[GW-GigabitEthernet0/0/2]ip add 192.168.253.254 24
路由器的接口三个都配置上对应的IP地址,并且有一个特点,配置上去后接口就变成up了,这个回头我们补充下,先测试下。
(4)测试
可以看到已经访问成功了,我们来分析下它是如何通的。
VLAN间是如何互通的
很多流程是前面链路类型内容中已经讲解过的,这里在进行复习与巩固。
(1)Client2想发起对于服务器的HTTP访问,先发起TCP三次握手,发现服务器是192.168.255.6,自己在192.168.254.0/24网段,不在一个网段内,想把SYN包发送给网关,由于没有ARP缓存,发送ARP请求,从网卡发送出去。
(2)办公区二从E0/0/2口收到后打上VLAN 20的标签,学习记录源mac+vid+源接口的同时,向VLAN 20内除源以外的所有接口发送出去,E0/0/1由于是trunk,保持VLAN 20的标签不变透传出去。
(3)核心交换机从G0/0/2收到以后,由于是trunk链路,所以允许通过,学习记录mac+vid+源接口,也在VLAN 20内进行泛洪,当数据从G0/0/23发出的时候,由于这个接口属于access,会剥离标签,最终抵达路由器的G0/0/1口。
(4)路由器收到以后,发现是找的自己,回应ARP,然后又从G0/0/1发回来,同时将client 2的IP与MAC记录在ARP缓存内。
(5)核心交换机从G0/0/23收到后,打上VLAN 20的标签,学习记录MAC+vid+源接口,然后通过MAC地址表查询发现client 2在G0/0/2口(MAC地址表有记录),从G0/0/2发出,该接口属于Trunk链路保持标签发送出去。
(6)办公区二交换机收到后,E0/0/1属于Trunk,接收通过,学习记录MAC+vid+源接口,然后通过MAC地址查询发现client 2在E0/0/2(MAC地址表有记录),从E0/0/2发出,该接口属于access链路,去掉标签发送,最终Client2知道了网关的MAC,可以安心的发送TCP 三次握手了。
(7)Client2发送TCP SYN,中间经过交换机都二层转发会抵达路由器。
(8)重点:路由器收到以后,解封装发现二层找到是自己,三层找的不是自己,自己支持路由功能,查询路由表,发现去往192.168.255.6在路由表里面是直连路由
可以从G0/0/0发出,但是目前不知道服务器的MAC,于是发送ARP请求,中间交换机二层转发(学习记录源MAC+VID+源接口,泛洪),服务器响应,得到MAC后,路由器记录在ARP缓存里面,重新封装二层源MAC为出接口(G0/0/0),目的MAC为服务器二层头部,将SYN包从G0/0/0发出去,中间交换机在二层转发,最终服务器收到这个SYN包,后面就是三层握手完毕后,然后发送HTTP请求,服务器响应 ,流程跟刚刚是一样的。
整体总结下来:
交换机完成的是二层转发,其中如果目的为全F、组播MAC、未知单播帧则泛洪处理,如果是MAC表中学习到的,通过表项转发。路由器完成的是三层转发(通过路由表查询),包含ARP请求从哪个口发出,以及怎么去往目的地。经过三层转发,对应的源目MAC都进行了变化。每个VLAN对应一个网段,有一个网关地址。
现实中解决方案(单臂路由)
理想中的了解完了,回归现实,现实就是早期的路由器接口很少,很多就2个接口,一个用于接外网,一个用于接内网,那如果遇到这种多个VLAN转发那就没法实现了,所以在早期就提出来了一个解决方案,引入了一个新的概念叫做子接口。听名字就应该可以猜到了它的作用了,不是接口少了吗,把一个接口划分成多个子接口,它就像多个逻辑的物理接口一样,可以配置多个网关地址了,这样像当时候access解决不了一根线路传递多个VLAN,于是trunk链路出现了,解决了这个问题,同样这里也是希望一个线路能够传递多个VLAN间的流量,并且能够相互转发,这个就是子接口,也叫做单臂路由子接口是如何实现的一个物理接口划分成了多个子接口,那它怎么去对应到VLAN上面去呢?直接从实战去感受下。
只留一根线,核心交换机G0/0/24到路由器G0/0/0,需要修改下配置
出口路由配置更改
[GW]interface g0/0/0
[GW-GigabitEthernet0/0/0]undo ip add
[GW-GigabitEthernet0/0/0]int g0/0/1
[GW-GigabitEthernet0/0/1]undo ip add
[GW-GigabitEthernet0/0/1]int g0/0/2
[GW-GigabitEthernet0/0/2]undo ip add
//去掉接口地址
又出现了一个比较有趣的提示,显示G0/0/0的down状态,跟之前有一个up的提示,待会我们来看看怎么回事。
交换机配置修改
[Core]interface g0/0/24
[Core-GigabitEthernet0/0/24]undo port default vlan
[Core-GigabitEthernet0/0/24]port link-type trunk
[Core-GigabitEthernet0/0/24]port trunk allow-pass vlan 10 20 30
从这个配置里面大家应该就想到了,利用trunk在一根线里面来透传这些VLAN抵达路由器那边,那路由器那边怎么去识别到这些VLAN呢,之前我们配置的路由器三层接口它是没有二层口的特性的,不支持链路类型,那它就无法识别这些VLAN,但是这个只是针对的物理口,子接口出现以后呢,它把VLAN跟某个子接口进行了关联,这样使得子接口能够去识别VLAN,并且终结它,下面看看配置应该就理解了。
路由器子接口配置
[GW]interface g0/0/0.10 //物理口是G0/0/0,后面的.10表示子接口的编号
[GW-GigabitEthernet0/0/0.10]dot1q termination vid 10 //终结dot1q的报文,识别并剥离vlan
[GW-GigabitEthernet0/0/0.10]arp broadcast enable //开启后,能够识别广播报文
[GW-GigabitEthernet0/0/0.10]ip address 192.168.255.254 24 //配置IP地址
[GW]interface g0/0/0.20
[GW-GigabitEthernet0/0/0.20]dot1q termination vid 20
[GW-GigabitEthernet0/0/0.20]arp broadcast enable
[GW-GigabitEthernet0/0/0.20]ip address 192.168.254.254 24
[GW]interface g0/0/0.30
[GW-GigabitEthernet0/0/0.30]dot1q termination vid 30
[GW-GigabitEthernet0/0/0.30]arp broadcast enable
[GW-GigabitEthernet0/0/0.30]ip address 192.168.253.254 24
实际测试下
访问是OK的,在来分析下它是如何通的,来理解这个子接口的功能。(之前重复介绍的细节就省略了,不然显得太过于啰嗦了)
(1)client 2发送ARP请求,由于不同网段需要知道网关的MAC地址。
(2)办公区二与核心交换机实现二层转发,进入办公区二打上VLAN 20的tag,中间trunk透传抵达核心,核心从G0/0/24发出,由于是Trunk链路,保持Tag不变。
(3)数据抵达出口路由器的物理接口G0/0/0
发现配置了子接口,并且拥有终结的能力,路由器能够去处理VLAN tag的数据,dot1q termination vid 20(有VLAN 20的数据过来,去掉Tag,也就是终结802.1q)
有了这个命令arp broadcast enable,路由器能够在子接口处理广播报文,否则你会发现处理不了广播ARP报文,导致业务不通,同时将Client 2的IP与MAC地址放入ARP缓存表。
(4)路由器进行ARP回应,路由器怎么怎么知道要从哪个接口发送出去呢?因为有了ARP缓存表项,直接从对应接口发出。
(5)核心收到的接口属于trunk,所以会保持不变的交给办公区二交换机,该交换机发现从E0/0/2发出,该接口属于access,untag标签,发送给client 2。
(6)Client 2得到路由器网关的地址,可以开始进行封装二层。
(7)client 2开始发送SYN,建立TCP三次握手,办公区二以及核心交换机流程之前一样,执行二层转发,路由器收到以后,会通过子接口 dot1q termination vid 20 终结该VLAN标签(去掉标签)。
(8)路由器查路由表发现是去往192.168.255.6,是直连网段,查询ARP表看是否有关于255.6的MAC,发现没有
192.168.255.0网段在G0/0/0.10接口,于是将这个ARP请求包发送出去,发出去的时候会打上VLAN 10的tag,中间交换机二层转发,抵达服务器,服务器进行回应,回应的包抵达路由器的子接口后终结VLAN,同时将server的IP与MAC放入ARP表项中,然后通过路由表查询,将数据包转发给client 2。(转发的时候会将二层头部信息更改)
整个核心内容总结
(1)交换机通过二层转发以及链路类型的规则进行处理数据
(2)路由器收到后,如果存在子接口,会使用与数据里面包含的vlan tag相同的所在接口进行处理,去掉标签,通常叫做终结VLAN
(3)路由器是通过查询路由表后,知道从哪个接口发送出去,包括ARP查询从哪个口发出,以及目的地址
(4)一个数据包在出路由器的时候,如果是通过子接口发出,会打上对应的VLAN ID。
(5)所以在实际中使用子接口就一定是配合着二层的交换机,交换机这边配置成trunk模式。
(6)早期的路由器起子接口的方式也被称为单臂路由(通过一个物理接口,逻辑的划分了多个子接口)
(7)interface g0/0/0.10跟dot1q termination vid 10是没有实质性的关联的,只是通常方便查看,把子接口的ID与VLANID对应起来
(8)路由器把学习到的IP、MAC对应关系放入ARP表项中,后续只要存在,直接调用ARP表项即可
(9)三层转发后,二层头部需要重新封装,因为二层链路发生了变化。
华三设备上面实现单臂路由
二层交换机下面有两个网段,VLAN10与VLAN20需要互访,通过路由器单臂路由实现。
华三路由器的配置
[H3C]sysname GW
[GW]interface g0/0.10
[GW-GigabitEthernet0/0.10]vlan-type dot1q vid 10
[GW-GigabitEthernet0/0.10]ip address 192.168.10.254 24
[GW-GigabitEthernet0/0.10]quit
[GW]interface g0/0.20
[GW-GigabitEthernet0/0.20]vlan-type dot1q vid 20
[GW-GigabitEthernet0/0.20]ip add 192.168.20.254 24
[GW-GigabitEthernet0/0.20]quit
华三路由器的配置跟华为的命令有点小区别,它不需要开启广播,实现方式一样的,在接口下面终结对应的VLANID,配置网关地址。另外一个有趣的事情,就是在配置了dot1q vid 10后,子接口全部提示up,这个跟华为又有点不一样,待会来看。
二层交换机配置
[GW]sysname SW
[SW]vlan 10
[SW-vlan10]vlan 20
[SW-vlan20]quit
[SW]interface g1/0/48
[SW-GigabitEthernet1/0/48]port link-type trunk
[SW-GigabitEthernet1/0/48]port trunk permit vlan 10 20
[SW-GigabitEthernet1/0/48]int g1/0/1
[SW-GigabitEthernet1/0/1]port access vlan 10
[SW-GigabitEthernet1/0/1]int g1/0/2
[SW-GigabitEthernet1/0/2]port access vlan 20
[SW-GigabitEthernet1/0/2]quit
交换机对接路由器的口配置trunk,允许VLAN 10 20通过,对应接PC的配置成access。
测试下(PC记得设置地址)
测试通了,通信的原理跟之前介绍是一样的,也是抵达接口后终结VLAN (去掉标签),然后查询路由表进行转发。
关于接口状态的事
在华为路由器里面,如果只要有物理线路存在,那么它有一个状态会显示是这样
提示这个G0/0/0链路的协议 IP 状态变成up。
所以这个图就很好理解了,当把IP地址去掉以后,就提示状态变成down了,因为该接口没有IP存在,协议起不来。
在华三里面显示不一样,它只要接了物理线路,physical以及protocol都是up的
这个就是每个厂商显示的方式不一样,思科的设备跟华为处理方式一样,不配置IP
是down的。知道这个后期我们在排错的时候会方便很多,这里作为一个了解。
“承上启下”
早期解决方案已经介绍完毕了,介绍早期的解决方案是更方便理解现在主流的解决方案的工作流程,另外一个呢,很多朋友觉得早期的解决方案就淘汰了,其实不是,可能常用到的是主流的,往往有些特别的网络环境,就只能使用这种方式才能实现(包括目前华为的VXLAN中也是以子接口方式),所以就有这两个原因,花了一篇的时间讲解早期的解决方案,下一篇进入正式的主流的解决方案里面。