Cómo especificar la instancia de enrutamiento en aplicaciones de Python 3 en dispositivos que ejecutan Junos OS evolucionado
Descripción del módulo libpyvrf
Una instancia de enrutamiento es una colección de tablas de enrutamiento, interfaces y parámetros de protocolo de enrutamiento. Cada instancia de enrutamiento tiene un nombre único y una tabla de unidifusión IP correspondiente, que se puede utilizar para separar el tráfico de esa instancia de otro tráfico. Por ejemplo, en dispositivos que ejecutan Junos OS Evolved, puede habilitar una instancia dedicada de enrutamiento y reenvío virtual de administración (VRF), mgmt_junos
que utiliza una tabla de enrutamiento administrativo independiente dedicada a las tareas de administración.
Las instancias de enrutamiento le permiten aislar el tráfico que atraviesa la red sin usar varios dispositivos para segmentar su red. Cuando usa instancias de enrutamiento para aislar el tráfico, las utilidades de red como ping
y ssh
deben hacer referencia a la instancia de enrutamiento correcta para enviar tráfico a un destino al que se puede acceder a través de esa instancia.
La imagen Evolved de Junos OS se ejecuta de forma nativa en Linux, lo que proporciona acceso directo a todas las utilidades y operaciones de Linux, incluidas las bibliotecas python que forman parte de la imagen base. La biblioteca de Python 3 en dispositivos que ejecutan Junos OS Evolved también incluye el módulo Juniper Networks libpyvrf
, que permite que las aplicaciones de Python 3 que se ejecutan en el shell especifiquen la instancia de enrutamiento que se usará para procesos específicos y utilidades de red.
La tabla 1 describe las libpyvrf
funciones que puede usar en aplicaciones de Python 3 que se ejecutan en el shell de Linux. Puede utilizar las funciones para indicar a un proceso que utilice una instancia de enrutamiento específica. Si el mismo proceso requiere varias instancias de enrutamiento, también puede establecer el contexto de instancia de enrutamiento para un socket específico, lo que no afecta al contexto del propio proceso. Los paquetes a través del socket luego usan la tabla de enrutamiento asociada con esa instancia. Cuando se establece la instancia de enrutamiento para un proceso o socket, el libpyvrf
módulo establece el contexto en el VRF de Linux que corresponde a la instancia de enrutamiento de Junos OS.
|
Descripción |
---|---|
|
Devuelva el VRF de Linux correspondiente a una instancia de enrutamiento de Junos OS. |
|
Devuelva el índice de la tabla de enrutamiento asociada con la instancia de enrutamiento especificada. |
|
Devuelva la instancia de enrutamiento asociada con la tarea especificada.
Nota:
Esta función está en desuso a partir de Junos OS versión Evolved 22.1R1. |
|
Devuelva la instancia de enrutamiento asociada con el proceso actual. |
|
Establezca la instancia de enrutamiento para el socket especificado. |
|
Establezca la instancia de enrutamiento para el proceso especificado.
Nota:
Esta función está en desuso a partir de Junos OS versión Evolved 22.1R1. |
|
Establezca la instancia de enrutamiento para el proceso actual. |
Las funciones del libpyvrf
módulo pueden generar las siguientes excepciones según la función y el error:
libpyvrf.error
: se genera cuandolibvrf
se devuelve un error.libpyvrf.evo_not_ready
: se genera cuando la pila de red Evolved de Junos OS no está lista, por ejemplo, cuando el dispositivo se está iniciando.libpyvrf.invalid_table
: se genera cuando la instancia de enrutamiento o el ID de tabla especificados no son válidos.
La siguiente secuencia de comandos de Python de ejemplo intenta hacer ping a un host al que solo se puede acceder a través de la instancia de mgmt_junos
enrutamiento. Inicialmente, la secuencia de comandos hace ping al host antes de llamar a la set_vrf()
función. A continuación, la secuencia de comandos llama a la set_vrf()
función para asociar la instancia de mgmt_junos
enrutamiento con el proceso actual y vuelve a hacer ping al host.
[vrf:none] user@host:~# cat libpyvrf-ping.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: # Ping the host before setting the routing instance subprocess.call(command) == 0 # Set the routing instance vrf.set_vrf("mgmt_junos") print ("\nUsing routing instance:", vrf.get_vrf()) # Ping the host after setting the routing instance subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e : print ("Junos OS Evolved network stack is not ready") except vrf.error as e : print ("Generic libvrf error")
Cuando se ejecuta la secuencia de comandos, se produce un error en el primer comando ping, ya que el proceso utiliza la instancia de enrutamiento predeterminada en este caso, y el host solo es accesible a través de la instancia de mgmt_junos
enrutamiento. El segundo comando ping, que usa la instancia de mgmt_junos
enrutamiento, se realiza correctamente.
[vrf:none] user@host:~# python3 libpyvrf-ping.py ping: unknown host host1.example.net Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Puede restablecer la instancia de enrutamiento a la asociación de instancia de enrutamiento predeterminada en una aplicación de Python especificando una cadena vacía para el nombre de instancia de enrutamiento. Por ejemplo:
vrf.set_vrf("")
Si una aplicación no especifica una instancia de enrutamiento, la asociación de instancia de enrutamiento predeterminada depende del entorno del proceso. Si el entorno precarga la biblioteca de libsi.so , de forma predeterminada, la aplicación utiliza la instancia y la tabla de enrutamiento predeterminadas. default.inet
De lo contrario, no hay ninguna instancia de enrutamiento predeterminada asociada con el proceso o los sockets.
Para determinar si el entorno carga previamente la biblioteca de libsi.so , compruebe que el valor de la LD_PRELOAD
variable de entorno incluye la ruta de acceso a la biblioteca.
[vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
Si la LD_PRELOAD
variable no incluye la ruta de biblioteca libsi.so , puede usar los comandos adecuados para su shell para agregarla, por ejemplo:
[vrf:none] user@host:~# export LD_PRELOAD="/path/to/libsi.so" [vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
Función get_host_vrf_name()
Sintaxis
host_vrf_name get_host_vrf_name(vrf_name)
Descripción
Devuelva el VRF de Linux correspondiente a una instancia de enrutamiento de Junos OS.
Parámetros
vrf_name |
Nombre de una instancia de enrutamiento de Junos OS. |
Valor devuelto
host_vrf_name | Nombre del VRF de Linux correspondiente a la instancia de enrutamiento de Junos OS. |
Ejemplos de uso
En el siguiente ejemplo, se imprime el VRF de Linux correspondiente a varias instancias de enrutamiento de Junos OS:
[vrf:none] user@host:~# cat libpyvrf-get-host-vrf-name.py import libpyvrf as vrf try: print ("mgmt_junos VRF:", vrf.get_host_vrf_name("mgmt_junos")) print ("default VRF:", vrf.get_host_vrf_name("default")) print ("L3VPN-1 VRF:", vrf.get_host_vrf_name("L3VPN-1")) except vrf.invalid_table as e: print ("Invalid Table")
[vrf:none] user@host:~# python3 libpyvrf-get-host-vrf-name.py mgmt_junos VRF: mgmt_junos default VRF: vrf0 L3VPN-1 VRF: vrf52
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función get_table_id()
Sintaxis
table_id get_table_id(vrf_name)
Descripción
Devuelva el índice de la tabla de enrutamiento asociada con la instancia de enrutamiento especificada. Si la instancia de enrutamiento no está definida, la función devuelve -1.
Parámetros
vrf_name |
Nombre de una instancia de enrutamiento de Junos OS. |
Valor devuelto
table_id | Índice de la tabla de enrutamiento para la instancia de enrutamiento dada. |
Ejemplos de uso
En el ejemplo siguiente se recupera e imprime el índice de tabla para la instancia de mgmt_junos
enrutamiento y una instancia foo
de enrutamiento no definida.
user@host> show route forwarding-table extensive table mgmt_junos Routing table: mgmt_junos.inet [Index 36738] Internet: ... Routing table: mgmt_junos.inet6 [Index 36738] Internet6: ...
[vrf:none] user@host:~# cat libpyvrf-get-table-id.py import libpyvrf as vrf try: print (vrf.get_table_id("mgmt_junos")) print (vrf.get_table_id("foo")) except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
El script devuelve el índice de tabla para la mgmt_junos
instancia y devuelve -1 para la instancia no definida.
[vrf:none] user@host:~# python3 libpyvrf-get-table-id.py 36738 -1
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función get_task_vrf()
Sintaxis
vrf_name get_task_vrf(tid)
Descripción
Devuelva la instancia de enrutamiento de Junos OS asociada con el ID de proceso especificado.
Parámetros
tid |
ID de proceso para el que recuperar la instancia de enrutamiento asociada. |
Valor devuelto
vrf_name | Nombre de la instancia de enrutamiento asociada con el ID de proceso. |
Ejemplos de uso
En el ejemplo siguiente, se recupera el ID de proceso del proceso actual y se asocia la instancia de mgmt_junos
enrutamiento con ese proceso. Cuando la secuencia de comandos llama a la get_task_vrf()
función para solicitar la instancia de enrutamiento para ese ID de proceso, devuelve la instancia de mgmt_junos
enrutamiento.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función en desuso en Junos OS versión Evolved 22.1R1.
Función get_vrf()
Sintaxis
vrf_name get_vrf()
Descripción
Devuelva la instancia de enrutamiento de Junos OS asociada con el proceso actual.
Valor devuelto
vrf_name |
Nombre de la instancia de enrutamiento asociada con el proceso actual. |
Ejemplos de uso
En el ejemplo siguiente, se asocia la instancia de mgmt_junos
enrutamiento con el proceso actual. Cuando la secuencia de comandos llama a la get_vrf()
función para solicitar la instancia de enrutamiento para el proceso actual, devuelve la instancia de mgmt_junos
enrutamiento.
[vrf:none] user@host:~# cat libpyvrf-set-vrf.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función set_socket_vrf()
Sintaxis
set_socket_vrf(socket_fd, vrf_name)
Descripción
Establezca la instancia de enrutamiento utilizada por el socket especificado. Establecer la instancia de enrutamiento para un socket es útil cuando varios sockets dentro de la misma aplicación necesitan usar distintas instancias de enrutamiento. Puede establecer el contexto de instancia de enrutamiento para cada socket de forma individual sin afectar el contexto de la instancia de enrutamiento para el proceso o la aplicación.
Parámetros
socket_fd |
Descriptor de archivo del socket. |
vrf_name |
Nombre de una instancia de enrutamiento de Junos OS.
|
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función set_task_vrf()
Sintaxis
set_task_vrf(tid, vrf_name)
Descripción
Establezca la instancia de enrutamiento que el proceso con el ID de proceso especificado usará para realizar operaciones.
Mientras que set_vrf()
establece la instancia de enrutamiento para el proceso actual, set_task_vrf()
establece la instancia de enrutamiento para el proceso con el ID de proceso especificado.
Parámetros
tid |
ID de proceso para el proceso que usará la instancia de enrutamiento especificada. |
vrf_name |
Nombre de una instancia de enrutamiento de Junos OS.
|
Ejemplos de uso
La siguiente secuencia de comandos de Python de ejemplo recupera el ID de proceso para el proceso actual y asocia la instancia de mgmt_junos
enrutamiento con ese proceso. A continuación, la secuencia de comandos hace ping a un host al que solo se puede acceder a través de esa instancia de enrutamiento.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.
Función en desuso en Junos OS versión Evolved 22.1R1.
Función set_vrf()
Sintaxis
set_vrf(vrf_name)
Descripción
Establezca la instancia de enrutamiento que usará el proceso actual para realizar operaciones. Las búsquedas futuras usarán esta instancia de enrutamiento.
Para asociar una instancia de enrutamiento a un proceso específico en lugar del proceso actual, utilice la set_task_vrf()
función.
Parámetros
vrf_name |
Nombre de una instancia de enrutamiento de Junos OS.
|
Ejemplos de uso
La siguiente secuencia de comandos de Python de ejemplo asocia la instancia de mgmt_junos
enrutamiento con el proceso actual. A continuación, la secuencia de comandos hace ping a un host al que solo se puede acceder a través de esa instancia de enrutamiento.
import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Información de la versión
Función introducida en Junos OS versión Evolved 20.3R1.