網絡配置協議(NETCONF和RESTCONF)
1??????引言

網絡配置協議(NETCONF)是由IETF開發并標準化的網絡管理協議。它是由NETCONF工作組制定的,并于2006年12月以RFC 4741的形式發布,后來在2011年6月進行了修訂,以RFC 6241的形式發布。
NETCONF協議規范是一個互聯網標準跟蹤文件。
2??????NETCONF
NETCONF提供了安裝、操作和刪除網絡設備配置的機制。其操作是在一個簡單的遠程過程調用(RPC)層之上實現的。
NETCONF協議對配置數據以及協議消息使用基于可擴展標記語言(XML)的數據編碼。協議消息是在安全傳輸協議之上進行交換的。
NETCONF協議在概念上可以分為四層:
1.?????????內容層由配置數據和通知數據組成。
2.?????????操作層定義了一組基礎協議操作,用于檢索和編輯配置數據。
3.?????????消息層為遠程過程調用(RPC)和通知的編碼提供了一種機制。
4.?????????安全傳輸層提供了客戶端和服務器之間安全可靠的消息傳輸。
NETCONF協議已經被一些主要的設備供應商在路由器和交換機等網絡設備中實現。
NETCONF的一個特別的優勢是它支持使用涉及多個設備的事務進行強大的配置變更。
2.1????與SNMP的淵源與歷史由來
IETF在20世紀80年代末開發了簡單網絡管理協議(SNMP),事實證明它是一種非常流行的網絡管理協議。
在21世紀初,人們發現SNMP并沒有被用來配置網絡設備,而是主要用于網絡監控。
2002年6月,互聯網架構委員會和IETF網絡管理社區的主要成員與網絡運營商聚在一起討論這一情況。這次會議的結果記錄在RFC 3535中。
結果發現,運營商主要使用專有的命令行接口(CLI)來配置他們的設備。這些接口有許多運營商喜歡的功能,包括它是基于文本的,而不是BER編碼的SNMP。
此外,許多設備供應商沒有提供完全通過SNMP配置設備的選項。
由于運營商一般喜歡編寫腳本來管理他們的盒子,他們發現SNMP CLI在很多方面都有欠缺。最明顯的是輸出的不可預知性。輸出的內容和格式很容易以不可預測的方式改變。
大約在同一時間,瞻博網絡(Juniper Networks)一直在使用基于XML的網絡管理方法。
這著方式被推廣到IETF,并與廣大社區分享。
這兩個事件共同促使IETF在2003年5月成立了NETCONF工作組。這個工作組的任務是制定一個網絡配置協議,以便更好地滿足網絡運營商和設備供應商的需求。
基礎NETCONF協議的第一個版本于2006年12月作為RFC 4741發布。在隨后的幾年中發布了一些擴展(2008年7月RFC 5277中的通知,2009年12月RFC 5717中的部分鎖,2011年6月RFC 6243中的默認值,2012年2月RFC 6470中的系統通知,2012年3月RFC 6536中的訪問控制)。2011年6月,NETCONF基本協議的修訂版作為RFC 6241發布。
2.2????NETCONF協議層
(NETCONF協議圖)
2.2.1????內容
NETCONF操作的內容是格式完善的XML。大部分內容與網絡管理有關。隨后,還增加了對JavaScript對象符號(JSON)編碼的支持。
NETMOD工作組已經完成了定義一種?"對人類友好"的建模語言的工作,用于定義操作數據、配置數據、通知和操作的語義,稱為YANG。YANG在RFC 6020(版本1)和RFC 7950(版本1.1)中進行了定義,并附有RFC 6991中的?"通用YANG數據類型"。
2010年夏天,NETMOD工作組重新成立,致力于核心配置模型(系統、接口和路由)以及與SNMP建模語言的兼容性。
YANG(Yet Another Next Generation)是一種數據建模語言,用于定義通過NETCONF和RESTCONF等網絡管理協議發送的數據。YANG數據建模語言由互聯網工程任務組(IETF)中的NETMOD工作組維護,并在2010年10月作為RFC 6020發布。
該數據建模語言既可以用來建模配置數據,也可以用來建模網元的狀態數據。
此外,YANG可以用來定義網絡元素發出的事件通知的格式,它允許數據建模者定義遠程過程調用的簽名,這些遠程過程可以通過NETCONF協議在網絡元素上調用。由于該語言與協議無關,因此可以將其轉換為網絡配置協議支持的任何編碼格式,如XML或JSON。
YANG是一種模塊化的語言,以XML樹格式表示數據結構。該數據建模語言帶有許多內置的數據類型。可以從內置的數據類型中派生出額外的特定應用數據類型。更復雜的可重用數據結構可以用分組來表示。YANG數據模型可以使用XPATH表達式來定義YANG數據模型元素的約束。
(YANG模型示意圖)
下面的YANG模塊example-sports展示了一個團隊運動的數據模型。該模塊聲明了一個命名空間和一個前綴,并在定義類型?season?之前導入了類型庫模塊?ietf-yang-types。然后它定義了一個容器sports,其中包括一個人的列表和一個隊的列表。一個團隊有一個球員列表,通過?leafref?類型及其路徑限制來引用人員。
數據模型如下定義:
module?example-sports?{
namespace?"http://example.com/example-sports";
prefix?sports;
import?ietf-yang-types?{?prefix?yang;?}
typedef?season?{
type?string;
description
"The?name?of?a?sports?season,?including?the?type?and?the?year,?e.g,
'Champions?League?2014/2015'.";
}
container?sports?{
config?true;
list?person?{
key?name;
leaf?name?{?type?string;?}
leaf?birthday?{?type?yang:date-and-time;?mandatory?true;?}
}
list?team?{
key?name;
leaf?name?{?type?string;?}
list?player?{
key?"name?season";
unique?number;
leaf?name?{?type?leafref?{?path?"/sports/person/name";?}??}
leaf?season?{?type?season;?}
leaf?number?{?type?uint16;?mandatory?true;?}
leaf?scores?{?type?uint16;?default?0;?}
}
}
}
}
下面的代碼塊顯示了example-sports數據模型實例的XML表示:
下面的代碼塊顯示了example-sports數據模型實例的JSON表示:
{
"example-sports:sports":?{
"person":?[
{
"name":?"Lionel?Andrés?Messi",
"birthday":?"1987-06-24T00:00:00-00:00"
},
{
"name":?"Cristiano?Ronaldo",
"birthday":?"1985-02-05T00:00:00-00:00"
}
],
"team":?[
{
"name":?"FC?Barcelona",
"player":?[
{
"name":?"Lionel?Andrés?Messi",
"season":?"Champions?League?2014/2015",
"number":?10,
"scores":?43
}
]
},
{
"name":?"Real?Madrid",
"player":?[
{
"name":?"Cristiano?Ronaldo",
"season":?"Champions?League?2014/2015",
"number":?7,
"scores":?48
}
]
}
]
}
}
2.2.2????操作
基本協議定義了以下操作:
操作
描述
檢索運行配置和設備狀態信息
檢索指定配置數據存儲的全部或部分。
通過創建、刪除、合并或替換內容來編輯配置數據存儲。
將整個配置數據存儲復制到另一個配置數據存儲中。
刪除配置數據存儲
鎖定設備的整個配置數據存儲。
釋放之前通過<鎖>操作獲得的配置數據存儲鎖。
要求優雅地終止NETCONF會話
強制終止NETCONF會話
基本的NETCONF功能可以通過定義NETCONF能力來擴展。
在會話設置的能力交換部分,服務器和客戶機之間會傳達一個實現所支持的附加協議特性集。強制性協議特性不包括在能力交換中,因為它們是假定的。RFC 4741定義了一些可選的能力,包括:xpath和:validate。
請注意,RFC 6241廢除了RFC 4741。
RFC 5277中發布了支持訂閱和接收異步事件通知的能力。
該文檔定義了
RFC 5717中定義了支持部分鎖定運行中的配置的能力。
這允許多個會話在運行中的配置中編輯非重疊的子樹。如果沒有這個功能,唯一可用的鎖定是整個配置。
RFC 6022中定義了監視NETCONF協議的功能。
該文檔包含一個數據模型,包括有關NETCONF數據存儲、會話、鎖和統計的信息,便于管理NETCONF服務器。它還定義了NETCONF客戶端發現NETCONF服務器支持的數據模型的方法,并定義了檢索這些數據模型的
2.2.3????消息
NETCONF消息層為編碼提供了一個簡單的、與傳輸無關的框架機制。
l??RPC調用(
l??RPC結果(
l??事件通知(
每個NETCONF消息都是一個格式良好的XML文檔。一個RPC結果通過一個Message-id屬性鏈接到一個RPC調用。NETCONF消息可以是管道式的,也就是說,一個客戶端可以調用多個RPC,而不必先等待RPC結果消息。RPC消息在RFC 6241中定義,通知消息在RFC 5277中定義。
2.2.4????傳輸
l??安全殼上的NETCONF協議(SSH):RFC:6242
l??具有相互X.509認證的傳輸層安全(TLS)的NETCONF協議:RFC:7589。
2.3????NETCONF通信
(NETCONF通信示意圖)
2.3.1????ncclient
ncclient?是一個用于?NETCONF?客戶端的?Python?庫。它的目的是提供一個直觀的API,將NETCONF的XML編碼性質合理地映射到Python結構和習慣中,并使編寫網絡管理腳本變得更容易。其他的主要特點是:
l??支持RFC 4741中定義的所有操作和功能。
l??請求管道化。
l??異步RPC請求。
l??除非真正需要,否則不使用XML。
l??可擴展性。可以輕松添加新的傳輸映射和能力/操作。
from?ncclient?import?manager
#?使用來自ssh-agent或~/.ssh密鑰的未加密密鑰,并依賴known_hosts
with?manager.connect_ssh("host",?username="user")?as?m:
assert(":url"?in?m.server_capabilities)
with?m.locked("running"):
m.copy_config(source="running",?target="file:///new_checkpoint.conf")
m.copy_config(source="file:///old_checkpoint.conf",?target="running")
從0.4版本開始,瞻博網絡(Juniper)和思科(Cisco)的分支已經整合進來了。因此,我們引入了很多新的概念,分別簡化了對瞻博網絡和思科設備的管理。最大的變化是在連接參數中引入了設備處理程序。例如,要調用Juniper的函數和參數,就必須重寫上面的device_params={'name':'junos'}。
from?ncclient?import?manager
with?manager.connect(host=host,?port=830,?username=user,?hostkey_verify=False,?device_params={'name':'junos'})?as?m:
c?=?m.get_config(source='running').data_xml
with?open("%s.xml"?%?host,?'w')?as?f:
f.write(c)
相應的是,對于思科Nexus來說,名稱是nexus。
最新的pull request merge包含了對device_params中名稱為huawei的華為設備的支持。
支持的設備處理程序:
l??Juniper: device_params={'name':'junos'}。
l??Cisco CSR:device_params={'name':'csr'}。
l??Cisco Nexus: device_params={'name':'nexus'}。
l??華為:device_params={'name':'huawei'}。
3??????RESTCONF
RESTCONF是另一個IETF標準,在RESTful接口的基礎上實現了一些NETCONF功能。
運行RESTCONF代理的網絡設備可以通過五個HTTP操作進行管理:
l??GET:該方法檢索資源的數據和元數據。除了操作資源外,所有資源類型都支持它。
l??PATCH:該方法可以部分修改資源的數據和元數據,但操作資源除外。此方法可部分修改資源(相當于NETCONF的合并操作)。
l??PUT:該方法創建或替換目標資源。。
l??POST:該方法創建或替換目標資源。此方法創建一個數據資源或調用一個操作資源。
l??DELETE:該方法刪除目標資源。
RESTCONF是通過HTTP/HTTPS使用XML或JSON消息的NETCONF,但它缺少了幾個關鍵的NETCONF組件,包括多個數據存儲、提交或回滾以及配置鎖定。
(網絡管理系統案例)
(RESTCONF協議棧)
(RESTCONF的請求案例)
4??????NETCONF與RESTCONF對比
1.?????????RESTCONF支持XML或JSON作為編碼。NetConf使用XML。
2.?????????通過NETCONF能力可以發現所有NETCONF服務器的信息,如NETCONF版本,數據存儲,YANG模塊,功能和偏差。YANG1.1要求NETCONF服務器用YANG模塊?"inetf-yang-library"[RFC7895]來聲明它實現的模塊。通過RESTCONF,服務器使用?"inetf-yang-library "YANG模塊,定義YANG模塊庫[RFC7895],報告它支持的每個YANG模塊、偏差、功能。
3.?????????考慮到NETCONF的功能,自然的服務自動化流程是NETCONF
RESTCONF不提供鎖的概念,不提供候選配置和提交的概念:配置的變化是直接應用的。因此,RESTCONF不提供分布式事務,只提供設備間的配置。RESTCONF無法實現兩階段的提交事務。
這個兩階段提交主要是在跨網元配置服務的時候,所以在控制器和網元之間很重要。在編排器北向接口上,一個包含所有服務參數的RESTCONF請求是完全可以的,?該請求是原子的操作。
4.?????????三階段事務,在NETCONF中可用,基本上是兩相提交和確認提交。由于RESTCONF連兩階段提交都不支持,所以RESTCONF顯然不支持三階段事務。
5.?????????NETCONF
6.?????????RESTCONF協議沒有事務的概念。一個RESTCONF調用本身就是一個事務,因為它使用HTTP POST、PUT、PATCH和DELETE方法是用來編輯YANG數據模型所代表的數據資源。
7.?????????RESTCONF在沒有激活配置的情況下,缺乏任何驗證的方式。然而,驗證是隱含的,是RESTCONF調用的一部分,結果就是成功或失敗。
8.?????????使用NETCONF,SSH會話是從NETCONF客戶端到NETCONF服務器建立的,這意味著可能存在許多并發的SSH會話。RESTCONF是基于HTTPS的。
9.?????????最后,RESTCONF不提供
這里想強調工具的重要性。一般的自動化,特別是網絡配置,意味著整個工具鏈的整合。而如果現有的工具鏈(例如,存儲和計算)是以HTTP為中心的,那么RESTCONF方案可能是最好的方案。
(編程架構示意圖)
(管理系統示意圖)
5??????參考
https://en.wikipedia.org/wiki/NETCONF
https://tools.ietf.org/html/rfc4741
https://tools.ietf.org/html/rfc5277
https://tools.ietf.org/html/rfc6022
https://tools.ietf.org/html/rfc5717
https://tools.ietf.org/html/rfc6241
https://tools.ietf.org/html/rfc5277
https://en.wikipedia.org/wiki/YANG
https://archive.nanog.org/sites/default/files/tuesday_tutorial_moberg_netconf_35.pdf
https://www.cisco.com/c/en/us/support/docs/storage-networking/management/200933-YANG-NETCONF-Configuration-Validation.html
https://www.slideshare.net/tailfsystems/netconf-yang-tutorial
https://tools.ietf.org/id/draft-ietf-netmod-revised-datastores-08.html#rfc.section.4.1
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2016/pdf/BRKNMS-2032.pdf
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2016/pdf/BRKNMS-2032.pdf
https://www.enog.org/wp-content/uploads/presentations/enog-13/43-ODL-Netconf-Yang-tutorial.pdf
https://www.informit.com/articles/article.aspx?p=2979064&seqNum=4
https://www.coursehero.com/file/47948151/wk2-netopspdf/
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/168/b_168_programmability_cg/NETCONG_YANG.pdf
https://www.fir3net.com/Networking/Protocols/an-introduction-to-netconf-yang.html
https://www.networkworld.com/article/2173842/understanding-netconf-and-yang.html
https://www.tail-f.com/what-is-netconf/#:~:text=NETCONF%20is%20a%20protocol%20defined,configuration%20on%20a%20network%20device.
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/169/b_169_programmability_cg/restconf_programmable_interface.pdf
https://www.netacad.com/sites/default/files/images/careers/Webinars/DevNet/devnet_session_7_networkprogrammability_yang_netconf_restconf.pdf
https://github.com/YangModels/yang
https://ncclient.readthedocs.io/
https://www.juniper.net/documentation/en_US/junos/topics/task/configuration/netconf-configuration-replacing.html
網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。