section

Automatická konfigurace portů pro Cisco a Juniper

15.09.2021 | Tag Sítě

Konfigurace portů na switchi je jeden z nejběžnějších úkolů správce. Pomocí předdefinovaného setu příkazů se pak dá port nastavit velmi rychle a jednotným způsobem. Chtěla bych ukázat, jak se toho dá dosáhnout na Cisco a Juniper EX switchích.

Teď necháme stranou nějaké robustní nástroje jako je Ansible, byť je to asi nejlepší způsob, jak si ulehčit život od rutinních malých úkolů. Určitou míru automatizace umožňují i samotné switche, dokonce i ty s původním IOS systémem, takže jde o poměrně starou věc. V našem prostředí je takový rutinní task konfigurace portu, což musí dělat každý z adminů nehledě na jeho specializaci. Aby se předešlo chybám a konfigurace se trochu zjednodušila, máme připravené sety konfigurace pomocí maker.

Cisco macro dovoluje vytvořit a pojmenovat si set příkazů a tento set následně volat, kdykoliv je potřeba. Makra se můžou vztahovat jak na globální konfiguraci, tak právě na specifickou konfiguraci, jako je konfigurace portů. Konfigurace maker má svá specifika, například:

Makra umějí používat i proměnné, nebo klíčová slova. Dá se tak třeba dynamicky doplnit číslo VLAN během zavolání makra. Je to hezká schopnost, ale osobně ji moc nevyužívám a spíše vytvářím statický set, který se pouze zavolá. Teď pár příkladů.

Makro se vždy definuje v konfiguračním módu pomocí macro name //název makra//. Každý řádek je jeden příkaz, konec zadávání makra se definuje pomocí @, což nám říká i sám IOS. První příklad je makro s jedním klíčovým slovem (může jich samozřejmě být víc). Klíčové slovo stačí umístit v příkazu tam, kam se má následně vyplnit jeho hodnota. Pak se pomocí #macro keywords klíčové slovo označí.

Switch(config)#macro name test

Enter macro commands one per line. End with the character '@'.

username test priv 15 secret $heslo

#macro keywords $heslo

@

Dále makro bez klíčového slova, které natvrdo nastavuje port jako accesový s VLAN 10.

Switch(config)#macro name port

Enter macro commands one per line. End with the character '@'.

description port_PC

switchport mode access

switchport access vlan 10

spanning-tree portfast

spanning-tree bpduguard enable

@

Vytvořené makro se dá zavolat buď pomocí macro trace, nebo pomocí macro apply. Macro trace do konzole vypíše to, co právě aplikuje. Macro apply aplikuje nadefinovaný set příkazů bez vypsání toho, co dělá. V globální konfiguraci se makro zavolá pomocí macro global. První příklad je zavolání makra v globální konfiguraci s klíčovým slovem. „Heslo“ je dříve zvolené klíčové slovo a „tohlejeheslo“ je hodnota toho klíčového slova, která se do příkazu doplní. Je vidět, že u macro trace makro řeklo, co aplikovalo.

Switch(config)#macro global trace test heslo tohlejeheslo

Applying command... 'username test priv 15 secret $tohlejeheslo'

Switch(config)#

Druhý příklad je konfigurace tří portů pomocí makra „port“. Zde je ukázáno to zmíněné vyčištění konfigurace z portu, aby se k tomu nepřimotala konfigurace z makra. Makro se dá volat nad rozsahy portů i nad jednotlivými porty samostatně.

Switch#conf t

Enter configuration commands, one per line. End with CNTL/Z.

Switch(config)#default int range fa0/22-24

Switch(config)#int range fa0/22-24

Switch(config-if-range)#macro apply port

Switch(config-if-range)#exit


Switch(config)#do sh run int fa0/22

Building configuration...

Current configuration : 186 bytes

interface FastEthernet0/22

description port_PC

switchport access vlan 10

switchport mode access

macro description port

spanning-tree portfast

spanning-tree bpduguard enable

end

Pomocí show parser macro brief se dají vypsat všechna existující makra. Cisco switche v sobě mají automaticky několik maker, které obsahují podle Cisco optimální konfiguraci pro specifické účely. Uživatelsky vytvořená makra jsou pak součástí konfigurace a ukážou se v jejím výpisu.

Switch#sh parser macro brief

default global : cisco-global

default interface: cisco-desktop

default interface: cisco-phone

default interface: cisco-switch

default interface: cisco-router

default interface: cisco-wireless

customizable : test

customizable : port

Switch#

To by bylo k Cisco řešení pro jednodušší konfiguraci portů. Něčeho podobného jsem chtěla dosáhnout také s Juniperem. Nakonec jsem skončila u možnosti, která mi zaručí stejný výsledek, ale úplně jiným způsobem. Zde půjde o seskupování portů se stejnou konfigurací do skupin, ze kterých si porty nastavení dědí. Není to přímý ekvivalent maker, ale pro snadnou konfiguraci portů se to hodí stejně.

Pomocí interface-range se na Juniperu dá vytvořit konfigurace pro skupinu portů se stejnými vlastnostmi. Porty, které tuto konfiguraci mají mít, se pak do skupiny přidávají jako členové. Má to oproti Ciscu nevýhodu – vytvořená konfigurace pomocí interface-range musí mít aspoň jednoho člena, tj. nedá se připravit dopředu bez aspoň jednoho portu. Na druhou stranu, oproti Cisco macru je interface-range příjemnější na použití, protože konfigurace portů probíhá jejich přiřazením ke skupině. Opět ukázka.

Konfigurace portu u Juniperu a u Cisca se dost liší. Cisco vše vztažené k portu nastavuje pod portem samotným. Juniper má naopak sekce konfigurace, do kterých se porty začleňují. To pro pochopení, proč je konfigurace tak rozsáhlá. Vlastnosti portu se definují na více místech.

Vytáhla jsem konfiguraci pro access point a pro PC port. port_AP a port_PC jsou názvy skupin portů, kam se později budou jednotlivé porty přiřazovat.

set protocols rstp interface port_AP edge

set protocols lldp interface port_AP

set protocols lldp-med interface port_AP

set poe interface port_AP

set interfaces interface-range port_AP description CAPWAP

set interfaces interface-range port_AP unit 0 family ethernet-switching port-mode trunk

set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 10

set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 11

set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 12

set interfaces interface-range port_AP unit 0 family ethernet-switching native-vlan-id 13


set protocols rstp interface port_PC edge

set protocols lldp interface port_PC

set protocols lldp-med interface port_PC

set poe interface port_PC

set ethernet-switching-options voip interface port_PC vlan 22

set ethernet-switching-options voip interface port_PC forwarding-class assured-forwarding

set interfaces interface-range port_PC description zasuvka_IT

set interfaces interface-range port_PC unit 0 family ethernet-switching port-mode access

set interfaces interface-range port_PC unit 0 family ethernet-switching vlan members 3

Tady už je samotné přiřazení portů do skupiny. Port ge-0/0/0 je členem skupiny pro AP a port ge-0/0/1 je členem skupiny pro PC. Oba porty pak mají ještě návdavkem nakonfigurovaný vlastní popis, který přebije popis z interface group. Je potřeba hlídat členství portu v jednotlivých skupinách, aby se konfigurace nějak nechtěně nemíchala.

set interfaces interface-range port_AP member ge-0/0/0

set interfaces ge-0/0/0 description AP


set interfaces interface-range port_PC member ge-0/0/1

set interfaces ge-0/0/1 description 1/14

Co se po commitu děje, je lepší ukázat pomocí show | display inheritance. Tímto příkazem se vypíše konfigurace spolu s popisem toho, co bylo odkud a proč zděděno. Výpis jsem zkrátila jen na část, kde je hezky vidět dědění konfigurace portů.

admin@switch# show | display inheritance

ge-0/0/1 {

description 1/14;

unit 0 {

##

## 'ethernet-switching' was expanded from interface-range 'port_PC'

##

family ethernet-switching {

##

## 'access' was expanded from interface-range 'port_PC'

##

port-mode access;

##

## 'vlan' was expanded from interface-range 'port_PC'

##

vlan {

##

## '3' was expanded from interface-range 'port_PC'

##

members 3;

}

}

}

}


ge-0/0/0 {

description AP;

unit 0 {

##

## 'ethernet-switching' was expanded from interface-range 'port_AP'

##

family ethernet-switching {

##

## 'trunk' was expanded from interface-range 'port_AP'

##

port-mode trunk;

##

## 'vlan' was expanded from interface-range 'port_AP'

##

vlan {

##

## '10' was expanded from interface-range 'port_AP'

## '11' was expanded from interface-range 'port_AP'

## '12' was expanded from interface-range 'port_AP'

##

members [ 10 11 12 ];

}

##

## '13' was expanded from interface-range 'port_AP'

##

native-vlan-id 13;

}

}

}

Zde je jiný příklad – port 0/0/19 se z jedné skupiny přeřazuje do druhé. Pomocí show | compare se objeví změny oproti původní konfiguraci.

admin@switch# delete interfaces interface-range port_FREE member ge-0/0/19

{master:0}[edit]

admin@switch# set interfaces interface-range port_PC member ge-0/0/19

{master:0}[edit]


admin@switch# show | compare

[edit interfaces interface-range port_PC]

member ge-0/0/18 { ... }

+ member ge-0/0/19;

[edit interfaces interface-range port_FREE]

- member ge-0/0/19;

{master:0}[edit]

Snad je trochu jasné, co jsem chtěla ukázat. Juniper i Cisco nabízí spoustu cest, jak si konfiguraci zjednodušit. Výše představené způsoby jsou jedny z nich.