手册下载
使用NETCONF配置设备操作指导书-6W103-整本手册.pdf (677.47 KB)
使用NETCONF配置设备操作指导书
Copyright © 2018 新华三技术有限公司 版权所有,保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。
本文档中的信息可能变动,恕不另行通知。
目 录
5.2 选用NETCONF over SOAP over HTTP或NETCONF over SOAP over HTTPS连接方式
7.2 使用NETCONF API文档构造NETCONF请求
11.1 通过NETCONF配置DHCP服务器和DHCP客户端
11.1.4 在Device B上通过CLI配置DHCP客户端功能
11.2 基于ncclient工具的NETCONF over SSH配置举例
NETCONF(Network Configuration Protocol,网络配置协议)是一种基于XML的网络管理协议,它提供了一种可编程的、对网络设备进行配置和管理的方法。用户可以通过该协议设置参数、获取参数值、获取统计信息等。
NETCONF报文使用XML格式,具有强大的过滤能力,而且每一个数据项都有一个固定的元素名称和位置,这使得同一厂商的不同设备具有相同的访问方式和结果呈现方式,不同厂商之间的设备也可以经过映射XML得到相同的效果,这使得它在第三方软件的开发上非常便利,很容易开发出在混合不同厂商、不同设备的环境下的特殊定制的网管软件。在这样的网管软件的协助下,使用NETCONF功能会使网络设备的配置管理工作,变得更简单更高效。
NETCONF协议采用分层结构,分为内容层(Content)、操作层(Operations)、RPC(Remote Procedure Call,远程调用)层和通信协议层(Transport Protocol)。
表1 XML分层与NETCONF分层模型对应关系
NETCONF分层 |
XML分层 |
说明 |
内容层 |
配置数据、状态数据、统计信息等 |
被管理对象的集合,可以是配置数据、状态数据、统计信息等 NETCONF协议具体可读写的数据请参见《NETCONF XML API 手册》 |
操作层 |
<get>,<get-config>,<edit-config> |
在RPC中应用的基本的原语操作集,这些操作组成NETCONF的基本能力 NETCONF全面地定义了对被管理设备的各种基础操作,如get、get-config、get-bulk、edit-config操作等 设备支持的操作请参见“7.4 Comware V7中支持的NETCONF操作类型” |
RPC层 |
<rpc>,<rpc-reply> |
为RPC模块的编码提供了简单的、传输协议无关的机制。通过使用<rpc>和<rpc-reply>元素分别对NETCONF请求和响应数据(即操作层和内容层的内容)进行封装 |
通信协议层 |
非FIPS模式下:Console/Telnet/SSH/HTTP/HTTPS/TLS FIPS模式下: Console/SSH/HTTPS/TLS |
为NETCONF提供面向连接的、可靠的、顺序的数据链路。 非FIPS模式下: · NETCONF支持Telnet、SSH和Console等CLI登录方式/协议,即NETCONF over SSH、NETCONF over Telnet和NETCONF over Console · NETCONF支持HTTP和HTTPS协议,即NETCONF over HTTP和NETCONF over HTTPS · NETCONF支持封装成SOAP(Simple Object Access Protocol,简单对象访问协议)报文后通过HTTP或HTTPS协议传输,即NETCONF over SOAP over HTTP和NETCONF over SOAP over HTTPS FIPS模式下: · NETCONF支持SSH和Console等CLI方式/协议,即NETCONF over SSH和NETCONF over Console · NETCONF支持HTTPS登录协议,即NETCONF over HTTPS · NETCONF支持封装成SOAP报文后通过HTTPS协议传输,即NETCONF over SOAP over HTTPS |
通信协议层不进行SOAP封装时的报文格式我们称为NETCONF格式。通信协议层进行SOAP封装时的报文格式我们称为NETCONF over SOAP格式。
NETCONF命令必须符合XML语言的基本格式。NETCONF报文格式遵循RFC 4741/RFC 6241。
请求分为协议定义、H3C自有两个部分,其格式如下:
· 协议定义部分:即RFC 4741/RFC 6241中规定的部分。其中:
¡ encoding表示使用的XML编码格式。Comware V7 NETCONF支持GB2312、GB18030、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE编码格式。如果请求中没有携带声明部分(即<?xml version="1.0" encoding="utf-8"?>)指定XML编码格式,则默认使用UTF-8编码格式。
¡ message-id表示消息ID。客户端使用单调递增的整数来表示消息ID。服务器端在应答中会使用相同的消息ID以表示应答对应的请求。
¡ 协议部分的命名空间必须为urn:ietf:params:xml:ns:netconf:base:1.0。
<?xml version="1.0" encoding="utf-8"?>
<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<operation>
</rpc>
· H3C自有部分:对于get系列操作,filter元素下的内容为H3C自有部分;对于edit-config系列操作,config元素下的内容为H3C自有部分。
¡ H3C自有部分需要使用H3C命名空间,H3C命名空间又分为base、config、data、action命名空间。
Base命名空间:http://www.h3c.com/netconf/base:1.0
Config命名空间:http://www.h3c.com/netconf/config:1.0
Data命名空间:http://www.h3c.com/netconf/data:1.0
Action命名空间:http://www.h3c.com/netconf/action:1.0
具体使用哪个命名空间与操作类型和内容有关,可参见“7.4 Comware V7中支持的NETCONF操作类型”部分描述。
¡ H3C自有部分可以以top元素为起点,也可以以具体模块为起点。是否使用top元素由netconf capability specific-namespace命令进行配置。缺省使用top元素,命名空间位于top元素之后,各模块共用命名空间。配置netconf capability specific-namespace命令后不再需要使用top元素,命名空间位于模块名之后,各模块专用自己的命名空间。模块专用的命名空间定义方式为H3C命名空间-模块名,例如,接口管理模块的data命名空间为http://www.h3c.com/netconf/data:1.0-Ifmgr。
¡ “模块信息”部分的内容由NETCONF API文档定义。
get-config的例子(使用共有命名空间):
<?xml version="1.0" encoding="utf-8"?>
<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<get-config>
<source>
<running/>
</source>
<filter type=”subtree”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
模块信息
</top>
</filter>
</get-config>
</rpc>
edit-config的例子(使用共有命名空间):
<?xml version="1.0" encoding="utf-8"?>
<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<edit-config>
<target>
<running/>
</target>
<config xmlns:xc=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
模块信息
</top>
</config>
</edit-config>
</rpc>
统一为协议RFC 4741定义的<rpc-reply>,如:
<?xml version="1.0" encoding="utf-8"?>
<rpc-reply xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0” message-id=”101”>
<ok/>
</rpc-reply>
如下为一个NETCONF报文示例,用于获取设备上所有接口的所有参数:
· 使用共有命名空间时:
<?xml version="1.0" encoding="utf-8"?>
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-bulk>
<filter type="subtree">
<top xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface/>
</Interfaces>
</Ifmgr>
</top>
</filter>
</get-bulk>
</rpc>
· 使用专用命名空间时:
<?xml version="1.0" encoding="utf-8"?>
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-bulk>
<filter type="subtree">
<Ifmgr xmlns="http://www.h3c.com/netconf/data:1.0-Ifmgr">
<Interfaces>
<Interface/>
</Interfaces>
</Ifmgr>
</filter>
</get-bulk>
</rpc>
一条SOAP消息包含以下元素:
· Envelope元素:必选,用来将XML文档标识为一条SOAP消息。
· Header元素:可选,包含头部信息。
· Body元素:必选,包含所有的调用和响应信息。
· Fault元素:可选,提供在处理此消息时发生错误的信息。
NETCONF over SOAP之后,NETCONF报文会放在SOAP报文的BODY元素里,这些报文除了需要遵循纯NETCONF报文的规则外,还需要遵循以下规则:
· SOAP消息必须用XML来编码。
· SOAP消息必须使用SOAP Envelope命名空间,包括http://schemas.xmlsoap.org/soap/envelope/和http://www.w3.org/2003/05/soap-envelope两种。不同设备支持的命名空间不同,请以设备的实际情况为准。
· SOAP消息不能包含DTD(Document Type Definition,文件类型定义)引用。
· SOAP消息不能包含XML处理指令。
Hello报文格式为:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:UserName>test</auth:UserName>
<auth:Password>test</auth:Password>
<auth:Language>zh-cn</auth:Language>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
</env:Body>
</env:Envelope>
NETCONF over SOAP请求的格式为:
<env:Envelope xmlns:env=”http://schemas.xmlsoap.org/soap/envelope/”>
<env:Header>
<auth:Authentication env:mustUnderstand=”1” xmlns:auth=”http://www.h3c.com/netconf/base:1.0”>
<auth:AuthInfo>10027c2abebdb482633f847102fbc890d22a</auth:AuthInfo>
<auth:Language>en</auth:Language>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<get-config>
<source>
<running/>
</source>
<filter type=”subtree”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
<Syslog/>
</top>
</filter>
</get-config>
</rpc>
</env:Body>
</env:Envelope>
NETCONF over SOAP报文格式中:
· Envelope元素:固定格式,在该元素中需要指定Envelope命名空间。
· Header元素:携带认证、使用的语言等信息。
¡ 认证信息:发送Hello建立连接时,NETCONF客户端在请求消息中携带auth:UserName和auth:Password,将认证用户名和密码发送给设备。如果认证成功,则设备在应答消息中返回登录成功的凭据(auth:AuthInfo)。后续基于该连接的NETCONF请求必须携带该凭据。
Authentication元素必须使用命名空间http://www.h3c.com/netconf/base:1.0,必须具有http://www.w3.org/2003/05/soap-envelope命名空间下的mustUnderstand属性,且属性值必须为1或者true。
¡ 使用的语言:在请求消息中通过auth:Language设置客户端期望的返回错误信息使用的语言。目前支持中文(zh-cn)和英文(en)两种语言。如果未指定,则表示使用英文。
并不是所有的请求消息都支持返回中文错误提示信息,应答消息中通过xml:lang="en"表明实际使用的语言。
auth:Language必须携带在auth:UserName、auth:Password和auth:AuthInfo之后。
· Body元素:携带的内容为NETCONF报文。
NETCONF over SOAP报文格式与NETCONF报文格式类似。下文如无特殊情况,均以NETCONF报文为例,说明报文构造方法。将NETCONF报文封装到NETCONF over SOAP报文的Body元素中,即可构造出对应的NETCONF over SOAP报文。
如下为一个NETCONF over SOAP报文示例,用于获取设备上所有接口的所有参数:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>800207F0120020C</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-bulk>
<filter type="subtree">
<top xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface/>
</Interfaces>
</Ifmgr>
</top>
</filter>
</get-bulk>
</rpc>
</env:Body>
</env:Envelope>
使用NETCONF客户端对接并配置设备的主要过程如图1所示。
图1 使用NETCONF配置设备流程图
除上述方法外,用户也可以在Python上安装ncclient库,利用已有或用户自行开发的Python IDE(Integrated Development Environment,集成开发环境),通过ncclient库将较为直观地Python脚本语言转化为Netconf报文,对Netconf客户端(设备)进行配置和管理,以简化网络配置脚本语言的编写。
用户可通过以下方式来使用NETCONF配置和管理设备:
· 通过Telnet、SSH或Console登录到设备并进入XML视图,将合法的NETCONF报文(1.2.1 NETCONF节所描述格式)直接拷贝、粘贴到命令行提示符处执行,即可实现对设备的配置和管理。
在XML视图下进行NETCONF配置时,NETCONF报文最后需要添加“]]>]]>”结束符,否则设备无法识别。
· 通过HTTP或HTTPS登录到设备的Web页面,系统会自动将Web页面的配置转换成NETCONF指令下发给设备来实现对设备的配置和管理。该方式通过简洁易用的图像化Web页面上完成配置,配置结果也会以简洁清晰的方式呈现给用户,整个NETCONF的交互过程对用户透明。
· 使用配置工具与设备建立连接并向设备下发NETCONF指令来实现对设备的配置和管理。配置工具可以分为以下两类:
¡ SSH配置工具:该类配置工具与设备建立SSH连接后,可下发NETCONF格式(即1.2.1 NETCONF节所描述格式)报文配置和管理设备。
¡ SOAP配置工具:该类配置工具通过HTTP/HTTPS与设备建立连接,并将NETCONF指令用SOAP封装成通用格式的报文后发送给设备,因此需要使用1.2.2 NETCONF over SOAP节所描述格式。使用该方式前设备上必须开启NETCONF over SOAP功能。
SOAP配置工具使用短连接,SSH配置工具使用长连接。因此,SSH配置工具具有较高的效率,但对设备和客户端的资源消耗较高。
综上,实际应用中使用NETCONF配置设备时主要采用配置工具的方式。客户可以开发和定制自己专用的配置工具软件,也可以使用第三方开发的配置工具。第三方的配置工具有:
· SSH配置工具:NETCONF Browser等。
· SOAP配置工具:SOAP UI等。
关于各配置工具的使用方法,请参见配置工具的配置指导。
H3C设备目前支持如下连接方式:
非FIPS模式下:
· NETCONF over SSH
· NETCONF over Telnet
· NETCONF over Console
· NETCONF over HTTP
· NETCONF over HTTPS
· NETCONF over SOAP over HTTP
· NETCONF over SOAP over HTTPS
FIPS模式下:
· NETCONF over SSH
· NETCONF over Console
· NETCONF over HTTPS
· NETCONF over SOAP over HTTPS
不同配置方式使用的连接方式不同:
· 使用Telnet登录到设备并进入XML视图即建立NETCONF over Telnet连接。
· 使用Console登录到设备并进入XML视图即建立NETCONF over Console连接。建议尽量不使用NETCONF over Console方式,因Console口的速度限制,且XML视图下不输出提示、告警信息,比较容易出现错误。
· 使用HTTP或HTTPS登录到设备的Web页面进行配置时,Web使用NETCONF over HTTP或NETCONF over HTTPs连接方式与设备交互配置信息。交互过程对用户透明,本文后续不再介绍。通过Web配置设备的支持情况与产品型号有关,请以设备的实际情况为准。
· 使用SSH配置工具或使用SSH登录到设备进入XML视图执行NETCONF配置时需要使用NETCONF over SSH连接方式。
· 使用SOAP配置工具下发NETCONF指令配置设备时,需要使用NETCONF over SOAP over HTTP或NETCONF over SOAP over HTTPS方式。
本文重点介绍通过NETCONF over SSH、NETCONF over SOAP over HTTP和NETCONF over SOAP over HTTPS配置工具与设备建立连接,其他连接方式不再介绍。
使用配置工具与设备建立NETCONF连接前,需要确保NETCONF用户具有对应的操作权限。
在Comware V7系统中,用户的权限通过它所属的角色的权限来控制,角色的权限主要包括规则和资源策略两个方面。
在规则方面,NETCONF用户角色需要如下权限:
· 执行NETCONF操作需要具有执行XML元素NETCONF RPC节点的权限,不同NETCONF操作需要的权限不同,具体请参见表2。
· 执行NETCONF操作内容的权限可以通过用户执行XML元素具体模块及其表的Xpath的权限控制,例如配置用户具有执行XML元素接口模块的权限,需要执行rule number permit read write execute xml-element ifmgr/命令。
在资源策略方面,可以根据实际需要配置用户角色操作接口、VLAN、VPN、安全域的权限。缺省情况下,用户具有操作所有资源的权限。
缺省用户角色network-admin、mdc-admin、context-admin可操作对应设备/MDC/Context的所有功能和资源(除安全日志文件管理相关命令display security-logfile summary、info-center security-logfile directory、security-logfile save之外)的权限,如果用户所属角色是这几种,则不需要进行权限配置,只需要指定用户角色为network-admin、mdc-admin或context-admin即可。
更多关于用户角色权限控制的内容,请参见“基础配置指导”中的“RBAC”。
表2 执行NETCONF操作需要配置的权限
执行的NETCONF操作 |
需要配置的权限节点 |
需要配置的权限 |
建立NETCONF会话 |
不涉及 |
执行xml命令的权限 |
从设备订阅事件 |
rpc/create-subscription |
execute |
给当前配置加锁 |
rpc/lock |
execute |
给当前配置解锁 |
rpc/unlock |
execute |
使用<get>获取信息 |
rpc/get |
read |
使用<get>获取系统支持的事件流 |
rpc/get/filter/netconf |
read |
使用<get>获取NETCON状态信息 |
rpc/get/filter/netconf-state |
read |
使用<get-bulk>获取信息 |
rpc/get-bulk |
read |
使用<get-config>获取配置信息 |
rpc/get-config |
read |
使用<get-bulk-config>获取配置信息 |
rpc/get-bulk-config |
read |
使用<get-schema>获取yang文件信息 |
rpc/get-schema |
read |
<edit-config>编辑指定模块数据 |
rpc/edit-config |
write |
执行一个<action>操作 |
rpc/action |
execute |
配置保存 |
rpc/save |
write |
配置回滚 |
rpc/rollback |
write |
配置加载 |
rpc/load |
write |
命令行操作 |
rpc/CLI |
write |
获取会话信息 |
rpc/get-sessions |
read |
关闭另一个会话 |
rpc/kill-session |
execute |
执行语法验证 |
rpc/validate |
read |
(1) 进入系统视图。
system-view
(2) 创建用户角色,并进入用户角色视图。
role name role-name
¡ 配置用户具有执行XML元素NETCONF RPC节点的权限。
rule number permit { execute | read | write } * xml-element rpc/
通过rule number permit { execute | read | write } * xml-element rpc/?可以查看具体操作的列表。不指定具体操作时,表示所有操作。
¡ 配置用户执行XML元素具体模块的权限。
rule number { deny | permit } { execute | read | write } * xml-element [ module-xpath ]
通过rule number { deny | permit } { execute | read | write } * xml-element ?可以查看具体模块列表,通过rule number { deny | permit } { execute | read | write } * xml-element module-name/?可以查看模块中具体表的列表。不指定具体模块和表时表示所有模块/所有表。
本文采用新建本地用户介绍配置过程。使用远端认证用户的配置方式请参见具体认证方式的配置指导,只要使通过认证的NETCONF用户满足以下两个条件:
· 使用NETCONF over SSH连接方式时,服务类型为SSH。使用NETCONF over SOAP over HTTP连接方式时,服务类型为HTTP。使用NETCONF over SOAP over HTTPS连接方式时,服务类型为HTTPS。
· 具有所需权限。
(1) 进入系统视图。
system-view
(2) 添加设备管理类本地用户,并进入设备管理类本地用户视图。
local-user user-name class manage
(3) 设置本地用户的密码。
(非FIPS模式)
password [ { hash | simple } string ]
(FIPS模式)
password
在非FIPS模式下,可以不为本地用户设置密码;在FIPS模式下,必须且只能通过交互式方式设置明文密码,否则用户的本地认证不能成功。
(4) 设置本地用户可以使用的服务类型。请根据连接方式选择其中一项进行配置
¡ 使用NETCONF over SSH连接方式:
service-type ssh
¡ 使用NETCONF over SOAP over HTTP或NETCONF over SOAP over HTTPS连接方式:
(非FIPS模式)
service-type { http | https } *
(FIPS模式)
service-type https
缺省情况下,本地用户不能使用任何服务类型。
(5) 设置本地用户的角色。
authorization-attribute user-role role-name
以下配置步骤只介绍采用password方式认证SSH客户端的配置方法,publickey方式的配置方法及SSH的详细介绍,请参见“安全配置指导”中的“SSH”。
(1) 进入系统视图。
system-view
(2) 生成本地密钥对。
(非FIPS模式)
public-key local create { dsa | ecdsa [ secp192r1 | secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]
(FIPS模式)
public-key local create { dsa | ecdsa [ secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]
(3) (可选)创建SSH用户,并指定SSH用户的服务类型为NETCONF,认证方式为password。
ssh user username service-type netconf authentication-type password
(4) 进入VTY用户线或VTY用户线类视图。
¡ 进入VTY用户线视图。
line vty first-number [ last-number ]
¡ 进入VTY用户线类视图。
line class vty
(5) 配置VTY用户线的认证方式为scheme方式。
(非FIPS模式)
authentication-mode scheme
缺省情况下,VTY用户线的认证方式为password方式。
(FIPS模式)
authentication-mode scheme
缺省情况下,VTY用户线的认证方式为scheme方式。
(1) 进入系统视图。
system-view
(2) 开启NETCONF over SSH。
netconf ssh server enable
缺省情况下,NETCONF over SSH处于关闭状态。
(3) 配置NETCONF over SSH的监听端口。
netconf ssh server port port-number
缺省情况下,NETCONF over SSH的监听端口为830。
(4) (可选)开启NETCONF日志功能。
netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }
缺省情况下,NETCONF日志功能处于关闭状态。
(5) 通过SSH配置工具与设备建立NETCONF over SSH会话。关于SSH配置工具的使用方法,具体参见SSH配置工具的配置指导。
使用NETCONF over SOAP over HTTP或NETCONF over SOAP over HTTPS连接方式时,配置工具将配置指令封装成SOAP报文后通过HTTP或HTTPS协议传输到设备。
本文仅介绍基本配置,有关SOAP报文的DSCP优先级、NETCONF客户端访问控制、NETCONF用户使用的认证域等相关内容请参见产品对应版本的NETCONF配置、NETCONF命令手册。
(1) 进入系统视图。
system-view
(2) 开启NETCONF over SOAP功能。
(非FIPS模式)
netconf soap { http | https } enable
(FIPS模式)
netconf soap https enable
缺省情况下,NETCONF over SOAP处于关闭状态。
(3) (可选)开启NETCONF日志功能。
netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }
缺省情况下,NETCONF日志功能处于关闭状态。
(4) 通过配置工具与设备建立NETCONF over SOAP会话。关于配置工具的使用方法,具体参见配置工具的配置指导。
建立NETCONF会话后,客户端需要先与设备进行能力集交互,完成能力集的交互后,设备才会处理客户端发送的其他请求。能力集的表示形式为URI(Uniform Resource Identifier,统一资源标识符),例如“urn:ietf:params:netconf:base:1.0”。客户端支持的能力集以客户端实际情况为准。客户端发送Hello报文时,请根据实际情况指定能力集。本文以客户端指定能力集urn:ietf:params:netconf:base:1.0为例进行举例。
多个用户同时配置设备时,可能会导致用户配置与配置结果不一致,因此,请避免多个用户同时配置设备。
设备同一时间内允许建立的最大会话数可以通过aaa session-limit命令配置,关于该命令的详细描述,请参见“安全配置指导”中的“AAA”。用户数超过上限后,新登录的用户将登录失败。
适用于NETCONF over SSH配置工具的方式。
客户端收到设备发送的能力集协商报文后,需要给设备发送如下格式的报文,告知设备客户端支持哪些NETCONF能力集。
Hello协商报文格式如下:
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
一个<capability>和</capability>选项对中只能填写一个能力集。可以使用多个<capability>和</capability>选项对,配置多个能力集。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
更多能力集显示略,以设备的实际回复为准
<capability>http://www.h3c.com/netconf/action:1.0-Configuration?module=Configuration&revision=2015-05-07</capability>
</capabilities>
<session-id>1</session-id>
</hello>
<capabilities>和</capabilities>之间的内容表示设备支持的能力集,以具体设备实际情况为准。
<session-id>和</session-id>之间的内容表示为本次会话分配的会话ID,用来唯一标识本次会话。
适用于NETCONF over SOAP配置工具的方式。
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:UserName>test</auth:UserName>
<auth:Password>test</auth:Password>
<auth:Language>zh-cn</auth:Language>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
</env:Body>
</env:Envelope>
一个<capability>和</capability>选项对中只能填写一个能力集。可以使用多个<capability>和</capability>选项对,配置多个能力集。
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100002fbf58da6797490a3ef11142d879212</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
更多能力集显示略,以设备的实际回复为准
<capability>http://www.h3c.com/netconf/action:1.0-Configuration?module=Configuration&revision=2015-05-07</capability>
</capabilities>
<session-id>2</session-id>
</hello>
</env:Body>
</env:Envelope>
<capabilities>和</capabilities>之间的内容表示设备支持的能力集,以具体设备实际情况为准。
<session-id>和</session-id>之间的内容表示为本次会话分配的会话ID,用来唯一标识本次会话。
NETCONF API文档分属于三个命名空间:
· data命名空间:提供系统的运行状态数据和配置数据,为只读,支持下发get和get-bulk操作。
· config命名空间:提供系统的配置数据信息,可读写,支持下发get-config、get-bulk-config和edit-config操作。
· action命名空间:通常提供系统非配置类的操作和运行状态数据(如ping、reset操作),可读写,支持下发action操作。
每一个支持NETCONF的模块都包括一个或者多个NETCONF API文档,分别描述其在data命名空间、config命名空间和action命名空间支持的功能。文档命名遵循如下格式,其中XXX代表模块名:
· data命名空间:Comware V7 XXX NETCONF XML API Data Reference.docx
· config命名空间:Comware V7 XXX NETCONF XML API Configuration Reference.docx
· action命名空间:Comware V7 XXX NETCONF XML API Action Reference.docx
每一个NETCONF API文档对应一个功能模块,如ARP、DHCP。每个模块由一个或者多个表组成。表以行和列的形式进行组织:
· 行:表示一个对象实例。
· 列:表示每个对象实例中包含的信息。
以ARP表为例,一条ARP表项为一行,ARP表项中的IP地址、MAC地址、所属VLAN等为列。
在NETCONF API文档中,每个表包含下面几个部分的信息:
· 表名称:提供了从模块开始的路径和最终的表名,如:ACL/Base
· 表的XML结构(XML structure):列举了本表从模块开始的XML表示方式,但不包括值信息,例如:
· 表描述(Table description):提供模块名称、表名称、表类型、行名称和约束信息。其中,表类型取值包括:
¡ Multi-instance table:多实例表格,表示该表可以包含多行。
¡ Single-instance table:单实例表格,表示该表能包括一行。
· 列详细信息(Columns):提供列名称、列描述、列数据类型和约束条件等信息。列数据类型取值包括:
¡ Index:表示该列为表格的索引列。
¡ N/A:表示该列不作为索引列。
· 应答的XML结构(Responsed XML structure):列举了本表从模块开始应答消息的XML表示方式,但不包括值信息。客户端可以依据返回结果来判断操作执行的效果。仅action命名空间中可以返回操作结果的表提供此信息。例如:
· 应答列详细信息(Responsed columns):用来描述应答XML结构中的各列。
Comware V7 NETCONF API文档描述的是全集,需要结合设备的XSD文件来查看当前设备的支持情况。设备可能不支持某些功能、某些表格或某些列。
NETCONF请求构造方法为:
(1) 构造XML请求的协议定义部分,即top外层的部分。
以get操作为例,top以外的部分为协议定义部分,可以直接从现有请求或者本文档拷贝。
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get>
<filter>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</top>
</filter>
</get>
</rpc>
其他操作的协议定义部分格式,请参见“7.4 Comware V7中支持的NETCONF操作类型”。
(2) 构造top元素。
top元素的格式通常为:<top xmlns="http://www.h3c.com/netconf/data:1.0">。其中,http://www.h3c.com/netconf/data:1.0为H3C自定义的命名空间,需要根据需要设置为data、config或action命名空间,即data:1.0也可根据需要设置为config:1.0或action:1.0。
(3) 构造模块操作部分。
拷贝NETCONF API文档中表格XML结构到“指定模块,子模块,表名,列名”部分,然后依据实际情况删除不需要的列或者为已知列赋值。
config命名空间中ARP模块的ArpConfig表用来配置ARP表项,其XML结构如图2所示。该表中包括ARP表项的IP地址、MAC地址、所属VPN实例、所属VLAN、出接口、表项类型信息。
图2 ARP/ArpConfig表的XML结构
通过NETCONF创建公网中IP地址为1.1.1.1、MAC地址为1-1-1、所属VLAN为VLAN 10、出接口索引为20的静态ARP表项时,需要采用edit-config:merge操作。该操作使用的XML请求为:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">
<ARP>
<ArpConfig>
<Config>
<VrfIndex>0</VrfIndex>
<Ipv4Address>1.1.1.1</Ipv4Address>
<MacAddress>00-01-00-01-00-02</MacAddress>
<VLANID>10</VLANID>
<PortIndex>20</PortIndex>
<ArpType>1</ArpType>
</Config>
</ArpConfig>
</ARP>
</top>
</config>
</edit-config>
</rpc>
Comware V7平台对NETCONF标准协议做了一些修订,删除了不常用的操作,增加部分新的操作,如表3所示。
表3 NETCONF协议支持的操作
操作 |
说明 |
XML格式样例 |
get |
获取数据,包括运行状态数据和配置数据 |
获取Syslog模块的全部数据的XML请求如下: |
get-config |
获取配置数据,和get不同,它只返回非缺省的配置数据。如果未配置数据,则返回一个空的<data> |
获取接口表内所有配置的XML请求如下: |
get-bulk |
从指定索引的下一条开始批量获取后续N条数据(索引行数据不返回),包括运行状态数据和配置数据。用户通过index属性指定索引,通过count属性指定N。如未指定索引,则以第一条为索引;如未指定N,或者数据表中符合条件的数据记录不足N条,则返回表中所有剩下的数据条目 get操作会返回所有符合条件的数据,这在某些情况下会导致效率问题。get-bulk允许用户从固定数据项开始,向后获取指定条目的数据记录 |
取全部接口的数据的xml请求如下: |
get-bulk-config |
从指定索引的下一条批量获取配置数据。和get-config类似,只返回非默认配置;其他约束类似get-bulk |
获取全部接口配置信息的xml请求如下: |
edit-config增量下发 |
增量下发选项incremental放置在列上,对于类似vlan permitlist列表集合性质的列,可能支持增量下发,用户请求XML中有增量下发选项时,最终执行结果不影响本列原有的数据。 增量下发只支持edit-config,但不支持edit-config中的replace。 不是所有模块都支持增量下发,具体请参见模块对应的NETCONF XML API,查找其是否支持增量下发 |
下发一个接口的VLAN配置,使用增量下发,262接口原有untagvlanlist为12~15,下发后为1~10,12~15。XML请求如下: |
edit-config: merge |
在当前运行配置的基础上直接运行指定配置 merge操作必须指定具体的操作对象(行): · 如果指定的对象存在,则直接配置该对象 · 如果指定的对象不存在,但允许创建,则先创建再配置该对象 · 如果指定的对象不存在且不允许创建,则返回merge失败 |
将BufferSize设置为120的xml请求如下: |
edit-config: create |
创建指定对象。create操作必须指定配置对象。create操作的XML数据格式和merge类似,只是operation属性需要指定为“create” · 如果当前配置表支持创建对象,且当前对象不存在,则先创建配置对象,再创建指定的配置 · 如果配置对象下对应的配置项已经存在,则返回data-exist错误 |
同上,把merge修改为create即可 |
edit-config: replace |
· 如果指定的对象存在,则替换指定对象的配置为当前配置 · 如果指定的对象不存在,但允许创建,则先创建再配置该对象为当前配置 · 如果指定对象不存在且不允许创建,则不进行replace操作,返回invalid-value错误,提示用户配置对象不存在 |
同上,把merge修改为replace即可 |
edit-config: remove |
删除指定配置 · 当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象 · 当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置 · 如果系统中指定对象不存在,或者XML消息未指定对象,则直接返回成功 |
同上,把merge修改为remove即可 |
edit-config: delete |
删除指定配置 · 当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象 · 当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置 · 如果系统中指定对象不存在,则直接返回不存在的错误消息 |
同上,把merge修改为delete即可 |
edit-config 默认操作选项 |
edit-config操作用于修改当前系统配置。NETCONF定制了四种修改配置的方式:merge、create、delete和replace。当XML消息中未指定修改配置方式的时候,则使用默认操作做为当前指令的操作方式,不会修改默认操作的缺省值 默认操作的缺省值是merge,在XML消息中可以通过<default-operation>节点来设置默认操作,取值为: · merge:当配置方式和默认操作方式均未指定时,使用该方式 · replace:当配置方式未指定,默认操作指定为replace的时候,edit-config操作会默认为replace操作 · none:当配置方式未指定,默认操作指定为none的时候,edit-config操作会默认为none操作。none操作主要用来检查,下发为none操作的配置仅仅做Schema校验,不进行真正的配置下发。语法检查通过,就返回ok成功,否则失败 |
下发一个空的操作,该操作仅仅验证格式,并不真正下发给系统,xml请求如下: |
edit-config默认错误处理选项 |
edit-config将指定的配置设置到系统上,完成配置设置的操作。在执行edit-config的过程中,如果遇到一个实例配置出错,默认情况下会直接返回错误,但是为了使我们的应用更加灵活,edit-config为我们提供了错误选项,通过错误选项取值的不同,在发生错误的时候进行不同的处理操作 <error-option>节点用于设置一个实例配置出错后,后续实例配置的处理方式,缺省值为stop-on-error,全部取值为: · stop-on-error:停止处理,返回错误。此选项为默认选项 · continue-on-error:继续处理,但是报告错误 · rollback-on-error:停止并回滚配置 |
下发两个接口的配置,当下发第一个接口的配置发生错误时,继续进行下一个接口配置的下发,XML请求如下: |
edit-config测试处理选项 |
在真正执行edit-config操作时,可指定一个测试选项,使用<test-option>节点来决定当前配置是否真正下发。该节点的缺省值为test-then-set,全部取值为: · test-then-set:如果没有错误则将配置设置到系统 · set:将配置设置到系统 · test-only:只测试,并不下发配置到系统。语法检查通过,就返回ok成功,否则失败 |
下发一个接口的配置,仅测试,XML请求如下: |
action |
下发非配置数据的设置动作,比如,reset操作 |
清除全部接口的统计信息,XML请求如下: |
lock |
锁保护的是配置数据,即edit-config中可以指定的那些模块的配置数据,其他操作不受锁的限制 NETCONF锁仅仅保护NETCONF 会话,不保护SNMP等其他请求下发的配置 |
禁止NETCONF会话修改设备的当前配置,XML请求如下: |
unlock |
取消锁保护 当会话结束时锁也会被自动释放 |
取消锁保护,允许NETCONF会话修改设备的当前配置: |
get- sessions |
获取当前系统中所有NETCONF会话的信息(不能指定sessions-ID) |
获取当前系统中所有NETCONF会话的信息: |
close- session |
关闭当前NETCONF会话,并释放锁和这个session用到的内部资源(如内存等),退出XML视图 |
关闭当前NETCONF会话,并释放锁和这个session用到的内部资源(如内存等),退出XML视图 |
kill- session |
关闭其他NETCONF会话,不支持关闭用户自己的NETCONF会话 |
关闭session-id为1的NETCONF会话: |
CLI |
执行命令行的命令。请求消息将命令行语句封装在<CLI>标签中,命令行输出信息被封装在<CLI>标签中返回 CLI支持Configuration和Execution方式执行命令行: · Execution:在用户视图下执行命令行 · Configuration:在系统视图下执行命令行。使用该方式时需要指定exec-use-channel的属性: ¡ false:不使用channel方式执行命令行 ¡ true:使用临时channel执行命令行,执行完成后,自动关闭该channel ¡ persist:使用保留channel执行命令行。使用该方式时,则需要执行Open-channel操作打开当前对话的channel;使用完成后,执行Close-channel关闭Channel。如果未执行Open-channel操作,则系统将自动打开channel;如果未执行关闭保留channel操作,再次使用保留channel时,系统在上次最后执行的命令行所在视图再次执行命令行 · 对于其他视图下命令,则需要在Configuration下先指定进子视图的命令,再指定配置命令 一个NETCONF会话只能打开一个保留channel,可以打开多个临时channel 不支持执行交互式命令 使用channel方式执行命令行时,不支持执行quit命令退出用户视图 |
在系统视图下不使用channel方式执行telnet server enable命令: |
save |
保存系统运行配置。save操作可以使用子元素<file>来指定保存的配置文件名称。当save操作中不存在子元素<file>列时,则设备会自动将当前运行配置保存到主用下次启动配置文件中。OverWrite属性用来判断当指定的配置文件名存在时,当前配置是否覆盖原配置文件并保存成功。Binary-only属性用来只保存当前使用的二进制配置文件 |
将设备当前配置保存到文件test.cfg中: |
load |
配置加载。<load>操作执行后,指定文件中的配置会被合并到设备的当前配置中 |
将文件a1.cfg中的配置合并到设备的当前配置中: |
rollback |
配置回滚。<rollback>操作必须使用子元素<file>来指定需要回滚的配置文件名称<rollback>操作执行后,当前系统运行配置会被完全替换为指定文件中所描述的配置 |
将设备当前配置回退到文件1A.cfg中配置的状态: |
在下发请求前,建议先利用XSD使用工具验证下请求的XML设备是否支持,是否存在格式问题。本文使用Altova XMLSpy来验证XML是否正确,也可以使用其他支持XML验证的工具。
(1) 把设备XSD文件拷贝出来,放在一个目录中。XSD文件随软件版本发布。
(2) 新建XML文件,将待验证NETCONF报文粘贴到该XML文件里。
图3 新建XML文件
(3) 点击XML—〉Check Formedness菜单验证XML格式是否良好。如果有XML格式问题,请根据下发Messages处提示信息修改。
图4 验证XML格式是否良好
(4) 根据XSD文件验证报文是否合法。点击DTD/Schema —〉 Assign Schema菜单,选择main.xsd。
图5 选择XSD文件
(5) 点击XML—〉Validate XML菜单验证XML是否合法。如果Messages处有错误提示,请根据提示进行修改。修改完成后再次验证,直到通过验证。
图6 验证XML是否合法(合法时)
图7 验证XML是否合法(不合法时)
使用XSD验证XML报文正确后,即可正式通过配置工具下发配置指令。
<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<close-session/>
</rpc>
设备向客户端应答如下报文,但此时由于关闭了会话,客户端可能收不到此报文。
<?xml version=”1.0” encoding=”UTF-8” ?>
<rpc-reply message-id=”101”
xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<ok/>
</rpc-reply>
在主机上安装NETCONF客户端软件,通过NETCONF配置Device A作为DHCP服务器、Device B作为DHCP客户端。DHCP服务器可以为DHCP客户端分配以下网络参数:
· 网段10.1.1.0/24内的IP地址。
· IP地址租约为1天。
· 网关地址为10.1.1.1。
· DNS服务器地址为10.1.1.10。
图8 通过NETCONF配置DHCP服务器组网图
(1) 开启NETCONF over SOAP功能。
# 开启NETCONF over SOAP功能。
<DeviceA> system-view
[DeviceA] netconf soap http enable
(2) 配置用户admin可以通过NETCONF操作DHCP和接口管理Ifmgr模块。
# 创建用户角色dhcp-ifmgr-vlan,指定该用户角色可以读、写、执行DHCP和Ifmgr模块的XML元素。
[DeviceA] role name dhcp-ifmgr-vlan
[DeviceA-role-dhcp-ifmgr-vlan] rule 1 permit command xml
[DeviceA-role-dhcp-ifmgr-vlan] rule 2 permit read write execute xml-element rpc/
[DeviceA-role-dhcp-ifmgr-vlan] rule 3 permit read write execute xml-element dhcp/
[DeviceA-role-dhcp-ifmgr-vlan] rule 4 permit read write execute xml-element ifmgr/
[DeviceA-role-dhcp-ifmgr-vlan] rule 5 permit read write execute xml-element vlan/
[DeviceA-role-dhcp-ifmgr-vlan] quit
# 创建设备管理类本地用户admin,设置其密码为admin、服务类型为HTTP。
[DeviceA] local-user admin
[DeviceA-luser-manage-admin] password simple admin
[DeviceA-luser-manage-admin] service-type http
# 配置为用户admin授权的用户角色为dhcp-ifmgr-vlan。
[DeviceA-luser-manage-admin] authorization-attribute user-role dhcp-ifmgr-vlan
(1) 配置NETCONF客户端软件,配置方法请参见客户端软件相关指导,具体配置过程略。
(2) 向Device A发送Hello
# 在TestCase-DHCP中添加步骤Hello,XML内容如下。其中,用户名为admin,密码为admin。所有步骤窗口中的URL地址均需要设置为:http://192.168.1.121/soap/netconf/。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:UserName>admin</auth:UserName>
<auth:Password>admin</auth:Password>
<auth:Language>en</auth:Language>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
</env:Body>
</env:Envelope>
# 接收到的应答消息中,auth:AuthInfo为100001ac479ef0988d587b74e787a0917f69。后续的请求报文都需要携带该认证信息。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
...省略若干capability...
</capabilities>
<session-id>1</session-id>
</hello>
</env:Body>
</env:Envelope>
(3) 获取接口GigabitEthernet1/0/1和GigabitEthernet1/0/2的接口索引值。
# 创建步骤GetIfINdex,向Device A发送请求获取接口索引值。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get>
<filter type="subtree">
<top xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex></IfIndex>
<Name>GigabitEthernet1/0/1</Name>
</Interface>
<Interface>
<IfIndex></IfIndex>
<Name>GigabitEthernet1/0/2</Name>
</Interface>
</Interfaces>
</Ifmgr>
</top>
</filter>
</get>
</rpc>
</env:Body>
</env:Envelope>
# 接收到的应答消息,获知接口GigabitEthernet1/0/1和GigabitEthernet1/0/2的索引值分别为1和2。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex>1</IfIndex>
<Name>GigabitEthernet1/0/1</Name>
</Interface>
</Interfaces>
</Ifmgr>
</top>
</data>
</rpc-reply>
</env:Body>
</env:Envelope>
(4) 创建VLAN,将接口加入VLAN,创建VLAN接口,并配置VLAN接口的IP地址。
# 创建步骤CreateVLAN,在Device A上创建VLAN 10和20,将接口GigabitEthernet1/0/1和GigabitEthernet1/0/2分别加入VLAN 10和20。创建VLAN接口10和20,配置其IP地址分别为10.1.1.1/24和192.168.1.1/24。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">
<VLAN>
<VLANs>
<VLANID>
<ID>10</ID>
<AccessPortList>1</AccessPortList>
<Ipv4>
<Ipv4Address>10.1.1.1</Ipv4Address>
<Ipv4Mask>255.255.255.0</Ipv4Mask>
</Ipv4>
</VLANID>
<VLANID>
<ID>20</ID>
<AccessPortList>2</AccessPortList>
<Ipv4>
<Ipv4Address>192.168.2.1</Ipv4Address>
<Ipv4Mask>255.255.255.0</Ipv4Mask>
</Ipv4>
</VLANID>
</VLANs>
</VLAN>
</top>
</config>
</edit-config>
</rpc>
# 接收到应答消息,表明配置成功。
</env:Body>
</env:Envelope>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
</env:Body>
</env:Envelope>
(5) 创建DHCP地址池
# 创建步骤CreatePool,在Device A上创建DHCP地址池pool1,该地址池分配10.1.1.0/24网段地址、IP地址租约为1天、网关地址为10.1.1.1、DNS服务器地址为10.1.1.10。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="create">
<DHCP>
<DHCPServerIpPool>
<IpPool>
<PoolIndex>1</PoolIndex>
<PoolName>pool1</PoolName>
<NetworkIpv4Address>10.1.1.0</NetworkIpv4Address>
<NetworkIpv4Mask>255.255.255.0</NetworkIpv4Mask>
<LeaseDay>1</LeaseDay>
<LeaseHour>0</LeaseHour>
<LeaseMinute>0</LeaseMinute>
<LeaseSecond>0</LeaseSecond>
<GatewayIpv4Address>10.1.1.1</GatewayIpv4Address>
<DNSIpv4Address>10.1.1.10</DNSIpv4Address>
</IpPool>
</DHCPServerIpPool>
</DHCP>
</top>
</config>
</edit-config>
</rpc>
</env:Body>
</env:Envelope>
# 接收到应答消息,表明配置成功。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
</env:Body>
</env:Envelope>
(6) 开启DHCP服务。
# 创建步骤DHCP-Enable,开启DHCP服务。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="create">
<DHCP>
<DHCPConfig>
<DHCPEnable>1</DHCPEnable>
</DHCPConfig>
</DHCP>
</top>
</config>
</edit-config>
</rpc>
</env:Body>
</env:Envelope>
# 接收到应答消息,表明配置成功。
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
</env:Body>
</env:Envelope>
# 创建VLAN 10,将接口GigabitEthernet1/0/1加入VLAN 10。
<DeviceB> system-view
[DeviceB] vlan 10
[DeviceB-vlan10] port GigabitEthernet 1/0/1
[DeviceB-vlan10] quit
# 创建VLAN接口10,配置该接口通过DHCP获取IP地址。
[DeviceB] interface vlan-interface 10
[DeviceB-Vlan-interface10] ip address dhcp-alloc
[DeviceB-Vlan-interface10] quit
# 在Device B上查看接口IP地址,可以看到VLAN接口10获取到IP地址10.1.1.2。
[DeviceB] display ip interface brief
*down: administratively down
(s): spoofing (l): loopback
Interface Physical Protocol IP address VPN instance Description
Vlan10 up up 10.1.1.2 -- --
# 在Device B上查看DHCP客户端信息,可以看到VLAN接口10获取到的参数与DHCP服务器上的配置一致。
[DeviceB] display dhcp client verbose
Vlan-interface10 DHCP client information:
Current state: BOUND
Allocated IP: 10.1.1.2 255.255.255.0
Allocated lease: 86400 seconds, T1: 38637 seconds, T2: 75600 seconds
Lease from Jan 1 08:54:48 2013 to Jan 2 08:54:48 2013
DHCP server: 10.1.1.1
Transaction ID: 0x81876da6
Default router: 10.1.1.1
DNS servers: 10.1.1.10
Client ID type: ascii(type value=00)
Client ID value: 00e0.fc00.511a-Vlan10
Client ID (with type) hex: 0030-3065-302e-6663-
3030-2e35-3131-612d-
566c-616e-3130
T1 will timeout in 0 days 10 hours 40 minutes 20 seconds
在主机Host上安装开源工具ncclient,通过主机Host与Device设备建立NETCONF over SSH会话,实现如下需求:
· 查询Device设备的ARP表项和接口信息。
· 配置BGP。
图9 通过NETCONF查询和配置Device设备组网图
(1) 配置主机Host与Device设备的IP地址,确保主机Host与Device互通(略)。
(2) 在Device设备上开启NETCONF over SSH server功能。
# 生成RSA密钥对。
<Router> system-view
[Router] public-key local create rsa
The range of public key modulus is (512 ~ 4096).
If the key modulus is greater than 512, it will take a few minutes.
Press CTRL+C to abort.
Input the modulus length [default = 1024]:
Generating Keys...
.
Create the key pair successfully.
# 生成DSA密钥对。
[Router] public-key local create dsa
The range of public key modulus is (512 ~ 2048).
If the key modulus is greater than 512, it will take a few minutes.
Press CTRL+C to abort.
Input the modulus length [default = 1024]:
Generating Keys...
.
Create the key pair successfully.
# 生成ECDSA密钥对。
[Router] public-key local create ecdsa secp256r1
Generating Keys...
.
Create the key pair successfully.
# 开启NETCONF over SSH服务器功能。
<Device> system-view
[Device] netconf ssh server enable
# 创建用户admin,并配置密码为admin和用户使用的服务类型为SSH。
[Device] local-user admin class manage
[Device-luser-manage-admin] password simple admin
[Device-luser-manage-admin] service-type ssh
# 配置用户admin的授权角色为network-admin和network-operator。
[Device-luser-manage-admin] authorization-attribute user-role network-admin
[Device-luser-manage-admin] authorization-attribute user-role network-operator
[Device-luser-manage-admin] quit
# 配置admin登录设备时,需要输入用户名和密码进行AAA认证。
[Device] line vty 0 63
[Device-line-vty0-63] authentication-mode scheme
[Device-line-vty0-63] user-role network-admin
[Device-line-vty0-63] user-role network-operator
(3) 在主机Host安装ncclient。
ncclient安装有如下两种方法:
¡ 使用pip工具安装。
在命令行执行pip install ncclient安装。
pip安装的好处在于,在联网的前提下,就可以把ncclient依赖的软件包都下载和安装完整,省去了排错的问题。
¡ 使用源码安装。
在官网下载软件包,地址https://pypi.org/project/ncclient/,解压文件,使用python setup.py install命令行安装。源码安装需要手工安装好多依赖包。
(4) 基于ncclient编写Device设备信息查询和功能配置的Python代码。
# 创建query.py文件,编写查询Device设备的ARP表项和接口信息代码。
#! /usr/bin/env python2.7
import sys, os, warnings
warnings.simplefilter("ignore", DeprecationWarning)
from ncclient import manager
import time
def my_unknown_host_cb(host, figerprint):
return True
def demo(host, port, user, pwd):
with manager.connect_ssh(host=host,
port=port,
username=user,
password=pwd,
unknown_host_cb=my_unknown_host_cb,
device_params = {'name':'h3c'}) as m:
for c in m.server_capabilities:
print (c)
get_xml = """
<top xmlns="http://www.h3c.com/netconf/data:1.0">
<ARP>
<ArpTable>
<ArpEntry>
<IfIndex></IfIndex>
<Ipv4Address></Ipv4Address>
<MacAddress></MacAddress>
<VLANID></VLANID>
<PortIndex></PortIndex>
<VrfIndex></VrfIndex>
<ArpType></ArpType>
</ArpEntry>
</ArpTable>
</ARP>
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex></IfIndex>
<Name></Name>
</Interface>
</Interfaces>
</Ifmgr>
</top>
"""
print (m.get(('subtree', get_xml)))
if __name__ == '__main__':
demo("17.1.1.124", 830, "admin", "admin")
print ("closed")
time.sleep(1)
保存该文件后,在主机Host执行python query.py命令执行该文件,即可看到Device设备的ARP表项和接口信息。
# 创建deploy.py文件,编写Device设备使能BGP NSR功能的Python代码。
#! /usr/bin/env python2.7
import sys, os, warnings
warnings.simplefilter("ignore", DeprecationWarning)
from ncclient import manager
import time
def my_unknown_host_cb(host, figerprint):
return True
def demo(host, port, user, pwd):
xml = """
<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<top xmlns="http://www.h3c.com/netconf/config:1.0">
<BGP>
<Instances>
<Instance>
<Name></Name>
<ASNumber>111</ASNumber>
<NSR>1</NSR>
</Instance>
</Instances>
</BGP>
</top>
</config>"""
with manager.connect_ssh(host=host,
port=port,
username=user,
password=pwd,
unknown_host_cb=my_unknown_host_cb,
device_params = {'name':'h3c'}) as m:
for c in m.server_capabilities:
print (c)
print (xml)
print (m.edit_config(target='running', config=xml))
if __name__ == '__main__':
demo("17.1.1.124", 830, "admin", "admin")
保存该文件后,在主机Host上执行python deploy.py命令执行该文件,会收到Device设备返回的信息,如果“rpc-reply”元素内显示信息为“ok”,即表示执行成功。然后在Device设备上使用display current-configuration configuration bgp命令查看BGP AS111的配置信息。