VXLAN_二层互通__无三层网关
VXLAN_二层互通__无三层网关
前言
此实验是VXLAN的第一个小实验,也是起步的实验,很基础、很简单,同样也很重要。
VXLAN的基础概念我们就不介绍了,但我们在做这个实验时,得先了解一下,VXLAN工作在哪一层呢?不管书里面怎么讲,我始终认为BGP、VXLAN这样的协议虽然还是三层相关的路由协议,但是已经非常像一个真正的应用了,甚至我们可以把他当应用去看待,因为它们也会侦听具体的套接字,比如BGP的会侦听TCP179,而VXLAN会侦听UDP的4789端口,如下所示:
bridge-domain 10
vxlan vni 10
int g1/0/1.10 mode l2
encapsulation dot1q vid 10
# 上面这两条命令一敲,vxlan进程直接就起来了
dis udp status
0x80EE0438 8 0.0.0.0:4789 0.0.0.0:0 0
那么从侦听的应用去看待VXLAN之间的交互你会发现非常的简单,VXLN在工作时会生成BD子进程,任何接口都可以去绑定,一旦绑定上之后,BD进程就会“把守”在这个接口上,任何从这个接口路过的数据帧都会由BD“抓走”附加VNI之后送给VXLAN主进程,VXLAN主进程会根据nve接口上的指定进行封装将数据扔给对端,对端即是在NVE接口里面的指定的目标IP。
实验
- 实验环境介绍
- PC1和PC3属于同一个VLAN、同一个网段都是192.168.10.x网关
- PC1和PC都没有设置网关,只有IP和掩码
- 实现目标:
- 实现PC1和PC3之间的同网段互访
- 实验思路:
- 第一步:让三台CE底层的underlay先跑起来,使用OSPF即可,保持CE1和CE2 lookback0接口能通信
- 第二步:在CE1或CE2上将vlan 10的流量引入到BD10当中,设置NVI并最终交给对端。
第一步 underlay
第一步:三台CE之间的underlay配置
# CE1
sys i
sysn CE1
# 创建互联VLAN
vlan 13
int l0
ip add 10.0.1.1 32
int vlan 13
ip add 10.0.13.1 24
ospf 1 router-id 10.0.1.1
a 0
network 10.0.1.1 0.0.0.0
network 10.0.13.1 0.0.0.0
# 物理接口要放行
int g1/0/0
undo shutdown
port link-ty trunk
port trunk a v 13
##############################
# CE3
sys i
int l0
ip add 10.0.3.3 32
vlan batch 13 23
int vlan 13
ip add 10.0.13.3 24
int vlan 23
ip add 10.0.23.3 24
ospf 1 router-id 10.0.3.3
a 0
network 10.0.3.3 0.0.0.0
network 10.0.13.3 0.0.0.0
network 10.0.23.3 0.0.0.0
int g1/0/0
undo shutdown
port link-ty trunk
port trunk all vlan 13
int g1/0/1
undo shutdown
port link-ty trunk
port trunk all vlan 23
# CE2
sys i
sysn CE2
int l0
ip add 10.0.2.2 32
vlan 23
int vlan 23
ip add 10.0.23.2 24
ospf 1 router-id 10.0.2.2
a 0
network 10.0.2.2 0.0.0.0
network 10.0.23.2 0.0.0.0
int g1/0/0
undo shutdown
port link-ty trunk
port trunk all vlan 23
qu
#####
# 验证
[CE1]ping -a 10.0.1.1 10.0.2.2
PING 10.0.2.2: 56 data bytes, press CTRL_C to break
Reply from 10.0.2.2: bytes=56 Sequence=1 ttl=254 time=11 ms
Reply from 10.0.2.2: bytes=56 Sequence=2 ttl=254 time=7 ms
[CE2]ping -a 10.0.2.2 10.0.1.1
PING 10.0.1.1: 56 data bytes, press CTRL_C to break
Reply from 10.0.1.1: bytes=56 Sequence=1 ttl=254 time=10 ms
Reply from 10.0.1.1: bytes=56 Sequence=2 ttl=254 time=12 ms
第二步 VXLAN
vxlan的配置也非常简单,vxlan的关注的问题非常是以下几点,把这几个问题回答完了,VXLAN就知道如何配置了。
- 去哪个VLAN里面抓数据?根据VLAN ID,创建BD-ID
- 去VLAN接口里面把BD绑进去,这样从这个接口流过的数据帧都会被BD抓走交给VXLAN进程
- VXLAN封装什么NVI?自己的源是多少?目标是多少?
先回答前两个问题。由于PC1是VLAN 10,所以我们希望VXLAN去VLAN 10里面抓数据, 想要抓数据VXLAN得先创建BD,BD的ID我们可以跟将要抓的VLAN保持一致,也用10吧!为了能抓到数据,下面我们应该VLAN 10的接口里面绑定BD;这个VLAN 10 接口指的什么?通常是指的二层的子接口。
# CE1上的具体配置
bridge-domain 10
quit
int g1/0/1
undo shutdown
port link-type trunk
int g1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
quit
# CE2上的具体配置
bridge-domain 10
quit
int g1/0/1
undo shutdown
port link-type trunk
int g1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
quit
接着我们再去回答第三个问题,通过BD抓到的数据帧发送给谁?本地的源IP又是什么?涉及到这种带有源目IP的,一般都得起一个虚拟隧道接口,VXLAN当中的虚拟隧道接口是NVE接口,我们从里面规定好源和目标IP即可。
NVE接口有点类似于GRE接口,是通用型接口,很多VLAN的流量的都可以从这里面经过,那我们怎么样标识我们的VLAN 10呢?其实这事不用NVE进行标识,当BD通过下游的流量抓到VXLAN之后就附加携带VNI,所以在交换机内部的数据帧是携带VNI的,我们只需要告诉NVE接口,某种VNI的数据帧发给谁就可以了!
# CE1
bridge-domain 10
vxlan vni 10 # 就是封装报文时需要用到VNI,非常重要,在交换机内部也会携带的;
quit
interface nve 1
source 10.0.1.1
vni 10 head-end peer-list 10.0.2.2 # 正确的理解是将vni是10的数据帧的发给10.0.2.2
# CE2
bridge-domain 10
vxlan vni 10
quit
interface nve 1
source 10.0.2.2
vni 10 head-end peer-list 10.0.1.1
## 验证,一连UP了并不代表另一边也UP,这个UP是单向的
[CE1-Nve1]dis vxlan tunnel
Number of vxlan tunnel : 1
Tunnel ID Source Destination State Type Uptime
4026531842 10.0.1.1 10.0.2.2 up static 00:00:10
[CE2-Nve1]dis vxlan tunnel
Number of vxlan tunnel : 1
Tunnel ID Source Destination State Type Uptime
4026531841 10.0.2.2 10.0.1.1 up static 00:00:49
思考和分析
问题一:interface nve 1 后面这个1是啥?两边需要一致吗?
这个1仅仅是一个进程的标识,两连不一致也没关系,不在数据包当中体现,不重要。
问题二:两端的NVI是VLAN ID 吗?
VNI的VLAN ID没啥关系,VNI和VLAN ID不是一回事儿。
问题三:两端BD可以不一致吗?,BD与VNI之间什么关系?
可以的,没问题,交换机内部调度的时候只认VNI。
BD与VNI之间是1:1的关系
问题四:如何理解这个配置?
interface nve 1
source 10.0.2.2
vni 10 head-end peer-list 10.0.1.1
vni 20 head-end peer-list 10.0.1.1
nvi 10 head-end peer-list 10.0.1.1的含义,将本端VNI是10的数据帧通过本隧道发给10.0.1.1;
数据包转发流程
- 数据包从PC1开始出发,目标IP地址192.168.10.3,到达g0/0/2接口之后被打上vlan-10的TAG进入交换机内部
- 数据帧从SW1的g0/0/1出来后到达CE1的子接口,由于该子接口与BD绑定,所以这个数据帧被CE1内部被携带VNI=10
- CE1根据NVE的配置vni 10 head-end peer-list 10.0.2.2将数据帧调度到nve接口进行封装,NVI还是要携带的,在数据帧的最外层重新加入源和目标IP地址(10.0.2.2)
- CE1在路由表当中查询路由发现到达10.2.2.2的路由是一条OSPF路由,下一跳是CE3,数据到达CE3最终转发到CE2上;
- CE2收到之后将最外层的IP拆除之后,发现数据包携带的VNI是10,于是在本地查找发VNI等于10的BD,找到之后,数据帧再次移交给相应的BD
- BD收到之后拆掉VNI,找到真正的原始的数据帧发现目标IP是192.168.10.3,查询路由之后从CE2的子接口发出。