miercuri, 18 februarie 2015

1 client, 2 provideri, 3 optiuni - Inter AS VPN Layer 3 Option B

Mai jos va prezint cum reusesc doi provideri (ISP 1 - AS 100 si ISP 2 - AS 200) sa configureze un NNI (Network to Network Interconnection) pentru a permite interconectarea a doua site-uri diferite (CPE 1 - LAN 7.7.7.7 /32 si CPE 2 - LAN 1.1.1.1 /32) a aceluiasi client. Mai mult, acest mod de configurare permite utilizarea legaturii NNI pentru interconectarea mai multor clienti care au site-uri conectate la ambii ISP-isti.

Topologie


Config routerelor CPE

CPE 1

!Loopback0 - LAN
interface Loopback0
ip address 7.7.7.7 255.255.255.255

!Ethernet0/1 - WAN
interface Ethernet0/1
ip address 192.168.78.7 255.255.255.0

!ruta implicita - next hop router-ul PE1
ip route 0.0.0.0 0.0.0.0 192.168.78.8
CPE 2

!Loopback0 - LAN
interface Loopback0
ip address 1.1.1.1 255.255.255.255

!Ethernet0/1 - WAN
interface Ethernet0/1
ip address 192.168.211.1 255.255.255.0

!ruta implicita - next hop router-ul PE2
ip route 0.0.0.0 0.0.0.0 192.168.211.21


Config routerelor P

P1

interface Loopback0
ip address 23.23.23.23 255.255.255.255

!Ethernet0/0.423 - leg cu ASBR 1
interface Ethernet0/0.423
encapsulation dot1Q 423
ip address 10.4.23.23 255.255.255.0
mpls ip

!Ethernet0/0.823 - leg cu PE 1
interface Ethernet0/0.823
encapsulation dot1Q 823
ip address 10.8.23.23 255.255.255.0
mpls ip

router ospf 1
network 10.4.23.23 0.0.0.0 area 0
network 10.8.23.23 0.0.0.0 area 0
network 23.23.23.23 0.0.0.0 area 0
P2

interface Loopback0
ip address 22.22.22.22 255.255.255.255

!Ethernet0/0.322 - leg cu ASBR 2
interface Ethernet0/0.322
encapsulation dot1Q 322
ip address 10.3.22.22 255.255.255.0
mpls ip

!Ethernet0/0.212 - leg cu PE 2
interface Ethernet0/0.212
encapsulation dot1Q 212
ip address 10.21.22.22 255.255.255.0
mpls ip

router ospf 1
network 10.3.22.22 0.0.0.0 area 0
network 10.21.22.22 0.0.0.0 area 0
network 22.22.22.22 0.0.0.0 area 0


Config routerelor PE

PE1

ip vrf Client
rd 100:1
route-target export 100:1
route-target import 100:1

!RT 200:1 il au rutele anuntate din AS 200 route-target import 200:1

interface Loopback0
ip address 8.8.8.8 255.255.255.255

!Ethernet0/0.78 - leg catre CPE 1
interface Ethernet0/0.78
encapsulation dot1Q 78
ip vrf forwarding Client
ip address 192.168.78.8 255.255.255.0

!Ethernet0/0.823 - leg catre P1
interface Ethernet0/0.823
encapsulation dot1Q 823
ip address 10.8.23.8 255.255.255.0
mpls ip

router ospf 1
network 8.8.8.8 0.0.0.0 area 0
network 10.8.23.8 0.0.0.0 area 0

router bgp 100
no bgp default ipv4-unicast

!adiacenta iBGP cu ASBR 1
neighbor 4.4.4.4 remote-as 100
neighbor 4.4.4.4 update-source Loopback0

address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community both
exit-address-family

address-family ipv4 vrf Client
redistribute connected
redistribute static
exit-address-family

!ruta statica prin CPE 1 catre LAN 1
ip route vrf Client 7.7.7.7 255.255.255.255 192.168.78.7
PE2

ip vrf Client
rd 200:1
route-target export 200:1
route-target import 200:1

!RT 100:1 il au rutele anuntate din AS 100
route-target import 100:1

interface Loopback0
ip address 21.21.21.21 255.255.255.255

!Ethernet0/0.211 - leg catre CPE 2
interface Ethernet0/0.211
encapsulation dot1Q 211
ip vrf forwarding Client
ip address 192.168.211.21 255.255.255.0

!Ethernet0/0.212 - leg catre P2
interface Ethernet0/0.212
encapsulation dot1Q 212
ip address 10.21.22.21 255.255.255.0
mpls ip

router ospf 1
network 10.21.22.21 0.0.0.0 area 0
network 21.21.21.21 0.0.0.0 area 0

router bgp 200
no bgp default ipv4-unicast

!adiacenta iBGP cu ASBR 2
neighbor 3.3.3.3 remote-as 200
neighbor 3.3.3.3 update-source Loopback0

address-family vpnv4
neighbor 3.3.3.3 activate
neighbor 3.3.3.3 send-community both
exit-address-family

address-family ipv4 vrf Client
redistribute connected
redistribute static
exit-address-family

!ruta statica prin CPE 2 catre LAN 2
ip route vrf Client 1.1.1.1 255.255.255.255 192.168.211.1


Config routerelor ASBR

Pe aceste routere trebuie sa existe toata tabela de adrese VPNv4, la fel ca pe Route Reflector, fara insa sa definim VRF-uri pentru fiecare client, asa cum facem pentru Option A. Se poate aplica un nivel de filtrare ale adreselor VPNv4 pentru a anunta numai retele clientilor care au nevoie de acest NNI. In plus, toate PE-urile unui ISP trebuie sa aibe ca next-hop propriul ASBR pentru adresele VPNv4 invatate de la celalalt ISP.
ASBR1

interface Loopback0
ip address 4.4.4.4 255.255.255.255

!Ethernet0/0.43 - leg catre ASBR2
interface Ethernet0/0.43
encapsulation dot1Q 43
ip address 10.0.43.4 255.255.255.0
mpls bgp forwarding

!Ethernet0/0.423 - leg catre P1
interface Ethernet0/0.423
encapsulation dot1Q 423
ip address 10.4.23.4 255.255.255.0
mpls ip

router ospf 1
network 4.4.4.4 0.0.0.0 area 0
network 10.4.23.4 0.0.0.0 area 0

router bgp 100
no bgp default ipv4-unicast

!comanda de mai jos permite invatarea tuturor adreselor VPNv4, similar cu RR
no bgp default route-target filter

!adiacenta iBGP cu PE1
neighbor 8.8.8.8 remote-as 100
neighbor 8.8.8.8 update-source Loopback0
!adiacenta eBGP cu ASBR2
neighbor 10.0.43.3 remote-as 200

address-family vpnv4
neighbor 8.8.8.8 activate
neighbor 8.8.8.8 send-community both
neighbor 8.8.8.8 next-hop-self
neighbor 10.0.43.3 activate
neighbor 10.0.43.3 send-community both
exit-address-family
ASBR2

interface Loopback0
ip address 3.3.3.3 255.255.255.255

!Ethernet0/0.43 - leg catre ASBR1
interface Ethernet0/0.43
encapsulation dot1Q 43
ip address 10.0.43.3 255.255.255.0
mpls bgp forwarding

!Ethernet0/0.322 - leg catre P2
interface Ethernet0/0.322
encapsulation dot1Q 322
ip address 10.3.22.3 255.255.255.0
mpls ip

router ospf 1
network 3.3.3.3 0.0.0.0 area 0
network 10.3.22.3 0.0.0.0 area 0

router bgp 200
no bgp default ipv4-unicast

!comanda de mai jos permite invatarea tuturor adreselor VPNv4, similar cu RR
no bgp default route-target filter

!adiacenta eBGP cu ASBR1
neighbor 10.0.43.4 remote-as 100
!adiacenta iBGP cu PE2
neighbor 21.21.21.21 remote-as 200
neighbor 21.21.21.21 update-source Loopback0

address-family vpnv4
neighbor 10.0.43.4 activate
neighbor 10.0.43.4 send-community both
neighbor 21.21.21.21 activate
neighbor 21.21.21.21 send-community both
neighbor 21.21.21.21 next-hop-self
exit-address-family

Probleme similare adresam in cadrul cursurilor de CCNA / CCNP de la academia Netschool. Spor la invatat si urmatorul post la fi despre Option C.

marți, 19 august 2014

VRF-uri sau cum virtualizam un router Cisco

Asa cum virtualizam un switch folosind Vlan-uri, tot asa putem virtualiza un router folosind VRF-uri (Virtual Routing & Forwarding). De exemplu un ISP instaleaza intr-o cladire de birouri echipamentele de transmisuni si un router pentru acces la Internet. ISP conecteaza primul client si acesta ii solicita sa configureze routerul cu adresa IP 192.168.1.1/24 pentru aceasta este adresa IP folosita de calculatoarele sale ca default-gateway. Al doilea client doreste si el acces la Internet, dar el doreste ca routerul ISP sa fie configurat cu adresa 192.168.1.254/24. Desi adresele IP sunt diferite, totusi sunt in acelasi subnet si stim ca routerele nu pot avea doua interfete diferite in acelasi subnet in aceeasi tabela de rutare. Cum adica aceeasi tabela de rutare? Dar cate tabele de rutare are un router? Raspunsul corect este ca un router are in mod implicit o tabela de rutare (denumita si tabela globala), dar poate fi configurat cu mai multe tabele de rutare. Castigul este ca putem configura aceleasi adrese IP (sau subneturi) daca acestea apartin diferitelor tabele de rutare.
La fel si switch-urile Cisco, sunt configurate in mod implicit cu Vlan-ul 1.
Cum se modifica pachetele IP care tranziteaza un astfel de router? Raspunsul este ca nu se schimba, sunt tratate ca si cum tranziteaza un router dedicat, cu interfete separate, cu tabela de rutare proprie.
Daca discutam si despre MPLS, atunci intr-adevar mesajele IP sufera niste modificari, prin incapsularea in frame-uri MPLS.

In continuare vom analiza problema de mai sus in care:
- clientul 1 doreste acces la Internet si in LAN adresele IP sunt din subnetul 192.168.1.0/24, default-gateway 192.168.1.1; ISP aloca adresa publica 100.50.25.2
- clientul 2 doreste acces la Internet si in LAN adresele IP sunt din subnetul 192.168.1.0/24, default-gateway 192.168.1.254; ISP aloca adresa publica 100.50.25.6
- ISP separa cele doua legaturi la Internet cu ajutorul subintefetelor 802.1Q
- in tabela globala de rutare se gaseste doar subinterfata de monitorizare pe care o foloseste ISP pentru monitorizare si conectare prin Telnet/SSH; ISP aloca adresa publica 100.50.25.254

Topologie


Configurarea tabelei de rutare globale si a interfetei de monitorizare

interface Ethernet0/0.2
   encapsulation dot1Q 2
   ip address 100.50.25.254 255.255.255.252
   exit
ip route 0.0.0.0 0.0.0.0 100.50.25.253

! definire aliasuri pentru comenzi
alias exec siibe show ip interface brief | exclude unassigned
alias exec sir show ip route
end
siibe
sir


Configurarea serviciului de acces la Internet pentru primul client

ip vrf Client1
   rd 1:1
   exit
interface Ethernet0/0.10
   encapsulation dot1Q 10
   ip vrf forwarding Client1
   ip address 100.50.25.2 255.255.255.252
   ip nat outside
   exit
ip route vrf Client1 0.0.0.0 0.0.0.0 100.50.25.1

interface Vlan 101
   ip vrf forwarding Client1
   ip address 192.168.1.1 255.255.255.0
   ip nat inside
   no shutdown
   exit
access-list 100 permit ip 192.168.1.0 0.0.0.255 any
ip nat inside source list 100 interface Ethernet0/0.10 vrf Client1 overload
end
siibe
sir vrf Client1
ping vrf Client1 100.50.25.1

In mod practic, am asociat interfetele cu un VRF denumit Client1 (vezi comanda ip vrf forwarding ...) si apoi am definit o ruta implicita ca apartinand tabelei de rutare corespunzatoare acestui VRF. Comanda de vizualizare a tabelei de rutare primeste cuvintul cheie vrf urmat de numele VRF-ului, la fel utilitarul ping.
Comanda de configurare pentru PAT primeste si aceasta cuvantul cheie vrf urmat de numele VRF-ului.
Definirea unui VRF are doua componente importante: numele si parametrul RD (Route Distinguisher). RD este un numar pe 64 de biti care trebuie sa fie unic, pe acelasi router nu pot exista doua VRF-uri cu acelasi RD. Totusi, adminul nu poate alege decat 48 de biti din cei 64 (16 biti sunt rezervati pentru campul Type). Astfel, RD se poate scrie:
- AS_16_biti:numar_32_biti (Type 0)
- IP:numar_16_biti (Type 1)
- AS_32_biti:numar_16_biti (Type 2)

Configurarea serviciului de acces la Internet pentru al 2-lea client

ip vrf Client2
   rd 1:2
   exit
interface Ethernet0/0.11
   encapsulation dot1Q 11
   ip vrf forwarding Client2
   ip address 100.50.25.6 255.255.255.252
   ip nat outside
   exit
ip route vrf Client2 0.0.0.0 0.0.0.0 100.50.25.5

interface Vlan 102
   ip vrf forwarding Client2
   ip address 192.168.1.254 255.255.255.0
   ip nat inside
   no shutdown
   exit
access-list 100 permit ip 192.168.1.0 0.0.0.255 any
ip nat inside source list 100 interface Ethernet0/0.11 vrf Client2 overload
end
siibe
sir vrf Client2
ping vrf Client2 100.50.25.5

Observatie: Comanda ip vrf forwarding ... se va folosi inainte de comanda ip address ..., altfel adresa IP existenta se va sterge, evenimentul este anuntat in consola si trebuie reconfigurata adresa IP.
Concluzie: un pachet IP care intra in router pe o interfata asociata cu un VRF nu poate iesi pe o interfata dintr-un alt VRF; cel mult poate iesi pe o interfata din tabela globala de rutare, folosind o configuratie corespunzatoare.

Configuratii suplimentare facem in cadrul cursurilor CCNA de la academia Asociatia Netschool.

marți, 24 decembrie 2013

Cum se incheie 2013 si planurile pentru 2014 - noua academie Cisco functioneaza

     Super an 2013, am reusit sa imi pun ordine si in viata personala, asa ca m-am casatorit in sfarsit. Acesta a fost unul din motivele pentru care mi-am restrans activitatea cu care unii dintre voi erau obisnuiti. Totusi, am lucrat si pe plan profesional si am pornit pregatirea pentru certificarea CCIE Routing & Switching, deja primul pas (examenul online) l-am trecut cu succes. Mai am in fata aproximativ 5 luni pana la examenul practic, este destul de dificil, dar in acelasi timp este si foarte interesant: foarte multe lucruri noi, atat din punct de vedere cunostinte cat si metode de abordare a problemelor de configurare si troubleshooting.

     Asa cum am promis unora dintre voi, nu voi renunta la activitatea de instructor care mi-a adus multe satisfactii pe parcursul a 9 ani si ceva, asa ca acum avem infiintata Asociatia Netschool, atestata ca academie Cisco in care deja putem organiza cursuri. M-am gandit foarte serios daca mai are rost sa continui si printre primii care m-au convins au fost fostii studenti care m-au incurajat sa nu renunt la visurile mele. Totusi, am schimbat formula obisnuita de desfasurare a cursurilor si din acest motiv, va rog sa ma contactati, in cazul in care sunteti interesati sa colaboram, pentru a va da lamuriri despre acest nou mod de lucru.

     Sper cu acest proiect sa atrag persoane pasionate de meseria pe care ma voi stradui sa o predau in toate etapele ei: Associate, Professional, Expert.

    Va doresc tuturor un Craciun fericit, un an nou numai cu bucurii, cu sanatate si cu multe visuri implinite,

Marius Moise

membru fondator

Asociatia Netschool

Tel: +(40) 745 007405

E-mail: marius@netschool.ro

marți, 30 aprilie 2013

MPLS - roots bloody roots

Multiprotocol Label Switching este o functionalitate foarte intalnita in routerele ISP, prin care acestea nu mai verifica propria tabela de rutare pt a gasi calea catre destinatia unui mesaj, ci utilizeaza o noua tabela, care contine corespondente intre etichete (un numar pe 20 de biti) si interfete de iesire. Avantajele sunt multiple si le voi puncta pe parcursul fiecarui post ce va urma acestuia.

Acest post are mai mult valoare teoretica decat practica, totusi trebuie sa raminem cu ideea ca pt. configurarea acestei noi metode de comutare a pachetelor avem nevoie de routere, protocoale de rutare IGP, de BGP (in urmatorul post) si de ceva in plus pe care incerc sa il evidentiez aici.

Ideea consta in asocierea unei etichete MPLS, de exemplu,  cu o adr IP si anuntarea acestei etichete printr-un prot. de rutare destinat acestei sarcini, LDP (Label Distribuition Protocol).
Totodata si adr. IP este anuntata printr-un prot. de rutare IGP. Corespondenta intre eticheta MPLS si adresa IP este importanta doar la intrarea pachetului IP in routerele PE, apoi conteaza numai corespondenta intre etichete.
Presupunem ca un pachet IP are sursa 192.168.2.x si destinatia 192.168.1.x (cele doua retele, in acest caz, sunt direct conectate de router PE2 si respectiv PE1). Routerul PE2 incapsuleaza pachetul IP intr-un frame MPLS (prin adaugarea unui header MPLS) si apoi intr-un frame corespunzator prot. Layer 2 OSI de pe interfata de iesire  (in cazul meu HDLC). In figura de mai jos observa ca intre headerul HDLC si cel IP se gaseste headerul MPLS, in care valoarea etichetei este 18 si TTL=255.
Tabela LFIB a routerului PE2 din imaginea de mai jos confirma ca eticheta corespunzatoare subnetului destinatie 192.168.10.0/24 este 18 (outgoing tag). Acest router a primit aceasta eticheta, prin prot. de rutare LDP, de la routerul P2.
Acum mesajul a ajuns in routerul P2 si are eticheta 18. Acest router nu se mai uita in tabela si de rutare, ci numai in LFIB. Se observa ca eticheta 18 (local tag) trebuie inlocuita cu 17 (outgoing tag) si frame-ul MPLS trebuie trimis pe interfara Se 1/1. In plus, TTL se decrementeaza cu 1.
Astfel, din router P2 pleaca mesajul in forma de mai jos (vezi eticheta si TTL).
Acum mesajul a ajuns in routerul P1 si are eticheta 17. Nici acest router nu se uita in tabela de rutare, ci numai in LFIB. De aceasta data etichetei 17 (local tag) ii corespunde o eticheta speciala (valoarea numerica 3) care inseamna 'imposition-null' si care determina routerul P1 sa elimine headerul MPLS (pop tag) si sa trimita spre PE1 pachetul IP asa cum l-a primit initial routerul PE2, cu exceptia TTL (acum 253).
Mesajul trimis de catre P1 nu mai contine headerul MPLS, iar TTL este 253.
Dupa ce mesajul a ajuns in PE1, doar acest router se mai uita in tabela de rutare proprie pt a determina intf. de iesire a pachetului.

Ca sa se intample toate acestea, trebuie sa configuram interfetele de leg. dintre routere cu comanda mpls ip si un prot de rutare IGP (OSPF, ISIS, EIGRP) cu timp de convergenta mic. Trebuie sa analizati daca este necesar sa mariti si MTU, un header MPLS are exact 20+3+1+8=32 biti (eticheta MPLS + Experimental_bits + Stack_bit + MPLS_TTL).
Experimental_bits -3 biti care se folosesc pt marcarea frame-urilor in vederea implementarii QoS.
Stack bit - bitul care indica daca acest header este ultimul din stiva (S=1) sau mai urmeaza si alte headere MPLS (S=0).
TTL_MPLS - campul de 8 biti care previne intrarea in bucla a unui frame MPLS.

Etichetele MPLS ajung de la un router la altul prin prot de rutare special, standard, denumit LDP - Label Distribution Protocol, care se activeaza automat dupa ce se configureaza routerele cum am precizat anterior.
Se formeaza in mod automat adiacente LDP intre routere; mesajele LDP sunt incapsulate in TCP/646.

De exemplu configuratia routerului P1 este:
interface Loopback1
 ip address 1.1.1.1 255.255.255.255
!
interface Serial1/0
 description link_2_PE1
 ip address 172.16.1.1 255.255.255.252
 ip router isis IGP
 mpls ip
 !
interface Serial1/1
 description link_2_P2
 ip address 172.16.0.1 255.255.255.252
 ip router isis IGP
 mpls ip
!
router isis IGP
 net 49.0001.0010.0100.1001.00
 is-type level-2-only
 log-adjacency-changes
 redistribute connected

Adiacentele LDP pe care le formeaza cu routerele PE1 si P2:
P1#sh mpls ldp neighbor
    Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 1.1.1.1:0
        TCP connection: 2.2.2.2.34835 - 1.1.1.1.646
        State: Oper; Msgs sent/rcvd: 13/11; Downstream
        Up time: 00:00:52
        LDP discovery sources:
          Serial1/1, Src IP addr: 172.16.0.2
        Addresses bound to peer LDP Ident:
          2.2.2.2         172.16.0.2
    Peer LDP Ident: 192.168.10.1:0; Local LDP Ident 1.1.1.1:0
        TCP connection: 192.168.10.1.31261 - 1.1.1.1.646
        State: Oper; Msgs sent/rcvd: 10/9; Downstream
        Up time: 00:00:41
        LDP discovery sources:
          Serial1/0, Src IP addr: 172.16.1.2
        Addresses bound to peer LDP Ident:
          172.16.1.2      10.0.0.1        192.168.10.1

Tabela de rutare:
P1#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     1.0.0.0/32 is subnetted, 1 subnets
C       1.1.1.1 is directly connected, Loopback1
     2.0.0.0/32 is subnetted, 1 subnets
i L2    2.2.2.2 [115/10] via 172.16.0.2, Serial1/1
i L2 192.168.10.0/24 [115/10] via 172.16.1.2, Serial1/0
     172.16.0.0/30 is subnetted, 3 subnets
i L2    172.16.20.0 [115/20] via 172.16.0.2, Serial1/1
C       172.16.0.0 is directly connected, Serial1/1
C       172.16.1.0 is directly connected, Serial1/0
i L2 192.168.20.0/24 [115/20] via 172.16.0.2, Serial1/1
     10.0.0.0/32 is subnetted, 2 subnets
i L2    10.0.0.2 [115/20] via 172.16.0.2, Serial1/1
i L2    10.0.0.1 [115/10] via 172.16.1.2, Serial1/0

Tabela LFIB:
P1#sh mpls forwarding-table
Local  Outgoing    Prefix            Bytes tag  Outgoing   Next Hop
tag    tag or VC   or Tunnel Id      switched   interface
16     Pop tag     2.2.2.2/32                         0          Se1/1      point2point
17     Pop tag     172.16.20.0/30               0          Se1/1      point2point
18     Pop tag     10.0.0.1/32                      0          Se1/0      point2point
19     Pop tag     192.168.10.0/24             0          Se1/0      point2point
20     20          10.0.0.2/32                           0          Se1/1      point2point
21     21          192.168.20.0/24                 0          Se1/1      point2point

Urmatorul post va fi despre VPN MPLS Layer 3, practic vom vedea frame-uri MPLS cu doua headere MPLS si un singur header IP, adrese VPNv4, VRF-uri si cum putem configura intraneturile a doi clienti care au acelasi plan de adresare privat, fara ca routerele sa fie deranjate ca pe doua interfete au aceeasi adresa IP.

joi, 25 aprilie 2013

... cu de toate (Linux, Expect, Cisco)


Ideea de la care am pornit a fost sa fac un script in BASH si cu ajutorul limbajul EXPECT sa execut comenzi, unele interactive (adica trebuie sa introduci parametrii, de ex. comanda enable
solicita introducerea unui parole s.a.m.d), pe un numar de elemente de retea (aici Cisco) a.i. sa pot configura la orice moment un numar cat mai mare din acestea fara sa ma conectez eu pe fiecare in parte.

Ziceam pe cand predam cursuri - si in continuare cred in faptul - ca si lenea a dus la progres.

Ceea ce am scris mai jos nu necesita cunostinte avansate de BASH scripting si de EXPECT, eu nu stiu mai mult de genunchiul broastei; totusi in 3-4 zile am reusit sa inteleg sintaxa de baza pt BASH si EXPECT si iata ce a iesit.

Scriptul se lanseaza cu comanda sh <numescript>.sh <inputFile>.csv

Fisierul cu datele de intrare <inputFile>.csv este in format csv, fiecare linie este de forma:
ipaddr,<numefisier>.txt (de ex: 192.168.1.2,routerBackbone.txt)

<numefisier>.txt contine pe fiecare linie comenzile pe care doriti sa le executati pe fiecare element de retea identificat cu ipaddr, de ex.:

show clock
conf t
interface Gi 0/0/0
no shutdown
ip address 10.0.0.0.1 255.255.255.0
exit
exit
write memory

De la linia de comanda se introduce user/parola, parola VTY si enable secret; doar userul este afisat pe ecran
Erorile se salveaza in fisierul <numefisier>.error.log, iar outputul comenzilor executate pe fiecare element de retea se savleaza in fisierul <numefisier>.report

Va rog sa inlocuiti <numefisier> cu ceva care are sens pt fiecare.

Continutul fisierului <numescript>.sh este:


#!/bin/bash

#functia de mai jos se apeleaza cu 3 parametrii si practic trimite 5 mesaje ICMP echo de marime 512 octeti 
#si asteapta raspuns timp de 10 sec
#nu ma intereseaza sa capturez outputul comenzii ping si nici eventualele erori

isAlive() {
host=$1
contor=$2
rows=$3
         echo -e "\n$contor/$rows#####start probing...$host"
         ping -c 5 -s 512 -w 10 $host > /dev/null 2>&1
}

#IFS este parametrul prin care ii transmit BASH ca Internal Field Separator este ,
IFS=","

#mai jos ii transmit BASH ca fisierul de intrare este primul argument din comanda de lansare
inputFile=$1

#ma asigur ca fisierul de intrare exista (-f) si ca are o lungime diferita de 0 octeti (-s)
if [ -f $inputFile -a -s $inputFile ]
then

#mai jos solicit utilizatorului sa introduca user/parola, VTY line password si enable secret
 stty echo
 echo username:
 read userName
 echo password:
 stty -echo
 read passWord
 stty echo
 echo VTY password:
 stty -echo
 read VTYpassWord
 stty echo
 echo ROOT/ENABLE password:
 stty -echo
 read RootPassWord
 stty echo

#mai jos ma asigur ca s-au introdus niste valori si nu s-a apasat doar Enter
 if [ "x$userName" != x -a "x$passWord" != x -a "x$VTYpassWord" != x -a "x$RootPassWord" != x ]
 then

#numar cate elemente de retea sunt in total
rows=`cat $inputFile | wc -l`

#sterg continutul fisierului cu erori si al celui cu outputul comenzilor
echo > <numefisier>.error.log
echo > <numefisier>.report




#initializez un contor care imi raporteaza indexul elementului de retea la care a ajuns scriptul 


i=1





#parcurg fisierul inputFile linie cu linie pana la sfarsitul acestuia

while read line

        do

#varialbila host va contine adresa IP a elementului de retea
                host=`echo $line | awk '{print $1}'`

#variabila inputCmdFile va contine numele fisierului cu comenzile de executat
                inputCmdFile=`echo $line | awk '{print $2}'`

#daca fisierul cu comenzi exista (-f) si are marimea diferita de 0 octeti (-s)
                if [ -f $inputCmdFile -a -s $inputCmdFile ]
                then

#variabila NOW contine momentul de timp, folositor pt raportare erori
                 NOW=$(date +"%c")

#apelez functia prin care testez ca elementul de retea este pornit
                 isAlive $host $i $rows

#daca rezultatul de executie al functiei isAlive este 0 (in BASH valoarea 0 inseamna SUCCESS)
                 if [ $? -eq "0" ]
                 then

#apelez scriptul <numescriptEXPECT>.expect pe care il gasiti mai jos (eu am facut acest script ca fiind 
#executabil) si outpul executiei il documentez in fisierul <numefisier>.report
./<numescriptEXPECT>.expect $inputCmdFile $host $userName $passWord $VTYpassWord $RootPassWord $NOW >> <numefisier>.report

#incrementez contor 
                       let i++

#daca elementul de retea nu raspunde la ping, documentez eroarea in fisierul cu erori si incrementez contor
                else
                        echo $NOW,$host",INACCESIBILl!" >> sendCmdCisco.error.log
                        let i++
                 fi

#daca un fisier cu comenzi nu exista sau are dimensiune 0 octeti, trec la urmatorul element


                else

                 continue
                fi
        done < $inputFile



#daca nu s-a introdus una  valorile user/password/VTYpassword/enableSecret, se iese din script
else echo "EROARE: Nu ati introdus user/password/VTYpassword/rootpassword!"; exit 1
 fi



#daca nu s-a introdus argumentul pt lansarea scriptului (cel cu datele de intrare), se iese din script

else

 echo "EROARE: Verificati fisierul de intrare $inputFile !"; exit 1
fi


Scriptul scris in EXPECT (<numescriptEXPECT>.expect) arata dupa cum urmeaza:

#!/usr/local/bin/expect

#parcurg fisierul cu comenzi si introduc fiecare comanda in lista inputCmd
set inputCmd [split [read [open [lindex $argv 0] r]] "\n"]

#deschid fisierul cu erori in modul append
set errorFile [open "<numefiser>.error.log" a]

#initializez variablilele host, userName, passWord, VTYpassword, RootPassWord si recordTime
set host [lindex $argv 1]
set userName [lindex $argv 2]
set passWord [lindex $argv 3]
set VTYpassWord [lindex $argv 4]
set RootPassWord [lindex $argv 5]
set recordTime [lindex $argv 6]

#initiez sesiunea Telnet
spawn telnet $host

#daca se solicita username atunci trimit valorile variabilelor userName si apoi passWord
#daca se solicita numai parola atunci trimit valorea variabilelei VTYpassWord
#daca nu se solicita nimic timp de 10 sec atunci documentez eroarea
expect {
"*sername: " {send "$userName\n"; expect "*assword: "; send "$passWord\n"}
"*assword: " {send "$VTYpassWord\n"}
timeout {puts $errorFile "$recordTime,$host,TIMEOUT 1"; exit 1}
}

#daca nu primesc promptul specific user-EXEC (adica >) pt a trece mai departe si se solicita din nou user 
#sau parola VTY atunci documentez eroarea (poate ati gresit cand ati introdus user/parola etc)
expect {
"*sername: " {puts $errorFile "$recordTime,$host,contul de acces $userName INCORECT!!!"; exit 1}
"*assword: " {puts $errorFile "$recordTime,$host,parola de acces VTY INCORECTA!!!"; exit 1}

#SUCCESS, suntem in modul user-EXEC
"*>"
}

#trimit comanda enable pt a ajunge in privileged-EXEC
send "enable\n"

#se solicita parola de escaladare a niv de privilegii (enable secret)
expect "*assword: "

#trimit valoarea variabilei care contine aceasta parola
send "$RootPassWord\n"

#daca nu primesc promptul specific priviled-EXEC (adica #) pt a trece mai departe si solicita din nou parola 
#atunci documentez eroarea (poate ati gresit cand ati introdus enable secret etc)
expect {
"*>" {puts $errorFile "$recordTime,$host,parola de acces in privilegiul 15 INCORECTA!!!"; exit 1}
"*assword: " {puts $errorFile "$recordTime,$host,parola de acces in privilegiul 15 INCORECTA!!!"; exit 1}

#SUCCESS, suntem in modul privileged-EXEC
"*#"
}

#se trimite fiecare comanda din lista comenzi si apoi se inchide sesiunea Telnet,
#parasind astfel si scriptul scris in EXPECT
foreach cmd $inputCmd {
send "$cmd\n"
expect "*#"
}
exit 0

Ca sa recapitulam:
1. trebuie sa aveti instalat EXPECT
2. va trebuie fisierul <numefisier>.EXPECT - vezi mai sus
3. va trebuie fisierul <numefisier>.sh - vezi mai sus
4. va trebuie <numefisier>.csv - vezi mai sus
5. va trebuie <numefisier>.txt (atatea fisiere cate hosturi aveti, daca nu rulati aceleasi comenzi, altfel numai unul singur) - vezi mai sus

Eu am rulat cu sucess si cu BASH si cu KSH (cu mici modificari) atat din RHEL, Debian, Sun Solaris.
Spor in tot ce faceti si sper sa am vesti cat de curand pt cei care le asteapta (acum suntem cu actele la judecatorie - greu la deal cu boii mici si vale tre' sa-mpingi).  



duminică, 3 februarie 2013

GETVPN - simplu simplu


GETVPN este o modalitate de configurare a routerelor CPE prin care se centralizeaza managementul politicilor IPSec necesare in protejarea mesajelor care circula intre LAN-urile care se conecteaza aceste routere CPE. Astfel, nu mai este nevoie sa configuram tunele IPSec, politici ISAKMP, liste de acces pentru fiecare pereche de LAN-uri. Un castig si mai mare consta in faptul ca pe un router CPE nu se mai formeaza tunele IPSec, nici dinamice nici statice, pentru fiecare pereche de LAN-uri, ci doar un tunel IPSec de intrare si altul de iesire. Nu mai este nevoie ca un router CPE sa se autentifice catre celalalt sau invers; cele doua se inregistreaza la un "server de management al politicilor PSec" denumit Key Server si devin Group Member. Doua routere CPE vor comunica intre ele daca sunt inregistrate si fac parte din acelasi grup GDOI; dupa ce s-au inregistrat cu succes, primesc de la KS politicile IPSec si lista de acces care defineste traficul interesant. Pachetele IP isi conserva headerul IP initial, routerele CPE nu adauga decat headerul ESP (este cel mai folosit) si/sau AH (mai putin folosit datorita interactiunii cu eventuale politici NAT). Pe toate routerele CPE aceste tunele IPSec sunt identificate la fel (acelasi SPI).

In continuare vom lucra pe topologia de mai jos, cu trei routere CPE pe care le configuram ca GM in acelasi grup si doua routere KS, pentru redundanta.

Configuratia Key Server Main

crypto isakmp policy 10
encr 3des
authentication pre-share
group 2
lifetime 600

crypto isakmp key 0 untest address 10.0.0.0 255.0.0.0
crypto isakmp keepalive 15 periodic

crypto ipsec transform-set GETVPN_ts_1 esp-3des esp-sha-hmac

crypto ipsec profile GETVPN_p_1
set transform-set GETVPN_ts_1

access-list 100 permit ip 172.16.0.0 0.15.255.255 172.16.0.0 0.15.255.255

crypto gdoi group GETVPN_g_1
identity address ipv4 1.1.1.1
server local
rekey lifetime seconds 1800
rekey retransmit 30 number 4
rekey authentication mypubkey rsa GETVPN_1
rekey transport unicast
registration interface FastEthernet0/0
sa ipsec 1
profile GETVPN_p_1
match address ipv4 100
replay time window-size 10
address ipv4 10.0.0.0
redundancy
 local priority 255
 peer address ipv4 10.255.255.255

Configuratia Key Server Bkp

crypto isakmp policy 10
encr 3des
authentication pre-share
group 2
lifetime 600

crypto isakmp key untest address 10.0.0.0 255.0.0.0
crypto isakmp keepalive 15 periodic
crypto ipsec transform-set GETVPN_ts_1 esp-3des esp-sha-hmac
crypto ipsec profile GETVPN_p_1
set transform-set GETVPN_ts_1
crypto gdoi group GETVPN_g_1
identity address ipv4 1.1.1.1
server local
rekey lifetime seconds 1800
rekey retransmit 30 number 4
rekey authentication mypubkey rsa GETVPN_1
rekey transport unicast
registration interface FastEthernet0/0
sa ipsec 1
profile GETVPN_p_1
match address ipv4 100
replay time window-size 10
address ipv4 10.255.255.255
redundancy
local priority 1
peer address ipv4 10.0.0.0

Configuratia unui Group Member

crypto isakmp policy 10
encr 3des
authentication pre-share
group 2
lifetime 600

crypto isakmp key untest address 10.0.0.0 255.0.0.0


crypto gdoi group GETVPN_G_1
identity address ipv4 1.1.1.1
server address ipv4 10.0.0.0
server address ipv4 10.255.255.255


crypto map MAP local-address Loopback0
crypto map MAP 1 gdoi
set group GETVPN_G_1


interface Fa0/0
descrption ### link 2 MPLS Netw ### 
crypto map MAP

Normal, pe acest router se configureaza interfetele, protocoale de rutare etc.


Verificari pe routerul Key Server Main (vezi Local KS Role)


sh crypto gdoi ks
Total group members registered to this box: 3

Key Server Information For Group GETVPN_g_1:
Group Name : GETVPN_g_1
Group Identity : 1.1.1.1
Group Members : 3
IPSec SA Direction : Both
ACL Configured:
access-list 100
Redundancy : Configured
Local Address : 10.0.0.0
Local Priority : 255
Local KS Status : Alive
Local KS Role : Primary



Verificari pe routerul Key Server Bkp (vezi Local KS Role)

sh crypto gdoi ks
Total group members registered to this box: 3

Key Server Information For Group GETVPN_g_1:
Group Name : GETVPN_g_1
Group Identity : 1.1.1.1
Group Members : 3
IPSec SA Direction : Both
ACL Configured:
access-list 100
Redundancy : Configured
Local Address : 10.255.255.255
Local Priority : 1
Local KS Status : Alive
Local KS Role : Secondary



Verificari pe routerul Group Member

sh crypto gdoi
Group Information

Group Name : GETVPN_G_1
Group Identity : 1.1.1.1
Rekeys received : 0
IPSec SA Direction : Both
ACL Received From KS : gdoi_group_GETVPN_G_1_temp_acl
Active Group Server : 10.0.0.0
Group Server list : 10.0.0.0
                               10.255.255.255



In logurile de pe routerul Group Member apare mesajul:


%GDOI-5-GM_REGS_COMPL: Registration to KS 10.0.0.0 complete for group GETVPN_G_1 using address 10.0.0.10


Traficul ICMP intre doua hosturi din LAN-uri diferite 172.16.10.2 si 172.16.10.2 se vede in reteaua MPLS (vezi adresa IP sursa si destinatie)



si in routerul GM (vezi contorul pentru pachete incapsulate/decapsulate, verificate etc)

show crypto ipsec sa

interface: FastEthernet0/0
Crypto map tag: MAP, local addr 10.0.0.10

protected vrf: (none)
local ident (addr/mask/prot/port): (172.16.0.0/255.240.0.0/0/0)
remote ident (addr/mask/prot/port): (172.16.0.0/255.240.0.0/0/0)
current_peer port 848
PERMIT, flags={origin_is_acl,}
#pkts encaps: 310, #pkts encrypt: 310, #pkts digest: 310
#pkts decaps: 310, #pkts decrypt: 310, #pkts verify: 310
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 0, #pkts compr. failed: 0
#pkts not decompressed: 0, #pkts decompress failed: 0
#send errors 0, #recv errors 0

local crypto endpt.: 10.0.0.10, remote crypto endpt.:
path mtu 1500, ip mtu 1500, ip mtu idb FastEthernet0/0
current outbound spi: 0x3FDDBB86(1071496070)

inbound esp sas:
spi: 0x3FDDBB86(1071496070)
transform: esp-3des esp-sha-hmac ,
in use settings ={Tunnel, }
conn id: 55, flow_id: SW:55, crypto map: MAP
sa timing: remaining key lifetime (k/sec): (4564260/1449)
IV size: 8 bytes
replay detection support: Y replay window size: 10
Status: ACTIVE

inbound ah sas:

inbound pcp sas:

outbound esp sas:
spi: 0x3FDDBB86(1071496070)
transform: esp-3des esp-sha-hmac ,
in use settings ={Tunnel, }
conn id: 56, flow_id: SW:56, crypto map: MAP
sa timing: remaining key lifetime (k/sec): (4564260/1427)
IV size: 8 bytes
replay detection support: Y replay window size: 10
Status: ACTIVE

outbound ah sas:

outbound pcp sas:

Daca devine indisponibil routerul Key Server Main, apare logul in Key Server Bkp

%GDOI-3-COOP_KS_UNREACH: Cooperative KS 10.0.0.0 Unreachable in group GETVPN_g_1
%GDOI-5-COOP_KS_TRANS_TO_PRI: KS 10.255.255.255 in group GETVPN_g_1 transitioned to Primary (Previous Primary = 10.0.0.0)
si verificand (vezi Local KS Role)

sh crypto gdoi ks
Total group members registered to this box: 3

Key Server Information For Group GETVPN_g_1:
Group Name : GETVPN_g_1
Group Identity : 1.1.1.1
Group Members : 3
IPSec SA Direction : Both
ACL Configured:
access-list 100
Redundancy : Configured
Local Address : 10.255.255.255
Local Priority : 1
Local KS Status : Alive
Local KS Role : Primary

Cand revine in functionare routerul Key Server Main, apare logul in Key server Bkp


%GDOI-5-COOP_KS_REACH: Reachability restored with Cooperative KS 10.0.0.0 in group GETVPN_g_1


si verificand (vezi Local KS Role)

sh crypto gdoi ks
Total group members registered to this box: 3

Key Server Information For Group GETVPN_g_1:
Group Name : GETVPN_g_1
Group Identity : 1.1.1.1
Group Members : 3
IPSec SA Direction : Both
ACL Configured:
access-list 100
Redundancy : Configured
Local Address : 10.255.255.255
Local Priority : 1
Local KS Status : Alive
Local KS Role : Secondary



In tot acest timp, traficul IPSec intre routerele Group Member nu este perturbat.


Spor la invatat.

marți, 25 decembrie 2012

Asterisk si configurarea automata a telefoanelor SIP Cisco

 Tema pe care am studiat-o de curand a fost sa configurez sistemul Asterisk astfel incat telefoanele sa isi ia configuratia in mod automat de la acesta. Ingredientele sunt: Asterisk 1.8 instalat pe Debian 6, conectat in Internet, sa presupunem ca are adresa 200.100.50.1. Telefoanele IP sunt conectate intr-un LAN privat, in care se gaseste un server DHCP (ruleaza pe un alt Debian 6); un telefon este Cisco SPA303 si altul Cisco SPA525G.



Telefoanele obtin adresa IP de la un server DHCP; tot pe acesta l-am configurat sa trimita telefoanelor si serverul de unde isi pot lua fisierele de configurare. Configuratia din dhcpd.conf este mai jos:
subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.100 192.168.1.107;
        option subnet-mask 255.255.255.0;
        option routers 192.168.1.1;
        option broadcast-address 192.168.1.255;
        option tftp-server-name  "tftp://
200.100.50.1/srv/tftp/spa$PSN.cfg";
}

spa$PSN.cfg se traduce prin "spa303.cfg" pentru telefonul Cisco SPA303 si respectiv "spa525G.cfg" pentru telefonul Cisco 525G. Nu uitati sa scrieti calea absoluta spre aceste fisiere, ca mai sus, mie mi-a luat ceva timp si nervi pana mi-am dat seama.

Pe serverul pe care ruleaza Asterisk avem instalat si un server TFTP care are calea absoluta "/srv/tftp" si in care am pus doua fisiere, cate unul pentru fiecare model de telefon. Continutul lor este acelasi si anume:


<flat-profile>
 <Resync_On_Reset>Yes</Resync_On_Reset>
 <Resync_Periodic>900</Resync_Periodic>
 <Profile_Rule>tftp://
200.100.50.1/srv/tftp/spa$MA.xml</Profile_Rule>
</flat-profile>



Practic, la fiecare 15 minute (900 secunde) telefonul isi va lua fisierul propriu de configurare, in format XML, de la serverul TFTP 200.100.50.1. In concluzie, daca aveti n telefoane model SPA303, va este necesar un singur fisier cu extensia "cfg".
spa$MAC.xml se traduce prin spa5475d02aadc6.xml daca adresa MAC a telefonului este 5475D02AADC6. Atentie, numele fisierului XML are litere mici in loc de literele mari din adresa MAC. Aici am mai pierdut ceva timp si nervi pana mi-am dat seama.
Dupa ce telefonul ia prin TFTP fisierul cu extensia "cfg" (de mai sus), dupa 15 minute incearca sa isi obtina fisierul propriu de configurare. In concluzie, daca aveti m telefoane este necesar sa aveti m fisiere cu extensia XML.
Eu am configurat o singura extensie (mai jos cel cu extensia 300 cu parola de autenficare 0003) pe fiecare telefon (desi pe fiecare se pot configura mai multe extensii) si astfel am obtinut fisierul XML de forma:
<flat-profile>
<Time_Zone group="Regional/Time">GMT+02:00</Time_Zone>
<Extension_1_ group="Phone/Line_Key_1">1</Extension_1_>
<Short_Name_1_ group="Phone/Line_Key_1">$USER</Short_Name_1_>
<Share_Call_Appearance_1_ group="Phone/Line_Key_1">private</Share_Call_Appearance_1_>
<Extended_Function_1_ group="Phone/Line_Key_1"/>
<Extension_2_ group="Phone/Line_Key_2">Disabled</Extension_2_>
<Short_Name_2_ group="Phone/Line_Key_2">$USER</Short_Name_2_>
<Share_Call_Appearance_2_ group="Phone/Line_Key_2">private</Share_Call_Appearance_2_>
<Extended_Function_2_ group="Phone/Line_Key_2"/>
<Extension_3_ group="Phone/Line_Key_3">Disabled</Extension_3_>
<Short_Name_3_ group="Phone/Line_Key_3">$USER</Short_Name_3_>
<Share_Call_Appearance_3_ group="Phone/Line_Key_3">private</Share_Call_Appearance_3_>
<Extended_Function_3_ group="Phone/Line_Key_3"/>
<Extension_4_ group="Phone/Line_Key_4">Disabled</Extension_4_>
<Short_Name_4_ group="Phone/Line_Key_4">$USER</Short_Name_4_>
<Share_Call_Appearance_4_ group="Phone/Line_Key_4">private</Share_Call_Appearance_4_>
<Extended_Function_4_ group="Phone/Line_Key_4"/>
<Extension_5_ group="Phone/Line_Key_5">Disabled</Extension_5_>
<Short_Name_5_ group="Phone/Line_Key_5">$USER</Short_Name_5_>
<Share_Call_Appearance_5_ group="Phone/Line_Key_5">private</Share_Call_Appearance_5_>
<Extended_Function_5_ group="Phone/Line_Key_5"/>
<Proxy_1_ group="Ext_1/Proxy_and_Registration">
200.100.50.1</Proxy_1_>
<User_ID_1_ group="Ext_1/Subscriber_Information">
300</User_ID_1_>
<Password_1_ group="Ext_1/Subscriber_Information">
0003</Password_1_>
<Preferred_Codec_1_ group="Ext_1/Audio_Configuration">G711a</Preferred_Codec_1_>
<Second_Preferred_Codec_1_ group="Ext_1/Audio_Configuration">G711u</Second_Preferred_Codec_1_>
<Dial_Plan_1_ group="Ext_1/Dial_Plan">(112S0|xxx.)</Dial_Plan_1_>
<Time_Format group="User/Supplementary_Services">24hr</Time_Format>
<Date_Format group="User/Supplementary_Services">day/month</Date_Format>
</flat-profile>



In fisierul "/etc/asterisk/sip.conf" avem urmatoarea configuratie pentru aceasta extensie



[netdesign](!)
context=netdesign
disallow=all
allow=alaw
type=friend
host=dynamic
nat=yes
qualify=2000
qualifyfreq=300
canreinvite=no
sendrpid=pai

[
300](netdesign)
secret=
0003
callerid=sales <300>

Modificand continutul fisierului cu extensia XML se pot configura telefoanele fara sa accesati pagina lor web de administrare.
Dupa cum spuneam si alta data, Linux ne ofera posibilitati de dezvoltare profesionala mult peste alte sisteme de operare. Va indemn sa va incepeti sa lucrati in acest sistem de operare, orice distributie va este accesibila/comoda.
Craciun fericit si mult spor la invatat!