閱讀冗長的NETCONF/YANG的RFC文檔是相當乏味枯燥的,結合開發(fā)實踐,本文試圖刪其繁,撮其要,給出NETCONF/YANG的輪廓和要點。
引子
NETCONF和YANG的目的是以可編程的方式實現(xiàn)網(wǎng)絡配置的自動化,從而簡化和加快網(wǎng)絡設備和服務的部署,為網(wǎng)絡運營商和企業(yè)用戶節(jié)約成本。NETCONF和YANG對應的RFC文檔分別是RFC6241和RFC6020,而RFC6244描述了一個實現(xiàn)NETCONF/YANG的參考架構。
按照RFC6241的定義,NETCONF是安裝、編輯和刪除網(wǎng)絡設備配置的標準協(xié)議。RFC6020指出,YANG是一種數(shù)據(jù)模型語言(Data Modeling Language),用來描述NETCONF相關的網(wǎng)絡配置和網(wǎng)絡狀態(tài)的數(shù)據(jù)模型,包括NETCONF支持的RPC(Remote Procedure Call)消息和異步通知(Notification)。請注意,YANG本身不是數(shù)據(jù)模型,而是定義數(shù)據(jù)模型的語言。YANG和NETCONF是相伴而生的,雖然,原則上YANG也能夠用于其他的協(xié)議和不同的領域,但基本上可以認為YANG就是為NETCONF量身定做的。
2002年,IAB(Internet Architecture Board)召集了一次關于網(wǎng)絡管理的專題工作會議(Workshop),最終形成了RFC3535。在這份文檔中,針對當時網(wǎng)絡管理中存在的問題,提出了14項需求,我們不妨列出其中關鍵的幾項:
簡單好用。這何須說?!嚴格區(qū)分網(wǎng)絡可配置的數(shù)據(jù)和運行時的狀態(tài)數(shù)據(jù)??膳渲玫臄?shù)據(jù)如靜態(tài)IP地址和VLAN,用來改變設備的行為;狀態(tài)數(shù)據(jù)如接收、丟棄、轉發(fā)的數(shù)據(jù)包的計數(shù)統(tǒng)計,用來監(jiān)控設備的行為。PicOS的Cli就有Operational模式和Configure模式,分別用于輸出系統(tǒng)狀態(tài)和改變系統(tǒng)配置??梢詫⒄麄€網(wǎng)絡作為配置的對象,而不僅僅是單獨的設備。所謂SDN的集中式管理不就是這樣嗎?很多SDN的Controller平臺如OpenDaylight本身也是基于整個網(wǎng)絡視圖的開發(fā)平臺。支持多個網(wǎng)絡設備配置的transaction機制。比如,給定一個網(wǎng)絡,利用Dijkstra算法得到兩個主機之間的最短路徑,將正確路由配置到這一路徑上的每個交換設備。若某個交換設備配置失敗,那么所有的交換設備都應該恢復到原來狀態(tài)。這個說起來簡單,做起來恐怕并不容易。網(wǎng)絡設備可保留多份配置拷貝,不同配置之間可以自由切換,以適配不同的應用場景。這樣,交換機就可以切換到特殊的配置來應對流量高峰期的到來。另外,更為重要的是,是否支持可編程配置的API不是問題,問題是以怎樣的方式來支持。這也是自動化配置的基礎。顯然,已有的網(wǎng)絡管理協(xié)議SNMP和上述的需求比較起來就大大的力所不逮了:盡管具有一些配置的功能,但SNMP本身并不是面向配置的協(xié)議,也不適合開發(fā)用于配置的客戶端應用,更談不到Transaction機制的支持。要滿足這些需求,設計新的替代的網(wǎng)絡管理協(xié)議就不可避免了。于是NETCONF和YANG的1.0版本分別于2006年和2010年正式發(fā)布。
總的來說,NETCONF/YANG并不規(guī)范配置的內容,支持NETCONF/YANG的設備供應商可保留自己的特有的配置內容,但需要轉換成用YANG定義的數(shù)據(jù)模型。然后,NETCONF通過定義標準的操作接口,必須用統(tǒng)一的方法來安裝、編輯、刪除配置內容,獲取設備運行的狀態(tài)數(shù)據(jù)。也就是說,數(shù)據(jù)內容可以不同,但定義數(shù)據(jù)(YANG)和操作數(shù)據(jù)(NETCONF)的方法必須一致統(tǒng)一。
相對來講,NETCONF和YANG都不是很新的東西。SDN(Software Defined Network)在學術界和工業(yè)界的發(fā)展和影響賦予了這兩項技術老樹吐新芽,迎來第二春的機會。大家都知道,SDN不能僅僅停留在抽象的概念層面上,必須找到應用的切入點, 并向更廣泛的領域逐漸展開,才會具有真正的生命力。目前來看,虛擬網(wǎng)絡和自動化配置是SDN應用的兩個重要支柱。自動化配置讓人們重新發(fā)現(xiàn)了NETCONF和YANG的價值。
NETCONF和YANG相互交織纏繞在一起,剪不斷,理還亂,很難把它們分開來一一描述清楚。所以本文從自動化網(wǎng)絡設備配置的功能為切入點,用實際的用例,來說明NETCONF/YANG是如何相互配合完成這些功能的。
組成和交互
NETCONF的自動化配置系統(tǒng)采用Client/Server架構。Client和Server之間由面向連接的傳輸協(xié)議建立會話。SSH(Secure Shell)是NETCONF強制支持的傳輸協(xié)議,其他的傳輸協(xié)議如TLS和SOAP也能滿足NETCONF的要求。Client和Server通信的內容是NETCONF定義的雙向的XML格式的RPC(Remote Procedure Call)消息,包括從Client發(fā)送到Server的請求消息,以及Server的響應消息。這樣,Client就可以獲取并修改Server的配置數(shù)據(jù)(configuration datastore)。
下圖描述了NETCONF配置系統(tǒng)的結構。NETCONF Server是要配置的網(wǎng)絡設備,除了硬件之外,NETCONF引擎是和NETCONF Client建立會話的軟件模塊,當然,Server上面還會運行自身設備的軟件系統(tǒng)。配置數(shù)據(jù)由NETCONF引擎維護并傳遞給Server的軟件系統(tǒng),最終應用到硬件的芯片。正如上文所述,配置數(shù)據(jù)的語法結構是用YANG語言定義的數(shù)據(jù)模型來描述的,包括數(shù)據(jù)類型和數(shù)據(jù)結構。這和XML的Schema與對應的應用域數(shù)據(jù)的關系完全類似。YANG分層的樹狀結構非常適用于網(wǎng)絡設備的配置數(shù)據(jù)的定義。YANG的另外一個優(yōu)點是沒有晦澀的內容,簡單易懂。用戶拿到YANG的數(shù)據(jù)模型文件,即可明白如何寫NETCONF Client程序來配置網(wǎng)絡設備。YANG語言的數(shù)據(jù)模型可以無信息丟失的轉換為XML的格式,稱為YIN(YANG Independent Notation),主要是為了利用隨手可得的標準的XML解析器。開源的NETCONF工具庫libnetconf提供了轉換的工具lnctool。NETCONF引擎和Client程序用YIN檢查配置數(shù)據(jù)的合法性。下文將用一個簡單的例子來說明YANG是如何定義配置數(shù)據(jù)的數(shù)據(jù)模型。
一般地,Client和Server經過如下的步驟來完成配置的獲取和改變:
由此可見,用戶能夠以任何編程語言實現(xiàn)遠端網(wǎng)絡設備的定制化配置的需求,所做的無非是與Server建立會話連接,封裝發(fā)送請求消息,接收解析消息。重要的是,用戶可以通過這種簡單的交互模式,實現(xiàn)自己的業(yè)務邏輯,比如,可根據(jù)網(wǎng)絡的負載和設備的狀態(tài),應用不同的配置。這也許就是可編程的自動化配置的內涵,也是YANG和NETCONF設計的目標。
模型和數(shù)據(jù)
METCONF Server上面的配置叫做配置存儲。配置存儲是設備完整的合法的一份配置數(shù)據(jù)拷貝,使能某個配置存儲可以把設備從缺省的初始狀態(tài)轉換到特定的運行狀態(tài)。在同一個設備上,NETCONF可支持三種配置存儲,包括:
運行時配置(running configuration datastore)是設備當前激活狀態(tài)的運行中的配置,和運行的狀態(tài)完全一致。重啟時配置(startup configuration datastore)是系統(tǒng)下次重啟時的配置,可以和運行時配置不一樣??蛇x配置(candidate configuration datastore)是沒有生效的候選配置,可使用commit命令將可選配置應用到設備,從而,可選配置變?yōu)楫斍暗倪\行時配置。無論是運行時配置,重啟時配置還是可選配置的數(shù)據(jù),都是用YANG定義的數(shù)據(jù)模型來描述的。下面給出一個關于網(wǎng)絡設備接口的極度簡化的例子。
YANG語言是非常直觀的模型語言,理解了上面代碼中YANG語言的一些關鍵詞,如module,container,list,leaf等,就基本可以清楚的知道代碼的含義了。解釋如下:
配置和操作
上文已說明,NETCONF Client和NETCONF Server通過RPC交互完成網(wǎng)絡設備的配置。下面給一個具體的例子,NETCONF Client向NETCONF Server發(fā)送一個xml編碼的請求(1),在Server的運行時配置(2)上通過操作(operation)create新建一個網(wǎng)絡接口(3)。
如果操作成功,NETCONF Server將返回。
異步通知(notification)
通知類似于SNMP的trap機制,當NETCONF Client訂閱(subcribe)通知時,通知所對應的事件發(fā)生之后,NETCONF Client就可以得到事件的信息。如下面的例子,NETCONF Client從NETCONF Server那里得到一個網(wǎng)絡接口的link-up事件。
參考文獻
Network Configuration Protocol (NETCONF)
https://tools.ietf.org/html/rfc6241
YANG - A Data Modeling Language for the Network Configuration Protocol
https://tools.ietf.org/html/rfc6020
An Architecture for Network Management Using NETCONF and YANG
https://tools.ietf.org/html/rfc6244
Network Configuration Management with NETCONF and YANG
https://www.ietf.org/edu/documents/2012-ietf-84-netconf-yang.pdf
NETCONF toolset Netopeer
https://github.com/cesnet/netopeer
Overview of the 2002 IAB Network Management Workshop
http://www.rfc-base.org/txt/rfc-3535.txt
作者簡介:賈彥民,2008年畢業(yè)于中科院軟件所,曾供職于IBM和AVOS從事軟件開發(fā)工作,目前是Pica8 Inc.高級網(wǎng)絡軟件工程師。