Acabei de ler um livro sobre PF (O Livro do PF, Sem Amido), mas há uma pergunta que não foi 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 (ou seja, 10.0.0.0/24) para $ ext_if usando match
, quando recebe o NAT 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 NAT para o endereço de $ ext_if antes do check se ele é de 10.0.0.23 é avaliado?
Esse diagrama não é útil para responder a essa pergunta, mas é interessante, no entanto: [ link ]
Se você ler a FAQ do PF NAT [ link ], especialmente a seção "Configurando o NAT", você vai encontrar essas 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 é alcançada. Isso permite que uma classe inteira de pacotes seja manipulada por uma única regra de correspondência e, em seguida, decisões específicas sobre permitir ou não o tráfego podem ser feitas com as regras block e pass.
Eu acho que parece que não é como eu disse no parágrafo acima, então 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?
P.S .: Esta é uma questão bastante teórica. Se você é um pouco pragmático, você vai fazer assim:
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 regra block
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 .23 chegar, ele corresponderá primeiro à primeira regra, depois corresponderá à segunda e à terceira "regra". Mas como a segunda regra é a última decisão sobre a passagem / bloqueio, o pacote é bloqueado. Certo?