《NetDevOps入门与实践.html.pdf》由会员分享,可在线阅读,更多相关《NetDevOps入门与实践.html.pdf(174页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本书赞誉 (本书推荐人排名不分先后,以音序排列) 随着通信技术近年来颠覆性的发展和变化,对传统网络技术工程师们的挑战越来越大。作者以传统网工1成功转型的亲身经验撰写了本书,它直击传统网络工程师们的痛点,是难得的兼具实用价值和 实践意义的“惊艳”之作,令人耳目一新! 方芳,思科大中华区副总裁兼运营商 spine1 - leaf2; spine1 - leaf3; spine1 - leaf4; spine1 - leaf5; spine1 - leaf6; spine2 - leaf1 color=red; spine2 - leaf2; spine2 - leaf3; spine2 - lea
2、f4; spine2 - leaf5; spine2 - leaf6; 解析这个DOT文件在Chrome浏览器(需要安装DOT Lang Viewer插件)中的显示结果如图2-3所示。使用DOT语言可以借助文本的方式来保存一个网络拓扑图。http:/www.graphviz.org提供了 DOT的详细说明,读者可以参考。 图2-3 Chrome浏览器显示拓扑图 再者,对于纯文本的文件,建议读者学习和了解MarkDown的文件格式。MarkDown具有以下优点。 兼容性好。纯文本的文件格式兼容性非常好,任何平台下都可以完全兼容。 可以转化为其他格式。MarkDown可以很容易地转换为HTML、P
3、DF等文件格式,并且经过了一定的排版和格式处理。 语法简单。MarkDown的语法非常简单,很容易学习和应用。 最后,二进制的文件相对不太好管理。建议大家最好保留每个二进制文件的MD5或者SHA的HASH值。Linux和MAC OSX很容易对此类系统文件进行MD5与SHA值的计算。例如: $ md5 iosxrv-k9-demo-6.1.2.qcow2.tgz MD5 (iosxrv-k9-demo-6.1.2.qcow2.tgz) = 71d3be46fb68f8058b6c683f80a0f410 通过管理文件的HASH值可以确定一个文件的内容是否完整。即使文件名称被修改了,HASH值也不
4、会发生变化。其值不变就可以认为是相同的文件。大家熟悉的云网盘也是通过这个方法进行海量文件 管理的。 2.1.4 版本管理的工具 在版本管理部分,存在很多的工具。目前较为流行的一个工具是Git(https:/git-)。Windows、Linux和MAC OSX都支持Git。Git是一个分布式的版本控制软件,由大名鼎鼎的Linux之父 Linus Torvalds所开发,并于2005年以GPL方式发布,其最初目的是更好地管理Linux内核开发。现在这个工具几乎是最为流行的版本管理软件。目前GitHub()是一个通过Git进行版 本控制的软件源代码托管服务中心。现在GitHub不单单有软件的源代码
5、,很多软件的使用说明也通过GitHub进行管理。这些内容通常被放在Git Pages(https:/github.io)中。对于本书的读者而言,掌 握基本的Git工具是后续章节学习的基础。出于篇幅的考虑,这里不对Git的使用方法进行展开,读者可以参考http:/rogerdudler.github.io/git-guide/index.zh.html,这个文档是一个非常简洁的Git入门 教材,其还包括多语言的版本。本书的后续章节中也会遇到Git相关命令,本书后续会默认大家已经了解和熟悉Git的基本命令。 2.2 编程语言的选择 NetDevOps中有开发的部分,开发就必然会涉及编程语言。网络工
6、程师在初次接触NetDevOps时,都会遇到编程语言的选择问题。下面我们就来简单讨论一下如何选择编程语言。这里我们将从程序 语言的选择和数据描述语言的选择两个部分来进行叙述。 2.2.1 程序语言的选择 在程序员的世界里,讨论哪种编程语言是最好的语言,往往会引起非常激烈的争吵。笔者不敢在这里和大家讨论哪种语言是最好的语言,而是从自己的角度和大家分享一下如何选择适合NetDevOps的 编程语言。 众所周知,编程语言既有编译型语言,也有解释型脚本语言。通常来说,编译型程序执行速度快,同等条件下对系统要求相对较低,C、C+、C#就是这类语言。相对于编译型语言的存在方式,解释 型语言的源代码不是直接
7、翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。例如,Python、Ruby、JavaScript、Perl、Shell等就是解释型语言。 在网络运维和管理中,程序的执行效率也许不是最为关键的。换句话讲,再慢的程序(只要不出错)也会比人工执行效率要高。程序大量的执行过程是需要和网络设备进行交互的。脚本程序在执行过 程中很多时候都是在等待网络设备侧返回的数据信息,因此执行效率瓶颈往往并不是语言的代码执行效率。另外,工程师也许更加关心的是程序开发的效率、代码的可读性方面。从这些方面考虑,解释型 语言是首选语言。 在众多的解释型语言中,哪些语言更加合适呢?现在程序在开发的时候
8、,通常会采用Web方式进行程序发布。基于Web的程序通常会分为前端和后端两大部分。前端开发主要解决视觉的问题,即如何 更好地展现数据。在浏览器中展现数据,JavaScript几乎是唯一的选择,当然还有HTML以及CSS等语言的方式。除了前端,后端的内容也是非常重要的。后端的主要功能是获取、整理以及保存数据。在某 些时候,为了简化开发的工作量,只保留后端的部分也是很正常的。对于NetDevOps网络工程师而言,如果只是为了快速地完成工作内容,将需要更多地关注后端的开发。在后端开发中,较常见的语言有 Python、Ruby、Bash、Java。其中,Python与Ruby在Web后端开发中非常有优
9、势。另外,NetDevOps工程师还需要和网络设备打交道,网络设备的厂家很多。近几年,网络设备的可编程能力越来越 强。基于笔者的观察,大量的网络设备会支持Python与Bash两种语言。 因此,笔者建议NetDevOps可以选择Python与Bash。如果要兼顾前端的开发,那么也需要了解和掌握一些Javascript、HTML、CSS相关知识。在本书的后续章节中,使用的语言主要是Python与 Bash,我们会分别介绍一下这两种语言的基本语法,以及在网络运维和管理中基于这两种语言开发的常用一些工具。 2.2.2 数据描述语言的选择 2.2.1节提到了编程语言的选择问题,其选择余地相对较大,并且
10、笔者给出了认为更加适合的语言,以减少初学者在语言选择上的徘徊。但在数据描述型语言的选择方面会少很多,这里笔者给出一些常 见的、在NetDevOps开发中通常会用到的格式。这里提到的数据描述型语言,读者最好能较好地掌握(其实掌握这些内容比学一门编程语言要简单很多)。 数据描述型语言主要是为程序提供服务的,也就是说程序能够快速方便地解析它们。部分数据描述型语言还兼顾了人的可读性,让人也能够较为方便地编写和阅读其内容。 下面是常见的数据描述型语言。 1.JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。JSON数据格式
11、与编程语言无关,它脱胎于JavaScript,但目前很多编程语言都支持JSON格式 数据的生成和解析。JSON用于描述数据结构,其形式如下: 名称:值 对象(object):一个对象以“”开始,以“”结束。一个对象包含一组非排序的名称与值对。 每个对内的名称与值(collection):名称和值之间使用“:”隔开。 多个对(名称与值对)之间使用“,”分开。 值的有序列表(array):一个或者多个值用“,”分区后,使用“”括起来就形成了列表。 hostname: Router1, hostname: Router2 JSON格式表达的是一种树状的数据类型,非常容易被保存到NoSQL数据库中,如
12、MongoDB。在网络编程中,这种结构较为常见,也易于使用。比如在Cisco Nexus系列的交换机上就可以直接输出为 JSON格式的数据。 ins_api: type: cli_show, version: 0.1, sid: eoc, outputs: output: body: hostname: switch , input: show switchname, msg: Success, code: 200 2.XML XML(Extensible Markup Language,可扩展标记语言)是一种标记语言,用于传送及携带数据信息,不用于表现或展示数据。这样的结构并不太适合人直接阅
13、读。但XML中的tag是可以携带多个属 性的。并且,XML还有namespace等概念。相比JSON,XML能表示更加复杂的数据结构,也比JSON复杂很多。XML格式是NETCONF协议的默认交换数据的格式。比如Juniper的路由器、交换机等网络 设备上运行的JUNOS可以直接输出XML格式的数据。XML是一种结构化的文本,非常适合程序进行处理。 userhost show chassis alarms No alarms currently active userhost show chassis alarms | display xml 3.YAML YAML(http:/yaml.or
14、g)是一种用来表达数据序列的格式,对人而言可读性较高,可以简单表达清单、散列表、标量等数据形态。它采用空白符号缩进的方式,非常适合用来表达或编辑数据结构、 配置文件、文件大纲等内容。由于YAML使用空白字符和分行来分隔数据,因此它特别适合用grep、Python、Perl、Ruby等语言进行操作。另外,YAML没有使用各种封闭符号,如引号、各种括号等,这 些符号在嵌套结构中会变得复杂并且难以辨认。YAML的语法非常简单,主要注意文本的缩进。读者可以参考如下链接: http:/www.yaml.org/spec/1.2/spec.html; 下面的Ansible的配置文件就采用了YAML格式进行
15、编写。 - - hosts: core connection: local remote_user: admin gather_facts: False tasks: - nxos_interface: interface: item mode: layer3 admin_state: up transport: nxapi host: 10.255.0.75 username: admin password: cisco12345 with_items: - Ethernet1/1 - Ethernet1/2 - Ethernet1/3 - Ethernet1/4 4.YANG 和前面三种语
16、言不同,YANG不是一种数据描述语言,而是一种数据建模语言。也就是说,它是用来定义数据的数据结构的,而不是数据的实体。通过下面这个例子可以很容易理解。 module acme-system namespace prefix acme; organization ACME Inc.; contact joe; description The module for entities implementing the ACME system.; revision 2007-11-05 description Initial revision.; container system leaf host-
17、name type string; description Hostname for this system; leaf-list domain-search type string; description List of domain names to search; list interface key name; description List of interfaces in the system; leaf name type string; leaf type type string; leaf mtu type int32; 这个文件使用YANG定义了一个交换机的输出数据结构
18、。system包含host-name、domain-search以及interface三个子内容。下面的输出内容是某一台交换机真实的输出结果。 Swith-1 Eth3/1 Ethernet 1500 Eth3/2 Ethernet 1500 通过这个例子,我们可以看出:YANG文件定义的是一个数据结构,而设备输出的结果使用了这个定义的数据结构,并在结构中相关部分给出了具体的值。关于YANG语言具体的内容,读者可以参 考http:/www.yang-central.org。 目前,由于各厂家网络设备的输出格式都不一样,并且大量的格式还是非结构化的数据格式,这种非结构化的数据格式对程序的开发并不
19、友好。YANG语言是专门为网络环境而开发的语言,它对网络 设备的输出数据进行抽象化并提供了一个通用的语言。Google、AT Authentication retries: 3 Minimum expected Diffie Hellman key size : 1024 bits IOS Keys in SECSH format(ssh-rsa, base64 encoded): ssh-rsa JUNOS配置公钥: edit system login user yuxin userhost# set authentication load-key-file id_rsa.pub .file
20、.19692 | 0 KB | 0.3 kB/s | ETA: 00:00:00 | 100% edit system userhost# show root-authentication ssh-rsa ”; # SECRET-DATA 3.使用ssh-agent管理密钥 命令ssh-agent是用于管理SSH私钥的工具,它为私钥提供了长时间且高速的缓存。其通过一个驻留在系统中的进程来实现这个功能。命令ssh-add可以将用户需要使用的私钥添加到由ssh-agent维护 的列表中。之后SSH需要使用私钥登录设备时,会优先在这里寻找私钥的高速缓存部分。命令如下: $ eval ssh-agen
21、t Agent pid 53053 $ ssh-add yuxinpw_rsa Enter passphrase for yuxinpw_rsa: Identity added: yuxinpw_rsa (yuxinpw_rsa) 注意 eval后面使用的是反引号(),位于键盘波浪号()下面,实际为同一个键。对于美式键盘,其位于数字1前面的那个键。 命令ssh-add添加了带有密码的私钥,在添加的时候就会提示输入密码。以后在SSH中使用这个私钥的时候就不需要再一次提供密码。 注意 对于前面的疑问,这里终于得到了解释,带密码的私钥仅仅在添加到密码库时被要求输入密码,而登录设备时将不再需要输入密码
22、。 $ ssh-add -l 2048 9b:0a:d4:2c:00:fb:69:59:e4:6f:a5:ca:af:8e:cc:aa .ssh/yuxin_rsa (RSA) 1024 aa:50:a5:a4:14:74:27:db:89:14:e8:e8:c9:55:41:38 yuxinpw_rsa (RSA) 使用命令ssh-add-l可以查询现在ssh-agent管理了哪些私钥。 通过上述的方法可以让设备的登录过程更加安全,同时提升了登录设备的便利性。 注意 对于一个用户,使用公钥认证的方式和使用tacacs+或radius的认证方式不能同时使用。要么使用公钥认证,要么使用密码认证(
23、密码认证可以使用tacacs+或radius)。公钥认证用于本地认证, 而tacacs+或radius的认证方式用于集中认证。不过,无论通过哪种认证方式,都可以使用SSH进行登录。如果设备支持ControlMaster的功能,将可以简化登录过程中频繁输密码的过程。 3.2.7 使用scp进行文件传输 命令scp是secure copy(安全复制)的简写,用于进行远程复制文件。它与远程设备通信的通道是和SSH一样的,加密方式也是类似的。其传输端口和SSH是一样的,默认为tcp 22。 1.基本命令和参数 $ scp 参数 原路径 目标路径 $ scp adminrouter1_ios:/conf
24、ig/vios vios 远程设备的路径表示为usernamehostname:path,用户名和远程设备的名称或IP用“”进行分割,这点和SSH登录方式是一致的。远程设备上的路径和设备名称中间用“:”进行分割,建议在 这里写出远程设备的绝对路径。 下面列出几个常用的参数。 -q:不显示传输进度条,常用于脚本中。 -r:递归复制整个目录,这在复制多个文件时很有意义。 -l:limit,限定用户所能使用的带宽,以kbit/s为单位。 -P:port,这里是大写的P,port是指定数据传输用到的端口号。 2.常见网络设备的配置 对于服务器而言,通常来说使用OpenSSH的服务端就默认支持了scp的
25、文件传输方式。但是对于网络设备而言,这个功能往往并不是默认开启的,需要我们进行额外的配置。具体到不同的网络设备会 有一些差异,下面给出几款网络设备的例子。 Cisco IOS设备:在配置了SSH登录之后,使用如下命令开启scp服务。 router(config)#ip scp server enable Cisco Nexus设备:同样和IOS类似,在配置了SSH登录之后,使用如下命令开启scp服务。 switch(config)# feature scp-server Juniper JUNOS:在JUNOS上只需要开启SSH服务就同时开启了scp的服务。 userhost# set sys
26、tem services ssh 3.2.8 利用SSH端口隧道转发功能 正如前面介绍,SSH可以用于加密的远程登录、文件传输等功能。除此以外,SSH还有一个非常有用的功能,就是端口隧道转发功能。我们熟悉的POP3、SMTP、FTP、LDAP等协议都可以利用此功 能,通过SSH的加密隧道进行数据传输,从而弥补其传输协议不加密的缺点。除了提供通道的加密功能,SSH还能完成端口的转发功能(转换目的或源端口)。我们先看一下图3-4。在图3-4中,网络管理 服务器通过交换机直连到了路由器的管理口。堡垒机和网络管理服务器之间有一层NAT设备,堡垒可以直接访问网络管理服务器,但是网络管理服务器不能主动访问
27、堡垒机。堡垒机上也没有路由器的管理 网段路由。基于传统的登录方式,堡垒机必须先使用SSH登录到网络管理服务器,然后才能通过网络管理服务器再登录到路由器。如果要给路由器传文件,也必须先从堡垒机拷贝到网络管理服务器,然后 拷贝到路由器上。这样的运维方式是非常烦琐的。在这种场景下,我们可以使用SSH的端口隧道转发功能来简化此烦琐流程。 图3-4 网络管理拓扑 先在堡垒机器上执行如下命令,完成本地端口转发以及建立SSH隧道。 $ ssh -f -N -L 10080:10.255.0.80:22 network_mgt 说明如下。 -f:认证结束后在后台运行此命令,通常和-N一起使用。 -N:不执行s
28、hell脚本或命令,通常和-f一起使用。 -L:创建一个本地转发规则。将本地(这里指堡垒机)的某个端口(本例中为10080)转发到远端指定设备(本例中为路由器的IP:10.255.0.80)的指定端口(例中为SSH的默认TCP 22端口)。其工 作原理是:本地机器分配一个端口,一旦这个端口有了数据,该规则就经过安全通道转发到远程主机的端口。从图3-4可以看出,这里利用了堡垒机和网络管理服务器之间的SSH连接建立了一个SSH的隧道 (IPv6地址用另一种格式说明:port/host/hostport)。 network_mgt:连接到网络管理服务器的参数。其更加完整的形式如下: -l yuxin
29、 10.74.82.252 p 10000 i /.ssh/yuxin_rsa 因为在$HOME/.ssh/config中有如下配置,这里只用了network_mgt。 Host network_mgt HostName 10.74.82.252 Port 10000 User yuxin IdentityFile /.ssh/yuxin_rsa 我们可以通过如下命令来查看这个转发策略是否已经运行。 # ps aux | grep -i ssh -f root 29768 0.0 0.0 73940 1104 ? Ss 15:03 0:00 ssh -f -N -L 10080:10.255.
30、0.80:22 network_mgt 现在我们可以在堡垒机上直接通过本地的10080端口直接登录到远端的路由器或交换机。 $ ssh localhost -l admin -p 10080 User Access Verification adminlocalhosts password: Cisco NX-OS Software Copyright (c) 2002-2016, Cisco Systems, Inc. All rights reserved. switch# 也可以直接运行远端设备上的命令。 $ ssh localhost -l admin -p 10080 show sy
31、stem uptime User Access Verification adminlocalhosts password: System start time: Sun May 7 09:32:40 2017 System uptime: 7 days, 3 hours, 26 minutes, 2 seconds Kernel uptime: 7 days, 3 hours, 27 minutes, 37 seconds 还可以通过scp来传递数据。 $ scp -P 10080 adminlocalhost:/scripts/maintenance-mode.py maintenance
32、-mode.py User Access Verification adminlocalhosts password: maintenance-mode.py 100% 12KB 12.0KB/s 00:00 上面端口隧道转发的方法对网络设备并没有什么特殊的要求,即使网络设备不支持SSH。所有功能都是在堡垒机和网络管理机之间完成的。 现在我们演示一下:先在网络设备上开启Telnet服务,然后在堡垒机上执行如下命令。 $ ssh -f -N -L 10083:10.255.0.80:23 network_mgt 通过Telnet登录设备。 $ telnet -l admin localhost
33、10083 Connected to localhost. Escape character is . Password: Last login: Sun May 14 13:12:32 UTC 2017 from 10.255.0.77 on pts/0 Cisco NX-OS Software Copyright (c) 2002-2016, Cisco Systems, Inc. All rights reserved. switch# 在这个例子中,我们可以看到Telnet服务也使用了SSH的加密通道。 除了本地端口转发模式,SSH还有远程端口转发模式,需要把-L的参数改成-R。具体的
34、细节希望读者自己去研究学习,这里将不再举例。 3.2.9 利用SSH做Socket代理 3.2.8节提到的端口隧道转发功能是静态的端口的,本节介绍动态的端口隧道转发功能。这里,还是基于图3-4中的拓扑图。假设现在路由器是一台能提供Web服务的设备,我们可以通过浏览器来管理 这台设备。这时,我们通常的做法也许会在网络管理服务器所在的网络(网段)中安装一台Windows,然后通过远程桌面登录这台Windows服务器,运行Windows服务器上的浏览器来管理这台路由器。 这样做显然是非常麻烦的,你完全可以换一种方式来实现。 首先,在堡垒机上运行如下命令: # ssh -f -N -g -D 1008
35、8 network_mgt 查看端口服务情况: # netstat -natp | grep 10088 tcp 0 0 0.0.0.0:10088 0.0.0.0:* LISTEN 30041/ssh tcp6 0 0 :10088 :* LISTEN 30041/ssh 我们可以看到,在堡垒机上TCP 10088端口提供了一个服务。这个服务可以通过堡垒机和网络管理服务器之间的SSH隧道访问到路由器。这时候,我们在一台可以正常访问堡垒机TCP 10088端口的计 算机上使用浏览器来直接访问路由器的Web服务,不过我们需要在浏览器上设置一个Socket5代理。对于FireFox浏览器,我们可以
36、在连接设置中找到这个Socket5代理服务(见图3-5)的其他浏览器,也 可以查找其设置的位置,或者使用第三方的插件来完成相应的功能。 1 Linux、MAC 和Windows平台的Telnet命令参数可能会有一些小区别。这里主要是针对Linux平台。 3.3 小结 本章主要介绍了screen和SSH两个工具,这两个工具主要用于管理会话和登录网络设备。对于广大的网络工程师,SSH应该不是一个陌生的工具。通过本章一些例子,大家可以了解和掌握SSH相关的 一些其他功能。通过使用这些功能,相信能够给大家日常的工作带来更多的方便。 图3-5 FireFox Socket 5代理 下面来看一下在3.2.
37、4节中留下的思考内容。 首先,使用如下命令查询其他机器的screen会话。 $ ssh -l root 172.16.6.130 screen -ls root172.16.6.130s password: There are screens on: 29645.mgt (Multi, detached) 23319.pts-5.centos7-1 (Multi, detached) 22596.yuxin (Multi, detached) Sockets in /var/run/screen/S-root. 然后,使用如下命令恢复远程screen会话。 $ ssh -t -l root 1
38、72.16.6.130 screen -r mgt 必须添加-t的参数。 在这个screen会话中,使用C-a d命令分离时,会直接退出SSH的连接。 第4章 Linux下的一些常用工具 在日常网络运维工作中,分析、处理网络异常或网络故障是网络工程师基本的工作内容。如何快速定位和排除网络中的故障点是网络运维工程师体现自身价值的努力方向。为了能有效地定位问题,快 速收集网络相关的数据是基础之一。本章主要介绍在Linux平台下的一些命令行工具。为什么是Linux平台?正如第3章介绍的,网络运维的工作环境是堡垒机或网络管理服务器,而它们往往是Linux平台。 如果通过命令行能获取网络设备的信息,后续
39、再加上数据分析和逻辑处理就可以实现小规模的自动化工具。图形化的展现设备运行状态信息固然非常直观,但这样的展现方式只适合人来观察。图形化的展 现并不适合机器对这些数据进行二次处理。本章会从如下几个方面对Linux下的常用工具进行介绍。 (1)获取网络设备运行状态信息 获取并展现网络设备的运行状态是传统网管平台的基本功能。网络告警功能也常常是通过获得这些数据而产生的。因此,本章会首先介绍通过SNMP如何获取设备信息的工具。这里介绍的工具为 SNMP工具集。 (2)网络的可达性检测 网络的基本目的是完成可达性,因此获取网络的可达性数据是非常关键的。可达性数据可以分为“通”与“不通”两种情况。这里的工
40、具会介绍Nmap与Nping。对于“通”的部分,我们又常常希望 知道其更多的信息,如RTT(Round Trip Time,往返时间)、带宽、抖动等信息。这里的工具会介绍iPerf与Fping。 (3)网络转发路径信息 网络通常是由很多节点组成的。出于安全性和稳定性的考虑,在网络设计的时候通常都会考虑冗余链路和冗余节点。因此,网络中会出现多条等价或者是不等价的转发路径。如何获取两点之间的转发 路径也是很需要的。这里的工具会介绍MTR。 除了上述这些工具之外,我们还会介绍几个常用的工具,分别是Watch、Wget、CURL。 4.1 SNMP 4.1.1 SNMP简介 SNMP(Simple N
41、etwork Management Protocol,简单网络管理协议)开发于20世纪90年代早期,其目的是在大型网络中简化对设备的管理和数据的获取。在实际的应用场景中,这个协议在数据 获取方面有非常广泛的应用。以至于在网管软件中,一提到获取设备的数据就必定会用到SNMP。目前SNMP有三个版本,分别是V1、V2和V3。V1是一个初始的标准,其定义了SNMP的基本框架。其主 要缺点是难以实现大量的数据传输以及缺少身份验证和加密机制。V2基于V1框架进行了修改,目前修订为V2c。V2c添加了几个新的数据类型(Counter32、Counter64、Gauge32、UInteger32以及 Bit
42、String),增强了对OID表和OID值的设置。但是,V2的增强并没有完全实现预期目标,特别是安全性没有得到提高,仍然使用明文进行数据传输和认证。V3体系结构引入了USM(User-based Security Model,基于用户的安全模型)和VACM(View-based Access Control Model,基于视图的访问控制模型),其中USM用于消息安全,VACM用于访问控制。通过简明的方式实现了加密和认 证功能。因此,大家在进行网络管理时尽可能地采用V3版本。 SNMP是一个非常好的结构化数据。它的数据结构表现为Key-Value的形式,虽然,在OID(Object Ident
43、ifiers,对象标识符)的定义上采用树形的结构方式(见图4-1),但我们在使用时通常采用二 维的表结构。OID可以看作Key,也就是关键字(或者也可以称为字段)。通过这些OID能从设备上获取一个值。有一些OID还有写的能力,也就是说可以通过SNMP中的OID来修改设备上的值。比如,常 用的有通过SNMP进行ping测试,通过SNMP修改设备的ACL信息等。但是,当前对于SNMP的应用主要集中在读取设备的信息。通过SNMP获取的结构化数据比通过CLI输出的半结构化文本要容易处理很 多(第11章会介绍如何处理CLI的半结构化文本)。我们还可以结合第5章提供的一些工具,快速地获取想要的信息。 另外
44、,随着云计算的发展,对于网络监控的精度,分钟级已经不能满足需求了。这时,SNMP协议在高精度的监控中表现得捉襟见肘。我们可以从“推”和“拉”这两个方面来看。 首先,SNMP在采集设备信息的时候采用“拉”的方式获取设备的数据(SNMP trap通常不用于设备的信息获取)。通常在服务器上会启动定时任务,这些任务的时间间隔一般会是15分钟,但是太 过于频繁地拉取设备的信息会带来以下几个问题。 可能会导致设备控制平面的CPU过于繁忙,从而使其他进程不能得到有效的资源,最后影响设备的正常使用。 图4-1 OID树形结构 设备根本无法支持过于频繁的数据采集,直接表现就是一段时间的数据是没有变化。因为在设备
45、内部,很多数值是采用滑动平均来给出值。滑动平均会削平那些剧烈变化的数据。 任务始终执行不完。由于SNMP采集服务器通常为集中式部署,任务间隔短会使执行中的任务太多。通常的表现是上一个任务还没有执行完,后一个任务就已经开始启动。 其次,“推”的方式是不是可以获得更好的效率呢?目前很多厂家逐渐开始提供更多的telemetry(遥测)接口。这种接口大部分采用了GPB(Google Protocol Buffer1)的数据格式。这是一种轻便 高效的结构化数据存储格式,可以用于结构化数据的序列化。其通信协议通常采用gRPC(Google Remote Process Call2)。另外,其采用网络设备往
46、外“推”的方式。关于GPB以及telemetry的详细内 容,本书并不会涉及。在这里提到它,是因为在高精度、高频率地采集数据时,其可以作为SNMP的替代品。Cisco和Juniper都提供了telemetry的开源项目。当然,还有一些其他的开源项目。 Cisco: Juniper: 最后需要说明的是,虽然有更好的解决方案来代替SNMP,但是,并不是说我们现在就可以完全放弃SNMP了。打个比喻来说,有了汽车并不代表我们就要完全抛弃自行车。 4.1.2 常见设备的SNMP配置 在使用SNMP客户端工具之前,我们需要在网络设备上先启用SNMP服务端的配置。为了减少读者查其他文档的时间以及便于后续SN
47、MP命令的演示,这里简单地给出Cisco IOS、Cisco IOS-XR以及 Juniper JUNOS的设备配置。V1和V2的配置区别不大,下面分别给出V2与V3的配置。这些配置并不包含全部的SNMP相关内容,只提供最简单的配置。 (1)Cisco IOS V2 /最简化配置 Router#configure terminal Router(config)#snmp-server community NetDevOps ro 1 Router(config)#access-list 1 permit host 172.16.1.78 (2)Cisco IOS V3 Router#configure terminal Router(config)#access-list 1 permit host 172.16.1.78 Router(config)# snmp-server group admins v3 auth access 1 Router(config)# snmp-server group admins v3 priv access 1 Router(config)# snmp-server user yuxin admins v3 auth sha hello123 priv des priv1234 (3)Cisc
限制150内