Sei sulla pagina 1di 23

Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.

org

Como crear un firewall con Packet Filter (PF)

Autor: Fernando Quintero (a.k.a nonr00t)


Correo electrónico: fernando.a.quintero@gmail.com

Fecha de creación : 25/03/09 Ultima modificación: 31/03/09

Índice de contenido
1.Licencia (BSD)..................................................................................................................................2
2.Introducción.......................................................................................................................................2
3.Que es un Firewall?...........................................................................................................................2
4.Que es packet filter?..........................................................................................................................3
5.Configuración previa.........................................................................................................................3
5.1.Definir las políticas....................................................................................................................3
5.2.Configuración de las interfaces de red.......................................................................................3
5.3.Habilitar el reenvío de paquetes.................................................................................................4
5.4.Configurar el gateway por defecto.............................................................................................4
5.5.Verificar el DNS.........................................................................................................................5
5.6.Habilitar el PF............................................................................................................................5
5.7.Chequeos de conectividad.........................................................................................................5
6.Ejemplos de firewalls........................................................................................................................6
6.1.Gateway sin restricciones..........................................................................................................6
a.Planteamiento del problema.................................................................................................6
b.Análisis.................................................................................................................................7
c.Solución PASS by default....................................................................................................7
d.Solución BLOCK by default................................................................................................9
6.2.LAN-WAN con restricciones básicas......................................................................................11
a.Planteamiento del problema...............................................................................................11
b.Analisis...............................................................................................................................12
c.Solución PASS by default..................................................................................................12
d.Solución BLOCK by default .............................................................................................14
6.3.LAN-WAN con DMZ..............................................................................................................16
a.Planteamiento del problema...............................................................................................17
b.Análisis...............................................................................................................................17
c.Solución PASS by default..................................................................................................18
d.Solución BLOCK by default..............................................................................................20
7.CONCLUSIONES...........................................................................................................................23
8.Enlaces relacionados.......................................................................................................................23

________________________________________________________________________________
1/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

1. Licencia (BSD)
Copyright (c) 2009, Fernando Quintero,

All rights reserved.


Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions
are met:
• Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
• Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided with the distribution.
• Neither the name of the OpenBSD Colombia nor the names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

2. Introducción
En este documento se explicará la forma de crear un firewall basado en Packet Filter (en adelante
PF), para esto se presentarán escenarios básicos que ejemplifiquen como proceder desde el
principio. También se tendrán en cuenta las políticas por defecto que se usarán para la creación de
los mismos:
● PASS BY DEFAULT – ACEPTAR POR OMISIÓN
● BLOCK BY DEFAULT – DENEGAR POR OMISIÓN
Se recomienda leer el documento llamado “¿Como funciona PF?” que se puede encontrar en el sitio
de OpenBSD Colombia1.
Espero que este documento les sea de utilidad y como siempre, cualquier duda o comentario lo
trataremos por la lista de correo.

3. Que es un Firewall?
Un “cortafuegos” (o firewall en inglés) es un elemento de hardware o software que se utiliza en una
red de computadoras para controlar las comunicaciones, permitiéndolas o prohibiéndolas según las
políticas de red que haya definido la organización responsable de la red. Su modo de funcionar es
indicado por la recomendación RFC 2979, que define las características de comportamiento y
requerimientos de interoperabilidad. La ubicación habitual de un cortafuegos es el punto de
conexión de la red interna de la organización con la red exterior, que normalmente es Internet; de
este modo se protege la red interna de intentos de acceso no autorizados desde Internet, que puedan
aprovechar vulnerabilidades de los sistemas de la red interna.”2

1 http://groups.google.com/group/OpenBSD-Colombia?hl=es
2 http://es.wikipedia.org/wiki/Cortafuegos_(inform%C3%A1tica)

________________________________________________________________________________
3.Que es un Firewall? 2/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

4. Que es packet filter?


Tomado de la F.A.Q oficial de PF3
Packet Filter es un sistema de filtrado para OpenBSD, que soporta TCP/IP y permite hacer NAT
(Network Address Translation). PF ademas es capaz de normalizar, acondicionar tráfico y proveer
un control de ancho de banda para las comunicaciones.
PF viene integrado en el Core del sistema operativo OpenBSD desde la versión 3.0 (la versión
actual es la 4.5) y no es necesario descargarlo como una aplicación externa, no hace falta decir que
Packet Filter es software libre, por lo tanto el concepto de LICENCIAS por usuario, por conexión,
por color, raza o condición social o por lo que sea, NO EXISTE.
PF fue desarrollado inicialmente por Daniel Hartmeier4 y actualmente es mantenido y soportado por
él y el resto del equipo OpenBSD.
Para mas información por favor lea las páginas del manual de PF: pf(4)5.

5. Configuración previa
Como fase previa a la implantación del firewall se seguirán unos pasos importantes para garantizar
que todo funcione como se espera. Por favor, se deben siguir estos pasos en orden y uno a uno, así
se evitarán contratiempos en el futuro.

5.1. Definir las políticas


Una parte vital del funcionamiento del firewall es tener unas políticas de acceso claras para los
usuarios, no sirve de nada tener una excelente herramienta de filtrado si no se sabe que es lo que se
quiere hacer. En este punto es importante reflexionar acerca del tráfico que se quiere o no permitir
en la red, de los usuarios que se quiere o no permitir, y de los servicios que se publicarán hacia
Internet.
En este punto también se debe pensar en el esquema de red en el que va a trabajar el firewall,
aunque los esquemas son bien conocidos para el personal de redes, es bueno que defina si la
infraestructura de red usará DMZ o no, si tendrá uno o varios firewalls, etc. Esto depende de sus
necesidades y de la cantidad de recursos que tenga disponibles. En los ejemplos posteriores se
podrán analizar esquemas sencillos usando un solo firewall, lo importante es que se puede replicar
esta teoría para diseñar lo que se quiera.

5.2. Configuración de las interfaces de red


Antes de proceder a la configuración de un servicio (DNS, DHCP, FTP, WEB, etc) se debe
garantizar que las interfaces de red fueron reconocidas y están bien configuradas, esto se debe
evidenciar mucho mas cuando se piensa usar una estación como firewall para la red. Algunos
problemas que se pueden presentar en este punto son:
● OpenBSD no reconoce las interfaces porque no tiene soporte
● Las tarjetas de red están malas o no funcionan a 1000/1000/10000Mbps

3 http://www.openbsd.org/faq/pf/index.html
4 http://www.benzedrine.cx/dhartmei.html
5 http://www.openbsd.org/cgi-bin/man.cgi?query=pf&sektion=4&manpath=OpenBSD+4.4

________________________________________________________________________________
5.Configuración previa 3/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

Verifique que esto no le este ocurriendo y continúe con la configuración:


En este caso se mostrará como configurar tres tarjetas de red para usarlas en el firewall OpenBSD,
esta sección de configuración se puede encontrar en la F.A.Q oficial6.

TARJETA WAN:
bash-3.2#
cat
hostname.rl0
inet
192.168.0.5
255.255.255.0

TARJETA LAN:
bash-3.2#
cat
hostname.sis0
inet
10.0.0.1
255.255.255.0

TARJETA DMZ:
bash-3.2#
cat
hostname.rl1
inet
172.16.0.1
255.255.255.0

No hay nada de misterio en esto, se editan los archivos y se definen las IPs con las que se va a
trabajar. En este ejemplo se asume que la WAN esta conectada por un enlace ETHERNET, pero
recuerde que su conexión puede estar por PPPoE 7 o puede ser un enlace WAN de otro tipo.
Verifique el tipo de conexión que tiene en la WAN antes de proceder con los pasos siguientes.

5.3. Habilitar el reenvío de paquetes


Este paso es necesario para que las tarjetas de red físicas se puedan comunicar entre sí, o sea para
que el kernel BSD le permita a los paquetes pasar de un lado a otro. Esto se hace modificando un
archivo en el sistema: /etc/sysctl.conf desde donde se controlan algunas variables del kernel. Allí se
edita la variable net.inet.ip.forwarding, pasandola de 0 a 1.
Debe queda algo así:

bash-3.2#
cat
/etc/sysctl.conf
|
grep
“net.inet.ip.forwarding”

net.inet.ip.forwarding=1







#
1=Permit
forwarding
(routing)
of
IPv4
packets

Si se quiere hacer el cambio de forma temporal y no definitiva entonces se hace desde la línea de
comandos:
bash-3.2#
sysctl
-w

net.inet.ip.forwarding=1

5.4. Configurar el gateway por defecto


La puerta de enlace por defecto se configura en el archivo /etc/mygate, en este ejemplo queda de la
siguiente forma:
bash-3.2#
cat
/etc/mygate

192.168.0.100

6 http://www.openbsd.org/faq/faq6.html#Setup
7 http://www.openbsderos.org/wiki/index.php?title=PPPoE_in-kernel

________________________________________________________________________________
5.Configuración previa 4/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

La IP 192.68.0.100 representa el router que provee la salida a Internet (recuerde que esto es un
escenario diseñado para la creación del manual, posiblemente su ruta por defecto sea una IP pública
o privada pero en el rango del ISP).

5.5. Verificar el DNS


El servidor DNS debe estar apuntando al servidor DNS interno o al del proveedor de la conexión.
La información como en todo sistema tipo UNIX se encuentra en:
bash-3.2#
cat
/etc/resolv.conf
search
epm.net.co
nameserver
192.168.0.100

5.6. Habilitar el PF
En este paso se va a habilitar el servicio de filtrado en OpenBSD, esto se hace modificando el
archivo /etc/rc.conf.local.
bash-3.2#
cat
/etc/rc.conf.local

#!/bin/sh
-
#
#






$OpenBSD:
rc.conf,v
1.128
2008/01/31
14:18:03
reyk
Exp
$

#
use
-u
to
disable
chroot,
see
httpd(8)
#httpd_flags=""








#
for
normal
use:
""
(or
"-DSSL"
after
reading

pf=YES
bash-3.2#


Como se puede ver en el ejemplo solo se agrega o modifica la variable pf para que sea igual a YES.
Puede leer estos dos manuales para comprender este paso:
http://www.openbsd.org/faq/pf/config.html
http://www.openbsderos.org/wiki/index.php?title=OpenBSD_%2B_PF

Una vez configurada esta variable se debe reiniciar el firewall para que los cambios tengan efecto y
el PF habilite un dispositivo de logueo (pflog0) durante el arranque, este permitirá hacer debugging
de errores durante la configuración del firewall.

bash-3.2#
reboot

5.7. Chequeos de conectividad


Después de reiniciar el sistema vamos a verificar conectividad con los equipos de nuestra red
interna y con los equipos de las redes externas, por ejemplo, INTERNET:

________________________________________________________________________________
5.Configuración previa 5/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

bash-3.2#
ping
www.google.com
PING
www.l.google.com
(209.85.165.147):
56
data
bytes
64
bytes
from
209.85.165.147:
icmp_seq=0
ttl=237
time=95.024
ms
---
www.l.google.com
ping
statistics
---
1
packets
transmitted,
1
packets
received,
0.0%
packet
loss
round-trip
min/avg/max/std-dev
=
95.024/95.024/95.024/0.000
ms
bash-3.2#

Si en este punto todo esta bien, puede procederse a crear el conjunto de reglas.

6. Ejemplos de firewalls
Se construirán tres firewalls típicos, usando políticas PASS y BLOCK por defecto:
● Gateway (2 tarjetas de red)
● LAN y WAN (2 tarjetas de red)
● LAN, DMZ y WAN (3 tarjetas de red)
Por favor haga muchas pruebas antes de concluir que PF no es lo suyo, realmente la sintaxis de PF
es la mas simple que he conocido, sin embargo el proceso de aprendizaje en la construcción de
reglas toma un tiempo, no se desespere y haga pruebas y mas pruebas. Recuerde que tiene
comunidades de Software Libre que le pueden ayudar.

6.1. Gateway sin restricciones


El esquema mas simple donde se usa un firewall es cuando nos piden que debemos dejar salir a
internet un conjunto de maquinas a través de un solo dispositivo conocido como gateway. Esta
configuración es la apropiada en este caso.

a. Planteamiento del problema

Fig 1. Esquema básico de funcionamiento como gateway

Según el diagrama Fig 1. se debe cumplir con lo siguiente:


● Los equipos de la LAN deben salir a la WAN para salir a INTERNET
● Se desea permitir conexión desde la LAN al puerto SSH (22) para hacer gestión
● Desde la WAN no se puede conectar a la LAN (no publicar servicios)

________________________________________________________________________________
6.Ejemplos de firewalls 6/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

b. Análisis
Para solucionar este ejercicio se debe habilitar el paso de paquetes por la interfaz sis0 y al mismo
tiempo hacer NAT en la interfaz de salida, con el fin de que los paquetes que quieran salir se
enmascaren y puedan regresar, para los que sepan un poco de Linux se trata del enmascaramiento
que se hace en la cadena POSTROUTING cuando salen los paquetes.

c. Solución PASS by default


Una vez realizados los pasos previos, solo se tendrá que editar el archivo del firewall /etc/pf.conf y
agregar las reglas en el orden correcto. Entonces se edita el archivo, que debe quedar parecido a
esto:
bash-3.2#
cat

/etc/pf.conf
#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.

#Definicion
de
interfaces,
con
macros
para
usar
palabras
mas
nemotecnicas
externa="rl0"
interna="sis0"

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

#El
scrub
organiza
paquetes
de
entrada
y
de
salida,
es
recomendable
tenerlo
para
evitar
ataques

#de
fragmentación
y
similares.
scrub
in
all
scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
#y
vayan 
para
 cualquier

#lugar.


nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#La
politica
de
acceso
por
defecto,
acepte
todo,
sin
embargo
no
es
necesario
poner
estas
dos

#reglas
por
que
PF
por
omisión
lo
tomará
así.
Lo
dejo
como
algo
ilustrativo.
pass
in
keep
state

________________________________________________________________________________
6.Ejemplos de firewalls 7/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

pass
out
keep
state

#Bloquee
todo
lo
que
intente
entrar
por
la
WAN
block
in
quick
on
$externa

Una vez creado el archivo se debe grabar, observe que las reglas de NAT deben ir antes de las reglas
de filtrado, esto es requisito para que PF considere correcto el archivo de configuración.
Se usarán varias opciones del comando pfctl para verificar el funcionamiento del firewall.
Verificando que las reglas estén bien escritas:

bash-3.2#
pfctl
-nf
/etc/pf.conf


Si este comando NO produce errores, entonces se procede a recargar la configuración del firewall:

bash-3.2#
pfctl
-f
/etc/pf.conf


(¿alcanzó a observar que ya no está la opción -n ?)

Luego se comprueban las reglas definidas.


Reglas de filtrado:

bash-3.2#
pfctl
-sr
scrub
in
all
fragment
reassemble
scrub
out
all
fragment
reassemble
pass
in
all
flags
S/SA
keep
state
pass
out
all
flags
S/SA
keep
state
block
drop
in
quick
on
rl0
all

Reglas de NAT:

bash-3.2#
pfctl
-sn
nat
on
rl0
from
!
(rl0)
to
any
->
(rl0)
round-robin
bash-3.2#


Las reglas pueden aparecer con mas o menos información, pero en general deben ser las mismas
reglas que definimos en el archivo.
Una vez recargado el firewall se procede a realizar pruebas desde la LAN hacia la WAN y desde la
WAN al firewall, por ejemplo haciendo un nmap desde la WAN:

________________________________________________________________________________
6.Ejemplos de firewalls 8/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

nonroot$
nmap
192.168.0.5
Starting
Nmap
4.76
(
http://nmap.org
)
at
2009-03-19
19:59
COT
Note:
Host
seems
down.
If
it
is
really
up,
but
blocking
our
ping
probes,
try
-PN
Nmap
done:
1
IP
address
(0
hosts
up)
scanned
in
2.10
seconds

No hay respuesta desde nuestro firewall, ¡justo lo deseado!.


¡Un momento!, y donde esta la regla que permite el acceso al servidor SSH desde la LAN?

ahhhh, como la política es aceptar por defecto, entonces todo el tráfico desde la LAN estará
permitido, por lo que crear una regla adicional no es necesario ;).
No sobra decir que se debe tener habilitado el servidor SSH escuchando en la interfaz sis0.

d. Solución BLOCK by default


Para solucionar el mismo ejercicio con BLOCK by default hay que entender como piensa PF
respecto a los paquetes que cruzan las interfaces, para esto se recomienda nuevamente leer el
documento “COMO FUNCIONA PF” que puede encontrar en el repositorio de archivos de la
comunidad OpenBSD Colombia. Teniendo en cuenta que OpenBSD desde la versión 4.1 maneja
estados por defecto, solo habrá que preocuparse por las reglas en un sentido. También hay que
recordar que el NAT se aplica antes de evaluar las reglas de filtrado, y que cuando se aplica la regla
NAT se traduce la dirección, esto hay que tenerlo en cuenta para cuando se tienen varias IP en la
misma interfaz física, aunque no es el común de los escenarios que estamos tratando.

El firewall quedaría así:

bash-3.2#
cat

/etc/pf.conf

#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.
#Definicion
de
interfaces,
con
macros

para
usar
palabras
mas
nemotecnicas
externa="rl0"
interna="sis0"

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

#El
scrub
organiza
paquetes
de
entrada
y
de
salida,
es
recomendable
tenerlo
para
evitar
ataques

#de
fragmentación
y
similares.

________________________________________________________________________________
6.Ejemplos de firewalls 9/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

scrub
in
all
scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
y
#vayan 
para
 cualquier

#lugar.

nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#La
politica
de
acceso
por
defecto,
bloquee
todo
en
cualquier
dirección
block
in
all
block
out
all

#Se
habilita
la
entrada
de
paquetes
desde
la
LAN
hacia
cualquier
destino
pass
in
log
quick
on
$interna
from
10.0.0.0/24
to
any

#Se
habilita
la
salida
de
paquetes
para
la
interfaz
WAN,
es
necesario
porque
de
lo
contrario
los

#paquetes
solo
llegan
hasta
la
interfaz
interna
y
no
se
les
permite
el
#paso
aunque
se
haga
NAT.
pass
out
log
quick
on
$externa
from
any
to
any

Observe que en el ejemplo se agrega una palabra mágica “log”, esta palabra lo que hace es loguear
cada paquete que coincida (match), de esta forma se puede verificar si los paquetes están pasando o
no por las interfaces. Para verificar esto se usa la interfaz que el PF crea durante el arranque en
conjunto con la utilidad tcpdump que viene por defecto en el sistema.

bash-3.2#
tcpdump
-e
-n
-ttt
-i
pflog0

tcpdump:
listening
on
pflog0,
link-type
PFLOG

Mar
19
17:13:16.583078
rule
3/(match)
pass
in
on
sis0:
10.0.0.2
>
192.168.0.100:
icmp:
echo
request
(DF)

Mar
19
17:13:16.583199
rule
4/(match)
pass
out
on
rl0:
192.168.0.5
>
192.168.0.100:
icmp:
echo
request
(DF)

Mar
19
17:13:31.891655
rule
3/(match)
pass
in
on
sis0:
10.0.0.2
>
192.168.0.100:
icmp:
echo
request
(DF)

Mar
19
17:13:31.891781
rule
4/(match)
pass
out
on
rl0:
192.168.0.5
>
192.168.0.100:
icmp:
echo
request
(DF)

Mar
19
17:13:38.482841
rule
3/(match)
pass
in
on
sis0:
10.0.0.2.56030
>
192.168.0.100.53:[|domain]
(DF)

Mar
19
17:13:38.482965
rule
4/(match)
pass
out
on
rl0:
192.168.0.5.61275
>
192.168.0.100.53:[|domain]
(DF)

Mar
19
17:13:38.485611
rule
3/(match)
pass
in
on
sis0:
10.0.0.2
>
209.85.165.104:
icmp:
echo
request
(DF)

Mar
19
17:13:38.485645
rule
4/(match)
pass
out
on
rl0:
192.168.0.5
>
209.85.165.104:
icmp:
echo
request
(DF)

Mar
19
17:13:38.596109
rule
3/(match)
pass
in
on
sis0:
10.0.0.2.38059
>
192.168.0.100.53:[|domain]
(DF)

Mar
19
17:13:38.596137
rule
4/(match)
pass
out
on
rl0:
192.168.0.5.52771
>
192.168.0.100.53:[|domain]
(DF)

Se ve que las reglas hacen match en orden, primero la de entrada en la interfaz interna y luego en la de salida

Esta captura es el resultado de un ping que se hace desde una maquina interna 10.0.0.2 al gateway

________________________________________________________________________________
6.Ejemplos de firewalls 10/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

de la WAN 192.168.0.100 y luego a una dirección pública de Internet.


Ahora las reglas que no son necesarias son las de acceso desde la WAN, ya que por defecto todo
estará bloqueado. Observe ademas el uso de la palabra quick en las reglas de paso, puesto que las
acciones de estas reglas se deben ejecutar en el momento en que se encuentran, de otro modo al
finalizar el listado de reglas PF aplicará la política por defecto.

6.2. LAN-WAN con restricciones básicas


Este escenario es el típico cuando hay equipos que ofrecen servicios dentro de la red y se requiere
que sean alcanzables desde Internet, tales como servidores web, de correo e incluso plantas
telefonicas. Tambien hay restricciones básicas de salida a internet como bloquear el MSN para los
usuarios de la LAN.

a. Planteamiento del problema

Fig 2. Firewall de filtrado básico

Según la Fig 2. se creará un firewall que cumpla con lo siguiente:


● Permita la salida de la LAN a la WAN, excepto al servicio de MSN
● Redireccione peticiones desde la WAN para el servidor de correo
● Redireccione peticiones desde la WAN para el servidor web
● Redireccione peticiones desde la WAN para la planta telefonica
● Habilite un puerto de acceso SSH desde la WAN y la LAN
● El resto de tráfico proveniente desde la WAN estará bloqueado

________________________________________________________________________________
6.Ejemplos de firewalls 11/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

b. Análisis
Para resolver este problema se deben conocer los puertos que usan los servicios que nos piden,
entonces tenemos:
Servidor web: 443 (https), 80 (http)
Servidor de correo: 25 (smtp), 993 (imap seguro), 995 (pop3 seguro), 110 (pop3), 143 (imap)
Planta telefónica VoIP: 5060 udp (señalización sip) + 10000 al 20000 para RTP (la voz)

Los puertos para correo y web son TCP, los de la planta VoIP son UDP.
Para filtrar el acceso al MSN: podemos usar el puerto por omisión: tcp 1863.
Muchos pensarán que esto NO es suficiente para bloquear el MSN, pero entonces vamos a
pretender que SI es suficiente, de lo contrario que lo demuestre con un documento en español y lo
envíe a la lista :P, recuerden que es un ejemplo, cuyo único propósito es aprender PF.

c. Solución PASS by default


Una vez realizados los pasos previos, solo se tendrá que editar el archivo del firewall /etc/pf.conf y
agregar las reglas en el orden correcto. Entonces se edita el archivo, que debe quedar parecido a
esto:
bash-3.2#
cat

/etc/pf.conf
#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.
#Definicion
de
interfaces,
con
macros

para
usar
palabras
mas
nemotecnicas
externa
=
"rl0"
interna
=
"sis0"
servidor_web
=
”10.0.0.2”
servidor_correo
=
”10.0.0.3”
servidor_voip
=
”10.0.0.4”
puerto_msn
=
“1863”
red_lan
=
”10.0.0.0/24”

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

________________________________________________________________________________
6.Ejemplos de firewalls 12/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

#El
scrub
organiza
paquetes
de
entrada
y
de
salida,
es
recomendable
tenerlo
para
evitar
ataques

#de
fragmentación
y
similares.
scrub
in
all
scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
y
#vayan 
para
 cualquier

#lugar.

nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#Redireccionando
los
puertos
al
servidor
de
correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port

25
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
110
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
143
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
993
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
995
->
$servidor_correo

#Redireccionando
los
puertos
al
servidor
web
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
80
->
$servidor_web
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
443
->
$servidor_web

#Redireccionando
los
puertos
a
la
planta
IP,
observe
que
estos
son
UDP
rdr
log
on
$externa
proto
udp
from
any
to
($externa)
port
5060
->
$servidor_voip
rdr
log
on
$externa
proto
udp
from
any
to
($externa)
port
10000:20000
->
$servidor_voip

#La
politica
de
acceso
por
defecto,
acepte
todo,
sin
embargo
no
es
necesario
poner
estas
dos

#reglas
por
que
PF
por
omisión
lo
tomará
así.
Lo
dejo
como
algo
ilustrativo.
pass
in
keep
state
pass
out
keep
state

#Acepte
conexiones
desde
la
WAN
a
los
puertos
a
redireccionar
y
al
puerto
22
local
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
($externa)
port
22
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_web
port
80
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_web
port
443
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
25
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
110
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
143
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
993
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
995
pass
in
log
quick
on
$externa
proto
udp
from
any
to
$servidor_voip
port
5060
pass
in
log
quick
on
$externa
proto
udp
from
any
to
$servidor_voip
port
10000:20000

________________________________________________________________________________
6.Ejemplos de firewalls 13/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

#No
permita
el
paso
de
las
conexiones
del
MSN
provenientes
desde
la
LAN
block
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
any
port
1863

#Bloquee
todo
el
resto
de
peticiones
que
intenten
entrar
por
la
WAN
block
in
quick
on
$externa

La conexiones desde la LAN al puerto 22 se permitirán puesto que no he dicho lo contrario en el


firewall. Observe que las reglas de redireccionamiento se parecen mucho, por lo tanto podríamos
usar macros para hacerlo mas sencillo:
Las siguientes reglas se pueden agrupar.

#Redireccionando
los
puertos
al
servidor
de
correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
110
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
143
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
993
->
$servidor_correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
995
->
$servidor_correo

Para tener algo como:


rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
$puertos_correo
->
$servidor_correo

no sin antes definir la macro “puertos_correo”, de la siguiente forma:


puertos_correo=”{25
110
143
993
995}”

Se puede hacer lo mismo para los conjuntos de reglas que se parezcan.


Despues de crear el archivo, se recarga el firewall:
bash-3.2#
pfctl
-f
/etc/pf.conf

d. Solución BLOCK by default


Se edita el archivo, que debe quedar parecido a esto:
bash-3.2#
cat

/etc/pf.conf
#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.
#Definicion
de
interfaces,
con
macros

para
usar
palabras
mas
nemotecnicas
externa="rl0"
interna="sis0"
servidor_web=”10.0.0.2”

________________________________________________________________________________
6.Ejemplos de firewalls 14/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

servidor_correo=”10.0.0.3”
servidor_voip=”10.0.0.4”
puerto_msn
=
“1863”
puertos_correo=”{25

110
143
993
995}”
puertos_web=”{
80
443
}”
puertos_voip=”{
5060

10000:20000
}”
red_lan=”10.0.0.0/24”

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

#El 
 scrub 
 organiza 
 paquetes 
 de 
 entrada 
 y 
 de 
 salida, 
 es 
 recomendable 
 tenerlo 
 para 
 evitar

#ataques
de
fragmentación
y
similares.
scrub
in
all
scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
y
#vayan 
para
 cualquier

#lugar.

nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#Redireccionando
los
puertos
al
servidor
de
correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port

$puertos_correo
->
$servidor_correo

#Redireccionando
los
puertos
al
servidor
web
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
$puertos_web
->
$servidor_web

#Redireccionando
los
puertos
a
la
planta
IP,
observe
que
estos
son
UDP
rdr
log
on
$externa
proto
udp
from
any
to
($externa)
port
$puertos_voip
->
$servidor_voip

#La
politica
de
acceso
por
defecto,
bloquee

todo

block
in
all
block
out
all

#Acepte
conexiones
desde
la
WAN
al
puerto
SSH
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
($externa)
port
22
pass
out
log
quick
on
$externa
proto
tcp
from
any
to
any
port
22

#Acepte
el
paso
de
las
conexiones
entrantes
por
la
WAN

________________________________________________________________________________
6.Ejemplos de firewalls 15/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

#Para
puertos
de
correo
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
$puertos_correo

#Para
puertos
web
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_web
port
$puertos_web

#para
puertos
VoIP
pass
in
log
quick
on
$externa
proto
udp
from
any
to
$servidor_voip
port
$puertos_voip

#Permita
el
acceso
de
salida
en
la
interfaz
interna,
puesto
que
habilitamos
la
entrada
en
la
WAN,

#debemos
garantizar
la
salida
en
la
LAN,
recuerden
las
reglas
(1)
y
(2)
en
#el
manual
de
como

#funciona
PF.
pass
out
log
quick
on
$interna
from
any
to
$servidor_web
pass
out
log
quick
on
$interna
from
any
to
$servidor_correo
pass
out
log
quick
on
$interna
from
any
to
$servidor_voip

#No
permita
el
paso
de
las
conexiones
del
MSN
provenientes
desde
la
LAN
block
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
any
port
1863

#Permita
el
resto
de
conexiones
desde
la
LAN,
observe
que
siempre
se
aplican
las
reglas
por

#parejas,
en
una
interfaz
dejo
entrar
los
paquetes
y
en
la
otra
los
dejo
#salir.

pass
in
log
quick
on
$interna
from
$red_lan
to
any
pass
out
log
quick
on
$externa
from
any
to
any

En este ejercicio definieron algunas macros para disminuir la cantidad de reglas.


Una vez creado el archivo, no olvide recargar el firewall:

bash-3.2#
pfctl
-f
/etc/pf.conf

6.3. LAN-WAN con DMZ


En este ejercicio se busca proteger un poco mas la infraestructura privada (LAN), creando una zona
desmilitarizada8, lo que se hace es separar los servidores que están mas expuestos y meterelos en
esta zona. Para crear una DMZ es necesario tener otra interface de red, así que recuerde verificar
que el sistema la reconozca y que este bien configurada.

8 http://es.wikipedia.org/wiki/DMZ

________________________________________________________________________________
6.Ejemplos de firewalls 16/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

a. Planteamiento del problema

Fig 3. Firewall con DMZ

Según la Fig 3. vamos se creará un firewall que cumpla con lo siguiente:


● Los usuarios de la LAN solo pueden navegar en Internet, se prohibe el uso de P2P y
cualquier otro protocolo diferente a HTTP y HTTPS.
● El servidor SIP es alcanzable desde la WAN, solo a los puertos necesarios.
● Los servidores web y de correo están en la DMZ, se debe poder acceder desde la LAN y
desde la WAN a estos servicios.
● El servidor de BD MySQL es alcanzable desde los dos servidores de la DMZ.
● El tráfico DNS es permitido entre todas las interfaces
● Se habilita el acceso SSH desde la WAN y desde la LAN al firewall
● No debe haber mas tráfico que el especificado desde la DMZ hacia la LAN
● Los pings estan habilitados internamente, entre DMZ y LAN, pero no desde la WAN

b. Análisis
Para trabajar en este firewall se debe usar la experiencia obtenida en la implementación de los
ejercicios anteriores. Se diseñará bloqueando los accesos en las interfaces correspondientes, en las
reglas de entrada (in) y se le dará paso por la interfaz donde vaya a salir, en las reglas de salida
(out).
Los puertos de este ejercicio son los mismos con los que se trabajó en el ejercicio anterior, excepto
por el puerto del servidor MySQL que es el 3306 tcp y el puerto del servicio DNS que puede ser
udp o tcp y es el 53.

________________________________________________________________________________
6.Ejemplos de firewalls 17/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

También se piden reglas relacionadas los pings, que son paquetes icmp.

c. Solución PASS by default


Una vez realizados los pasos previos, solo se tendrá que editar el archivo del firewall /etc/pf.conf y
agregar las reglas en el orden correcto. Entonces se edita el archivo, que debe quedar parecido a
esto:
bash-3.2#
cat

/etc/pf.conf
#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.
#Definicion
de
interfaces,
con
macros

para
usar
palabras
mas
nemotecnicas
externa="rl0"
interna="sis0"
dmz=”rl1”
servidor_web=”172.16.0.2”
servidor_correo=”172.16.0.3”
servidor_voip=”10.0.0.4”
servidor_mysql=”10.0.0.3”
red_lan=”10.0.0.0/24”
red_dmz=”172.16.0.0/24”
puerto_dns
=
“53”
puerto_mysql=”3306”
puertos_correo=”{
25

110
143
993
995
}”
puertos_web=”{
80
443
}”
puertos_voip=”{
5060
10000:20000
}”

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

#El
scrub
organiza
paquetes
de
entrada
y
de
salida,
es
recomendable
tenerlo
para
evitar
ataques

#de
fragmentación
y
similares.
scrub
in
all
scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
y
#vayan 
para
 cualquier

#lugar.

nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#Redireccionando
los
puertos
al
servidor
de
correo

________________________________________________________________________________
6.Ejemplos de firewalls 18/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port

$puertos_correo
->
$servidor_correo

#Redireccionando
los
puertos
al
servidor
web
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
$puertos_web
->
$servidor_web

#Redireccionando
los
puertos
a
la
planta
IP,
observe
que
estos
son
UDP
rdr
log
on
$externa
proto
udp
from
any
to
($externa)
port
$puertos_voip
->
$servidor_voip

#La
politica
de
acceso
por
defecto,
acepte
todo,
sin
embargo
no
es
necesario
poner
estas
dos

#reglas
por
que
PF
por
omisión
lo
tomará
así.
Lo
dejo
como
algo
ilustrativo.
pass
in
keep
state
pass
out
keep
state

#Acepte
conexiones
externas
al
servidor
SSH
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
($externa)
port
22
pass
in
log
quick
on
$interna

proto
tcp
from
$red_lan
to
($interna)
port
22

#Acepte
conexiones
externas
a
los
diferentes
servidores
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_web
port
$puertos_web
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
$puertos_correo
pass
in
log
quick
on
$externa
proto
udp
from
any
to
$servidor_voip
port
$puertos_voip

#Acepte
solo
conexiones
HTTP
y
HTTPS
de
la
LAN
a
la
WAN
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
any
port
$puertos_web

#Acepte
solo
conexiones
de
la
LAN
para
la
DMZ
a
los
puertos
de
correo
y
web
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
$servidor_web
port
$puertos_web
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
$servidor_correo
port
$puertos_correo

#Permita
el
paso
desde
los
servidores
de
la
DMZ
al
servidor
MySQL
pass
in
log
quick
on
$dmz
proto
tcp
from
$red_dmz
to
$servidor_mysql
port
$puerto_mysql

#El
paso
de
tráfico
PING
es
permitido
entre
todas
las
interfaces
pass
in
log
quick
on
$interna
proto
icmp
from
any
to
any
pass
in
log
quick
on
$dmz
proto
icmp
from
any
to
any
#El
paso
de
tráfico
DNS
es
permitido
entre
todas
las
interfaces
pass
in
log
quick
on
$interna
proto
tcp

from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$interna
proto
udp
from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$dmz
proto
tcp

from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$dmz
proto
udp
from
any
to
any
port
$puerto_dns

#Bloquee
todo
el
resto
de
peticiones
que
intenten
entrar
por
las
interfaces

________________________________________________________________________________
6.Ejemplos de firewalls 19/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

block
in
quick
on
$externa
block
in
quick
on
$dmz
block
in
quick
on
$interna

Recuerde recargar el firewall una vez creado el archivo:


bash-3.2#
pfctl
-f
/etc/pf.conf

En este firewall se bloquea al final todos los paquetes que entran en las interfaces para hacerlo mas
seguro, con eso estamos garantizando que solo el tráfico especificado es el que tiene acceso:
DNS, ICMP, WEB ,CORREO y MySQL.

d. Solución BLOCK by default


Una vez realizados los pasos previos, solo se tendrá que editar el archivo del firewall /etc/pf.conf y
agregar las reglas en el orden correcto. Entonces se edita el archivo, que debe quedar parecido a
esto:
bash-3.2#
cat

/etc/pf.conf
#






$OpenBSD:
pf.conf,v
1.35
2008/02/29
17:04:55
reyk
Exp
$
#
See
pf.conf(5)
and
/usr/share/pf
for
syntax
and
examples.
#
Remember
to
set
net.inet.ip.forwarding=1
and/or
net.inet6.ip6.forwarding=1
#
in
/etc/sysctl.conf
if
packets
are
to
be
forwarded
between
interfaces.
#Definicion
de
interfaces,
con
macros

para
usar
palabras
mas
nemotecnicas

externa="rl0"
interna="sis0"
dmz=”rl1”
servidor_web=”172.16.0.2”
servidor_correo=”172.16.0.3”
servidor_voip=”10.0.0.4”
servidor_mysql=”10.0.0.3”
red_lan=”10.0.0.0/24”
red_dmz=”172.16.0.0/24”
puerto_dns
=
“53”
puerto_mysql=”3306”
puertos_correo=”{
25

110
143
993
995
}”
puertos_web=”{
80
443
}”
puertos_voip=”{
5060
10000:20000
}”

#Esta
regla
es
para
que
no
se
apliquen
filtros
en
la
interfaz
loopback
=
127.0.0.1
=
lo

set
skip
on
lo

#El
scrub
organiza
paquetes
de
entrada
y
de
salida,
es
recomendable
tenerlo
para
evitar
ataques

#de
fragmentación
y
similares.
scrub
in
all

________________________________________________________________________________
6.Ejemplos de firewalls 20/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

scrub
out
all

#Aqui
se
hace
el
enmascaramiento,
la
regla
dice:
haga
NAT
en
la
interfaz
externa
(rl0)
siempre
y

#cuando
 los
paquetes
 vengan
desde
 una
 red
 que
 no
sea
 la
externa
y
#vayan 
para
 cualquier

#lugar.

nat
on
$externa
inet
from
!($externa)
to
any
->
($externa)


#Redireccionando
los
puertos
al
servidor
de
correo
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port

$puertos_correo
->
$servidor_correo

#Redireccionando
los
puertos
al
servidor
web
rdr
log
on
$externa
proto
tcp
from
any
to
($externa)
port
$puertos_web
->
$servidor_web

#Redireccionando
los
puertos
a
la
planta
IP,
observe
que
estos
son
UDP
rdr
log
on
$externa
proto
udp
from
any
to
($externa)
port
$puertos_voip
->
$servidor_voip

#La
politica
de
acceso
por
defecto
bloquee
todo
block
in
all
block
out
all

#Acepte
conexiones
externas
al
servidor
SSH
regla
IN
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
($externa)
port
22
pass
in
log
quick
on
$interna

proto
tcp
from
any
to
($interna)
port
22

#Acepte
conexiones
externas
al
servidor
SSH
regla
OUT
pass
out
log
quick
on
$externa
proto
tcp
from
any
to
any
port
22
pass
out
log
quick
on
$interna

proto
tcp
from
any
to
any
port
22

#Acepte
conexiones
externas
a
los
diferentes
servidores
reglas
IN
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_web
port
$puertos_web
pass
in
log
quick
on
$externa
proto
tcp
from
any
to
$servidor_correo
port
$puertos_correo
pass
in
log
quick
on
$externa
proto
udp
from
any
to
$servidor_voip
port
$puertos_voip

#Acepte
conexiones
externas
a
los
diferentes
servidores
reglas
OUT
pass
out
log
quick
on
$interna
proto
udp
from
any
to
$servidor_voip
port
$puertos_voip

________________________________________________________________________________
6.Ejemplos de firewalls 21/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

#Acepte
solo
conexiones
HTTP
y
HTTPS
de
la
LAN
a
la
WAN
reglas
IN
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
any
port
$puertos_web

#Acepte
solo
conexiones
HTTP
y
HTTPS
de
la
LAN
a
la
WAN
reglas
OUT
pass
out
log
quick
on
$externa
proto
tcp
from
any
to
any
port
$puertos_web

#Acepte
solo
conexiones
de
la
LAN
para
la
DMZ
a
los
puertos
de
correo
y
web
reglas
IN
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
$servidor_web
port
$puertos_web
pass
in
log
quick
on
$interna
proto
tcp
from
$red_lan
to
$servidor_correo
port
$puertos_correo

#Acepte
solo
conexiones
de
la
LAN
para
la
DMZ
a
los
puertos
de
correo
y
web
reglas
OUT
pass
out
log
quick
on
$dmz
proto
tcp
from

any
to
$servidor_web
port
$puertos_web
pass
out
log
quick
on
$dmz
proto
tcp
from

any
to
$servidor_correo
port
$puertos_correo

#Permita
el
paso
desde
los
servidores
de
la
DMZ
al
servidor
MySQL
regla
IN
pass
in
log
quick
on
$dmz
proto
tcp
from
$red_dmz
to
$servidor_mysql
port
$puerto_mysql

#Permita
el
paso
desde
los
servidores
de
la
DMZ
al
servidor
MySQL
regla
OUT
pass
out
log
quick
on
$interna
proto
tcp
from
$red_dmz
to
$servidor_mysql
port
$puerto_mysql

#El
paso
de
tráfico
PING
es
permitido
entre
todas
las
interfaces
reglas
IN
pass
in
log
quick
on
$interna
proto
icmp
from
any
to
any
pass
in
log
quick
on
$dmz
proto
icmp
from
any
to
any

#El
paso
de
tráfico
PING
es
permitido
entre
todas
las
interfaces
reglas
OUT
pass
out
log
quick
on
$externa
proto
icmp
from
any
to
any
pass
out
log
quick
on
$dmz
proto
icmp
from
any
to
any
pass
out
log
quick
on
$interna
proto
icmp
from
any
to
any

#El
paso
de
tráfico
DNS
es
permitido
entre
todas
las
interfaces
reglas
IN
pass
in
log
quick
on
$interna
proto
tcp

from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$interna
proto
udp
from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$dmz
proto
tcp

from
any
to
any
port
$puerto_dns
pass
in
log
quick
on
$dmz
proto
udp
from
any
to
any
port
$puerto_dns

#El
paso
de
tráfico
DNS
es
permitido
entre
todas
las
interfaces
reglas
OUT
pass
out
log
quick
on
$interna
proto
tcp

from
any
to
any
port
$puerto_dns
pass
out
log
quick
on
$dmz
proto
tcp

from
any
to
any
port
$puerto_dns
pass
out
log
quick
on
$externa
proto
tcp

from
any
to
any
port
$puerto_dns
pass
out
log
quick
on
$interna
proto
udp

from
any
to
any
port
$puerto_dns
pass
out
log
quick
on
$dmz
proto
tcp

udp
any
to
any
port
$puerto_dns
pass
out
log
quick
on
$externa
proto
udp

from
any
to
any
port
$puerto_dns

Recuerde recargar el firewall una vez creado el archivo:


bash-3.2#
pfctl
-f
/etc/pf.conf

NOTA: Para todos los firewalls que usan macros, verifique que los valores estén encerrados entre comillas
dobles, de lo contrario PF presentará errores al cargar las reglas.

________________________________________________________________________________
6.Ejemplos de firewalls 22/23
Como crear un firewall con Packet Filter (PF) - Fernando Quintero (a.k.a nonr00t), http://www.openbsdcolombia.org

7. CONCLUSIONES

● Diseñar un firewall es, en un alto porcentaje, una tarea que consiste en entender realmente
que es lo que se quiere hacer, la mayoría de las veces vamos a intentar crea reglas tratando
de cubrir nuestras necesidades sobre la marcha y esa falta de planeación hará que las reglas
implementadas no sean las mas adecuadas, independiente del firewall a implementar
siempre debe haber una planeación como se muestra en cada ejercicio propuesto.
Planteamiento del problema, análisis, diseño y pruebas.

● Se pudo observar la flexibilidad de PF al adaptarse a diferentes escenarios con diferentes


políticas de acceso por defecto. Se concluye, entonces, que La herramienta es fácil de usar,
como siempre, solo se requiere un poco de practica.

● De las configuraciones se puede observar que las reglas con “BLOCK by default” son mas
fáciles de entender que las “PASS by default”, pero no siempre serán útiles, dado que esta
elección depende de los requerimientos que tengamos. Use las primeras cuando haya mas
asuntos que prohibir que los que se deban permitir, en caso contrario trabaje con las
segundas.

● Si bien no se estan mostrando todas las características avanzadas de PF, se presentan


configuraciones funcionales que le pueden servir para adaptarlas a otros escenarios.

● Se puede observar la facilidad de interpretación de la sintaxis de PF, que guarda semejanza


con el lenguaje cotidiano (nos evitamos reglas confusas con INPUT, OUTPUT, PREROUTING, -i,
-o, -d, -s, ETC). Esto permite que el manejo de esta herramienta sea aprendido y asimilado en
menos tiempo en comparación con otras herramientas con las que se pretende lograr los
mismos resultados.

8. Enlaces relacionados

● Guía oficial de PF: http://www.openbsd.org/faq/pf/


● Guía oficial de PF en español (desactualizada): http://www.openbsd.org/faq/pf/es
● RFC sobre diseño de firewalls: http://tools.ietf.org/html/rfc2979
● Sitio oficial de OpenBSD Colombia: http://www.openbsdcolombia.org/
● Blog site del autor del documento: http://nonroot.blogspot.com/

! Larga vida a OpenBSD !

________________________________________________________________________________
8.Enlaces relacionados 23/23

Potrebbero piacerti anche