Cisco IOS 18 - inter-VLAN routing a ACL - směrování mezi VLANy

Zdroj seriálu: https://www.samuraj-cz.com/serie/cisco-ios/
Tento článek logicky navazuje na popis VLAN. Vezměme, že jsme si rozdělili naši LAN na VLANy (subnety), čímž jsme omezili broadcast domény, segmentovali síť a získali další výhody. Jenže teď bychom potřebovali, aby alespoň (nebo právě) některé VLANy mohli mezi sebou komunikovat. Potřebujeme tedy mezi jednotlivými VLANami routovat, tomu se říká inter-VLAN routing. Tento článek popisuje, jak takové routování provozovat a jak jej omezovat pomocí Access Control List (ACL).

V tomto článku budu vycházet z (myslím běžné) topologie, kdy máme switche ve dvou vrstvách (a ne doporučovaných třech). Je zde jádro (core), což je L3 switch (nebo dva kvůli redundanci), který provádí vlastní inter-VLAN routing. Druhá vrstva je přístupová (access), do ní jsou zapojena všechna zařízení (stanice, v tomto případě i servery, tiskárny apod.). Všechny switche přístupové vrstvy jsou zapojeny do jádra, tyto spoje jsou konfigurovány jako trunk a používáme VLAN Trunking Protocol (VTP), takže stejné VLANy máme na všech switchích.

Pozn.: Obdobně se dá použít i zapojení, kdy nevyužíváme L3 switch, ale router. Základní informace jsou v článku VLAN - Virtual Local Area Network.

Zapnutí routování mezi VLANami
Defaultně je switch v módu L2 switchování, pokud chceme použít L3 vlastnost IP routing, tak ji musíme zapnout.

SWITCH(config)#ip routing
Nepotřebujeme použít žádný routovací protokol, protože veškeré routování se odehrává na jednom zařízení. Cisco IOS automaticky vkládá přímo připojené interfacy do routovací tabulky. Pokud je zapnuto routování, tak IOS routuje podle záznamů v routovací tabulce, což jsou statické routy a přímo připojené interfacy.

To je výhoda inter-VLAN routingu, že pro základní funkcionalitu není třeba téměř žádná konfigurace. VLAN interfacy jsou na core switchi přímo připojené interfacy, mezi kterými se provádí routování automaticky. Musíme pouze pro VLANy, které chceme routovat, vytvořit VLAN interface a nastavit mu IP adresu. IP adresa je stejně nutná, protože se jedná o gateway (bránu) pro daný subnet.

Následující příklad vytváří VLAN interface pro VLAN 100, která má subnet 10.0.1.0/24 a chceme adresu gateway 10.0.1.1. VLAN 100 již máme vytvořenou.

SWITCH(config)#interface vlan 100
SWITCH(config-if)#ip address 10.0.1.1 255.255.255.0 // zadání IP adresy spolu s maskou, která určuje subnet
SWITCH(config-if)#no shutdown // výchozí stav interface je vypnutý
Ještě je vhodné nastavit default gateway, pokud chceme komunikovat třeba do internetu, aby router věděl, kam poslat provoz, který nepatří do žádné z jeho VLAN. Možností nastavení je několik, ale první možnost je pouze pro úplnost, tu nemůžeme použít!

SWITCH(config)#ip default-gateway 10.0.1.250 // mohu použít, pouze pokud není zapnuto routování
SWITCH(config)#ip default-network 10.0.1.0 // nastaví defaultní síť, při používání routování
SWITCH(config)#ip route 0.0.0.0 0.0.0.0 10.0.1.250 // nejčastější metoda, vytvořím přímo záznam do routovací tabulky
Pouze jako poznámku zde zmíním užitečnou věc. Pokud jsme rozdělili původní jednu síť na VLANy a využívali jsme jeden DHCP server, tak můžeme stále pokračovat v používání jednoho serveru. Na serveru vytvoříme několik poolů (pro každý subnet jeden). A na switchi nakonfigurujeme pro dané VLANy DHCP Relay Agenta, ten předává broadcast požadavky na přidělení IP adresy pomocí unicastu na zadaný server.

SWITCH(config-if)#ip helper-address 10.0.1.10
Omezení routování a neroutované VLANy
Myslím, že mohou nastat dvě situace, pokud nechceme vše routovat, a to

neroutovaná VLAN - chceme mít izolovanou VLAN, tady naprosto neroutovanou s ostatními VLANami, buď funguje jako uzavřená síť nebo ji dále propojujeme pomocí firewallu či jiné GW
omezeně routovaná VLAN - chceme, aby jedna VLAN mohla komunikovat pouze s některými dalšími, případně aby byla povolena pouze určitá komunikace
Neroutovaná VLAN
Z předchozí kapitoly je jasné, jak jednoduše vytvoříme izolovanou VLANu. Stačí, aby její VLAN interface neměl zadanou IP adresu (nemusí vůbec existovat či může být shutdown). Taková VLAN se neúčastní routovacího procesu. IP adresu potřebujeme mít na VLANě z několika důvodů, například když chceme v této VLANě přistupovat na switch (na jeho CLI nebo webové rozhranní) nebo když chceme využít přidělování IP adres z DHCP serveru na switchi (do této VLAN). Ale po promyšlení se asi vždy objedeme bez toho, aby VLAN, kterou nechceme routovat, měla adresu.

Druhá možnost je trošku složitější a znamená vytvoření ACL. O tom pojednává další kapitola.

Omezeně routovaná VLAN pomocí ACL
Pokud chceme, aby některá VLANa byla routována (mohla komunikovat) pouze s některými dalšími (a ne se všemi). Případně chceme ještě více specifikovat komunikaci mezi VLANami (nebo ji úplně zakázat). Tak k tomu můžeme použít Access Control List (ACL). A tyto ACL aplikujeme na VLAN interface na routeru (v našem případě core switchi), těmto ACL se říká Router ACL.

Pozn.: Další možností je použití VLAN ACL (VACL), jinak řečeno VLAN map (vlan access-map), ty se uplatňují nejen na routovaný provoz (jako Router ACL), ale i na bridgovaný (switchovaný) provoz uvnitř VLANy, tedy na všechny pakety. Mají určité výhody, ale také nevýhody. V tomto článku se jim nevěnuji.

Podrobný (doufám) popis ACL je v článku Cisco IOS 8 - Access Control List, takže se zde nebudu věnovat vytváření ACL. Ale zkusím podrobně vysvětlit aplikaci ACL na interface, protože jsem to delší dobu nechápal. Pokud uvažujeme port ACL, které se aplikuje na nějaký port, tak je situace relativně jednoduchá. V článku o ACL je schematický obrázek, který snad jasně ukazuje, že se na komunikaci díváme z pohledu routeru, a pokud se chceme věnovat přicházející komunikaci do portu (do routeru), tak se aplikuje in a pokud odcházející, tak out.

Aplikace ACL na port

Následující obrázek obdobně ilustruje situaci. Počítač X je připojen do portu 1. Server Y je připojen do portu 47 switche. Pokud aplikujeme ACL na port 1 jako vstupní, tak se zabýváme komunikací, která odchází ze stanice X a směřuje (nemusí jenom na něj) na server Y. V tom případě zdrojové adresy jsou stanice X (S=X) a cílové adresy jsou serveru Y (D=Y). Další varianty jsou znázorněné v obrázku.

Port ACL application directions

Port ACL application directions
Aplikace ACL na VLAN

Pokud situaci přeneseme na náš L3 core switch, tak je situace stejná, ale myslím, že vyžaduje vážnější zamyšlení. My sice ACL aplikujeme na VLAN interface, ale nedíváme se na směry z pohledu VLAN, ale z pohledu switche (nebo jeho routovacího procesu - VLAN interfacu). Jakoby VLANa byla mimo switch a vše z ní vstupovalo do routeru přes VLAN interface, na který aplikujeme ACL. Když aplikujeme ACL jako vstupní na VLANě, tak řeší komunikaci, která z této VLAN odchází a vstupuje do routovacího procesu (do interfacu). Situaci jsem se pokusil schematicky zobrazit na následujícím obrázku.

Router ACL application directions - inter-VLAN

Router ACL application directions - inter-VLAN
Volba ACL a směru

Cisco udává jediné obecné doporučení:

standard ACL aplikovat blízko cíle na jako out (pravidla obsahují pouze zdrojové adresy, takže omezujeme, co do cíle vstupuje)
extended ACL aplikovat blízko zdroje jako in (pravidla obsahují zdrojové i cílové adresy, omezujeme provoz, který odchází ze zdroje, tedy ještě dříve než je zpracován routovacím procesem)
V praxi máme možnost aplikovat ACL u zdroje nebo u cíle a aplikovat buď směr in, směr out nebo oba in i out. V případě, že řídíme provoz na úrovni portů, tak si musíme také uvědomit, na kterou stranu komunikace (zdroj, cíl) nastavujeme port.

U interVLAN routingu nám někdy může stačit standard ACL, ale asi častěji použijeme extended ACL. Zda jej nastavíme in, out nebo oboje dohromady je třeba důkladně zvážit. Valná část komunikace (protokol TCP) potřebuje navázat spojení, takže když omezíme pouze jeden směr, spojení se nenaváže, a komunikace neprobíhá. Ale určitá komunikace probíhá jednosměrně (klasicky UDP protokol).

Pokud aplikujeme ACL jako vstupní u zdrojové VLANy, tak jej stačí nastavit pouze na jednu VLANu (tu zdrojovou a omezujeme, s kým může komunikovat). Pokud bychom jej chtěli nastavit u cíle, tak jej musíme nastavit u všech cílů, do kterých nesmí zdrojová VLANa komunikovat.

Malé shrnutí, jak můžeme ACL aplikovat:

na in u omezované VLANy - zdroj je omezovaná VLAN, cíl buď povolujeme, nebo zakazujeme, řídíme, co může z VLANy odcházet
na out u omezované VLANy - cíl je omezovaná VLAN, řídíme, co do ní může vstoupit
na in i out u omezované VLANy - cíl a zdroj v obou variantách, zamezíme vstupu i výstupu dat do dané VLANy
na out u cílové VLANy - v některých případech můžeme potřebovat aplikovat ACL i u cílových VLAN, například chceme, aby všechny VLANy mohli komunikovat pouze s jednou (třeba se servery) a ne mezi sebou
Příklad použití
Pokusím se o komplexnější příklad. Vezmeme situaci z předchozího obrázku, kde máme VLAN 100, VLAN 200 a přidáme ještě VLAN 300. Chceme, aby VLAN 100 komunikovala s VLAN 200 a VLAN 300, ale VLAN 300 komunikovala pouze s VLAN 100, stejně jako VLAN 200. Jinak řečeno plné routování, kde se VLAN 300 omezí pouze na komunikaci s VLAN 100.

SWITCH(config)#ip routing
SWITCH(config)#interface vlan 100
SWITCH(config-if)#ip address 10.0.1.1 255.255.255.0
SWITCH(config-if)#no shutdown
SWITCH(config)#interface vlan 200
SWITCH(config-if)#ip address 10.0.2.1 255.255.255.0
SWITCH(config-if)#no shutdown
SWITCH(config)#interface vlan 300
SWITCH(config-if)#ip address 10.0.3.1 255.255.255.0
SWITCH(config-if)#no shutdown
SWITCH(config)#ip access-list extended vlan300in
SWITCH(config-ext-nacl)#permit ip 10.0.3.0 0.0.0.255 10.0.1.0 0.0.0.255
SWITCH(config)#interface vlan 300
SWITCH(config-if)#ip access-group vlan300in in
Druhý příklad ukazuje možnost izolace jedné VLANy.

SWITCH(config)#ip access-list extended vlan300
SWITCH(config-ext-nacl)#deny ip any any
SWITCH(config)#interface vlan 300
SWITCH(config-if)#ip access-group vlan300 in
SWITCH(config-if)#ip access-group vlan300 out