Acabo de leer un libro sobre PF (The Book Of PF, No Starch), pero hay una pregunta que no responde.
Si tengo una máquina de puerta de enlace que usa dos interfaces, $ int_if y $ ext_if, y hago NAT los paquetes que vienen de $ int_if: net (que es, digamos, 10.0.0.0/24) a $ ext_if usando match
, cuando se aplica el NAT ? ¿Antes o después de las reglas de filtrado?
Ejemplo:
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
¿Eso funciona? ¿O obtiene la IP de origen de un paquete que viene de 10.0.0.23 NATed a la dirección de $ ext_if antes de evaluar si se evalúa si es de 10.0.0.23?
Creo que este diagrama no es útil para responder a esta pregunta, pero es interesante, sin embargo: [ http://www.benzedrine.cx/pf_flow.png ]
Si lee las preguntas frecuentes de PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], especialmente la sección "Configuración de NAT", se encontrará con estas oraciones:
Cuando se selecciona un paquete mediante una regla de coincidencia, los parámetros (por ejemplo, nat-to) de esa regla se recuerdan y se aplican al paquete cuando se alcanza una regla de aprobación que coincide con el paquete. Esto permite que toda una clase de paquetes sea manejada por una sola regla de coincidencia y luego se pueden tomar decisiones específicas sobre si se debe permitir el tráfico con reglas de bloqueo y aprobación.
Creo que suena como si no fuera lo que dije en el párrafo anterior, por lo que la IP de origen se "recuerda" hasta que haya una decisión sobre la acción que se realizará con el paquete. Si se toma la decisión, se aplica el NATting.
¿Qué piensas?
PD: Esta es una pregunta bastante teórica. Si eres un poco pragmático, lo harás de esta manera:
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
Entonces, la block
regla ya se aplica cuando el paquete viene en $ int_if.
EDITAR: Otra posibilidad es, por supuesto, decidir antes de 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 llega un paquete de .23, primero coincide con la primera regla, luego coincide con la segunda regla y la tercera "regla". Pero como la segunda regla es la última que decide sobre pasar / bloquear, el paquete se bloquea. ¿Derecha?
quick
palabra clave, pero no me gusta, siempre trato de usar el orden de evaluación de pf;) Por cierto, encontré la respuesta en una página de preguntas frecuentes de OpenBSD: "NAT se especifica como un parámetro opcional nat-to para una regla de aprobación saliente. A menudo, en lugar de establecerse directamente en la regla de aprobación, se utiliza una regla de coincidencia. Cuando un paquete es seleccionado por una regla de coincidencia, los parámetros (por ejemplo, nat-to) de esa regla se recuerdan y se aplican a paquete cuando se alcanza una regla de aprobación que coincide con el paquete ". Entonces, mi conjunto de reglas no causaría ningún problema y bloquearía correctamente .23