vamos a configurar pf en unos cuantos pasos
preparen su pf.conf temporal para trabajar en ese y no regarla en el principal
para validar que las reglas de PF esten bien escritas, pero sin cargarlas al sistema, se ejecuta lo siguiente:
$ pfctl -n -f myarchivopf.conf
ahora, en las primeras lineas deben de escribirse variables que se usaran en las reglas
para nuestro proposito, tendriamos solo 2 variables; una llamada red_internet y la otra red_lan
en esas apuntariamos el nombre de dispositivo de nuestras tarjetas de red: rl0, em0, vr0 o como se llame
en red_internet pondriamos el dispotivo de red que esta conectado hacia la Internet
para nuestro ejemplo pondremos la vr0
en red_lan pondriamos el dispositivo de red que esta conectado a nuestra red local
para nuestro ejemplo podremos la rl0
entonces, en nuestro pf.conf quedaria asi:
red_internet=”vr0″
red_lan=”rl0″
como todos sabemos, en UNIX existe el dispositivo loopback o lo0 que siempre apunta la IP 127.0.0.1; este es indispensable para que los procesos de nuestra maquina se comuniquen entre ellos
entonces, nuestro dispositivo lo0 no debe de estar regido por las reglas del firewall; entonces le diremos a PF que ignore y no ande chingando a nuestro loopback
entonces, la siguiente regla seria:
set skip on lo0
la primera regla de seguridad de un firewall, es que se bloqueen todo paquete que vaya entrar que este corrupto
todo paquete entrante incompleto o corrupto, que lo bloquee nuestro firewall
los paquetes extraños podrian ser algun xploit o vulnerabilidad que pueda afectar al firewall
ahora nuestra politica de filtrado en firewall seria: “bloquea TODOS los paquetes entrantes, y luego, deja pasar unicamente los que te vamos a permitir que pases”
para bloquear toda conexion entrante, nuestra siguiente regla en pf.conf seria:
block in all
no vayan a activar su pf.conf porque se van a desconectar de la red eh
ahora, como queremos que nuestras maquinas en la LAN se puedan comunicar entre estas y tambien el firewall pueda comunicarse con estas; vamos a abrir las conexiones de nuestra LAN
para eso, nuestra siguiente instruccion en nuestro pf seria:
pass quick on $red_lan
recuerden que $red_lan es un llamado de nuestra variable que apunta a nuestro dispositivo de red que esta conectado a la red local
nuestras siguientes reglas; seria, el redirigir las conexiones de entrada a nuestro servidor web
nuestra regla seria: redirige las conexiones entrantes de nuestra tarjeta de red de Internet que provengan de cualquier direccion que pidan el puerto 80 (www) y que las mande a tal IP
entonces, en nuestro pf pondriamos:
rdr on $red_internet proto tcp from any to any port www -> 200.33.45.111 port www
esa es una opcion
la otra forma de ponerla seria:
rdr on $red_internet proto tcp from any to any port 80 -> 200.33.45.111
la ultima que acabo de poner, por logica, dice que las conexiones entrantes por el puerto 80 se las mande a 200.33.45.111; la maquina de esa IP sabe que es una peticion al puerto 80
la del servidor NetBSD que se supone tiene una IP publica asignada
si el firewall y el servidor es el mismo equipo; entonces no seria necesario redirigir
para el caso que, en vez de rdr seria
pass in quick on $red_internet proto tcp from any to port www
ahora, podriamos tener el caso de que nuestro Firewall tenga la IP publica, pero que nuestro servidor web esta en un equipo dentro de nuestra red local; la regla seria:
rdr on $red_internet proto tcp from any to 200.33.45.111 port www -> 192.168.1.4 port www
ahora viene la regla que usaremos para nuestro caso de 2 servidores Web detras de un firewall
suponemos que nuestro servidor NetBSD es 200.33.45.111 y nuestro servidor Debian es 200.33.45.20
serian 2 reglas de redireccion, en nuestro pf.conf estaria asi:
rdr on $red_internet proto tcp from any to 200.33.45.111 port www -> 200.33.45.111 port www
rdr on $red_internet proto tcp from any to 200.33.45.20 port www -> 200.33.45.20 port www
recordemos que en un paquete TCP, siempre vienen los datos del remitente y el destinatario; nuestro Firewall lee los datos del paquete, lee el destinatario y lo manda a donde le corresponde
ahora, hay que probar esas reglas en el firewall; para activar nuestras reglas, se usaria:
# pfctl -e -f mi_pf.conf
si hay broncas, la desactivamos con:
# pfctl -d
una vez que se vio que funciona; hay que activar en /etc/sysctl.conf:
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
y en nuestro /etc/rc.conf:
pf=YES
pf_rules=/etc/pf.conf
y listo ya tenemos funcionando nuestro PF
=============================================================================
especial thanks to Hokum