W poprzednim artykule omówiliśmy technologię DMVPN i na potrzeby symulacji użyto środowiska GNS3. Konfiguracja dla każdego urządzenia (routera) została wprowadzona ręcznie i nie było z tym większych problemów. Zastanówmy się jednak, nad problemem konfiguracji wielu urządzeń: 10, 100 lub nawet 1000 routerów w naszym środowisku sieciowym. Operacja ręcznego wprowadzenia konfiguracji mimo, iż nadal pozostaje możliwa jest bardzo czasochłonna i mechaniczna. 

Innym rozwiązaniem jest napisanie skryptu w dostępnych językach programowania i wykonanie operacji wprowadzenia konfiguracji na każdym z urządzeń automatycznie. Wróćmy do naszego przykładu i topologii logicznej naszej infrastruktury sieciowej.

Konfigurację routera (lub routerów zapewniając redundancję) głównego (hub) wprowadzamy ręcznie, ponieważ nie jest to zadanie czasochłonne. Naszym zadaniem będzie napisanie skryptu w języku Python, w taki sposób, aby dla każdego oddziału (spoke) konfiguracja została wprowadzona automatycznie. Zwróćmy uwagę, iż w naszej topologi logicznej mamy 2 oddziały. W praktyce oddziałów naszej firmy  (biura, magazyny, sklepy itp.) może być zdecydowanie więcej.

Przykład poniżej:

#!/usr/bin/python

import paramiko
import time

time.sleep(1)

for x in range (2, 4):
ip = „200.100.100.%d”% (x)
host = ip
username = „cisco”
password = „Cisco123!”

remote_conn_pre = paramiko.SSHClient()
remote_conn_pre
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote_conn_pre.connect(ip, username=username, password=password, look_for_keys=False, allow_agent=False)
print(„SSH connection established to ” + host)

remote_conn = remote_conn_pre.invoke_shell()
print(„Interactive SSH session established”)

remote_conn.send(„enable\n”)
remote_conn.send(„Cisco123!\n”)
remote_conn.send(„conf t\n”)

remote_conn.send(„crypto isakmp policy 10\n”)
remote_conn.send(„hash md5\n”)
remote_conn.send(„authentication pre-share\n”)
remote_conn.send(„!\n”)

remote_conn.send(„crypto isakmp key cisco123 address 0.0.0.0 0.0.0.0\n”)
remote_conn.send(„!\n”)

remote_conn.send(„crypto ipsec transform-set strong esp-3des esp-md5-hmac\n”)
remote_conn.send(„!\n”)

remote_conn.send(„crypto ipsec profile cisco\n”)
remote_conn.send(„set security-association lifetime seconds 120\n”)
remote_conn.send(„set transform-set strong\n”)
remote_conn.send(„!\n”)

remote_conn.send(„interface Tunnel0\n”)
remote_conn.send(„ip address 172.30.1.%s 255.255.255.0\n”% (x))
remote_conn.send(„no ip redirects\n”)
remote_conn.send(„ip mtu 1440\n”)
remote_conn.send(„ip nhrp authentication cisco123\n”)
remote_conn.send(„ip nhrp map multicast dynamic\n”)
remote_conn.send(„ip nhrp map 172.30.1.1 200.100.100.1\n”)
remote_conn.send(„ip nhrp map multicast 200.100.100.1\n”)
remote_conn.send(„ip nhrp network-id 1\n”)
remote_conn.send(„ip nhrp nhs 172.30.1.1\n”)
remote_conn.send(„tunnel source FastEthernet0/0\n”)
remote_conn.send(„tunnel mode gre multipoint\n”)
remote_conn.send(„tunnel key 0\n”)
remote_conn.send(„tunnel protection ipsec profile cisco\n”)
remote_conn.send(„!\n”)

remote_conn.send(„router eigrp 90\n”)
remote_conn.send(„network 172.16.%s.0 0.0.0.255\n”% (x))
remote_conn.send(„network 172.30.1.0 0.0.0.255\n”)
remote_conn.send(„no auto-summary\n”)

remote_conn.send(„exit\n”)

time.sleep(.15)
output = remote_conn.recv(65535)
print(output)

output = remote_conn.recv(1000)
print(output)

time.sleep(15)

output = remote_conn.recv(5000)
print(output)

Uwagi do przykładu powyżej:

Powyższy kod został napisany w języku Python. Dla uproszczenia i celów demonstracyjnych przyjęto adresację publiczną zaczynającą się od adresu 200.100.100.1 (adres publiczny routera głównego) do 200.100.100.3 oraz adresację prywatną dla oddziałów zaczynająca się od adresu 172.16.2.0 do 172.16.3.0. Przy konwersji naszego programu do realiów sieciowych, wyzwaniem mogą okazać się zadania:

    • zbudowania odpowiedniej bazy adresów IP naszych oddziałów
    • wczytania danych w/w do naszego programu

Baza adresów może zostać zbudowana np. formie pliku tekstowego, a dane wczytywane wiersz po wierszu. Dobrze napisany skrypt powinien również posiadać odpowiednią obsługę błędów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *