网络操作系统VyOS应用实践(二)

前言

本文将会通过实验,应用VyOS的实用功能,本章主要介绍路由功能。最后介绍一下笔者自己开发的VyOS路由配置库。

简单路由

在VyOS中,我们可以为不同的LAN创建一个以太网接口,LAN中的机器把网关设为VyOS中对应接口的ip地址,就可以得到一个简单的路由。不同LAN中的机器都可以连通。

如下图示,只要在VyOS上设置三个对应LAN的ethernet interface就完成了自动路由的第一步。

我的虚拟网络配置:

在这个实验中,使用三个vmware虚拟机:machine1,machine2和vyos。
在实验中使用了两个VMnet,分别为VMnet3和5,全部为host-only模式。

整个实验的拓扑如下:

machine1只添加一个网络设备,连到VMnet5上:

machine1的配置文件(重点是把网关设为VyOS中两个接口的地址):

machine2连VMnet3:

machine2的配置文件:

vyos要同时连接VMnet5和VMnet3,保留一个NAT模式的网卡用于透过ssh管理系统。

一开始,host-only下两个虚拟机machine1与machine2之间ping不通:

完成上述准备后,登陆VyOS进行设置:
目前eth1和2并没有任何接口设置:

先对两个虚拟网卡进行设置:

从上面可以看到,在configure模式中可以通过run执行在普通模式中才能用的命令。

测试一下是否能ping得通machine2:

测试ping machine1:

这样一来,两台虚拟机间就通过VyOS虚拟路由实现通讯了。在这种情况下,只要VyOS设置好了端口,就可以让两个本来无法通讯的虚拟机实现通讯。

通过简单路由,可以很方便地实现host-only模式下vm的互连,这就允许我们灵活地创建不同的拓扑。

静态路由

静态路由的配置比较简单,管理员可以掌控一切。无论是Cisco IOS还是Vyatta/VyOS,静态路由都需要管理员一条一条规则进行配置,静态路由的路径相对固定,如果网络拓扑改变,需要管理员再次手动设置。

静态路由默认情况下是私有的,不会与其他路由器交换信息。静态路由也是单向性的,意味着我们想让中间隔着两台路由的两台机器(m1,m2)连通,我们不仅要配置一个从m1到m2的路径,还要配置一个从m2到m1的路径,如果发现配置了路由但是ping不通,那就得检查是否有没有设置回程的路径了。

静态路由作为CCNA中的一项很基本的能力,原理和实现是足够简单的,下面将使用VyOS实现静态路由。

我们使用四个虚拟机,machine1和machine2的任何设置都不变,按照原有的设定。增加多一个vyos2虚拟机,组成一个这样的网络:

参考上面VMnet的设定,修改vyos的网络适配器设置:

对于vyos2,建议重新安装一个系统而不是直接克隆vyos。如果直接克隆,会有意想不到的错误。(安装vyos实际上用不了10分钟),这是vyos2的的设置:

进行好外部的设定后,登陆vyos,设置好eth1和2的地址(eth0用dhcp,这里忽略其设置过程):

设置eth1接口和其ip地址。如果想让路由真正起效,machine1必须把网关设为eth1的地址,指向节点m1:

设置eth2接口,description参数说明该接口指向路由r2:

检查网络接口是否已经配置完毕。检查信息是很重要的一项行动,很多问题并不是因为没掌握该技能,而是疏忽导致的。

上面是vyos的设置,设置完毕后,重启一下。

下面是vyos2的设置,设置完也同样重启一下:

重启完两个作为路由器的虚拟机后,登陆vyos,设置静态路由。在VyOS中,设置静态路由可以用这样的格式进行:

在Vyatta/VyOS中,大多数功能都是通过set protocols来设置的,比Cisco IOS的同功能的命令格式上复杂点,但是相对应的更加直观。

在vyos中,我设定eth1为machine1的网关,进入configure模式后,这样设定:

上面的配置的意思是:设置一条通往网络10.20.10.0/24的路径,通过10.20.10.1路由出去,默认情况下distance为1,但在笔者的实验中,静态路由中不显式指定distance也没有遇到问题。

设置向指向vyos2的路由(目的网络是192.168.10.0/24):

上面的配置的意思是:设置一条通往192.168.10.0/24的路径,下一跳为vyos2,地址是192.168.202.3。

因为static route后面的参数是目标网络,这条路径的目的是把数据转到machine2的网络中,所以跟的参数应该是192.168.10.0而不是路由器的网络192.168.202.0。next-hop指定了下一个路由器的地址。

在vyos2上设置:

最后测试machine1与machine2的连通性:

这样就设置好一个含两个路由器的,使用静态路由的网络。

RIP

RIP是一种内部网关协议,用于AS内路由信息的传递,RIP基于DistanceVectorAlgorithms,配置这种协议后,路由器会相邻的路由器交换信息。

相比OSPF等协议,RIP协议已经显得过时了,由于RIP自身的问题,不适合在大型网络内使用。但VyOS对RIP提供了支持,那么我们也通过下面的例子操作一下吧。

在这个实验中,我们直接用静态路由中的网络,所有网络接口不变,只是没有任何静态路由的设置。

在vyos中,用前面实验的网络接口配置即可:

在设置RIP之前,先修改回环地址:

在vyos上把自己负责的网络通告一下,这里是machine1所属的网络和路由器间的网络:

可以看到增加了回环地址的信息:

在vyos2上设置,沿用之前的网络接口:

同样像vyos一样修改回环地址后,通告自己负责的网络:

保存退出configure模式后,检查网络接口信息:

在某些情况下我们需要为VyOS设置一个loopback地址,可以参考设置以太网接口一样设置,只要把ethernet改为loopback,接口名为lo就行。

最后,我们测试一下machine1和machine2的连通性(笔者在测试时发现短暂ping不通,重启两个路由虚拟机就没问题了):

通过show configuration可以看到该配置信息(节选自vyos2):

如果我想删除RIP的设置,可以输入:

这会把上面show configuration中protocols花括号内的配置内容全都删掉。

OSPF

OSPF与RIP同样是一种内部网关协议,在AS内决策路由,OSPF分为v2和v3,在ipv4网络是OSPFv2协议。

在OSPF中通过Dijkstra算法计算最短路径树,与RIP不同的是,OSPF是基于链路状态的,而RIP是基于距离向量的。OSPF比RIP更加适合用在
大型网络中。

在OSPF实验中,我们同样需要两个路由节点,因此,我们直接采用静态路由的网络结构,任何基础设置都不变,网络结构如下:

读者可以参考前面的内容进行设置。

搞定四个虚拟机的设置和里面操作系统的设置后,登陆vyos,进行OSPF的设置,这里选择vyos发布默认路由。

先设置vyos的lo地址:

在OSPF中,有一个很重要的参数是router id,每一台OSPF路由器都必须有一个router id,上面我们设置了lo地址,目的是当做router id

和RIP一样,发布自己路由的网段:

OSPF的另一个重要概念就是area,为了在大型网络中减轻OSPF计算的压力和复杂程度,OSPF采用分区域计算,将所有OSPF路由器划分成不同的区域,每个区域负责自己的LSA传递和路由计算,在区域间则传递简化的LSA。如果网络比较小,可以直接使用area 0,上面就是按照这个原则设置area的。

发布默认路由:

OSPF使用接口带宽来计算Metric(Cost),一般情况下可以自动计算接口上的Cost,但也可以手动设置。如何计算Cost这里就不再详细介绍,上面我直接设置metric为10.

激活路由协议邻接关系变化日志功能:

设置路由ID(这里直接用前面设置的lo地址作为id):

重发布路由:

设置路由表:

最后commit、save,退出configure模式。

登陆vyos2,进行同样的设置,不过不用发布默认路由:

先发布自己路由的网段:

其他设置

设置路由表:

查看配置信息(图为vyos中的配置信息):

最后测试machine1和machine2的连通性:

可以互相ping通,证明这个靠OSPF协议的路由设置成功。

可以通过show ip route查看路由情况:

如果你想查看邻近的路由信息,可以用show ip ospf neighbor:

可以清楚地看到路由ID,地址和与它相连的网络接口。

VyRoute

先前本人有幸听取了这个有关网络设备自动化的技术分享(https://www.sdnlab.com/15695.html),同时看到目前操作VyOS还仅仅只能通过管理员手动登陆系统对路由服务进行设置,无法实现自动化和可编程。

为了解决这个问题,我开始思考用怎样的方式来解决自动化和可编程。最初我考虑过两种方案:

1.在VyOS上部署一个提供REST接口的服务器程序,服务器程序控制VyOS,管理员可以通过web工具发送json数据对VyOS进行操作,或者是开发出客户端,像OpenStack的client一样进行管理。

2.用自动化运维工具。部署一个agent到VyOS上接管VyOS的控制,但是有点怀疑进入configure模式之后能不能再像普通模式下控制VyOS。

我一开始觉得方案2不怎么可行,于是寻求第一种方案的实现方式,但发现有一个比较麻烦的问题:VyOS的基本系统是一个Debian6 Squeeze,但是内核是3.13,如今Debian8都出来了,基本上找不到任何可用的软件源,就算是backports都没。虽然自带python但是没有软件源连pip都安装不了,gcc自然是不会在这种路由系统上存在,也就是说:
编译,不可能。
安装第三方库,不可能。

基本上可以知道两个方案都死了,然后我开始找那些可以透过ssh控制操作系统的工具,看过paramiko等,但是都没找到合适的。不过,后来我偶然找到一个叫Exscript的库,抱着试试的心态测试了下成功了。于是着手开发了vyroute库,现在开源在我的github上:https://github.com/Hochikong/vyroute

下面是部分功能的使用例子:

实例化一个VyOS路由并设置一个静态路由,提交后但不保存:

登陆VyOS后可以看到配置的确生效:

重启,什么都没了:

继续在原来那个终端,同一个路由对象vyos1进行操作:

重启后配置的确保存了:

在这个库中,任何输入输出都是在python字典中,如果要基于此库做支持REST的高层应用的话(比如用flask),字典和json是最接近的数据结构。

在每个实例化的路由器中,都有一个status私有变量,用于记录路由实例的操作状态,基本上可以实现管理员手动设置路由服务时的操作流程:登入路由、进入configure模式、进行配置、提交配置、保存配置、退出configure模式、登出路由。使用者可以通过status()函数查询此时的状态。

具体的文档和使用相关可以访问项目的github主页。

结语

实际上,官方文档只有对这些设置的命令例子,并没有通过具体的例子进行实践的资料。透过这篇文章,算是对VyOS的功能有进一步的研究和应用,而不是只限于文档上的几个命令例子。

本文通过实验介绍了如何在模拟的环境中应用VyOS解决网络问题,细心的读者可能会发现,VyOS其实和Cisco IOS的操作方式很类似,比如设置RIP,我觉得,熟悉IOS的管理人员应该能很快上手VyOS。在后面的文章中,还会继续在模拟环境中对VyOS的其他功能进行实践。本人水平有限,如有缺点和漏洞,请各位读者指出。

最后我提供了一个实现VyOS路由服务的自动化和可编程的库,如果有Bug存在或要改进的地方,还请各位指出。

参考资料:

http://vyos.net/wiki/User_Guide

http://d.hatena.ne.jp/nao_pcap/20110327/1301159240

https://anuragbhatia.com/networking/vyatta-based-vyos-linux-based-network-os/

https://keepingitclassless.net/2011/09/configuring-ospf-between-vyatta-and-cisco-ios/

**作者简介: **
何智刚,2015至今,准大学生一枚,主要研究Docker,OpenStack,SDN,对各种领域都有所涉猎,目标是迈向full stack。
qq:1097225749
github:https://github.com/Hochikong

--------------华丽的分割线------------------
本文系《SDNLAB原创文章奖励计划》投稿文章,该计划旨在鼓励广大从业人员在SDN/NFV/Cloud网络领域创新技术、开源项目、产业动态等方面进行经验和成果的文字传播、分享、交流。有意向投稿的同学请通过官方唯一指定投稿通道进行文章投递,投稿细则请参考《SDNLAB原创文章奖励计划

注:投稿文章仅出于传递更多信息之目的,系SDNLAB《原创文章奖励计划》的投稿文章,仅供参考,不代表证实其描述或赞同其观点,投资者据此操作,风险自担;技术问题请留言指正。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/16953.html
分享到:
相关文章
条评论

登录后才可以评论

Hochikong 发表于16-05-30
0