"Scrubbing" é o processo de normalização de
pacotes, para que não haja ambiguidades na
interpretação pelo destino final do pacote. A diretiva
scrub também remonta pacotes fragmentados, protegendo alguns
sistemas operacionais de algumas formas de ataque, e descarta pacotes
TCP que possuam combinações de
flag inválidas.
Uma forma simples de uso da diretiva scrub:
scrub in all
É válida para todos pacotes chegando em todas interfaces.
Uma razão para não fazer scrub numa interface é
no caso de haver tráfego NFS atravessando-a. Algumas plataformas
não-OpenBSD enviam (e esperam) pacotes estranhos -- pacotes
fragmentados com o bit "do not fragment" marcado, que são
(devidamente) rejeitados pelo scrub. Isso pode ser resolvido
através do uso da opção no-df. Outra
razão é que alguns jogos multiplayer apresentam
problemas de conexão ao passar por um firewall PF com
scrub ativado. Fora estes casos, o uso de scrub em todos
pacotes é prática altamente recomendada.
A sintaxe da diretiva scrub é muito similar à
sintaxe das regras de filtragem, o que torna
fácil usar scrub de maneira seletiva em alguns tipos de pacotes
e outros não.
A palavra-chave no pode ser usada na frente de scrub
para especificar que pacotes não devem passar por scrub.
Assim como regras nat,
a primeira regra que casar vence.
Limpa o bit don't fragment no cabeçaho IP do pacote.
Alguns sistemas operacionais são conhecidos por gerar pacotes
fragmentados com o bit don't fragment setado. Isso é
particularmente verdadeiro no NFS. Scrub irá descartar
esses pacotes a não ser que a opção no-df
seja especificada. Pelo fato de alguns sistemas operacionais gerarem
pacotes don't fragment com campo de identificação
IP zero no cabeçalho, é recomendado o uso de
no-df em conjunto com random-id.
random-id
Substitui o campo de identificação IP de pacotes com
valores aleatórios para compensar sistemas operacionais que usam
valores previsíveis. Esta opção somente se aplica a
pacotes que não são fragmentados após a
reconstrução de pacotes opcional.
min-ttl num
Força um valor mínimo de Time To Live (TTL)
nos cabeçalhos de pacotes IP.
max-mss num
Força tamanho máximo para Maximum Segment
Size (MSS) nos cabeçalhos de pacotes TCP.
fragment reassemble
Armazena em buffer, pacotes fragmentados que chegam e os
reconstrói em pacotes completos antes de passa-los para o sistema
de filtragem.
A vantagem é que regras de filtragem devem lidar apenas com
pacotes completos, ignorando fragmentos. A desvantagem é o
aumento do uso de memória para armazenar os fragmentos. Este
é o comportamento padrão quando nenhuma
opção fragment for especificada. Esta
também é a única opção
fragment que funciona com NAT.
fragment crop
Descarta fragmentos duplicados e elimina
sobreposições.
Diferentemente de fragment reassemble, os fragmentos
não são armazenados em buffer, mas passados adiante assim
que chegam.
fragment drop-ovl
Similar a fragment crop
exceto que fragmentos duplicados e sobrepostos serão descartados
assim como quaisquer fragmentos subsequentes.
reassemble tcp
Normaliza conexões TCP dinamicamente.
Ao usar scrub reassemble tcp uma direção
(in/out) não deve ser especificada.
As seguintes normalizações são realizadas:
Nenhum lado da conexão pode reduzir seu TTL IP. Isso
é feito para proteger contra um atacante enviando pacotes
de forma que cheguem ao firewall, afetem a
informação de estado da conexão, e expire
antes de atingir o host de destino. O TTL de todos pacotes
é aumentado para o maior valor possível para a
conexão.
Modula timestamps TCP
RFC1323
em cabeçalhos de pacotes para um número
aleatório. Isso pode impedir um observador de deduzir a
quanto tempo a máquina está ligada ou saber
quantos hosts existem atrás de um gateway NAT.
Exemplos:
scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400
scrub in on fxp0 all no-df
scrub on fxp0 all reassemble tcp