Je viens de lire un livre sur PF (The Book Of PF, No Starch), mais il n'y a pas de question sans réponse.
Si j'ai une machine passerelle utilisant deux interfaces, $ int_if et $ ext_if, et que je NAT les packages provenant de $ int_if: net (qui est, disons, 10.0.0.0/24) à $ ext_if en utilisant match
, quand obtient le NAT appliqué ? Avant ou après les règles de filtrage?
Exemple:
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
Est-ce que ça marche? Ou obtient l'IP source d'un paquet provenant de 10.0.0.23 NATed à l'adresse de $ ext_if avant que la vérification de sa provenance de 10.0.0.23 ne soit évaluée?
Ce schéma n'est pas utile pour répondre à cette question, je pense, mais il est néanmoins intéressant: [ http://www.benzedrine.cx/pf_flow.png ]
Si vous lisez la FAQ PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], en particulier la section "Configurer NAT", vous rencontrerez ces phrases:
Lorsqu'un paquet est sélectionné par une règle de correspondance, les paramètres (par exemple nat-to) de cette règle sont mémorisés et sont appliqués au paquet lorsqu'une règle de passage correspondant au paquet est atteinte. Cela permet à une classe entière de paquets d'être gérée par une seule règle de correspondance, puis des décisions spécifiques sur l'autorisation du trafic peuvent être prises avec des règles de blocage et de passage.
Je pense que cela ne semble pas être comme je l'ai dit dans le paragraphe ci-dessus, donc l'IP source est "mémorisée" jusqu'à ce qu'il y ait une décision sur l'action à faire avec le paquet. Si la décision est prise, le NATting est appliqué.
Qu'est-ce que tu penses?
PS: C'est une question assez théorique. Si vous êtes un peu pragmatique, vous le ferez de cette façon:
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
La block
règle est donc déjà appliquée lorsque le paquet arrive sur $ int_if.
EDIT: Une autre possibilité est, bien sûr, de décider avant 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)
Si un paquet de .23 arrive, il correspond d'abord à la première règle, puis à la deuxième règle et à la troisième "règle". Mais comme la deuxième règle est la dernière à décider de passer / bloquer, le paquet est bloqué. Droite?
quick
mot - clé mais je ne l'aime pas vraiment - j'essaie toujours d'utiliser l'ordre d'évaluation de pf;) Btw, j'ai trouvé la réponse sur une page FAQ d'OpenBSD: "NAT est spécifié comme paramètre nat-to optionnel pour une règle de passage sortant. Souvent, plutôt que d'être définie directement sur la règle de passage, une règle de correspondance est utilisée. Lorsqu'un paquet est sélectionné par une règle de correspondance, les paramètres (par exemple, nat-to) de cette règle sont mémorisés et sont appliqués à la paquet lorsqu'une règle de passage correspondant au paquet est atteinte. ". Donc mon jeu de règles ne causerait aucun problème et bloquerait correctement .23