430 lines
18 KiB
Text
430 lines
18 KiB
Text
<!--
|
|
The FreeBSD Documentation Project
|
|
-->
|
|
|
|
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
|
|
<!ENTITY % articles.ent PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Articles Entity Set//ES">
|
|
%articles.ent;
|
|
]>
|
|
|
|
<article lang=es>
|
|
<articleinfo>
|
|
<title>Cortafuegos con Dialup en FreeBSD</title>
|
|
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Marc</firstname>
|
|
<surname>Silver</surname>
|
|
|
|
<affiliation>
|
|
<address><email>marcs@draenor.org</email></address>
|
|
</affiliation>
|
|
</author>
|
|
</authorgroup>
|
|
|
|
<pubdate>$FreeBSD$</pubdate>
|
|
|
|
<abstract>
|
|
<para>En éste artículo se describe cómo
|
|
configurar un cortafuegos que utiliza conexión PPP con
|
|
FreeBSD e IPFW y más concretamente el uso de un
|
|
cortafuegos en una conexión telefónica
|
|
a la que se le asigna una IP dinámica. Éste
|
|
documento no se ocupa de la configuración de la
|
|
conexión PPP necesaria.</para>
|
|
&trans.es.carvay;
|
|
</abstract>
|
|
</articleinfo>
|
|
|
|
<sect1 id="preface">
|
|
<title>Prefacio</title>
|
|
|
|
<para>Uso de un Cortafuegos en una Conexión Telefónica
|
|
en FreeBSD</para>
|
|
|
|
<para>En éste documento se expone el proceso necesario para
|
|
configurar un cortafuegos en FreeBSD cuando la dirección IP
|
|
es asignada dinámicamente por el ISP. Aunque se ha hecho
|
|
todo lo posible por hacer éste documento tan informativo
|
|
y correcto como sea posible puede enviar comentarios y/o
|
|
sugerencias al autor a <email>marcs@draenor.org</email>, que
|
|
serán bien recibidas.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="kernel">
|
|
<title>Configuración del Kernel</title>
|
|
|
|
<para>Lo primero que tendrá que hacer es recompilar su
|
|
kernel. Si necesita más información sobre cómo
|
|
hacerlo el mejor recurso es <ulink
|
|
URL="../../books/handbook/kernelconfig.html">la sección de
|
|
Handbook acerca de la configuración del
|
|
kernel</ulink>. Necesitará añadir a su fichero de
|
|
configuración del kernel las siguientes opciones:</para>
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>options IPFIREWALL</literal></term>
|
|
|
|
<listitem>
|
|
<para>Activa el código necesario para el cortafuegos
|
|
en el kernel.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>options IPFW2</literal></term>
|
|
|
|
<listitem>
|
|
<para>Activa la nueva versión de IPFW.</para>
|
|
<important><para>Esto solo debe hacerse en FreeBSD 4.X puesto
|
|
que en las versiones más recientes vienen incluído
|
|
por defecto.</para></important>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>options IPFIREWALL_VERBOSE</literal></term>
|
|
|
|
<listitem>
|
|
<para>Envia los paquetes que se ha decidido sean incluídos
|
|
en un <filename>log</filename> a la aplicación encargada
|
|
de gestionar los <filename>logs</filename> del sistema.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>options
|
|
IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>
|
|
|
|
<listitem>
|
|
<para>Limita el número de veces que una entrada que cumple
|
|
las reglas puede ser incluída en los <filename>logs
|
|
</filename> del sistema. Esto previene que sus <filename>logs
|
|
</filename> se vean inundados por entradas repetidas.
|
|
<replaceable>100</replaceable> es un número razonable,
|
|
pero puede ajustarlo a sus necesidades.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>options IPDIVERT</literal></term>
|
|
|
|
<listitem>
|
|
<para>Activa los <quote>sockets</quote> <emphasis>divert</emphasis>,
|
|
que serán descritos más tarde.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<para>Hay otras entradas <emphasis>opcionales</emphasis> 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.</para>
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>options TCP_DROP_SYNFIN</literal></term>
|
|
|
|
<listitem>
|
|
<para>Ignorar paquetes TCP con SYN y FIN. Esto evita ser
|
|
vulnerable al uso de herramientas como
|
|
<filename role="package">security/nmap</filename>, que permiten
|
|
identificar la pila TCP/IP de la máquina, pero incumple
|
|
el soporte a las extensiones incluídas en el
|
|
RFC1644. <emphasis>No</emphasis> se recomienda hacer tal cosa
|
|
si la máquina va a ejecutar un servidor web.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<para>No reinicie tras recompilar el kernel. Si todo sale bien
|
|
sólo necesitaremos reiniciar una vez en todo el proceso
|
|
de instalación del cortafuegos.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="rcconf">
|
|
<title>Modificación de <filename>/etc/rc.conf</filename> para
|
|
cargar el cortafuegos</title>
|
|
|
|
<para>Necesitamos hacer algunos cambios en
|
|
<filename>/etc/rc.conf</filename> para darle ciertos detalles
|
|
del cortafuegos. Es tan simple como añadir las siguientes
|
|
líneas:</para>
|
|
|
|
<programlisting>firewall_enable="YES"
|
|
firewall_script="/etc/firewall/fwrules"
|
|
natd_enable="YES"
|
|
natd_interface="tun0"
|
|
natd_flags="-dynamic"</programlisting>
|
|
|
|
<para>Para más información sobre éstas entradas
|
|
consulte
|
|
<filename>/etc/defaults/rc.conf</filename> y lea
|
|
&man.rc.conf.5;</para>
|
|
</sect1>
|
|
|
|
<sect1>
|
|
<title>Desactivación de la Traducción de Direcciones
|
|
de Red (NAT) de PPP</title>
|
|
|
|
<para>Es posible que ya esté usando la NAT que incluye
|
|
PPP. Si es su caso tendrá que desactivarla puesto que
|
|
los casos que vamos a usar emplean &man.natd.8; para hacerlo.</para>
|
|
|
|
<para>Si ya dispone de un grupo de entradas para arrancar
|
|
automáticamente PPP probablemente se parezca a
|
|
ésto:</para>
|
|
|
|
<programlisting>ppp_enable="YES"
|
|
ppp_mode="auto"
|
|
ppp_nat="YES"
|
|
ppp_profile="<replaceable>profile</replaceable>"</programlisting>
|
|
|
|
<para>Si es su caso, tendrá que desactivar
|
|
específicamente <literal>ppp_nat</literal>
|
|
asegurándose de que
|
|
<literal>ppp_nat="NO"</literal> existe en su
|
|
in <filename>/etc/rc.conf</filename>. Tendrá tambié que
|
|
borrar todas las entradas como
|
|
<literal>nat enable yes</literal> o
|
|
<literal>alias enable yes</literal> en
|
|
<filename>/etc/ppp/ppp.conf</filename>.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="rules">
|
|
<title>Las Reglas del Cortafuegos</title>
|
|
|
|
<para>Casi hemos acabado. Lo único que nos falta es
|
|
definir las reglas del cortafuegos, reiniciar y deberíamos
|
|
tener nuestro cortafuegos funcionando perfectamente. Soy
|
|
consciente de que cada cual tendrá necesidades distintas
|
|
como reglas básicas. He intentado escribir unas reglas
|
|
básicas que puedan cubrir las necesidades de un usuario
|
|
de conexión telefónica normal. Vamos a comenzar
|
|
por lo básico de un cortafuegos cerrado. Lo que se
|
|
busca es rechazar todo por defecto y dejar pasar solamente
|
|
lo que necesitemos. Las reglas deberían ir en la forma
|
|
<quote>al principio permitir, luego rechazar</quote>. La premisa
|
|
es que vamos a an˜adir reglas para lo que vamos a aceptar y
|
|
luego rechazamos todo lo demás. :)</para>
|
|
|
|
<para>Ahora vamos a crear el directorio <filename
|
|
class="directory">/etc/firewall</filename>. Sitúese en el
|
|
directorio y edite el fichero <filename>fwrules</filename> tal y
|
|
como hemos escrito dentro de <filename>rc.conf</filename>. Por favor,
|
|
no olvide que puede cambiar el nombre del fichero por cualquier otro
|
|
que prefiera. Éste documento solamente facilita un ejemplo
|
|
del nombre del fichero.</para>
|
|
|
|
<para>Vamos a echar un vistazo a un ejemplo de fichero de
|
|
configuración del cortafuegos que hemos comentado
|
|
cuidadosamente.</para>
|
|
|
|
<programlisting># Definimos el comando con el que invocamos al cortafuegos
|
|
# (tal y como hemos incluído 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 éste fichero.
|
|
$fwcmd -f flush
|
|
|
|
# Desvía todos los paquetes a través del interfaz tunnel.
|
|
$fwcmd add divert natd all from any to any via tun0
|
|
|
|
# Permite todas las conexiones incluídas en reglas
|
|
# dinámicas pero rechaza todas aquellas conexiones
|
|
# establecidas que no estén incluídas en alguna
|
|
# regla dinámica.
|
|
$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 máquina. Éste
|
|
# ejemplo permite específicamente 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
|
|
|
|
# Ésto envía 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 máquina
|
|
# responda al ping.
|
|
$fwcmd add allow icmp from any to any icmptypes 0,3,8,11,12,13,14
|
|
|
|
# Rechazamos todo lo demás.
|
|
$fwcmd add deny log ip from any to any</programlisting>
|
|
|
|
<para>Ya tiene usted un cortafuegos totalmente funcional que
|
|
acepta todas las conexiones a los puertos 22 y 80 y registrará
|
|
cualquier otro tipo de intento de conexión en un fichero
|
|
<filename>log</filename>. Ahora podemos reiniciar tranquilamente
|
|
y su cortafuegos debería empezar a trabajar tal y como le
|
|
hemos dicho. Si le parece que hay algún dato incorrecto o
|
|
tiene alguna sugerencia para mejorar éste documento por
|
|
favor envíeme un correo electrónico.</para>
|
|
</sect1>
|
|
|
|
<sect1>
|
|
<title>Preguntas</title>
|
|
|
|
<qandaset>
|
|
<qandaentry>
|
|
<question>
|
|
<para>¿Por qué utiliza &man.natd.8; y
|
|
&man.ipfw.8; cuando podría usar los filtros
|
|
incluídos en &man.ppp.8;?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Seré honesto y diré que no hay una
|
|
razón clara por la que use <command>ipfw</command> y
|
|
<command>natd</command> en lugar de los filtros que incorpora
|
|
<command>ppp</command>. Tras hablarlo con mucha gente el
|
|
consenso parece ser que <command>ipfw</command>
|
|
es mucho más potente y configurable que el filtrado
|
|
de <command>ppp</command> pero lo que se gana en
|
|
funcionalidad lo pierde en facilidad de
|
|
personalización. Una de las razones por las que
|
|
prefiero usar esas aplicaciones es que creo má conveniente
|
|
ejecutar un cortafuegos desde el kernel que desde una
|
|
aplicación de entorno de usuario.</para>
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Me aparecen mensajes como <errorname>limit 100 reached on
|
|
entry 2800</errorname> y después de eso ya no me aparecen
|
|
más entradas indicando tráfico rechazado en mis
|
|
<filename>logs</filename>. ¿Funciona mi
|
|
cortafuegos?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Esto significa simplemente que se ha alcanzado el
|
|
máximo de entradas que pueden incluírse en el
|
|
<filename>log</filename> cuando una determinada regla
|
|
se ha cumplido. Esa regla sigue
|
|
funcionando pero no enviaría más entradas al
|
|
<filename>log</filename> hasta que el contador vuelva a
|
|
cero. Puede poner a cero ese contador mediante
|
|
<command>ipfw resetlog</command>. Además es posible
|
|
elevar el límite de entradas a introducir en el
|
|
<filename>log</filename> incluyendo la <quote>option</quote>
|
|
<option>IPFIREWALL_VERBOSE_LIMIT</option> en el fichero de
|
|
de configuración del kernel. Por otra parte puede
|
|
modificar ese valor (sin modificar su kernel y en consecuencia
|
|
sin reiniciar la máquina) mediante el valor de
|
|
&man.sysctl.8; net.inet.ip.fw.verbose_limit.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Supongamos que estoy usando direcciones privadas internas,
|
|
por ejemplo el rango 192.168.0.0. ¿Puedo añadir
|
|
una regla al cortafuegos mediante un comando como
|
|
<literal>$fwcmd add
|
|
deny all from any to 192.168.0.0:255.255.0.0 via tun0</literal>
|
|
para prevenir intentos de acceso desde el exterior para conectar
|
|
con máquinas de mi red?.</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>La respuesta corta es no. La razón es que
|
|
<command>natd</command> efectúa la traducción
|
|
de direcciones para <emphasis>cualquier cosa</emphasis> que
|
|
sea redirigida a través del dispositivo
|
|
<devicename>tun0</devicename>. Eso significa que todos los
|
|
paquetes entrantes hablarán exclusivamente con la IP
|
|
asignada dinámicamente y <emphasis>no</emphasis> con la
|
|
red interna. Hay que tener en cuenta sin embargo que es posible
|
|
añadir una regla como
|
|
<literal>$fwcmd add deny all from 192.168.0.4:255.255.0.0
|
|
to any via tun0</literal>, que evitaría que una de las
|
|
máquinas de esa red enviara tráfico al exterior
|
|
a través del cortafuegos.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Debo de haber hecho algo mal. He seguido las instrucciones
|
|
al pie de la letra y no tengo acceso a Internet.</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Estamos asumiendo que está usando
|
|
<emphasis>userland-ppp</emphasis>, en consecuencia el conjunto
|
|
de reglas que aquí se proponen operan en el interfaz
|
|
<devicename>tun0</devicename>, que corresponde a la primera
|
|
conexión efectuada mediante &man.ppp.8; (más
|
|
conocido como <emphasis>user-ppp</emphasis>). Las conexiones
|
|
efectuadas más tarde recibirán nombres como
|
|
<devicename>tun1</devicename>, <devicename>tun2</devicename> y
|
|
así sucesivamente.</para>
|
|
|
|
<para>Hay que tener también presente que &man.pppd.8;
|
|
en cambio utiliza el interfaz <devicename>ppp0</devicename>,
|
|
de modo que si se inicia la conexión con &man.pppd.8; hay
|
|
que sustituír <devicename>tun0</devicename> por
|
|
<devicename>ppp0</devicename>. A continuación se muestra
|
|
una forma muy limpia de modificar las reglas del
|
|
cortafuegos. Conservaremos un fichero con las reglas originales
|
|
con el nombre de
|
|
<filename>fwrules_tun0</filename>.</para>
|
|
|
|
<screen> &prompt.user; <userinput>cd /etc/firewall</userinput>
|
|
/etc/firewall&prompt.user; <userinput>su</userinput>
|
|
<prompt>Password:</prompt>
|
|
/etc/firewall&prompt.root; <userinput>mv fwrules fwrules_tun0</userinput>
|
|
/etc/firewall&prompt.root; <userinput>cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules</userinput>
|
|
</screen>
|
|
|
|
<para>Para saber exactamente si está usando &man.ppp.8; o
|
|
&man.pppd.8; examine la salida de &man.ifconfig.8; una vez que
|
|
establezca la conexión. V.g., en una conexión
|
|
hecha mediante &man.pppd.8; debería encontrarse con
|
|
algo muy similar a lo siguiente (se muestran sólo las
|
|
líneas relevantes):</para>
|
|
|
|
<screen> &prompt.user; <userinput>ifconfig</userinput>
|
|
<emphasis>(eliminado...)</emphasis>
|
|
ppp0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
|
|
inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xff000000</replaceable>
|
|
<emphasis>(eliminado...)</emphasis>
|
|
</screen>
|
|
|
|
|
|
<para>Si por el contrario la conexión fué
|
|
establecida mediante &man.ppp.8;
|
|
(<emphasis>user-ppp</emphasis>) ésto es más o
|
|
menos lo que se encontraría:</para>
|
|
|
|
<screen> &prompt.user; <userinput>ifconfig</userinput>
|
|
<emphasis>(eliminado...)</emphasis>
|
|
ppp0: flags=<replaceable>8010<POINTOPOINT,MULTICAST> mtu 1500</replaceable>
|
|
<emphasis>(skipped...)</emphasis>
|
|
tun0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
|
|
<emphasis>(IPv6 stuff skipped...)</emphasis>
|
|
inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xffffff00</replaceable>
|
|
Opened by PID <replaceable>xxxxx</replaceable>
|
|
<emphasis>(eliminado...)</emphasis></screen>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandaset>
|
|
</sect1>
|
|
</article>
|