                   Cortafuegos con Dialup en FreeBSD

  Marc Silver

   <marcs@draenor.org>

   $FreeBSD:
   doc/es_ES.ISO8859-1/articles/dialup-firewall/article.sgml,v 1.3
   2007/11/08 21:49:10 carvay Exp $

   En este articulo se describe como configurar un cortafuegos que
   utiliza conexion PPP con FreeBSD e IPFW y mas concretamente el uso
   de un cortafuegos en una conexion telefonica a la que se le asigna
   una IP dinamica. Este documento no se ocupa de la configuracion de
   la conexion PPP necesaria.

   Traduccion de Jose Vicente Carrasco Vaya <carvay@es.FreeBSD.org>.

     --------------------------------------------------------------

1. Prefacio

   Uso de un Cortafuegos en una Conexion Telefonica en FreeBSD

   En este documento se expone el proceso necesario para configurar
   un cortafuegos en FreeBSD cuando la direccion IP es asignada
   dinamicamente por el ISP. Aunque se ha hecho todo lo posible por
   hacer este documento tan informativo y correcto como sea posible
   puede enviar comentarios y/o sugerencias al autor a
   <marcs@draenor.org>, que seran bien recibidas.

     --------------------------------------------------------------

2. Configuracion del Kernel

   Lo primero que tendra que hacer es recompilar su kernel. Si
   necesita mas informacion sobre como hacerlo el mejor recurso es la
   seccion de Handbook acerca de la configuracion del kernel.
   Necesitara anadir a su fichero de configuracion del kernel las
   siguientes opciones:

   options IPFIREWALL

           Activa el codigo necesario para el cortafuegos en el
           kernel.

   options IPFW2

           Activa la nueva version de IPFW.

             Importante: Esto solo debe hacerse en FreeBSD 4.X puesto
             que en las versiones mas recientes vienen incluido por
             defecto.

   options IPFIREWALL_VERBOSE

           Envia los paquetes que se ha decidido sean incluidos en un
           log a la aplicacion encargada de gestionar los logs del
           sistema.

   options IPFIREWALL_VERBOSE_LIMIT=100

           Limita el numero de veces que una entrada que cumple las
           reglas puede ser incluida en los logs del sistema. Esto
           previene que sus logs se vean inundados por entradas
           repetidas. 100 es un numero razonable, pero puede
           ajustarlo a sus necesidades.

   options IPDIVERT

           Activa los "sockets" divert, que seran descritos mas
           tarde.

   Hay otras entradas opcionales que pueden compilarse en el kernel
   para incrementar la seguridad. No hacen falta para el
   funcionamiento del cortafuegos pero algunos usuarios especialmente
   paranoicos pueden querer usarlos.

   options TCP_DROP_SYNFIN

           Ignorar paquetes TCP con SYN y FIN. Esto evita ser
           vulnerable al uso de herramientas como security/nmap, que
           permiten identificar la pila TCP/IP de la maquina, pero
           incumple el soporte a las extensiones incluidas en el
           RFC1644. No se recomienda hacer tal cosa si la maquina va
           a ejecutar un servidor web.

   No reinicie tras recompilar el kernel. Si todo sale bien solo
   necesitaremos reiniciar una vez en todo el proceso de instalacion
   del cortafuegos.

     --------------------------------------------------------------

3. Modificacion de /etc/rc.conf para cargar el cortafuegos

   Necesitamos hacer algunos cambios en /etc/rc.conf para darle
   ciertos detalles del cortafuegos. Es tan simple como anadir las
   siguientes lineas:

 firewall_enable="YES"
 firewall_script="/etc/firewall/fwrules"
 natd_enable="YES"
 natd_interface="tun0"
 natd_flags="-dynamic"

   Para mas informacion sobre estas entradas consulte
   /etc/defaults/rc.conf y lea rc.conf(5)

     --------------------------------------------------------------

4. Desactivacion de la Traduccion de Direcciones de Red (NAT) de PPP

   Es posible que ya este usando la NAT que incluye PPP. Si es su
   caso tendra que desactivarla puesto que los casos que vamos a usar
   emplean natd(8) para hacerlo.

   Si ya dispone de un grupo de entradas para arrancar
   automaticamente PPP probablemente se parezca a esto:

 ppp_enable="YES"
 ppp_mode="auto"
 ppp_nat="YES"
 ppp_profile="profile"

   Si es su caso, tendra que desactivar especificamente ppp_nat
   asegurandose de que ppp_nat="NO" existe en su in /etc/rc.conf.
   Tendra tambie que borrar todas las entradas como nat enable yes o
   alias enable yes en /etc/ppp/ppp.conf.

     --------------------------------------------------------------

5. Las Reglas del Cortafuegos

   Casi hemos acabado. Lo unico que nos falta es definir las reglas
   del cortafuegos, reiniciar y deberiamos tener nuestro cortafuegos
   funcionando perfectamente. Soy consciente de que cada cual tendra
   necesidades distintas como reglas basicas. He intentado escribir
   unas reglas basicas que puedan cubrir las necesidades de un
   usuario de conexion telefonica normal. Vamos a comenzar por lo
   basico de un cortafuegos cerrado. Lo que se busca es rechazar todo
   por defecto y dejar pasar solamente lo que necesitemos. Las reglas
   deberian ir en la forma "al principio permitir, luego rechazar".
   La premisa es que vamos a an~adir reglas para lo que vamos a
   aceptar y luego rechazamos todo lo demas. :)

   Ahora vamos a crear el directorio /etc/firewall. Situese en el
   directorio y edite el fichero fwrules tal y como hemos escrito
   dentro de rc.conf. Por favor, no olvide que puede cambiar el
   nombre del fichero por cualquier otro que prefiera. Este documento
   solamente facilita un ejemplo del nombre del fichero.

   Vamos a echar un vistazo a un ejemplo de fichero de configuracion
   del cortafuegos que hemos comentado cuidadosamente.

 # Definimos el comando con el que invocamos al cortafuegos 
 # (tal y como hemos incluido en /etc/rc.firewall) para
 # facilitarnos la lectura. 
 fwcmd="/sbin/ipfw"

 # Fuerza el borrado de todas las reglas existentes en nuestro
 # cortafuegos antes de cargar el contenido de este fichero.
 $fwcmd -f flush

 # Desvia todos los paquetes a traves del interfaz tunnel.
 $fwcmd add divert natd all from any to any via tun0

 # Permite todas las conexiones incluidas en reglas
 # dinamicas pero rechaza todas aquellas conexiones
 # establecidas que no esten incluidas en alguna
 # regla dinamica.
 $fwcmd add check-state
 $fwcmd add deny tcp from any to any established

 # Aceptar todas las conexiones de localhost.
 $fwcmd add allow tcp from me to any out via lo0 setup keep-state
 $fwcmd add deny  tcp from me to any out via lo0
 $fwcmd add allow ip  from me to any out via lo0 keep-state

 # Aceptar todas las conexiones desde mi tarjeta de red que yo inicie.
 $fwcmd add allow tcp from me to any out xmit any setup keep-state
 $fwcmd add deny  tcp from me to any
 $fwcmd add allow ip from me to any out xmit any keep-state

 # Todo el mundo a lo largo y ancho de Internet puede conectarse
 # a los siguientes servicios de la maquina.  Este
 # ejemplo permite especificamente las conexiones a sshd
 # y al servidor web.
 $fwcmd add allow tcp from any to me dst-port 22,80 in recv any setup keep-state

 # Esto envia un RESET a todos los paquetes ident.
 $fwcmd add reset log tcp from any to me 113 in recv any

 # Activa ICMP: borre el tipo 8 si no quiere que su maquina
 # responda al ping.
 $fwcmd add allow icmp from any to any icmptypes 0,3,8,11,12,13,14

 # Rechazamos todo lo demas.
 $fwcmd add deny log ip from any to any

   Ya tiene usted un cortafuegos totalmente funcional que acepta
   todas las conexiones a los puertos 22 y 80 y registrara cualquier
   otro tipo de intento de conexion en un fichero log. Ahora podemos
   reiniciar tranquilamente y su cortafuegos deberia empezar a
   trabajar tal y como le hemos dicho. Si le parece que hay algun
   dato incorrecto o tiene alguna sugerencia para mejorar este
   documento por favor envieme un correo electronico.

     --------------------------------------------------------------

6. Preguntas

   6.1. ?Por que utiliza natd(8) y ipfw(8) cuando podria usar los
   filtros incluidos en ppp(8)?

   6.2. Me aparecen mensajes como "limit 100 reached on entry 2800" y
   despues de eso ya no me aparecen mas entradas indicando trafico
   rechazado en mis logs. ?Funciona mi cortafuegos?

   6.3. Supongamos que estoy usando direcciones privadas internas,
   por ejemplo el rango 192.168.0.0. ?Puedo anadir una regla al
   cortafuegos mediante un comando como $fwcmd add deny all from any
   to 192.168.0.0:255.255.0.0 via tun0 para prevenir intentos de
   acceso desde el exterior para conectar con maquinas de mi red?.

   6.4. Debo de haber hecho algo mal. He seguido las instrucciones al
   pie de la letra y no tengo acceso a Internet.

   6.1. ?Por que utiliza natd(8) y ipfw(8) cuando podria usar los
   filtros incluidos en ppp(8)?

   Sere honesto y dire que no hay una razon clara por la que use ipfw
   y natd en lugar de los filtros que incorpora ppp. Tras hablarlo
   con mucha gente el consenso parece ser que ipfw es mucho mas
   potente y configurable que el filtrado de ppp pero lo que se gana
   en funcionalidad lo pierde en facilidad de personalizacion. Una de
   las razones por las que prefiero usar esas aplicaciones es que
   creo ma conveniente ejecutar un cortafuegos desde el kernel que
   desde una aplicacion de entorno de usuario.

   6.2. Me aparecen mensajes como "limit 100 reached on entry 2800" y
   despues de eso ya no me aparecen mas entradas indicando trafico
   rechazado en mis logs. ?Funciona mi cortafuegos?

   Esto significa simplemente que se ha alcanzado el maximo de
   entradas que pueden incluirse en el log cuando una determinada
   regla se ha cumplido. Esa regla sigue funcionando pero no enviaria
   mas entradas al log hasta que el contador vuelva a cero. Puede
   poner a cero ese contador mediante ipfw resetlog. Ademas es
   posible elevar el limite de entradas a introducir en el log
   incluyendo la "option" IPFIREWALL_VERBOSE_LIMIT en el fichero de
   de configuracion del kernel. Por otra parte puede modificar ese
   valor (sin modificar su kernel y en consecuencia sin reiniciar la
   maquina) mediante el valor de sysctl(8)
   net.inet.ip.fw.verbose_limit.

   6.3. Supongamos que estoy usando direcciones privadas internas,
   por ejemplo el rango 192.168.0.0. ?Puedo anadir una regla al
   cortafuegos mediante un comando como $fwcmd add deny all from any
   to 192.168.0.0:255.255.0.0 via tun0 para prevenir intentos de
   acceso desde el exterior para conectar con maquinas de mi red?.

   La respuesta corta es no. La razon es que natd efectua la
   traduccion de direcciones para cualquier cosa que sea redirigida a
   traves del dispositivo tun0. Eso significa que todos los paquetes
   entrantes hablaran exclusivamente con la IP asignada dinamicamente
   y no con la red interna. Hay que tener en cuenta sin embargo que
   es posible anadir una regla como $fwcmd add deny all from
   192.168.0.4:255.255.0.0 to any via tun0, que evitaria que una de
   las maquinas de esa red enviara trafico al exterior a traves del
   cortafuegos.

   6.4. Debo de haber hecho algo mal. He seguido las instrucciones al
   pie de la letra y no tengo acceso a Internet.

   Estamos asumiendo que esta usando userland-ppp, en consecuencia el
   conjunto de reglas que aqui se proponen operan en el interfaz
   tun0, que corresponde a la primera conexion efectuada mediante
   ppp(8) (mas conocido como user-ppp). Las conexiones efectuadas mas
   tarde recibiran nombres como tun1, tun2 y asi sucesivamente.

   Hay que tener tambien presente que pppd(8) en cambio utiliza el
   interfaz ppp0, de modo que si se inicia la conexion con pppd(8)
   hay que sustituir tun0 por ppp0. A continuacion se muestra una
   forma muy limpia de modificar las reglas del cortafuegos.
   Conservaremos un fichero con las reglas originales con el nombre
   de fwrules_tun0.

             % cd /etc/firewall
             /etc/firewall% su
             Password:
             /etc/firewall# mv fwrules fwrules_tun0
             /etc/firewall# cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules
          

   Para saber exactamente si esta usando ppp(8) o pppd(8) examine la
   salida de ifconfig(8) una vez que establezca la conexion. V.g., en
   una conexion hecha mediante pppd(8) deberia encontrarse con algo
   muy similar a lo siguiente (se muestran solo las lineas
   relevantes):

             % ifconfig
             (eliminado...)
             ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000
             (eliminado...)
            

   Si por el contrario la conexion fue establecida mediante ppp(8)
   (user-ppp) esto es mas o menos lo que se encontraria:

             % ifconfig
             (eliminado...)
             ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
             (skipped...)
             tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     (IPv6 stuff skipped...)
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00
                     Opened by PID xxxxx
             (eliminado...)

     --------------------------------------------------------------

          Puede descargar este y muchos otros documentos desde
                ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Si tiene dudas sobre FreeBSD consulte la documentacion antes de escribir
                  a la lista <questions@FreeBSD.org>.
    Envie sus preguntas sobre la documentacion a <doc@FreeBSD.org>.
