Exemplo: Adicionar uma final e depois aceitar um termo em um firewall
Este exemplo de script de confirmação adiciona uma then accept
declaração a qualquer filtro de firewall que ainda não termine com uma declaração explícita then accept
.
Requisitos
Este exemplo usa um dispositivo que executa o Junos OS.
Visão geral e script de compromisso
Cada filtro de firewall no Junos OS tem uma ação de descarte implícita no final do filtro, o que equivale ao seguinte termo de filtro explícito:
term implicit-rule { then discard; }
Como resultado, se um pacote não corresponde a nenhum dos termos no filtro, ele é descartado. Em alguns casos, você pode querer substituir o padrão adicionando um último termo para aceitar todos os pacotes que não correspondam à série de condições de correspondência de um filtro de firewall. Neste exemplo, o script de confirmação adiciona uma declaração final then accept
a qualquer filtro de firewall que ainda não termine com uma declaração explícita then accept
.
O script de exemplo é mostrado tanto na sintaxe XSLT quanto na sintaxe SLAX:
Sintaxe 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>
Sintaxe 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>; } } } } } }
Configuração
Procedimento
Procedimento passo a passo
Baixar, habilitar e testar o script:
Copie o script em um arquivo de texto, nomeie o arquivo add-accept.xsl ou add-accept.slax conforme apropriado, e copie-o para o /var/db/scripts/commit/ directory no dispositivo.
Selecione as seguintes estrofes de configuração de teste e pressione Ctrl+c para copiá-las na prancheta.
Se você estiver usando a versão SLAX do script, altere o nome de arquivo no nível de
[edit system scripts commit file]
hierarquia para 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; } } } }
No modo de configuração, emita o
load merge terminal
comando para mesclar as estrofes na configuração do seu dispositivo.[edit] user@host# load merge terminal [Type ^D at a new line to end input] ... Paste the contents of the clipboard here ...
No prompt, cole o conteúdo da prancheta usando o mouse e o ícone da pasta.
Pressione insira.
Pressione Ctrl+d.
Confirmar a configuração.
user@host# commit
Verificação
Verificando a configuração
Propósito
Verifique se o script se comportará como esperado.
Ação
Analise a saída do commit
comando. O script exige que todos os filtros de firewall terminem com uma declaração explícita then accept
. As estrofes de configuração de amostra incluem o test
filtro com dois termos, mas não incluem uma declaração explícita then accept
. Quando você emite o commit
comando, o script adiciona a declaração ausente then accept
e confirma a configuração. Quando você emite o commit
comando, a saída a seguir aparece:
[edit] user@host# commit [edit firewall family inet filter test] warning: filter is missing final 'then accept' rule commit complete
No modo de configuração, emita o show firewall
comando para revisar a configuração modificada. A saída a seguir aparece:
[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 */ } } }