Ejemplo: Agregar un final y, luego, aceptar términos a un firewall
Este ejemplo de script de confirmación agrega una then accept
instrucción a cualquier filtro de firewall que aún no termina con una instrucción explícita then accept
.
Requisitos
En este ejemplo, se usa un dispositivo que ejecuta Junos OS.
Descripción general y script de confirmación
Cada filtro de firewall en Junos OS tiene una acción de descarte implícito al final del filtro, que es equivalente al siguiente término de filtro explícito:
term implicit-rule { then discard; }
Como resultado, si un paquete no coincide con ninguno de los términos del filtro, se descarta. En algunos casos, es posible que desee invalidar el valor predeterminado agregando un último término para aceptar todos los paquetes que no coincidan con la serie de condiciones de coincidencia de un filtro de firewall. En este ejemplo, la secuencia de comandos de confirmación agrega una instrucción final then accept
a cualquier filtro de firewall que aún no termina con una instrucción explícita then accept
.
El script de ejemplo se muestra en la sintaxis XSLT y SLAX:
Sintaxis XSLT
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:apply-templates select="firewall/filter | firewall/family/inet | firewall/family/inet6" mode="filter"/> </xsl:template> <xsl:template match="filter" mode="filter"> <xsl:param name="last" select="term[position() = last()]"/> <xsl:comment> <xsl:text>Found </xsl:text> <xsl:value-of select="name"/> <xsl:text>; last </xsl:text> <xsl:value-of select="$last/name"/> </xsl:comment> <xsl:if test="$last and ($last/from or $last/to or not($last/then/accept))"> <xnm:warning> <xsl:call-template name="jcs:edit-path"/> <message> <xsl:text>filter is missing final 'then accept' rule</xsl:text> </message> </xnm:warning> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="content"> <term> <name>very-last</name> <junos:comment> <xsl:text>This term was added by a commit script</xsl:text> </junos:comment> <then> <accept/> </then> </term> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
Sintaxis SLAX
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match configuration { apply-templates firewall/filter | firewall/family/inet | firewall/family/inet6 { mode "filter"; } } match filter { mode "filter"; param $last = term[position() = last()]; <xsl:comment> { expr "Found "; expr name; expr "; last "; expr $last/name; } if ($last and ($last/from or $last/to or not($last/then/accept))) { <xnm:warning> { call jcs:edit-path(); <message> "filter is missing final 'then accept' rule"; } call jcs:emit-change() { with $content = { <term> { <name> "very-last"; <junos:comment> "This term was added by a commit script"; <then> { <accept>; } } } } } }
Configuración
Procedimiento
Procedimiento paso a paso
Para descargar, habilitar y probar el script:
Copie el script en un archivo de texto, asigne un nombre al archivo add-accept.xsl o add-accept.slax según corresponda, y cópielo en el directorio /var/db/scripts/commit/ del dispositivo.
Seleccione las siguientes estrofas de configuración de prueba y presione Ctrl + c para copiarlas en el portapapeles.
Si utiliza la versión SLAX del script, cambie el nombre de archivo en el
[edit system scripts commit file]
nivel jerárquico a add-accept.slax.system { scripts { commit { file add-accept.xsl; } } } firewall { policer sgt-friday { if-exceeding { bandwidth-percent 10; burst-size-limit 250k; } then discard; } family inet { filter test { term one { from { interface t1-0/0/0; } then { count ten-network; discard; } } term two { from { forwarding-class assured-forwarding; } then discard; } } } } interfaces { t1-0/0/0 { unit 0 { family inet { policer output sgt-friday; filter input test; } } } }
En el modo de configuración, emita el
load merge terminal
comando para combinar las estrofas en la configuración del dispositivo.[edit] user@host# load merge terminal [Type ^D at a new line to end input] ... Paste the contents of the clipboard here ...
En el indicador, pegue el contenido del portapapeles con el ratón y el icono de pegar.
Presione Intro.
Presione Ctrl + d.
Confirme la configuración.
user@host# commit
Verificación
Verificar la configuración
Propósito
Compruebe que la secuencia de comandos se comporte como se esperaba.
Acción
Revise el resultado del commit
comando. El script requiere que todos los filtros de firewall acaben con una instrucción explícita then accept
. Las estrofas de configuración de ejemplo incluyen el test
filtro con dos términos, pero no incluyen una instrucción explícita then accept
. Cuando se emite el commit
comando, el script agrega la instrucción que falta y then accept
confirma la configuración. Cuando se emite el commit
comando, aparece el siguiente resultado:
[edit] user@host# commit [edit firewall family inet filter test] warning: filter is missing final 'then accept' rule commit complete
En el modo de configuración, emita el show firewall
comando para revisar la configuración modificada. Aparecerá el siguiente resultado:
[edit] user@host# show firewall policer sgt-friday { if-exceeding { bandwidth-percent 10; burst-size-limit 250k; } then discard; } family inet { filter test { term one { from { interface t1-0/0/0; } then { count ten-network; discard; } } term two { from { forwarding-class assured-forwarding; } then { discard; } } term very-last { then accept; /* This term was added by a commit script */ } } }