51学通信论坛2017新版

标题: 简单路由 [打印本页]

作者: admin    时间: 2017-9-17 15:49
标题: 简单路由
在VyOS中,我们可以为不同的LAN创建一个以太网接口,LAN中的机器把网关设为VyOS中对应接口的ip地址,就可以得到一个简单的路由。不同LAN中的机器都可以连通。
如下图示,只要在VyOS上设置三个对应LAN的ethernet interface就完成了自动路由的第一步。

[attach]1435[/attach]

我的虚拟网络配置:

[attach]1436[/attach]

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

[attach]1437[/attach]

machine1只添加一个网络设备,连到VMnet5上:
machine1的配置文件(重点是把网关设为VyOS中两个接口的地址):
machine2连VMnet3:
machine2的配置文件:
vyos要同时连接VMnet5和VMnet3,保留一个NAT模式的网卡用于透过ssh管理系统。
一开始,host-only下两个虚拟机machine1与machine2之间ping不通:
完成上述准备后,登陆VyOS进行设置: 目前eth1和2并没有任何接口设置:
vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 172.16.77.184/24 u/u OUTSIDE
eth1 - A/D
eth2 - A/D
lo 127.0.0.1/8 u/u
::1/128
vyos@vyos:~$
先对两个虚拟网卡进行设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address 10.20.10.1/24
[edit]
vyos@vyos# set interfaces ethernet eth1 description 'to-m1'
[edit]
vyos@vyos# set interfaces ethernet eth2 address 192.168.10.1/24
[edit]
vyos@vyos# set interfaces ethernet eth2 description 'to-m2'
[edit]
vyos@vyos# commit
[edit]
vyos@vyos# run show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 172.16.77.184/24 u/u OUTSIDE
eth1 10.20.10.1/24 u/u to-m1
eth2 192.168.10.1/24 u/u to-m2
lo 127.0.0.1/8 u/u
::1/128
[edit]

从上面可以看到,在configure模式中可以通过run执行在普通模式中才能用的命令。
测试一下是否能ping得通machine2:

[attach]1438[/attach]

测试ping machine1:

[attach]1439[/attach]

这样一来,两台虚拟机间就通过VyOS虚拟路由实现通讯了。在这种情况下,只要VyOS设置好了端口,就可以让两个本来无法通讯的虚拟机实现通讯。
通过简单路由,可以很方便地实现host-only模式下vm的互连,这就允许我们灵活地创建不同的拓扑。
</p>静态路由

静态路由的配置比较简单,管理员可以掌控一切。无论是Cisco IOS还是Vyatta/VyOS,静态路由都需要管理员一条一条规则进行配置,静态路由的路径相对固定,如果网络拓扑改变,需要管理员再次手动设置。
静态路由默认情况下是私有的,不会与其他路由器交换信息。静态路由也是单向性的,意味着我们想让中间隔着两台路由的两台机器(m1,m2)连通,我们不仅要配置一个从m1到m2的路径,还要配置一个从m2到m1的路径,如果发现配置了路由但是ping不通,那就得检查是否有没有设置回程的路径了。
静态路由作为CCNA中的一项很基本的能力,原理和实现是足够简单的,下面将使用VyOS实现静态路由。
我们使用四个虚拟机,machine1和machine2的任何设置都不变,按照原有的设定。增加多一个vyos2虚拟机,组成一个这样的网络:

[attach]1440[/attach]

参考上面VMnet的设定,修改vyos的网络适配器设置:
对于vyos2,建议重新安装一个系统而不是直接克隆vyos。如果直接克隆,会有意想不到的错误。(安装vyos实际上用不了10分钟),这是vyos2的的设置:
进行好外部的设定后,登陆vyos,设置好eth1和2的地址(eth0用dhcp,这里忽略其设置过程):
eth0 172.16.77.184/24 u/u manage
eth1 - u/u
eth2 - u/u
vyos@vyos:~$ configure
[edit]
设置eth1接口和其ip地址。如果想让路由真正起效,machine1必须把网关设为eth1的地址,指向节点m1:
vyos@vyos# set interfaces ethernet eth1 address 10.20.10.1/24
[edit]
vyos@vyos# set interfaces ethernet eth1 description 'to-m1'
[edit]
设置eth2接口,description参数说明该接口指向路由r2:
vyos@vyos# set interfaces ethernet eth2 address 192.168.202.2/24
[edit]
vyos@vyos# set interfaces ethernet eth2 description 'to-r2'
[edit]
vyos@vyos# commit
[edit]
vyos@vyos# save
Saving configuration to '/config/config.boot'...
Done
[edit]
vyos@vyos# exit
exit
检查网络接口是否已经配置完毕。检查信息是很重要的一项行动,很多问题并不是因为没掌握该技能,而是疏忽导致的。
eth1 10.20.10.1/24 u/u to-m1
eth2 192.168.202.2/24 u/u to-r2
上面是vyos的设置,设置完毕后,重启一下。
下面是vyos2的设置,设置完也同样重启一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 172.16.77.185/24 u/u manage
eth1 - u/u
eth2 - u/u
lo 127.0.0.1/8 u/u
::1/128
vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address 192.168.202.3/24
[edit]
vyos@vyos# set interfaces ethernet eth1 description 'to-r1'
[edit]
vyos@vyos# set interfaces ethernet eth2 address 192.168.10.1/24
[edit]
vyos@vyos# set interfaces ethernet eth2 description 'to-m2'
[edit]
vyos@vyos# commit
[edit]
vyos@vyos# save
Saving configuration to '/config/config.boot'...
Done
[edit]
vyos@vyos# exit
exit
vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 172.16.77.185/24 u/u manage
eth1 192.168.202.3/24 u/u to-r1
eth2 192.168.10.1/24 u/u to-m2
lo 127.0.0.1/8 u/u
::1/128

重启完两个作为路由器的虚拟机后,登陆vyos,设置静态路由。在VyOS中,设置静态路由可以用这样的格式进行:
set protocols static route <目的网络> next-hop <下一个路由器的地址>/<目的机器的网关>
在Vyatta/VyOS中,大多数功能都是通过set protocols来设置的,比Cisco IOS的同功能的命令格式上复杂点,但是相对应的更加直观。
在vyos中,我设定eth1为machine1的网关,进入configure模式后,这样设定:
vyos@vyos# set protocols static route 10.20.10.0/24 next-hop 10.20.10.1 distance 1
[edit]
上面的配置的意思是:设置一条通往网络10.20.10.0/24的路径,通过10.20.10.1路由出去,默认情况下distance为1,但在笔者的实验中,静态路由中不显式指定distance也没有遇到问题。
设置向指向vyos2的路由(目的网络是192.168.10.0/24):
vyos@vyos# set protocols static route 192.168.10.0/24 next-hop 192.168.202.3 distance 1
[edit]
上面的配置的意思是:设置一条通往192.168.10.0/24的路径,下一跳为vyos2,地址是192.168.202.3。
因为static route后面的参数是目标网络,这条路径的目的是把数据转到machine2的网络中,所以跟的参数应该是192.168.10.0而不是路由器的网络192.168.202.0。next-hop指定了下一个路由器的地址。
在vyos2上设置:
vyos@vyos# set protocols static route 192.168.10.0/24 next-hop 192.168.10.1 distance 1
[edit]
vyos@vyos# set protocols static route 10.20.10.0/24 next-hop 192.168.202.2 distance 1
[edit]
最后测试machine1与machine2的连通性:
[attach]1441[/attach]


[attach]1442[/attach]

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

RIP

RIP是一种内部网关协议,用于AS内路由信息的传递,RIP基于DistanceVectorAlgorithms,配置这种协议后,路由器会相邻的路由器交换信息。
相比OSPF等协议,RIP协议已经显得过时了,由于RIP自身的问题,不适合在大型网络内使用。但VyOS对RIP提供了支持,那么我们也通过下面的例子操作一下吧。
在这个实验中,我们直接用静态路由中的网络,所有网络接口不变,只是没有任何静态路由的设置。

[attach]1443[/attach]

在vyos中,用前面实验的网络接口配置即可:
在设置RIP之前,先修改回环地址:
vyos@vyos# set interfaces loopback lo address 1.1.1.1/32
[edit]
在vyos上把自己负责的网络通告一下,这里是machine1所属的网络和路由器间的网络:
vyos@vyos# set protocols rip network 10.20.10.0/24
[edit]
vyos@vyos# set protocols rip network 192.168.202.0/24
[edit]
vyos@vyos# set protocols rip redistribute connected
可以看到增加了回环地址的信息:
1.1.1.1/32
::1/128
在vyos2上设置,沿用之前的网络接口:
eth0 172.16.77.185/24 u/u manage
eth1 192.168.202.3/24 u/u to-r1
eth2 192.168.10.1/24 u/u to-m2
同样像vyos一样修改回环地址后,通告自己负责的网络:
vyos@vyos# set interfaces loopback lo address 2.2.2.2/32
vyos@vyos# set protocols rip network 192.168.10.0/24
保存退出configure模式后,检查网络接口信息:
2.2.2.2/32
::1/128
在某些情况下我们需要为VyOS设置一个loopback地址,可以参考设置以太网接口一样设置,只要把ethernet改为loopback,接口名为lo就行。
最后,我们测试一下machine1和machine2的连通性(笔者在测试时发现短暂ping不通,重启两个路由虚拟机就没问题了):
通过show configuration可以看到该配置信息(节选自vyos2):
protocols {
rip {
network 192.168.202.0/24
network 192.168.10.0/24
redistribute {
connected {
}
如果我想删除RIP的设置,可以输入:
这会把上面show configuration中protocols花括号内的配置内容全都删掉。

OSPF

OSPF与RIP同样是一种内部网关协议,在AS内决策路由,OSPF分为v2和v3,在ipv4网络是OSPFv2协议。
在OSPF中通过Dijkstra算法计算最短路径树,与RIP不同的是,OSPF是基于链路状态的,而RIP是基于距离向量的。OSPF比RIP更加适合用在 大型网络中。
在OSPF实验中,我们同样需要两个路由节点,因此,我们直接采用静态路由的网络结构,任何基础设置都不变,网络结构如下:

[attach]1444[/attach]

读者可以参考前面的内容进行设置。
搞定四个虚拟机的设置和里面操作系统的设置后,登陆vyos,进行OSPF的设置,这里选择vyos发布默认路由。
先设置vyos的lo地址:
在OSPF中,有一个很重要的参数是router id,每一台OSPF路由器都必须有一个router id,上面我们设置了lo地址,目的是当做router id
和RIP一样,发布自己路由的网段:
vyos@vyos# set protocols ospf area 0 network 10.20.10.0/24
[edit]
vyos@vyos# set protocols ospf area 0 network 192.168.202.0/24
[edit]
OSPF的另一个重要概念就是area,为了在大型网络中减轻OSPF计算的压力和复杂程度,OSPF采用分区域计算,将所有OSPF路由器划分成不同的区域,每个区域负责自己的LSA传递和路由计算,在区域间则传递简化的LSA。如果网络比较小,可以直接使用area 0,上面就是按照这个原则设置area的。
发布默认路由:
vyos@vyos# set protocols ospf default-information originate always
[edit]
vyos@vyos# set protocols ospf default-information originate metric 10
[edit]
vyos@vyos# set protocols ospf default-information originate metric-type 2
[edit]
OSPF使用接口带宽来计算Metric(Cost),一般情况下可以自动计算接口上的Cost,但也可以手动设置。如何计算Cost这里就不再详细介绍,上面我直接设置metric为10.
激活路由协议邻接关系变化日志功能:
vyos@vyos# set protocols ospf log-adjacency-changes
[edit]
设置路由ID(这里直接用前面设置的lo地址作为id):
vyos@vyos# set protocols ospf parameters router-id 1.1.1.1
[edit]
重发布路由:
vyos@vyos# set protocols ospf redistribute connected metric-type 2
[edit]
vyos@vyos# set protocols ospf redistribute connected route-map CONNECT
[edit]
设置路由表:
vyos@vyos# set policy route-map CONNECT rule 10 action permit
[edit]
vyos@vyos# set policy route-map CONNECT rule 10 match interface lo
[edit]
最后commit、save,退出configure模式。
登陆vyos2,进行同样的设置,不过不用发布默认路由:
vyos@vyos# set interfaces loopback lo address 2.2.2.2/32
[edit]
先发布自己路由的网段:
vyos@vyos# set protocols ospf area 0 network 192.168.10.0/24
[edit]
其他设置
vyos@vyos# set protocols ospf log-adjacency-changes
[edit]
vyos@vyos# set protocols ospf parameters router-id 2.2.2.2
vyos@vyos# set protocols ospf redistribute connected route-map CONNECT
vyos@vyos# set policy route-map CONNECT rule 10 action permit
[edit]
vyos@vyos# set policy route-map CONNECT rule 10 match interface lo
[edit]
查看配置信息(图为vyos中的配置信息):

[attach]1445[/attach]

最后测试machine1和machine2的连通性:
[attach]1446[/attach]


[attach]1447[/attach]

可以互相ping通,证明这个靠OSPF协议的路由设置成功。
可以通过show ip route查看路由情况:
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route
S>* 0.0.0.0/0 [210/0] via 172.16.77.2, eth0
C>* 1.1.1.1/32 is directly connected, lo
O>* 2.2.2.2/32 [110/20] via 192.168.202.3, eth2, 00:07:18
O 10.20.10.0/24 [110/10] is directly connected, eth1, 00:09:39
C>* 10.20.10.0/24 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
C>* 172.16.77.0/24 is directly connected, eth0
O>* 192.168.10.0/24 [110/20] via 192.168.202.3, eth2, 00:07:19
O 192.168.202.0/24 [110/10] is directly connected, eth2, 00:09:39
C>* 192.168.202.0/24 is directly connected, eth2
如果你想查看邻近的路由信息,可以用show ip ospf neighbor:
vyos@vyos:~$ show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
2.2.2.2 1 Full/Backup 31.243s 192.168.202.3 eth2:192.168.202.3 0 0 0
可以清楚地看到路由ID,地址和与它相连的网络接口。

VyRoute

先前本人有幸听取了这个有关网络设备自动化的技术分享(http://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路由并设置一个静态路由,提交后但不保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

>>> from vyroute.Router import BasicRouter
>>> vyos1 = BasicRouter('172.16.77.184','vyos:vyos')
>>> vyos1.login
{'Result': 'Login successfully.'}
>>> vyos1.status
{'commit': None, 'object': 'login', 'configure': None, 'save': None}
>>> vyos1.configure
{'Result': 'Active configure mode successfully.'}
>>> static = {'config':{'target':'10.20.10.0/24','next-hop':'10.20.10.1','distance':'1'},}
>>> vyos1.static_route(static)
{'Result': 'Configured successfully'}
>>> vyos1.commit_config
{'Result': 'Commit successfully.'}
>>> vyos1.exit_config(force=True)
{'Result': 'Exit configure mode successfully.'}
>>> vyos1.status
{'commit': None, 'object': 'login', 'configure': 'No', 'save': None}
>>> vyos1.logout
{'Result': 'Logout successfully.'}
>>> vyos1.status
{'commit': None, 'object': 'logout', 'configure': None, 'save': None}

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

[attach]1448[/attach]

重启,什么都没了:

[attach]1449[/attach]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

>>> vyos1.login
{'Result': 'Login successfully.'}
>>> vyos1.status
{'commit': None, 'object': 'login', 'configure': None, 'save': None}
>>> vyos1.static_route(static)
{'Error': 'You are not in configure mode.'}
>>> vyos1.configure
{'Result': 'Active configure mode successfully.'}
>>> vyos1.static_route(static)
{'Result': 'Configured successfully'}
>>> vyos1.exit_config
{'Error': 'You should commit first.'}
>>> vyos1.commit_config
{'Result': 'Commit successfully.'}
>>> vyos1.exit_config
{'Error': 'You should save first.'}
>>> vyos1.save_config
{'Result': 'Save successfully.'}
>>> vyos1.status
{'commit': 'Yes', 'object': 'login', 'configure': 'Yes', 'save': 'Yes'}
>>> vyos1.exit_config
{'Result': 'Exit configure mode successfully.'}
>>> vyos1.logout
{'Result': 'Logout successfully.'}

重启后配置的确保存了:

[attach]1450[/attach]

在这个库中,任何输入输出都是在python字典中,如果要基于此库做支持REST的高层应用的话(比如用flask),字典和json是最接近的数据结构。
在每个实例化的路由器中,都有一个status私有变量,用于记录路由实例的操作状态,基本上可以实现管理员手动设置路由服务时的操作流程:登入路由、进入configure模式、进行配置、提交配置、保存配置、退出configure模式、登出路由。使用者可以通过status函数查询此时的状态。
具体的文档和使用相关可以访问项目的github主页。

结语


实际上,官方文档只有对这些设置的命令例子,并没有通过具体的例子进行实践的资料。透过这篇文章,算是对VyOS的功能有进一步的研究和应用,而不是只限于文档上的几个命令例子。
本文通过实验介绍了如何在模拟的环境中应用VyOS解决网络问题,细心的读者可能会发现,VyOS其实和Cisco IOS的操作方式很类似,比如设置RIP,我觉得,熟悉IOS的管理人员应该能很快上手VyOS。在后面的文章中,还会继续在模拟环境中对VyOS的其他功能进行实践。本人水平有限,如有缺点和漏洞,请各位读者指出。
最后我提供了一个实现VyOS路由服务的自动化和可编程的库,如果有Bug存在或要改进的地方,还请各位指出。
参考资料:
**作者简介: **
何智刚,2015至今,准大学生一枚,主要研究Docker,OpenStack,SDN,对各种领域都有所涉猎,目标是迈向full stack。
qq:1097225749
--------------华丽的分割线------------------
本文系《SDNLAB原创文章奖励计划》投稿文章,该计划旨在鼓励广大从业人员在SDN/NFV/Cloud网络领域创新技术、开源项目、产业动态等方面进行经验和成果的文字传播、分享、交流。有意向投稿的同学请通过官方唯一指定投稿通道进行文章投递,投稿细则请参考《SDNLAB原创文章奖励计划》
注:投稿文章仅出于传递更多信息之目的,系SDNLAB《原创文章奖励计划》的投稿文章,仅供参考,不代表证实其描述或赞同其观点,投资者据此操作,风险自担;技术问题请留言指正。
声明:本文转载自网络。版权归原作者所有,如有侵权请联系删除。




欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/) Powered by Discuz! X3