[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.
- $if - A interface
- $srcaddr - Endereço IP de origem
- $dstaddr - Endereço IP de destino
- $srcport - A especificação da porta de origem
- $dstport - A especificação da porta de destino
- $proto - O protocolo
- $nr - O número da regra
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:
- Etiquetas são "fixas". Uma vez marcado por uma regra, a etiqueta no
pacote não pode ser removida. Ela pode, contudo, ser substituída por
uma etiqueta diferente.
- Por causa da "fixação" da etiqueta, um pacote pode ter uma etiqueta
mesmo se a última regra correspondente não utilizar a
palavra-chave tag.
- Um pacote pode ter no máximo uma etiqueta por vez.
- Etiquetas são identificadores internos. Etiquetas não são
enviadas para outras máquinas.
- O nome de uma etiqueta pode ter no máximo 63 caracteres.
No OpenBSD 4.0 e versões anteriores, os nomes de etiquetas eram
limitados a 15 caracteres.
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
- Pacotes vindo pela interface $int_if serão marcados
com INT_NET pela regra número 1.
- Pacotes TCP vindo pela interface $int_if e com
destino a porta 80 serão primeiro marcados com
INT_NET pela regra número 1. Essa etiqueta é então
substituída por INT_NET_HTTP pela regra número 2.
- Pacotes vindo pela interface $int_if do IP
192.168.1.5 serão marcados de duas formas.
Se o pacote foi destinado à porta TCP 80, ele corresponde à regra
número 2 e será marcado com INT_NET_HTTP.
Caso contrário o pacote corresponde à regra número 3 e será
marcado com INT_NET.
Como o pacote corresponde à regra número 1, a
etiqueta INT_NET é aplicada e não é removida até que uma
regra subsequente correspondente especifique uma etiqueta (essa é a
"fixação" de uma etiqueta).
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:
- Tráfego vindo da LAN interna para a Internet é
permitido (LAN_INET) e deve ser traduzido (LAN_INET_NAT)
- Tráfego vindo da LAN interna para DMZ é permitido
(LAN_DMZ)
- Tráfego vindo da Internet para os servidores na DMZ é
permitido (INET_DMZ)
- Tráfego vindo da Internet e que está sendo redirecionado para o
spamd(8) é permitido (SPAMD)
- Qualquer outro tipo de tráfego é bloqueado
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]
www@openbsd.org
$OpenBSD: tagging.html,v 1.16 2011/02/07 07:39:59 ajacoutot Exp $