2. Cortafuegos: filtrado y tuneles

Un cortafuegos permite filtrar tráfico que puede llegar o salir a un computador conectado a una red como Internet.

El siguiente ejemplo ejemplifica parte del archivo /etc/pf.conf para que permita toda conexión que salga de la red privada hacia Internet, y para que bloquee toda conexión que llegue excepto tráfico TCP por los puertos para ssh (22) y dns (53), también permite llegada de tráfico UDP por el puerto 53 y tráfico ICMP (para responder ping). Suponemos que ya se han configurado las variables int_if y ext_if con las interfaces de red interna y externa respectivamente:

servicios_tcp="{ssh,domain}
servicios_udp="{domain}"
servicios_icmp="echoreq"

block in log all
pass out keep state

pass quick on { lo $int_if }
antispoof quick for { lo $int_if }

pass in on $ext_if inet proto tcp from any to ($ext_if) \
        port $servicios_tcp keep state
pass in on $ext_if inet proto udp from any to ($ext_if) \
	        port $servicios_udp keep state
pass in inet proto icmp all icmp-type $servicios_icmp keep state

Si tiene un servidor interno (por ejemplo en una DMZ con IP 192.168.2.2) y necesita que este preste servicios visibles al exterior como: web (80), https (443), imaps (993), smtp (25) y ldap (389), deberá establecer un túnel para cada uno de estos puertos, de forma que las conexiones que lleguen al cortafuegos sean redirigidas al servidor interno. El siguiente ejemplo presenta como puede hacerse:

serv_ip="192.168.2.2"
servicios_serv="{ldap,smtp,www,https,imaps}"

#En la sección rdr/nat:
rdr pass on $ext_if proto tcp from any to any port 80 -> $serv_ip port 80
rdr pass on $ext_if proto tcp from any to any port 443 -> $serv_ip port 443
rdr pass on $ext_if proto tcp from any to any port 993 -> $serv_ip port 993
rdr pass on $ext_if proto tcp from any to any port 10022 -> $serv_ip port 22
rdr pass on $ext_if proto tcp from any to any port 10465 -> $serv_ip port 465
rdr pass on $ext_if proto tcp from any to any port smtp -> $serv_ip port smtp
rdr pass on $ext_if proto tcp from any to any port 389 -> $serv_ip port 389


#En la sección de reglas de filtrado

pass in on $ext_if proto tcp from any to $serv_ip port $servicios_serv \
        flags S/SA synproxy state
	

2.1. Referencias y lecturas recomendadas

Las siguientes páginas man: pf(4), pfctl(4).

Guía del usuario de PF [PF].