ON THIS PAGE
Cómo actualizar automáticamente las listas de prefijos
A lo largo de este libro ha trabajado ampliamente con listas de prefijos. Una lista de prefijos contiene una o varias correcciones previas que se pueden usar en las directivas de enrutamiento. Cuando se crea una red, normalmente se inicia con listas de prefijos creadas manualmente y que se actualizan manualmente. Su propio conjunto de prefijos (los que deberá originar) no’cambia con frecuencia; de todos modos, acepta todo, desde los proveedores de tránsito, cuando no tiene muchos interlocutores o clientes, tampoco hay muchos cambios en sus listas de prefijos. Todos’hemos estado ahí.
Sin embargo, a medida que la red y la base de clientes crecen, no es factible mantener manualmente las listas de prefijos. En este apéndice, le mostraremos cómo usamos la funcionalidad NETCONF de Junos OS, junto con algunas secuencias de comandos de Python, para cargar automáticamente los cambios de lista de prefijos.
Este apéndice es un poco diferente al resto del libro, ya que no podemos ofrecer secuencias de comandos que pueda cortar y pegar en su sistema de administración de red’. En su lugar, le mostramos cómo lo hacemos y cómo le invitamos a hablar con su equipo de desarrollo de software, alentarles para que sean entusiastas de su nueva tabla de enrutamiento seguro y que implementen cambios de lista de prefijos automáticos en su red.
Existen tres pasos básicos:
Asegúrese de que, para cada cliente, su base de datos de clientes contenga el AS-SET (o el número) que sus clientes anuncien a usted.
Recupere la lista de prefijos para ese valor tal y como está establecido a partir del TIR.
Cargue la lista de prefijos en sus enrutadores.
Hacerlo periódicamente (por ejemplo, dos veces al día) significa que no’tendrá que preocuparse por los clientes que deseen cambiar su lista de prefijos. No tienen que crear tickets que le pidan que cambie su lista de prefijos y qué’más s: Esto significa que no’tendrá que tratar estos vales más.
Base de datos de clientes
La base de datos debe contener al menos dos campos para cada cliente:
Su número AS (lo utilizaremos en el nombre de la lista de prefijos a medida que se cargue en el enrutador).
Sus.
Su cliente habrá creado su propio como establecido en
el TIR. Cuando conecte su cliente al trabajo de red, comprobará
si su conjunto de AS tiene sentido. Debe contener el número
AS que utilizan en su propia red (desde el que anunciarán sus
propios prefijos), así como los números de AS y/o los
de sus clientes. Al recorrer este “árbol”, el bgpq3
herramienta creará una lista de prefijos
única que contraerá todos los prefijos que pueda anunciar
el cliente.
Recuperar lista de prefijos: Utilice bgpq3
La herramienta para convertir los valores como definido en listas
de prefijo es bgpq3
. El sitio web oficial
de bgpq3 está en el https://github.com/SNAr/bgpq3 donde se le invita a leer, aprender y contribuir. Después
de instalar bgpq3 en un equipo, puede usarlo para crear listas de
prefijos como las que se indican a continuación:
Y para IPv6:
Utilice bgpq3
, cree un archivo. txt
en el directorio prefix-list.d/
para cada
uno de los conjuntos que desea actualizar automáticamente.
El archivo. txt debe tener el nombre de la lista de prefijos tal y
como desea que se inserte en el enrutador; y el contenido debe ser
un prefijo por línea. La creación de una secuencia de
comandos que lo hace periódicamente se deja como un ejercicio
para el lector.
Cargar en el enrutador
El Junos OS admite varias maneras de cargar información externa en la base de datos de configuración. Dado que se trata de un apéndice, no es exhaustivo y no ofrece una configuración predefinida y verificada en terreno. Aquí solo se proporciona un ejemplo. En el ejemplo, la interfaz NETCONF de Junos OS se utiliza para cargar información. En este ejemplo se utiliza específicamente el lenguaje Python 3 y la biblioteca Junos PyEZ creada y mantenida por Juniper Networks. Tenga en cuenta que PyEZ también puede usarse con Python 2,7 si es preferible.
Consulte el día uno PyEZ libros: https://www.Juniper.net/US/en/Training/jnbooks/día-uno/Automation-series/Junos-pyez-Cookbook/.
En este ejemplo, se utiliza un dispositivo Juniper ficticio como destino de configuración. Sin embargo, el ejemplo debería funcionar en cualquiera de los Junos OS dispositivos que utilizan listas de prefijos del mismo modo. Nuestro requisito es actualizar la lista de prefijos IP presentes en la lista de prefijos basándose en el contenido de un archivo de texto. La secuencia de comandos que va a Accom Plish se ejecuta desde un host remoto.
Aplicables
Para el dispositivo Junos OS:
Tener el subsistema SSH de NETCONF (consulte: https://www.juniper.net/documentation/en_US/junos/topics/topic-Map/netconf-ssh-Connection.html) habilitado a través de:
N.º
set system services netconf ssh
Permitir acceso desde el servidor remoto en el puerto NETCONF (predeterminado: 830)
Para el servidor remoto:
Tener instalado Python 3,5
(alternativamente, utilice Python 2 y ajuste la sintaxis según corresponda en el código a continuación)
Ha instalado Junos PyEZ (consulte: https://github.com/Juniper/py-Junos-eznc), por ejemplo, a través de:
N.º
pip install junos-eznc
Código de ejemplo
El siguiente código de Python 3 busca archivos *. txt
en un directorio llamado prefix-list.d
dentro
del directorio principal de la propia secuencia de comandos. Cada
uno de estos archivos representa una lista de prefijos para actualizar
y debe contener prefijos, uno por línea, del que debería
estar compuesto la lista de prefijos. Las líneas y líneas
vacías que comienzan con el símbolo (#) se pasan por
alto. El nombre del archivo (excluido el sufijo de extensión)
se utiliza como nombre de la lista de prefijos.
Actualice las variables de configuración HOST, usuario y pase a la parte superior de la secuencia de comandos para que coincida con su configuración. Consulte los comentarios de la secuencia de comandos para obtener una explicación más detallada:
<code> from pathlib import Path from jnpr import junos from jnpr.junos.utils.config import Config from lxml import etree as ET HOST = 'mx0.example.com' USER = 'automation' PASS = 'secret' # Prefix lists to update. # Dictionary of {name -> list of prefixes}. prefix_lists = {} # Find files matching 'prefix-list.d/*.txt' # relative to the parent directory of the script. CONF_DIR = Path( file ).parent / 'prefix-list.d' for f in CONF_DIR.glob('*.txt'): with f.open('r', encoding='utf-8') as fp: # Use the file basename ('stem') as the prefix list name; # read, split & trim lines, exclude comments ('#') and empty. lines = [x.strip() for x in fp.read().splitlines()] prefix_lists[f.stem] = [x for x in lines if x and not x.startswith('#')] # Connect to configuration target. # Note: should use agent auth if PASS is None. print('Connect to [%s]...' % HOST) with junos.Device(host=HOST, user=USER, passwd=PASS) as device: # Open configuration; use private mode to avoid # committing existing shared candidate configuration. print('Open private configuration...') with Config(device, mode='private') as config: # Merge XML config for each prefix list. for name, prefixes in prefix_lists.items(): # Generate an XML configuration with the following structure: """ <configuration> <policy-options> <prefix-list replace="replace"> <name>{name}</name> <prefix-list-item> <name>x.x.x.x/n</name> </prefix-list-item> (...) </prefix-list> </policy-options> </configuration> """ patch = ET.Element('configuration') policy_options = ET.SubElement(patch, 'policy-options') # Note: replace entire prefix-list to remove extraneous entries. prefix_list = ET.SubElement(policy_options, 'prefix-list', replace='replace') ET.SubElement(prefix_list, 'name').text = name for prefix in prefixes: item = ET.SubElement(prefix_list, 'prefix-list-item') ET.SubElement(item, 'name').text = prefix print('\nUpdate prefix list [%s] with [%d] entries:' % (name, len(prefixes))) print('---\n' + ET.tounicode(patch, pretty_print=True) + '---') config.load(patch) print('\nUpdated [%d] prefix lists; config diff:' % len(prefix_lists)) print('---\n' + config.diff() + '---') while True: choice = input('\nDo you want to commit these changes? [y/n] ').lower() if choice in ('y', 'yes'): print('Committing changes...') config.commit() print('Commit successful!') break elif choice in ('n', 'no'): print('Changes not committed.') break </code>
Es probable que este código no sea un corte y pegado en su propio sistema de administración de red, pero debe defi nitely empezar a trabajar y estar listo para los cambios automatizados con la lista de prefijos.
El siguiente paso: Utilice el mismo mecanismo para filtrar los elementos del mismo nivel
Los desarrolladores están escribiendo software de una creatividad y los ingenieros de redes lo utilizan de una vez más.
Basándose en el trabajo descrito, no solo crea listas
de prefijos para filtrar a los clientes, puede usar el mismo mecanismo
para filtrar también sus homólogos; simplemente cree
un ‘pseudo cliente’ en su sistema de administración
de red, anote el como conjunto que debe anunciar el interlocutor y,
a continuación, puede hacer referencia a la prefix-list
en la Directiva de BGP de ese homólogo.
De esta forma, puede estar seguro de que sus clientes, así como sus colegas, tienen un grado de seguridad en las precorrecciones que se les permite anunciar.