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 terminalcomando 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 */
}
}
}