Netmiko – 網通設備型號與ConnectType對照

品牌 型號 Netmiko ConnectType
Aruba 70xx
72xx
aruba_os
aruba_os
Brocade ICX 6610 brocade_fastiron
Cisco Catalyst 1000
Catalyst 2960
cisco_ios
cisco_ios
HPE S3100
A5120
5140
7502
hp_comware
hp_comware
hp_comware
hp_comware
Juniper EX2200
EX2300
juniper_junos
juniper_junos

Template正則表達式參考

品牌 資料名稱 規則
通用 IPADDRESS (((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]).){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]))
通用 MACADDRESS ([a-fA-F0-9]{2}[.:-]{0,1}[a-fA-F0-9]{2}[.:-]{0,1}[a-fA-F0-9]{2}[.:-]{0,1}[a-fA-F0-9]{2}[.:-]{0,1}[a-fA-F0-9]{2}[.:-]{0,1}[a-fA-F0-9]{2})
通用 PORT (/S+)

2023/04/18 MAC Table中是否有SwitchMAC

最近寫了不少網路管理自動化,發現很多內容會使用集合set(),這樣方便做比對。

這裡講Switch MAC,Switch外箱上或是設備上的標籤會標明該設備的MAC Address,但如果在MAC Table去看就會發現Switch MAC跟設備寫的MAC有一點點不同。

如果Switch MAC為「00:00:00:00:00:00」,在VLAN 1中,該設備MAC會是「00:00:00:00:00:01」,而在VLAN255中就是「00:00:00:00:00:ff」。

我們透過檢查Switch MAC是否存在於MAC Table的某一Port中,可以於繪製拓樸圖。

但是,一旦Switch數目增多,就會導致Interface數飛漲與MAC數飛漲,這時候就需要有個好的算法,才能避免運算時間長到不想等。

這裡要導入一個很重要的觀念,LAN與VLAN。

Local Area Network(LAN)一開始是指實體設備與實體線路的網路,在LAN之下,大家都在同一個網路。如果我們想做出區隔,避免網路區域過大造成效率低下或是安全考量,這時候可以再買一整套設備與線做實體區隔,或是切VLAN。

Virtual Local Area Network(VLAN)是透過指令產生的虛擬LAN,即便是在接在同一臺交換器上,只要虛擬LAN不同就可以做到區隔,彼此互相不看到。

具有VLAN、路由功能的L3 Switch,可能會存在於多個VLAN中扮演Gateway(Router)的角色,正常的終端設備(MAC)只會出現在一個VLAN中,而Switch為了扮演不同VLAN上的一個終端,就需要讓MAC隨著VLAN ID變化。

先講如果不調整MAC,就以ARP跟MAC Table的學習機制,即便Switch在不同VLAN都使用相同MAC,也是可以正常運作的。那為什麼Switch在不同VLAN要讓MAC產生變化?

MAC Address可以用於作為設備的唯一識別,理論上任一VLAN上學到的MAC應該是不重覆,否則就無法辨識。如果一個設備(MAC)出現在VLAN 1與VLAN 2是一個很奇怪的現象,這代表在某處始得VLAN1與VLAN2相通,是設定上或接線上的疏失。

如果一個MAC出現在不同VLAN,就會偵測到FLAPPING!

如果L3 Switch都會隨著VLAN ID調整MAC,即便是不同VLAN,MAC也不會重覆出現。對其他台Switch來說,就不會判斷有Flapping的現象發生。

知道Switch (VLAN) MAC在不同VLAN之下會有所差異

從MAC Table中,我們可以得到「(Endpoint) MAC Address」「VLAN ID」「Interface」。如果要同時看許多台Switch MAC是否存在於MAC Table中,顯然我們要先對Switch MAC做調整,加上VLAN ID。

以下是python的函式

# 將MAC轉換為:分割,每2個分隔
def format_mac(mac, delimiter=":", interval=2, case="lower"):
    """將MAC轉換為:分割,每2個分隔"""
    mac = re.sub("[:\-]", "", mac)
    hex_digits = re.findall(r'[\dA-Fa-f]{:}'.format("{"+str(interval)+"}"), mac)
    if case == "upper": return delimiter.join(hex_digits).upper()
    return delimiter.join(hex_digits).lower()

# 將MAC地址轉換為十進位數字
def mac_to_decimal(mac_address, delimiter=":"):
    """將MAC地址轉換為十進位數字"""
    mac_address = mac_address.replace(delimiter, "")
    return int(mac_address, 16)

# 將十進位數字轉換為MAC地址
def decimal_to_mac(decimal, delimiter=":"):
    """將十進位數字轉換為MAC地址"""
    mac = "{:0>12}".format(format(decimal, '02x'))
    #print(mac)
    return format_mac(mac, delimiter=delimiter) # 重新組合為MAC地址

# 對MAC地址進行加減操作
def modify_mac_address(mac_address, offset, delimiter=":"):
    """對MAC地址進行位移操作"""
    decimal_list = mac_to_decimal(mac_address, delimiter=delimiter) # 將MAC地址轉換為十進位數字
    decimal_list += offset
    modified_mac_address = decimal_to_mac(decimal_list, delimiter=delimiter) # 將十進位數字轉換回MAC地址
    return modified_mac_address
mac_address = '00:11:22:33:44:55'
print('Original MAC Address:', mac_address)

modified_mac_address = modify_mac_address(mac_address, 10) 
print('Modified MAC Address:', modified_mac_address)

=>
Original MAC Address: 00:11:22:33:44:55
Modified MAC Address: 00:11:22:33:44:5f

功能寫法

  • 先把MAC Table,依Interface跟VLANID去把MAC Address做集合A。
  • 將各SwitchMAC加上VLANID做成集合B。
  • 將集合A跟集合B做聯集得到集合C
  • 如果集合C不為空集合,則表示有SwitchMAC在,再逐一提取MAC扣除VLANID,還原為原始的SwitchMAC。

2023/04/17 NAT角色區分

講到NAT角色,這一塊經常搞亂很多學習CCNA的新進,但其實很簡單。

今天教了兩三小時,下班後突然有點頓悟,就趕緊把更好的說法寫下來。

在Cisco的NAT章節中,在NAT Table中,可以分成「Inside Local」、「Inside Global」、「Outside Local」、「Outside Global」。

參考文章《Jan Ho的網路世界

首先來區分什麼是Inside跟Outside,當我們設置NAT規則時,規則中符合的來源IP的來源端就是Inside;規則中符合的目的IP的目的端就是Outside。

也就是說,如果封包的「來源IP」到「目的IP」符合,就會進行NAT。可能是來源IP轉換,或是目的IP轉換,又或者是來源IP跟目的IP都轉換。

如果來源IP跟目的IP都不轉換要怎麽看inside跟outside,這問題肯定是開玩笑的。

實際上NAT規則,需要設定「來源」「來源Port或服務」「目的」「目的Port或服務」,若吻合則進行「Src NAT」、「Dst NAT」、「Dual NAT」。

Inside即是NAT規則中「來源」這一區塊Outside則是NAT規則中「目的」這一塊

即先設好NAT規則,才能區分出Inside或Outside。

接著談Local跟Global,如果是Inside看Inside或是Outside看Outside就是Local;如果是Inside看Outside或是Outside看Inside就是Global。

在NAT角色中「Inside Local」、「Inside Global」、「Outside Local」、「Outside Global」都是對應IP位置。Local的意思是當地的,也就是說Inside Local表示的IP就是當地IP。

Local的IP是NAT設備上看到終端設備IP」通常就是終端設備本身設定的IP。

而Global的概念就是別人眼中的設備IP,從另外一個Side去看到的設備IP。

Global的IP表示在另一側設備所看到終端設備IP」因此設備的Global IP是什麼,就是另一端設備回覆時的目的IP。

local就是自己看自己,global就是別人看自己。

接著我們舉個例,一般家用網路環境,路由器會將192.168.0.x去NAT轉成public IP。這NAT規則即「來源為192.168.0.x」就進行Src NAT轉換。

以NAT設備做區分,192.168.0.x是NAT規則的來源,即為Inside。

我們連上whatismyip,可以網頁看到一組IP,這IP是外面的設備所認為我設備的IP,我設備是在Inside,從Outside看到Inside為Global,因此這組IP是Inside Global。

換個例子,今天要拿一組Public IP作為提供給網際網路來存取伺服器的IP。

這時候我們會進行 Static NAT,讓Public IP對照到一個Private IP。

請問從網際網路來想存取伺服器的設備是處在Inside或Outside?答案是Inside。

NAT規則為「來源為網際網路」「目的為特定Public IP」進行Dst NAT轉換。

因此身在網際網路的設備為來源,所以是Inside。

新手誤區

  • 把Private IP當成Inside,把Public IP當成Outside。
  • 認為Global是Public IP,把Local認為是Private IP。
  • 沒有意識到NAT的過程發生點,沒有探討封包從Inside Local發出時到最後收到回覆過程中封包的Soure IP與Destination IP的變化。
  • NAT具有強烈的方向性,但是沒有注意到方向性。

在我的上述所述,雖然在Private IP to Public IP的交界處做NAT是非常經典的案例,但是,NAT沒有非得一定得在這樣的環境上做,NAT也可以用於Public IP to Private IP、Public IP to Public IP或是Private IP to Private IP的環境,Public IP to Private IP也常見於提供服務在網際網路上。

雖然用Public跟Private的概念可以幫助記憶,但是一旦擁抱住一點點,就會難以理解NAT功能中的各個角色,陷入誤區第一點第二點,記得NAT本身功能概念跟Public IP跟Private IP是沒有關聯的。

重點溫習

  • NAT規則為符合「來源」「來源Port或服務」「目的」「目的Port或服務」則進行「Src NAT」、「Dst NAT」、「Dual NAT」。
  • 先有NAT規則,才能區分出Inside或Outside。
  • Inside即是NAT規則中「來源」這一區塊。
  • Outside則是NAT規則中「目的」這一區塊。
  • Local代表的IP是NAT設備所看到的設備的IP,通常為終端設備上的IP。
  • Global代表的IP為從另一側所看到終端設備的IP。

以MAC Table繪製拓樸圖

如果要繪製拓樸圖,需要什麼資訊?怎麽繪畫?

我們可以使用肉眼觀測、LLDP看Neighbor等,逐一繪製,都很花時間。LLDP可能會面臨到有開沒開的問題。

一個設備普遍擁有的MAC Table,更適合於各種場景。MAC Table主要由MAC、其來源介面組成,相較LLDP複雜(多)的資訊,MAC Table是非常容易過濾出資料的。

要繪製拓樸圖,我們會先知道所有設備的資訊,然後定義出圖中的節點(通常為Switch),接著在節點與節點間畫直線表示兩節點直連,這部份就要判斷兩設備是不是相鄰的。

以下為簡單的拓樸圖。

以上圖,表示整理過後的MAC Table。

設備 來源介面 MAC Address
A 1 C、G
A 2 B、E、F
B 1 A、C、G
B 2 E
B 3 F
C 1 A、B、E、F
C 2 G
E 1 A、B、C、F、G
F 1 A、B、C、E、G
G 1 A、B、C、E、F

如果從A的1介面來看,會看到C、G。從圖上來看,我們可以知道是C相鄰,G接到C上。

要怎麽知道設備是不是相鄰的?用一個判斷條件「空集合」。

A與G中間,因為有C,如果A的1介面與G的有A的介面的MAC Addresses,聯集會得到C。

A與C中間沒有設備,A的1介面與C的有A的介面的MAC Addresses,聯集會得到空集合。

藉此,我們可以判斷任意兩設備是否有相鄰。

這樣完成拓樸圖中節點與節點是否需要劃線的依據。

拓樸圖的節點是已知的,接下來就是要怎麽畫,才能把所有節點跟節點與節點間的線畫上。

方法如下:

  1. 先選擇一個節點出來,加入待畫Switch串列。
  2. 從待畫Switch串列,取一個Switch出來,將該Switch放入已畫Switch集合。
  3. 找到該Switch的鄰居,若鄰居Switch不在已畫Switch集合,則繪製節點與節點的線,並將鄰居Switch加入待畫串列。
  4. 回到2,直到待畫Switch串列清空。

如果以B為第一個節點,會依序這樣畫。

繪製Switch 鄰居Switch 待命Switch 已畫Switch
B A、E、F A、E、F B
A B、C E、F、C B、A
E B F、C B、A、E
F B C B、A、E、F
C A、G G B、A、E、F、C
G C B、A、E、F、C、G

目前程式碼還在整理之中,後續整理會放上Github供參考用。

Cisco Switch cable-diagnostics tdr 線對代號與實際線對對照

有些Switch上會配有一些測線功能,輸出電訊號並偵測,然後能得出線長與各線對狀況或是出現異常的長度。

Cisco 2960上,可以使用下面的指令去測試網路線(電)的狀況。

test cable-diagnostics tdr interface

如果想更瞭解這功能,可以參考這篇《How to use Time-Domain Reflectometer (TDR)》。

根據上述參考文章,可以找到下面的對照表。

根據維基百科,可以找到一般網路線接頭的線對排法與顏色。

目前接頭是T568A-T568B或是T568B-T568B線序已經無所謂了,因為交換器已全面普遍有自動Medium Dependent Interface(MDI),因此會偵測線對與決定是否交叉。目前網路線也不再特別標註,幾乎都是T568B-T568B線序。

不過Cisco測線表示A、B、C、D對,對應線序的什麼顏色與Pin,就是沒有明寫的出來的。

基於實證精神,我跟同事一對對剪掉與測線,找到Cisco線對與標準線序(顏色)的對照。

T568B-T568B
  • A Pair: 白橙(橘)色 / 橙(橘)色
  • B Pair: 白綠色 / 綠色
  • C Pair: 白藍色 / 藍色
  • D Pair: 白棕色 / 棕色

Aruba Controller的Total Memory變動

在同一台控制器與同一版本上,Total Memory數值理論上是不會變的。

某天突然發現同一台控制器的Total Memory的數值竟然有變動,第一時間就想到是不是更新韌體的問題。

使用一臺配置4GB記憶體,使用8.10.0.6版本時,得到的Total Memory為3776100。

將韌體降版到8.6.0.20時,得到的Total Memory為3776184。

因此,其實「升降韌體版本」,會導致偵測到的Total Memory有所變動。

2023/04/12 Netmiko網管構思

任何一個收集資訊並呈現的程式都需要具有三部分:

  1. 蒐集資訊並整理
  2. 將整理資訊儲存
  3. 將儲存的資訊取出應用

藉此去切割不同module該設計的功能,為了讓不同module可以順利串接,就需要制定一套共用的語言命名邏輯。

網管構思最難的不是在於寫Code,而是訂一套Rule,這Rule要能協調三部分順利運行。

蒐集資訊並整理

這部份使用CLASS,讓網路設備變成類別,可以依照輸入的設備清單變成一個個實例。實例中包含連線、下指令、過濾出資訊。

這部份以Netmiko作為主力,輸入的設備清單也建議轉成Netmiko友善的格式,白話就是Netmiko連線需要什麼資訊、下指令。

將整理資訊儲存

整個程式最耗費資源與時間的部分就是蒐集資訊並整理,因此若是將資訊妥善儲存下來,即便略過第一部分,也可以從儲存的資訊去還原第一部分得到的結果。

比較通用記錄的方式是: 時間、設備IP、指令、結果。

以設備清單加上執行時間點作為資料夾,如此可以應用在不同場域,避免相互干擾。

能儲存的方式有許多種,建議依循資料庫的思維去整理分割資料表。這對於下一部分應用會很有幫助,能很快速的直接使用。

這部份先以csv為主,後續轉為sqlite。

將儲存的資訊取出應用

如果能套用資料庫,開發這部份就是非常迅速且容易的。

應用的話取決於想要呈現的內容以及使用什麼應用程式呈現,我們需要把資訊再過濾並重新整合,變成最後應用程式能使用的資料與格式。

共同命名規則

如果是順序法撰寫,會發現一個設備能找到很多個MAC Address,MAC Address格式也不一樣。到了第三部分,就會開始應用這些取得的資訊,會重新定義各種資訊在整理過程中是什麼角色,寫套算法,開始演算,然後取得最終想要的結果。

這時候,資訊被重新定義的角色就很適合作為模板的Value名稱,更適合將於各品牌的同意義不同名稱變成一致的名稱。

2023/04/12 透過ARP+MAC Table追蹤終端所接的Edge Switch。

透過ARP與MAC Table找到設備是網路工程師的基本工,常用技術之一。

原理很簡單,鎖定住一個IP之後,就以ARP取得該IP的MAC,然後透過MAC Table不斷往下追查直至Edge Switch。

那如果在「程式化」的前提下,這套思路只能專心處理一個MAC,會顯得沒有效率。執行次數會幾乎等於ARP總數,實際上只希望讓執行次數跟Switch數目相同就好。

以下是程式化的思路

  • 假設所有Switch的IP與MAC是已知的,為「MgmtIP」跟「MgmtMAC」。
  • 先取得所有Switch的ARP跟MAC Table,ARP得到「EndpointIP」與「EndpointMAC」、MAC Table得到「EndpointMAC」、「EndpointLinkedInterface」。
  • 以ARP數目最多的Switch當做Core Switch。
  • 擇一條(群)ARP為主,建立串列Switches,如果該「EndpointMAC」的「EndpointLinkedInterface」上能找到Switch的「MgmtMAC」,將該Switch放入該ARP的Switches串列。
  • 計算Switch的CoreSwitchDistance,從Switches串列中取出沒有CoreSwitchDistance的Switch,以Core的「「MgmtIP」跟透過MAC Table找到「EndpointLinkedInterface」,該Interface上有幾個存在於Switches串列中Switch的「MgmtMAC」再加1(補上CoreSwitch)即為該Switch的CoreSwitchDistance。
  • 將ARP的Switches串列以Switch的CoreSwitchDistance重新排序,以小至大排列。
  • 以ARP為主,建立字串SwitchesPath,從CoreSwitch到CoreSwitchDistance最遠的Switch,將DeviceInfo(可以是SwitchName、MgmtIP等擇一)與「EndpointLinkedInterface」加到字串SwitchesPath中。

照以上步驟,如此可知道CoreSwitch到Endpoint所經的路徑,經過優化的話,可以讓執行次數為Switch數。

網工界TextFSM模板-ntc_templates

參考文件

雖然Netmiko可以支援TextFSM去處理輸出文本,但是網路品牌那麼多,就算是同一家也不見得指令都是一套邏輯,要產生TextFSm模板是相當費工的,一是要取得指令輸出的Data,二是要針對Data做模版,因此,還是找大神做出直接使用會比較省工。

ntc_templates是一個集TextFSM版本的模組,看到這篇文章《写textfsm模板太难?看这里-ntc-templates》,發現Windows是不能直接運行ntc_templates,不過也沒關系,進到github,正如這篇文章的參考文件,裡面就是可以用的template,會發現其實也不是應有盡有。

當然要自己刻的話,取得下指令後的DATA是很容易的,但是template要寫好就要寫好正則表達式,就需要一點技術,例如IP Address要怎麽匹配?不妨就直接看ntc_templates內的template去觀摩(照抄),至少不會寫不好。

以下是個人的Github連結,會放上目前有做的template。

部落格撰寫指南與分類標準

這篇用於記錄與說明撰寫方針與標籤、分類的標準說明。

撰寫指南

標籤

網路技能類

  • 網路基礎: 入門需要學會的,電子書會寫到的。
  • 網路進階: 進階去應付更多場景與需求需要學會的,電子書會寫到的。
  • 網路專業: 電子書沒有寫到的,學會靠個人觀察與領悟。

文章描述本體

  • 如Aruba、Windows等諸多……

分類

20230407 檢查某牌據說是供電問題的PoE Switch

如果有品牌迷思,可能就嫌棄這一牌。

為了給AP供電,買了好幾台以link結尾牌子的PoE Switch。

剛好就有一台據說是故障的,請我檢查。

插上三顆AP都沒有無法PoE供電問題,不過Switch一上電就能聞到焦味,而且隨著時間與負載更長更重時,焦味更明顯。

電器的焦味通常跟高電阻脫離不了關係,電流會以熱能損失出去,於是越來越熱,就會產生焦味。

至於好端端的設備為什麼會有焦味?拆機看最準。焦味通常意味著不要長時間運行,積熱到一定時就會燒起來。

即使知道,還是一台台負載接上,焦味越來越重。過一陣子,突然設備內發出一個聲響,就嚇得趕緊把電源斷開。再開時,下排燈號就亮不起來了。

我認為PoE Switch是一個吃電重的設備,如果設計不良,長時間運行是一件很可怕的事情。Switch應該在有焦味的時候,就跳出告警,不讓使用。

最讓我震驚的是,我居然明顯在作死。人無畏,就一步步越做越危險的事情,真是不應該。

Aruba保固條款

參考文件

Aruba AP是有條件終身保,保到停售EOS(End of sale)後五年。一旦發生故障等,就能報修去以良品更換,因此更換。

保修除外部分

This Limited Warranty does not apply to expendable or consumable parts and does not extend to any product from which the serial number has been
removed or that has been damaged or rendered defective (a) as a result of accident, misuse, abuse, contamination, improper or inadequate
maintenance or calibration or other external causes; (b) by operation outside the usage parameters stated in the user documentation that shipped with
the product; (c) by software, interfacing, parts or supplies not supplied by HPE; (d) improper site preparation or maintenance; (e) virus infection; (f) loss
or damage in transit; or (g) by modification or service by anyone other than (i) HPE, (ii) an HPE authorized service provider, or (iii) your own installation

一般來說,AP故障的因素可歸責於人損的因素居多,網路接口針腳歪斜或斷掉非常常見,而這種屬於保固排除範圍,希望還是能妥善安裝跟保存,以避免送修被拒絕。