Acabei de ler um livro sobre PF (The Book Of PF, No Starch), mas há uma pergunta não respondida por ele.
Se eu tiver uma máquina de gateway usando duas interfaces, $ int_if e $ ext_if, e eu NAT os pacotes provenientes de $ int_if: net (que é, digamos, 10.0.0.0/24) para $ ext_if usando match
, quando o NAT for aplicado ? Antes ou depois das regras de filtragem?
Exemplo:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23
Isso funciona? Ou obtém o IP de origem de um pacote vindo de 10.0.0.23 NATed para o endereço $ ext_if antes da verificação se é de 10.0.0.23 avaliada?
Acho que esse diagrama não é útil para responder a essa pergunta, mas é interessante: [ http://www.benzedrine.cx/pf_flow.png ]
Se você ler as Perguntas frequentes sobre o PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], especialmente a seção "Configurando o NAT", você encontrará estas frases:
Quando um pacote é selecionado por uma regra de correspondência, os parâmetros (por exemplo, nat-to) nessa regra são lembrados e aplicados ao pacote quando uma regra de aprovação correspondente ao pacote é atingida. Isso permite que toda uma classe de pacotes seja manipulada por uma única regra de correspondência e, em seguida, decisões específicas sobre a possibilidade de permitir o tráfego com regras de bloqueio e aprovação.
Eu acho que soa como se não fosse o que afirmei no parágrafo acima; portanto, o IP de origem é "lembrado" até que haja uma decisão sobre a ação a ser feita com o pacote. Se a decisão for tomada, o NATting será aplicado.
O que você acha?
PS: Esta é uma questão bastante teórica. Se você for um pouco pragmático, faça o seguinte:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23
Portanto, a block
regra já é aplicada quando o pacote chega em $ int_if.
EDIT: Outra possibilidade é, obviamente, decidir antes do NAT:
pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
Se um pacote de 0,23 chegar, ele primeiro corresponderá à primeira regra, depois corresponderá à segunda regra e à terceira "regra". Mas como a segunda regra é a última decisão sobre aprovação / bloqueio, o pacote é bloqueado. Direita?
quick
palavra - chave, mas não gosto muito - sempre tento usar a ordem de avaliação do pf;) Aliás, encontrei a resposta na página de perguntas frequentes do OpenBSD: "O NAT é especificado como um parâmetro nat-to opcional para uma regra de passagem de saída. Muitas vezes, em vez de ser definida diretamente na regra de aprovação, é usada uma regra de correspondência.Quando um pacote é selecionado por uma regra de correspondência, os parâmetros (por exemplo, nat-to) nessa regra são lembrados e aplicados ao pacote quando uma regra de aprovação correspondente ao pacote for atingida. " Então, meu conjunto de regras não causaria qualquer problema e bloquear corretamente .23