martes, 17 de agosto de 2021

 Automatización de la red con Napalm

Publicado el 17 de Agosto del 2021

Apoyando a mis alumnos en esta nueva tendencia de la automatización de las redes, les traigo otra alternativa de administración de los routers y switches, de forma remota y automatizada usando Napalm y programando las actividades con Python.

Napalm es una especie de API que permite administrar a los dispositivos independiente del fabricante, es una librería desarrollada con Python por dos programadores y se han acoplado muchos más, en la actualidad, se tiene desarrollado una variedad de métodos para algunos sistemas operativos de routers y switches de diferentes fabricantes.


El acceso a diferentes fabricantes implicaría el conocimiento variado de cada uno de ellos, lo interesante de Napalm, es que nos hace fácil el acceso, por que han desarrollado el  get_network_driver, al cual solo tenemos que decirle que IOS queremos que controle. 

Vamos a hacer una práctica automatización y para ello se debe levantar primero la VM de GNS3 en VMware.

Usaremos la siguiente topología de GNS3

El tipo de router y switch que tenía en mi GNS3 no me servían, no funcionaba para pruebas de automatización, esto es te va a resultar normal con el tiempo, no todo funciona y hay que ir investigando por nuevas alternativas. La versión 15.6 lo cambié por el de 15.7 para el caso del router.

Para este lab tuve que que agregar estos dos dispositivos, a continuación sus nombres completos, y navegando por Internet los podrás bajar.

    Switch IOS: vios_l2-adventerprisek9-m.ssa.high_iron_20190423.qcow2    IOS

    Router IOS: vios-adventerprisek9-m.vmdk.SPA.157-3.M3.qcow2   IOS

Para su configuración debes hacer una importación del dispositivo (Appliance)


Debes haber bajado tres archivos para el router y uno de ellos es el de GNS3 appliance

Next, Next, 


Con esto tendrás instalado el router, de forma similar puedes agregar al switch

Si te preguntas de donde se obtiene esta información, la respuesta la obtienes de GNS3 Marketplace



La topología tiene 4 elementos, en particular la 
nube o cloude1 nos va a permitir la conexión a Internet, además permite que nuestra PC real esté en contacto con los dispositivos de GNS3, esto permite que pueda usar una aplicación instalada en mi PC, Visual Studio Code (VSC), desde la cual estaremos corriendo las aplicaciones en Python, para controlar al router y switch de GNS3.


La configuración previa del switch y router es la necesaria para que sea administrada vía SSH, adjunto las dos configuraciones.

Configuración del switch
S1#sho runn
version 15.2
!
hostname S1
!
username user1 privilege 15 password 0 cisco
!
ip domain-name cisco.com
!
interface Vlan1
 ip address 192.168.1.41 255.255.255.0
 no shutdown
!
ip ssh version 2

line vty 0 4
 login local
 transport input ssh
!
end
S1#


Configuración del router R1
R1#sho runn
version 15.7
hostname R1
!
ip domain name cisco.com
username user1 privilege 15 password 0 cisco
!
interface GigabitEthernet0/0
 ip address 192.168.1.43 255.255.255.0
 no shutdown

line vty 0 4
 login local
 transport input ssh
!
end
R1#


Desde la consola o Terminal de VSC, verifique que ya tiene instalado la versión 3 de Python, para ello ejecute python --version









Instale napalm si no lo tiene instalado, con el comando pip install napalm




Se puede usar el comando napalm --help para conocer los comandos que podemos usar para interactuar con los router y switches, previo al uso de las aplicaciones en Python.



Con este comando puedo consultarle al router que interfaces tiene y su características, para ello se debe indicar el usuario, su password, el tipo de IOS (vendor), el host, en este caso la IP que identifica al host, puede ser también su nombre y finalmente se llama a un método, en este ejemplo lo haremos con get_interfaces.

napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_interfaces

Con este comando y usando napalm le consultamos al router sobre sus interfaces y nos devuelve los datos de cada interfaz usando el formato json.






















Usando el método 
get_interfaces_ip podemos ver las IP de las interfaces del router, se puede conocer la IP de una interfaz, la única que tiene IP, las otras 3 no aparecieron.

napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_interfaces_ip








Usando el método get_arp_table para ver la tabla ARP del router, se puede apreciar así.

napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_arp_table












Si usamos los comandos típicos del router para hacer las consultas, nos entrega los datos desordenados, ya no los presenta en el formato json.

napalm --user user1 --password cisco --vendor ios 192.168.1.43  call cli --method-kwargs "commands=['show ip route']"








Los métodos get_xx han sido desarrollados para la consulta de algunos datos y se los debe buscar en su documentación, para saber cuales están disponibles. Se muestra a continuación solo algunos de ellos.



Ahora vamos a trabajar con Python, lo primero que haremos es un pequeño programa (napalm01.py), que permita verificar si hay interacción con el router o switch. 


Previo a la ejecución, podemos presionar Terminal / Nuevo terminal











Luego usamos el comando clear para liberar más la consola y queda así.






A continuación vamos a ejecutar el programa napalm01.py y lo hacemos desde el mismo VSC.






La respuesta obtenida es la siguiente, donde se muestra que el test ha sido completado satisfactoriamente.



En la aplicación, primero se importa napalm, luego se define una función donde se invoca al método get_network_driver y le indicamos que vamos a usarlo con un ios tradicional.

Se crea un objeto ios_router y se le pasa los parámetros para acceder al dispositivo: IP, nombre de usuario y password.

Luego le aplicamos el método open al objeto, con lo cual se inicia la conexión hacia el dispositivo. Si no aparece ningún mensaje de error significa que la conexión es exitosa
Aplicamos a continuación el método is_alive para verificar el estado de esa conexión.
Finalmente, se usa el método close para cerrar la conexión


Para cerrar esta presentación, vamos a desarrollar un programa en Python (napalm04.py), usando napalm para logrando obtener datos de los equipos de la red, para esta prueba solo tendremos en cuenta a un router y un switch, podrían ser muchos mas, dependiendo de la lista que declaremos.

Solo haremos la aplicación para routers del tipo IOS clásico, no lo haremos con los IOSXR, para no complicar por ahora nuestro proceso de aprendizaje, como dicen. " menos es más".


Necesitamos la librería tabulate, si no lo tenemos, debemos instalarlo, por lo que desde la consola del Visual S.C. usamos el comando pip install tabulate

Iniciamos el programa importando napalm y tabulate, este último, para imprimir con facilidad los datos de los dispositivos.

Se define una función, luego un objeto mediante el método de napalm "get_network_driver" y seleccionamos al ios tradicional.

Se hace la lista de dispositivos que van a ser monitoreados, tomando tres parámetros para identificarlo: su IP, tipo de IOS y tipo de dispositivo.

Se crea la lista network_devices y se accede a cada dispositivo, para lo cual se debe indicar el usuario y password y se tomando nota de varios parámetros: hostname, vendor, etc

Si ejecutamos, este es el resultado:











lunes, 9 de agosto de 2021

 Configuración de TACACS en GNS3 con VM

GNS3
Publicado el 09 de Agosto del 2021

A continuación se muestra una topología que puedes implementarla, donde se configuran los componentes de tal forma que el router R1 sea administrado remotamente usando SSH y autenticando con el servidor TACACS.


Note que estoy usando el Main server, eso significa que primero he activado la máquina virtual de GNS3 en VMware.


Abrí el GNS3 y agregué los siguientes componentes:


En el caso de la nube (cloud1), lo agregamos para que podamos tener acceso a la red de nuestra casa y asigne direcciones IP en la dirección de red 192.168.1.0 /24, y con ello tengamos acceso a Internet.

Esta debe ser la configuración de la nube, donde se ve la presencia de interfaces virtuales virbr0, note que el switch debe de estar conectado a la interface eth0, tal como lo indica la figura.

AL webterm1 lo configuramos con dhcp, si ingresamos a Edit config, podemos ver que se ha realizado los siguientes cambios:


Con esta configuración y gracias a la nube, se puede ingresar a Internet mediante el browser:


Aunque el objetivo no es tener acceso a Internet desde este host, si no, acceder al servidor TacacsGUI y desde aquí realizar la configuración necesaria.

Al TacacsGUI le configuramos una IP fija igual a: 192.168.1.31 /24. Para ello debe ingresar los siguientes comandos:





    ifconfig eth0 192.168.1.31 netmask 255.255.255.0
    route add default gw 192.168.1.1 eth0

La otra alternativa es usar el editor vi.
    vi /etc/network/interfaces

    :w para grabar
    :q para salir

Para ver los resultados de la edición
    cat /etc/network/interfaces






Ahora podemos acceder al servidor desde webterm1


Estos son los cambios que debemos hacer en el servidor:

Add new Device grupo

Device group name: GNS3Devices    Check: set group
Tacas Key:  cisco
enable password: class       texto claro

        Clic en Add Device Group



Add new Device

Device name: R1 Device group: GNS3Devices
IP add: 192.168.1.30
Tacacs Key: cisco
enable password: class      texto claro

    Clic en Add Device 



Add new user 

username: user1      user group: defaultusergroup
login password: cisco     en texto plano
enable pass: class    en texto plano

Clic en Add User


                        Clic en Apply Changes

Tacacs Configuration File
    no check en Make backup ..
    Clic en Apply




Luego de esto ya tenemos configurado al servidor TacacsGUI

Solo falta configurar R1, al cual a demás de la IP fija en su interface G0/0, se debe configurar para que el acceso remoto sea controlado por el servidor de autenticación, a continuación la configuración más importante.

Configuración de R1
---------------------------
aaa new-model
!
aaa authentication login default group tacacs+
aaa authorization exec default if-authenticated
aaa accounting exec default start-stop group tacacs+
!
ip tacacs source-interface GigabitEthernet0/0
!
tacacs server tacacsgui
 address ipv4 192.168.1.31
 key cisco
!
line vty 0 4
 privilege level 15
 transport input ssh
 login authentication default

ip domain-name cisco.com
cryto key generate rsa     1024

---------------------------------------------
Si abrimos una sesión Putty desde nuestra PC real, podemos acceder al router R1:



Para verificar que está actuando el servidor, hemos habilitado en R1 el comando debug tacacs, mediante el cual vemos el trabajo de dicho servidor.




viernes, 6 de agosto de 2021

Trabajando GNS3 con switches y routers (parte 2/2)

GNS3
Publicado el 06 de Agosto del 2021
Gracias a Elías Miranda Canales, como principal fuente.

En la presentación anterior (parte 1/2) vimos la posibilidad de trabajar con switches y routers en GNS3 como si estuviésemos trabajando con equipos reales, ya que el IOS que usamos tiene todos los comandos.

Para ello, se usa una máquina virtual de GNS3 en VMware, donde se cargan los IOS de los routers y switches, en nuestro caso solo hemos cargado un IOSv de router y un IOU L2 de switch, usando la opción de New template.


Con estos dos dispositivos podemos implementar una gran variedad de topologías, para nuestros cursos de CCNA.

Trabajar de esta manera es más eficiente, tanto en el uso de CPU y de memoria RAM y es probable que optes por cambiar tu configuración de GNS3, dejando la modalidad del GNS3 con servidor local y con los IOS tradicionales de routers.



Con esta modalidad se usa un servidor principal o Main server (VM en VMware), todo lo guarda en la VM, incluso los proyectos, por lo que, si queremos guardar un proyecto en nuestra PC, no es posible, no da la opción para guardarlo en una ruta, solo permite poner el nombre.

Si hacemos clic en File y Save project as mostrará la siguiente ventana sin la opción de explorar una ruta.



Cuando nos preguntamos y donde están almacenados estos proyectos, la respuesta es en el servidor VM GNS3, tal como lo muestra Proyects library, en la ruta: /opt/gns3/projects



Habiendo instalado al router y switch, lo que nos está faltando son los dispositivos finales, y para ello tenemos a la PC virtual (VPCS), la cual se puede usar para hacer pruebas básicamente de conectividad, usando el comando ping y trace, como se puede apreciar en la siguiente figura.




En el caso que queramos hacer pruebas de acceso web, no sería posible y nos veríamos obligados a usar la nube y conectar una máquina virtual con Windows o Linux en cada Host, lo que consumiría muchos recursos de la PC.

Una mejor solución es agregar una plantilla a través de Virtual template, para importar un dispositivo o appliance para GNS3, agregando archivos de dispositivos con extensión ".gns3a"

Antes debemos visitar la página:  https://www.gns3.com/marketplace
y seleccionar Appliances



Se recomienda descargar los siguientes Appliances:









Este dispositivo contiene el software del lado del servidor para la administración secundaria de dispositivos de red: 
- www (nginx) 
- ftp (vsftpd) 
- tftp (tftpd) 
- syslog (rsyslog) 
- dhcp (isc-dhcpd) 
- servidor snmp (snmpd + snmptrapd)

A este dispositivos lo puedo usar como servidor para todos los servicios indicados en la lista anterior.








Link de descarga

Permite tener un servidor Tacacs con entorno gráfico, útil cuando se quiere configurar AAA para la autenticación usando un servidor.

Se debe bajar también el siguiente archivo: tac_plus.qcow2 de 160MB desde este link.












Este dispositivo hace el papel de cliente y c
ontiene el navegador Firefox más las siguientes utilidades: 
 - net-tools, 
 - iproute2, 
 - ping, 
 - traceroute, 
 - ssh client, 



Instalación de webterm

Vamos a instalar webterm desde GNS3, presionando New template. y en el menú que aparece debemos elegir "Import an appliance file", con la intensión de importar el archivo de extensión .gns3a



Ubicamos al archivo en alguna carpeta de nuestra computadora, donde lo almacenamos luego de bajarlo.





Luego de finalizado la instalación, aparece en All devices un nuevo host con el ícono del navegador y nombre: webterm

Al agregarlo a la topología se realiza una serie de configuraciones, como las que se muestran en la siguiente figura.


Y una vez que finaliza la configuración, aparece en la topología y podemos conectarlo al switch como un dispositivo final y haciendo el papel de cliente.




Instalación de herramientas de la red Toolbox

Nuevamente presionamos New template y seleccionamos Import an appliance file


Indicamos donde se encuentra el archivo que bajamos.



Aparece una indicación respecto al password del root = gns3




Finalmente, pasado la instalación, Se agregará un nuevo dispositivo, el Toolbox:


A continuación lo agregamos a la topología y lo conectamos a un puerto del switch. De forma similar al terminal web (webterm), se realizan configuraciones y al final tendremos a dicho dispositivo Toolbox listo para su conexión.




Instalación del Servidor Tacacs

Similar a los dos casos anteriores, New template / Importar appliance / ruta del archivo de extensión .gns3a: tacas-gui / Abrir / Install en Main server / Next


Para el servidor Tacacs se usan dos archivos, como ya bajamos el segundo archivo: tac_plus.qcow2, podemos instalar esta versión de Tacacs GUI, si no lo estuviésemos deberíamos importarlo.





Note que antes de finalizar me da las credenciales de acceso a SSH, a la base de datos MySQL y a la interface web. Estos datos también se los puede obtener en la web desde donde bajamos los Appliances.




Se agregó el nuevo host TacacsGUI y lo vamos a conectar a la red.


En este caso, no se produjo configuraciones automáticas como en los dos anteriores, simplemente se adicionó y lo conectamos al switch.



Iniciamos a los dispositivos (Start) y notamos que lo hace de manera sencilla y rápida, respecto al método tradicional de uso de GNS3, con la misma cantidad de dispositivos.


Ahora falta configurar los dispositivos finales, fundamentalmente la asignación de direcciones IP a cada uno de los tres.

He configurado R1 como servidor DHCP para que le asigne IP al cliente PC1, la interface G0/1 de R1 tiene la IP = 192.168.10.1 /24













Configuración de webterm

Como R1 se está comportando como servidor DHCP, vemos que PC1 ya tiene asignada la IP = 192.168.10.11 /24. Lo que vemos a continuación es la pantalla del webterm.


Podemos asignarle una IP de forma estática, para ello seleccionamos Edit config y podemos cambiar la configuración, quitando el # de cada una de las líneas que nos interese establecer. Para ello la PC1 debe estar apagada (en rojo).




Se abre la siguiente ventana, mostrando la configuración del archivo: 
    /etc/network/interfaces
















Lo editamos para establecer la IP vía DHCP, esta es una alternativa.


La otra opción de configuración es asignar la IP de manera estática:.




Una vez que hemos configurado y salvamos la configuración, iniciamos PC1 con Start

Si ingresamos al navegador y hacemos clic en Información de conexión podemos ver su IP asignada.


Podemos achicar la ventana del navegador y al hacer clic izquierdo en la parte negra, apareciendo ventanas con diferentes menús de aplicaciones de cliente, como por ejemplo, poder hacer un telnet, tal como lo muestra la siguiente figura.




Puede usar la terminal para una variedad de cosas, pero en este artículo, solo se usará para verificar la configuración de IP del contenedor.




Configuración de Toolbox

Para el caso del Toolbox, muestra el shell de Linux y debemos recordar que este Linux tiene como usuario: root y password; gns3










Este servidor viene sin IP, lo comprobamos usando el comando ifconfig o ip a, donde vemos a la interfaz eth0 sin IP y a la interfaz looopback lo con la IP 127.0.0.1



















Para la configuración debemos editar el archivo "interfaces" con el siguiente comando:
   # nano /etc/network/interfaces

Debemos quitar los # y establecer los parámetros de lP para eth0
Grabamos los cambios con Control + o y luego Enter.
Salimos con Control + x


Para que los cambios se apliquen debemos aplicar el comando:
    # exit

Volvemos a iniciar con la opción de clic derecho sobre el dispositivo y elegimos: Start. Ahora ya vemos que tiene su IP, 192.168.10.2.

















Podemos verificar que hay ping de Toolbox a R1 y a PC1.












El servidor web está activo por defecto y lo podemos acceder desde PC1:



Toolbox
se comporta también como un servidor FTP, vamos a acceder desde PC1 que es una PC cliente. Para las pruebas estamos usando esta topología.




En el navegador de webterm ingresamos el URL con el protocolo FTP y vemos que solicita el usuario (root) y el password (gns3) para poder acceder.




Finalmente vemos a la carpeta del servidor FTP, el cual está vacío no se aprecia ningún archivo.


Desde el router R1, vamos a copiar un archivo en el servidor FTP, para ello primero hay indicar el usuario y password y posteriormente le diremos que copie un archivo de R1 al servidor FTP:











Este archivo (R1-en-ftp) debe aparecer en el servidor FTP, donde antes no tenía ningún archivo. Ahora vemos que ya hay un archivo.





Toolbox también se comporta como servidor TFTP, para lo cual vamos a guardar el archivo de configuración de R1, similar al caso anterior pero usando el protocolo TFTP, el cual lo usamos mas cunado hacemos backup de los archivos de routers y switches.










Si ingresamos a la carpeta /tftpboot en el Toolbox, encontraremos al archivo de configuración del router (r1-confg)

















Configuración del servidor TACACS

Hay que tener en cuenta las siguientes credenciales para su acceso:

SSH ---> username: root 
            ---> password: 1234 

MySQL DB: ---> username: root 
        --> password: tacacs 

Web interface: ---> username: tacgui 
        ---> password: abc123 

Con clic derecho sobre el dispositivo, ingresamos vía consola:

Para el acceso debo usar el usuario y password para SSH:



















Debemos configurar su IP, de manera estática o dinámica, en este caso elegimos que sea IP estática: 192.168.10.3 de acuerdo a nuestra topología que estamos trabajando.

Por defecto está configurada con dhcp:













Para editar su dirección IP usé el comando vi /etc/network/interfaces  no funciona el editor nano.
Para que sea válida la nueva dirección IP hacemos un Stop y luego Start al dispositivo TacacsGUI.










Desde PC1 ingresamos al TacacsGUI.










Espero que les pueda servir toda esta información que como profesional de redes es necesario conocerlo.