[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

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
(2) pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
(3) pass in quick on $int_if from 192.168.1.5

Verificação de Etiquetas Aplicadas

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

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

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 para classificar os pacotes na política.

block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025

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

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

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

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.
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025
# Aplicação da política -- permite/bloqueia com base na política # do firewall. pass in quick on $ext_if tagged SPAMD pass out quick on $ext_if tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ

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 ifconfig(8). Exemplo:
# ifconfig 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.16 2011/02/07 07:39:59 ajacoutot Exp $