[OpenBSD]

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

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 mais tarde usado para filtrar ou traduzir com base em algum critério. Com marcação, é possível fazer coisas como criar "relações de confiança" entre interfaces e determinar se pacotes devem ou não ser processados por regras de tradução. Também é possível sair do esquema de filtragem baseado em regras e partir para filtragem baseada em política.

Marcando Pacotes

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

A marca INTERNAL_NET será adicionada a qualquer pacote que case com a regra acima.

Uma marca também pode ser colocada usando-se uma macro. Por exemplo:

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

Existem algumas macros predefinidas que também podem ser usadas.

Estas macros são expandidas em tempo de carregamento das regras e NÃO em tempo de execução.

A marcação segue as seguintes regras:

Tomemos as seguintes 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 marcação com regras de filtragem, regras de nat, rdr e binat também podem marcar pacotes utilizando a palavra-chave tag.

Verificando Pacotes Marcados

Para procurar por pacotes previamente marcados 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 INT_NET para combinar com a regra acima. O inverso também pode ser feito utilizando o operador ! para casar com pacotes que não estiverem marcados.

pass out on $ext_if ! tagged WIFI_NET keep state

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

Filtragem por Política

Filtragem por Política é uma forma diferente de se escrever regras. Uma política é definida a qual configura um conjunto de 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 de origem/destino endereço/porta, 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ênteses indica qual marca 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 criadas.

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 todas regras estão prontas, 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 email será aceito como parte da política INET_DMZ.

O conjunto completo de regras:

# 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

Marcando Frames Ethernet

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). Criando regras de filtragem 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 no pf.conf:

pass in on fxp0 tagged USER1

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


[voltar] www@openbsd.org
$OpenBSD: tagging.html,v 1.10 2007/06/20 09:29:47 jufi Exp $