[OpenBSD]

[Anterior: Grupos de Endereços e Balanceamento de Carga] [Conteúdo] [Próximo: Registro de Dados]

PF: Marcação de Pacotes (Filtragem por Política)


Conteúdo


Introdução

Marcação de pacotes é uma forma de colocar um identificador interno que pode ser usado mais tarde como critério em regras de filtragem ou tradução. Com a marcação é possível fazer coisas como criar "relações de confiança" entre interfaces e determinar se pacotes foram processados por regras de tradução. Também é possível sair do esquema de filtragem baseado em regras e partir para a filtragem baseada em política.

Atribuição de Etiquetas a Pacotes

Para adicionar uma etiqueta a um pacote, use a palavra-chave tag:
pass in on $int_if all tag INTERNAL_NET keep state

A etiqueta INTERNAL_NET será adicionada a qualquer pacote que corresponda à regra acima.

Uma etiqueta também pode ser atribuída usando-se uma macro. Por exemplo:

name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state

Existe um conjunto de macros predefinidas que também podem ser usadas.

Essas macros são expandidas em tempo de carregamento do conjunto de regras, e NÃO em tempo de execução.

A marcação segue as seguintes regras:

Tomemos o seguinte conjunto de regras como exemplo.

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
        INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

Além de aplicar etiquetas com regras de filtragem, as regras de nat, rdr e binat também podem aplicar etiquetas em pacotes utilizando a palavra-chave tag.

Verificação de Etiquetas Aplicadas

Para verificar por etiquetas aplicadas previamente, utilize a palavra-chave tagged:
pass out on $ext_if tagged INT_NET keep state

Pacotes saindo pela interface $ext_if devem estar marcados com a etiqueta INT_NET para corresponder à regra acima. O inverso também pode ser feito utilizando o operador ! para corresponder a pacotes que não estiverem marcados.

pass out on $ext_if ! tagged WIFI_NET keep state

Regras de tradução (nat/rdr/binat) também podem usar a palavra-chave tagged para corresponder a pacotes.

Filtragem por Política

Filtragem por política é uma forma diferente de se escrever um conjunto de regras de filtragem. Uma política é definida, a qual configura as regras para quais tipos de tráfego são permitidos e quais tipos são bloqueados. Os pacotes são então classificados, baseando-se no critério tradicional de endereço IP/porta de origem/destino, protocolo, etc. Por exemplo, veja a seguinte política de firewall:

Perceba a forma como a política cobre todo o tráfego que passa pelo firewall. A palavra entre parêntesis indica qual etiqueta será usada para cada item na política.

Agora devem ser definidas regras de filtragem e tradução para classificar os pacotes na política.

rdr on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state

Agora as regras que definem a política são configuradas.

pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

Agora que todo o conjunto de regras está pronto, fazer alterações no firewall é uma questão de modificar as regras de classificação de pacotes. Por exemplo, se for adicionado um servidor POP3/SMTP na DMZ, será necessário adicionar regras de classificação para tráfego POP3 e SMTP, desta forma:

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
   tag INET_DMZ keep state

Tráfego de correio eletrônico será aceito como parte da entrada de política INET_DMZ.

O conjunto de regras completo:
# Macros
int_if  = "dc0"
dmz_if  = "dc1"
ext_if  = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"

table <spamd> persist file "/etc/spammers"

# Classificação -- classifica pacotes com base na política
# do firewall.
rdr on $ext_if proto tcp from <spamd> to port smtp \
    tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
    tag INET_DMZ keep state

# Aplicação da política -- permite/bloqueia com base na política
# do firewall.
pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

Marcação de Quadros Ethernet

A marcação pode ser feita a nível Ethernet caso a máquina que realiza marcação/filtragem esteja também agindo como bridge(4). Ao criar regras de filtragem de bridge(4) que usem a palavra-chave tag, o PF pode filtrar com base no endereço MAC de origem ou destino. Regras bridge(4) são criadas usando o comando brconfig(8). Exemplo:
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1

E então no pf.conf:

pass in on fxp0 tagged USER1

[Anterior: Grupos de Endereços e Balanceamento de Carga] [Conteúdo] [Próximo: Registro de Dados]


[voltar] www@openbsd.org
$OpenBSD: tagging.html,v 1.14 2009/10/19 09:39:59 ajacoutot Exp $