Redes en Linux Parte 2

Redes en Linux Parte 1

5.9.1. /etc/protocols

El fichero /etc/protocols es una base de datos que correlaciona
números de identificación de protocolos con sus nombres. Esto lo usan
los programadores para especificar protocolos por su nombre en sus
programas y también por programas como tcpdump para mostrar nombres en
lugar de números en su salida. En general la sintaxis del fichero es:

nombredelprotocolo número sobrenombres

El fichero /etc/protocols proporcionado con la distribución Debian
http://www.debian.org es como sigue:

  # /etc/protocols:
  # $Id: protocols,v 1.1 1995/02/24 01:09:41 imurdock Exp $
  #
  # Internet (IP) protocols
  #
  #       from: protocols     5.1 (Berkeley) 4/17/89
  #
  # Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).

  ip      0       IP              # internet protocol, pseudo protocol number
  icmp    1       ICMP            # internet control message protocol
  igmp    2       IGMP            # Internet Group Management
  ggp     3       GGP             # gateway-gateway protocol
  ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially «IP»)
  st      5       ST              # ST datagram mode
  tcp     6       TCP             # transmission control protocol
  egp     8       EGP             # exterior gateway protocol
  pup     12      PUP             # PARC universal packet protocol
  udp     17      UDP             # user datagram protocol
  hmp     20      HMP             # host monitoring protocol
  xns-idp 22      XNS-IDP         # Xerox NS IDP
  rdp     27      RDP             # reliable datagram protocol
  iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4
  xtp     36      XTP             # Xpress Tranfer Protocol
  ddp     37      DDP             # Datagram Delivery Protocol
  idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
  rspf    73      RSPF            # Radio Shortest Path First.
  vmtp    81      VMTP            # Versatile Message Transport
  ospf    89      OSPFIGP         # Open Shortest Path First IGP
  ipip    94      IPIP            # Yet Another IP encapsulation
  encap   98      ENCAP           # Yet Another IP encapsulation

5.9.2. /etc/networks

El fichero /etc/networks tiene una función similar a la del fichero
/etc/hosts. Proporciona una base de datos sencilla de nombres de red y
direcciones de red. Su formato difiere en que sólo puede haber dos
campos por línea y los campos están codificados así:

nombredelared direccióndered

Un ejemplo podría ser:

       loopnet    127.0.0.0
       localnet   192.168.0.0
       amprnet    44.0.0.0

Cuando use órdenes como route, si un destino es una red y la red tiene
una entrada en el fichero /etc/networks entonces route mostrará el
nombre de la red en lugar de su dirección.

5.10. Seguridad en la red y control de acceso.

Déjeme empezar esta sección advirtiendo que la seguridad de su máquina
y red ante ataques maliciosos es un arte complejo. No me considero un
experto en este campo y aunque los mecanismos que voy a describir
puedan ayudar, si quiere tomarse en serio la seguridad entonces le
recomiendo que investigue un poco en el tema. Hay algunas buenas
referencias en Internet relacionadas con la seguridad, incluido el
Security HOWTO (Dispone de una traducción en
http://www.insflug.org/documentos/Seguridad-Como/.

Una regla general importante es: No ejecute servicios que no tenga
intención de usar’. Muchas distribuciones vienen configuradas con
todo tipo de servicios que se inician automáticamente. Para asegurar
un nivel mínimo de seguridad debería examinar el fichero
/etc/inetd.conf y comentar (poner un # al inicio de la línea) de toda
declaración de servicio que no vaya a usar. Buenos candidatos son:
shell, exec, uucp, ftp y servicios de información como finger, netstat
y systat.

Hay todo tipo de mecanismos de seguridad y control de acceso,
describiré los más elementales.

5.10.1. /etc/ftpusers

El fichero /etc/ftpusers es un mecanismo sencillo que le permite
denegar la entrada a ciertos usuarios mediante FTP. El fichero
/etc/ftpusers lo lee el programa demonio de FTP (ftpd) cuando se
recibe una conexión FTP. El fichero es una simple lista de aquellos
usuarios que no tienen permitido el acceso. Puede parecerse a esto:

# /etc/ftpusers - users not allowed to login via ftp
root
uucp
bin
mail

5.10.2. /etc/securetty

El fichero /etc/securetty permite especificar qué dispositivos tty
puede usar root para identificarse en el sistema. El fichero
/etc/securetty es leído por el programa de acceso (normalmente
/etc/login). Su formato es una lista de los nombres de dispositivos
tty permitidos, en todos los demás root tiene prohibida la entrada:

# /etc/securetty - tty's on which root is allowed to login
tty1
tty2
tty3
tty4

5.10.3. El mecanismo de control de acceso hosts de tcpd

El programa tcpd que ha visto listado en el fichero /etc/inetd.conf
proporciona mecanismos de control de registro y acceso a los servicios
que haya de proteger.

Cuando es invocado por el programa inetd lee dos ficheros que
contienen reglas de acceso y que permiten o deniegan acceso al
servidor que está protegiendo.

Mirará en los ficheros de reglas hasta que encuentre la primera
correspondencia. Si no se encuentran correspondencias asume que el
acceso debería estar permitido para todo el mundo. La secuencia de
archivos que revisa es: /etc/hosts.allow, /etc/hosts.deny. Describiré
cada uno de estos en seguida. Para una descripción completa de este
servicio debería referirse a las páginas del manual apropiadas
(hosts_access (5) es un buen punto de partida).

5.10.3.1. /etc/hosts.allow

El /etc/hosts.allow es un fichero de configuración del programa
/usr/sbin/tcpd. El fichero hosts.allow contiene reglas que describen
qué máquinas tienen permiso para acceder a un servicio en la suya.

El formato del fichero es bastante sencillo:

       # /etc/hosts.allow
       #
       # lista de servicios: lista de hosts [: orden]

lista de servicios
es una lista delimitada por comas de nombres de servidores a los
que se aplica esta regla. Ejemplos de nombre de servicio son:
ftpd, telnetd y fingerd.

lista de hosts
es una lista de nombres de máquinas, delimitada por comas. Aquí
también puede usar direcciones IP. De forma adicional, puede
especificar nombres de máquinas o direcciones usando caracteres
comodín para corresponder con grupos de máquinas. Por ejemplo:
gw.vk2ktj.ampr.org para una máquina específica, .uts.edu.au para
cualquier nombre de máquina que acabe en esa cadena, 44. para
cualquier dirección IP que comience con esos dígitos. Hay
algunas palabras especiales para simplificar la configuración,
algunas de las cuales son:

· ALL, que se corresponde con cualquier host.

· LOCAL se corresponde con cualquier nombre de host que no
contenga un . o sea que esté en el mismo dominio que su máquina;

· PARANOID se corresponde con cualquier nombre que no se
corresponda con esta dirección (name spoofing). Hay una última
palabra que también es útil. La palabra
· EXCEPT permite proporcionar una lista con excepciones. Esto lo
cubriremos en un capítulo posterior.

orden
es un parámetro opcional. Este parámetro es el camino completo
hasta una orden que debería ser ejecutada cada vez que se cumpla
esta regla. Podría por ejemplo ejecutar una instrucción que
intentase identificar quién está autenticado en el host que
conecta, o generar un mensaje de correo u otro tipo de alerta a
un administrador de sistema avisando de que alguien intenta
conectar. Hay cierto número de expansiones que podríamos
incluir, algunos ejemplos comunes son: %h se expande al nombre
de la máquina que se conecta o a su dirección si no tiene un
nombre, %d es el demonio que está siendo llamado.

Un ejemplo:

# /etc/hosts.allow
#
# Permitir correo a todo el mundo
in.smtpd: ALL
# Todo telnet y FTP sólo a hosts dentro de mi dominio y el host que tengo
# en caso
telnetd, ftpd: LOCAL, myhost.athome.org.au
# Permitir finger a cualquiera pero mantener un registro de quién es.
fingerd: ALL: (finger @%h | mail -s "finger desde %h" root)

5.10.3.2. /etc/hosts.deny

El fichero /etc/hosts.deny es un fichero de configuración del programa
/usr/sbin/tcpd. El fichero hosts.deny contiene reglas que describen
qué máquinas tienen prohibido el acceso a un servicio en su máquina.

Un ejemplo simple podría parecerse a esto:

# /etc/hosts.deny
#
# Desautorizar a todos los host con nombre sospechoso
ALL: PARANOID
#
# Desautorizar a todos los host.
ALL: ALL

La entrada PARANOID es redundante porque la otra entrada abarca todo
en cualquier caso. Ambas entradas serían razonables por defecto
dependiendo de sus requisitos particulares.

La configuración más segura es tener ALL: ALL por defecto en
/etc/hosts.deny para después dar permiso específicamente a aquellos
servicios y hosts que se desee en /etc/hosts.allow.

5.10.4. /etc/hosts.equiv

El fichero hosts.equiv se usa para garantizar a ciertos hosts y
usuarios derechos de acceso a cuentas en su máquina sin que tenga que
proporcionar una clave. Esto es útil en un entorno seguro donde
controle todas las máquinas, pero en otro caso es un peligro para la
seguridad. Su máquina es sólo tan segura como la menos segura de
aquellas en las que confíe. Para maximizar la seguridad, no use este
mecanismo, y anime a sus usuarios para que tampoco usen ficheros
.rhost.

5.10.5. Configure su demonio de ftp adecuadamente.

Muchos servidores estarán interesados en ejecutar un demonio de FTP
anónimo para permitir a otras personas que subir y descargar ficheros
sin necesidad de un userid específico. Si decide ofrecer este servicio
asegúrese de que configura el demonio de ftp apropiadamente para
acceso anónimo. La mayoría de las páginas de ftpd(8) describen cómo
hacerlo. Debería asegurarse siempre de que sigue estas instrucciones.
Una cosa importante es no usar una copia de su fichero /etc/passwd
habitual en el directorio /etc de la cuenta anónima; asegúrese de que
elimina todos los detalles sobre las cuentas excepto aquellos que deba
tener, ya que en otro caso será vulnerable a las técnicas de
adquisición de claves por fuerza bruta.

5.10.6. Cortafuegos para redes.

Un excelente medio de seguridad es no permitir que los datagramas
lleguen siquiera a su máquina o servidores. Esto lo cubre en
profundidad el http://www.insflug.org/documentos/Cortafuegos-Como/ y,
más concisamente, la última sección de este documento.

5.10.7. Otras sugerencias.

Hay otras sugerencias, que debería considerar, pero que realmente son
cuestión de cada uno.

sendmail
a pesar de su popularidad, el demonio sendmail aparece con
preocupante regularidad en los anuncios de alerta de seguridad.
Usted decides, pero yo elijo no ejecutarlo.

NFS y otros servicios Sun RPC
tenga cuidado con estos. Hay todo tipo de posibles formas de
explotar estos servicios. Es difícil de encontrar una opción a
los servicios NFS, y si decide usarlos, asegúrese de que es
cuidadoso con los permisos que da al configurarlo.

6. Información relacionada con IP y Ethernet

Esta sección cubre la información específica a Ethernet e IP. Estas
subsecciones han sido agrupadas juntas debido a que pienso que son las
más interesante dentro de la que previamente se llamó sección de
«Tecnología Específica». Cualquiera que tenga una LAN se beneficiará
de esta parte.

6.1. Ethernet

Los dispositivos Ethernet son eth0, eth1, eth2, etc. A la primera
tarjeta detectada por el núcleo se le asigna eth0 y al resto se les
asigna secuencialmente en el orden en que sean detectadas.

Por defecto, el núcleo de Linux sólo intenta buscar una tarjeta de
red, por lo que tendrá que pasarle algunos parámetros para forzar la
detección de las demás.

Para aprender cómo hacer trabajar una tarjeta Ethernet bajo Linux
debería acudir al Ethernet Howto, Ethernet-HOWTO.html.

Una vez que tenga el núcleo compilado para reconocer su tarjeta
Ethernet, configurar la tarjeta es sencillo.

Normalmente debería hacer algo como:

root# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
root# route add -net 192.168.0.0 netmask 255.255.255.0 eth0

La mayoría de los controladores Ethernet fueron desarrollados por
Donald Becker, becker@CESDIS.gsfc.nasa.gov.

6.2. EQL – ecualizador de tráfico para líneas múltiples

El nombre del dispositivo EQL es eql. Con las fuentes estándar del
núcleo sólo podrá tener un dispositivo EQL por máquina. EQL
proporciona un medio para utilizar múltiples líneas punto a punto como
un solo enlace PPP, slip o PLIP lógico para llevar tcp/ip. A menudo es
más barato usar varias líneas de baja velocidad que tener una sola
línea de alta velocidad.

Opciones de Compilación del Núcleo:

Network device support —
[*] Network device support
* EQL (serial line load balancing) support

Para poder usar este mecanismo la máquina en el otro extremo de la
línea debe admitirlo también. Linux, Livingstone Portmasters y los
nuevos servidores dial-in soportan servicios compatibles.

Para configurar EQL necesitará las herramientas eql que están
disponibles en
ftp://metalab.unc.edu/pub/linux/system/Serial/eql-1.2.tar.gz.

La configuración es bastante directa. Se comienza por la interfaz eql.
La interfaz es exactamente como la de cualquier otro dispositivo de
red. La dirección IP y mtu se configura usando ifconfig, con algo
como:

       root# ifconfig eql 192.168.10.1 mtu 1006

Lo siguiente que se necesita es iniciar manualmente cada una de las
líneas que se vayan a usar. Esta puede ser cualquier combinación de
dispositivos de red punto a punto. Cómo iniciar las conexiones depende
del tipo de enlace que sea, por lo que ha de mirar las secciones
apropiadas para más información.

Finalmente necesitará asociar el enlace serie con el dispositivo EQL,
esto se llama «esclavizar» y se hace con la orden eql_enslave como se
ve en el ejemplo:

       root# eql_enslave eql sl0 28800
       root# eql_enslave eql ppp0 14400

El parámetro velocidad estimada que se da a eql_enslave no hace nada
directamente. Lo usa el controlador (driver) EQL para determinar qué
parte de los datagramas va a recibir cada dispositivo, para así afinar
el balance de las líneas jugando con este valor.

Para disociar una línea de un dispositivo EQL use eql_emancipate de
esta manera:

       #root eql_emancipate eql sl0

Puede añadir rutas de la misma manera que para cualquier otro enlace
punto a punto, excepto en que las rutas deben referirse al dispositivo
eql en lugar de a los verdaderos dispositivos en serie. Normalmente
usará:

       root# route add default eql

El controlador EQL fue desarrollado por Simon Janes, simon@ncm.com.

6.3. IP Accounting (en Linux 2.0)

Los servicios de auditoría IP del núcleo de Linux le permiten
recolectar y analizar datos de uso de la red. Los datos recogidos
comprenden el número de paquetes y de bytes acumulados desde que se
puso a cero la última vez. Tiene a su disposición varias reglas para
categorizar estas cifras para que se ajusten a los propósitos que les
vaya a dar. Esta opción ha sido eliminada del núcleo a partir de la
versión 2.1.102, porque el viejo sistema de cortafuegos basado en
ipfwadm fue reemplazado por ipfwchains.

Opciones de Compilación del Núcleo:

Networking options —
[*] IP: accounting

Después de que haya compilado e instalado el núcleo necesitará hacer
uso de la orden ipfwadm para configurar la auditoría de IP. Hay muchas
maneras diferentes de obtener la información de auditoría para elegir.
He creado un ejemplo sencillo de lo que podría ser útil, pero debería
leer la página de manual de ipfwadm para obtener más información.

Escena: Tenemos una red Ethernet que accede a la Internet mediante un
enlace PPP. En la Ethernet tiene una máquina que ofrece cierta
variedad de servicios y está interesado en saber cuánto tráfico se
genera por cada conexión ftp y http, así como el tráfico total tcp y
udp.

Podrías usar un conjunto de órdenes que se pareciese a lo siguiente,
que se presenta como guión de ejecución de órdenes (shell script):

  #!/bin/sh
  #
  # Borrar las reglas de contabilidad
  ipfwadm -A -f
  #
  # Establecer macros
  localnet=44.136.8.96/29
  any=0/0
  # Agregar reglas para los segmentos de la red local
  ipfwadm -A in  -a -P tcp -D $localnet ftp-data
  ipfwadm -A out -a -P tcp -S $localnet ftp-data
  ipfwadm -A in  -a -P tcp -D $localnet www
  ipfwadm -A out -a -P tcp -S $localnet www
  ipfwadm -A in  -a -P tcp -D $localnet
  ipfwadm -A out -a -P tcp -S $localnet
  ipfwadm -A in  -a -P udp -D $localnet
  ipfwadm -A out -a -P udp -S $localnet
  #
  # Reglas por defecto
  ipfwadm -A in  -a -P tcp -D $any ftp-data
  ipfwadm -A out -a -P tcp -S $any ftp-data
  ipfwadm -A in  -a -P tcp -D $any www
  ipfwadm -A out -a -P tcp -S $any www
  ipfwadm -A in  -a -P tcp -D $any
  ipfwadm -A out -a -P tcp -S $any
  ipfwadm -A in  -a -P udp -D $any
  ipfwadm -A out -a -P udp -S $any
  #
  # Mostrar las reglas
  ipfwadm -A -l -n
  #

Los nombres ftp-data y www se refieren a líneas en /etc/services. La
última orden da una lista de cada una de las reglas de auditoría y
muestra los totales obtenidos.

Una cosa importante a tener en cuenta cuando analizamos IP accounting
es que los totales de todas las reglas que se han cumplido se han
incrementado, por tanto para obtener las diferencias tendrá que hacer
los cálculos apropiados. Por ejemplo, si quiero saber cuantos datos no
fueron de ftp, ni www restaré los totales individuales de la regla que
se corresponde con todos los puertos.

  root# ipfwadm -A -l -n
  IP accounting rules
   pkts bytes dir prot source               destination          ports
      0     0 in  tcp  0.0.0.0/0            44.136.8.96/29       * - 20
      0     0 out tcp  44.136.8.96/29       0.0.0.0/0            20 - *
     10  1166 in  tcp  0.0.0.0/0            44.136.8.96/29       * - 80
     10   572 out tcp  44.136.8.96/29       0.0.0.0/0            80 - *
    252 10943 in  tcp  0.0.0.0/0            44.136.8.96/29       * - *
    231 18831 out tcp  44.136.8.96/29       0.0.0.0/0             * - *
      0     0 in  udp  0.0.0.0/0            44.136.8.96/29       * - *
      0     0 out udp  44.136.8.96/29       0.0.0.0/0            * - *
      0     0 in  tcp  0.0.0.0/0            0.0.0.0/0            * - 20
      0     0 out tcp  0.0.0.0/0            0.0.0.0/0            20 - *
     10  1166 in  tcp  0.0.0.0/0            0.0.0.0/0            * - 80
     10   572 out tcp  0.0.0.0/0            0.0.0.0/0            80 - *
    253 10983 in  tcp  0.0.0.0/0            0.0.0.0/0            * - *
    231 18831 out tcp  0.0.0.0/0            0.0.0.0/0            * - *
      0     0 in  udp  0.0.0.0/0            0.0.0.0/0            * - *
      0     0 out udp  0.0.0.0/0            0.0.0.0/0            * - *

6.4. IP Accounting (en Linux 2.2)

El nuevo código para llevar la contabilidad se accede mediante «IP
Firewall Chains». Consulte la página principal de IP chains
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html si
desea más información. Entre otras cosas, necesitará usar ipchains en
lugar de ipfwadm para configurar sus filtros. (De
Documentation/Changes en las últimas fuentes del núcleo)

6.5. IP Aliasing

Hay algunas aplicaciones para las que es útil ser capaz de asignar
varias direcciones IP a un sólo dispositivo de red. Los Proveedores de
Servicios de Internet usan esto a menudo para ofertar a sus usuarios
WWW y FTP «a medida». Puede acudir al IP-Alias mini-HOWTO si quiere
obtener más información de la que aquí hay.

Opciones de Compilación del Núcleo:

Networking options —
….
[*] Network aliasing
….
* IP: aliasing support

Después de compilar e instalar su núcleo con la implementación de
IP_Alias, la configuración es muy sencilla. Los alias se añaden a
dispositivos de red virtuales asociados al verdadero dispositivo de
red. Se aplica una convención sencilla para dar nombres a estos
dispositivos, que es nombredisp:núm disp virtual, por ejemplo
eth0:0, ppp0:10, etc. Tenga en cuenta que dispositivo nombre:número
sólo se puede configurar después de haber activado la interfaz
principal.

Por ejemplo, asumiremos que tiene una red Ethernet que soporta dos
redes IP diferentes simultáneamente y quiere que tu máquina tenga
acceso directo a ambas. Podríamos hacer algo como:

root# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0

root# ifconfig eth0:0 192.168.10.1 netmask 255.255.255.0 up
root# route add -net 192.168.10.0 netmask 255.255.255.0 eth0:0

Para borrar un alias sencillamente añadimos un `-‘ al final de su
nombre y nos referimos a él de forma tan sencilla como:

       root# ifconfig eth0:0- 0

También serán borradas automáticamente todas las rutas asociadas con
ese alias.

6.6. IP Firewall (para Linux 2.0)

Los temas referentes a Cortafuegos IP y al trabajo con Cortafuegos
está cubierto en mayor profundidad en el
http://www.insflug.org/documentos/Cortafuegos-Como/. Tener un
Cortafuegos IP le permite asegurar su máquina frente a accesos por la
red no autorizados filtrando o permitiendo que entren datagramas de o
hacia las direcciones IP que sean designadas. Hay tres clases
diferentes de reglas, filtrado de entradas (incoming filtering),
filtrado de salidas (outgoing filtering) y filtrado de reenvíos
(forwarding filtering). Las reglas de entradas son aplicadas a los
datagramas recibidos en un dispositivo de red. Las reglas de salidas
se aplican a los datagramas que va a transmitir un dispositivo de red.
Las reglas de reenvíos se aplican a datagramas que se reciben pero que
no son para esta máquina, como por ejemplo datagramas que entran por
una interfaz para ser encaminados por otra.

Opciones de Compilación del Núcleo:

Networking options —
[*] Network firewalls
….
[*] IP: forwarding/gatewaying
….
[*] IP: firewalling
[ ] IP: firewall packet logging

La configuración de las reglas del cortafuegos IP se realiza usando la
orden ipfwadm. Como mencioné antes, yo no soy un experto en seguridad,
por lo aunque le voy a presentar un ejemplo que se puede usar, usted
debería investigar y desarrollar sus propias reglas si la seguridad es
algo que le importe.

El uso más común de los cortafuegos IP es probablemente cuando está
usando su máquina Linux como encaminador y pasarela (gateway)
cortafuegos para proteger tu red local de accesos sin autorización
desde fuera de la red.

La configuración siguiente está basada en una contribución de Arnt
Gulbrandsen, agulbra@troll.no.

El ejemplo describe la configuración de las reglas de cortafuegos en
la máquina cortafuegos/encaminadora ilustrada en este diagrama.

       -                                   -
        \                                  | 172.16.37.0
         \                                 |   /255.255.255.0
          \                 ---------      |
           |  172.16.174.30 | Linux |      |
       NET =================|  f/w  |------|    ..37.19
           |    PPP         | router|      |  --------
          /                 ---------      |--| Mail |
         /                                 |  | /DNS |
        /                                  |  --------
       -                                   -

Las órdenes que siguen, deberían normalmente estar situadas en un
fichero rc de manera que sean ejecutadas automáticamente cada vez que
el sistema reinicie. Para mayor seguridad deberían ser llamadas
después de que ser configuradas las interfaces de red, pero antes de
que las interfaces hayan sido puestas «en marcha» para prevenir
cualquier intento de acceder mientras la máquina cortafuegos está
reiniciando.

#!/bin/sh

# Limpiar la tabla de reglas de ‘Reenvíos’
# Cambiar la política por defecto a ‘accept’
#
/sbin/ipfwadm -F -f
/sbin/ipfwadm -F -p accept
#
# .. y lo mismo para ‘Entradas’
#
/sbin/ipfwadm -I -f
/sbin/ipfwadm -I -p accept

# Antes que nada, sellamos la interfaz PPP
# Me encantaría usar ‘-a deny’ en lugar de ‘-a reject -y’ pero entonces
# sería imposible originar conexiones desde ese interfaz.
# El -o causa que todos los datagramas rechazados sean registrados. Esto
# toma espacio de disco a cambio de tener el conocimiento de un ataque
# por error de configuración.
#
/sbin/ipfwadm -I -a reject -y -o -P tcp -S 0/0 -D 172.16.174.30

# Eliminar ciertos tipos de paquetes que obviamente han sido generados
# de forma ‘artificial’: No puede venir nada de direcciones
# multicast/anycast/broadcast
#
/sbin/ipfwadm -F -a deny -o -S 224.0/3 -D 172.16.37.0/24
#
# y nunca deberíamos ver llegar por un cable nada de la red
# ‘loopback’
#
/sbin/ipfwadm -F -a deny -o -S 127.0/8 -D 172.16.37.0/24

# aceptamos entradas de las conexiones SMTP y DNS, pero sólo
# hacia el Mail/Name Server
#
/sbin/ipfwadm -F -a accept -P tcp -S 0/0 -D 172.16.37.19 25 53
#
# DNS usa tanto UPD como TCP, por lo tanto los permitimos ambos
# para quien pregunte por nuestro servidor de nombres
#
/sbin/ipfwadm -F -a accept -P udp -S 0/0 -D 172.16.37.19 53
#
# pero no “respuestas” que lleguen a puertos peligrosos como el de NFS
# y extensiones de NFS de Larry McVoy. Si ejecutamos squid, añadir
# su puerto aquí también.
#
/sbin/ipfwadm -F -a deny -o -P udp -S 0/0 53 \
-D 172.16.37.0/24 2049 2050

# valen las respuestas a otros puertos de usuario
#
/sbin/ipfwadm -F -a accept -P udp -S 0/0 53 \
-D 172.16.37.0/24 53 1024:65535

# Rechazar conexiones de entrada a identd Usaremos ‘reject’ aquí para que
# se le diga al ordenador que intenta conectar que no continúe, si no lo
# hiciéramos, experimentaríamos retrasos mientras ident da un error de
# ‘time out’
#
/sbin/ipfwadm -F -a reject -o -P tcp -S 0/0 -D 172.16.37.0/24 113

# Aceptamos algunas conexiones a servicios comunes desde las redes
# 192.168.64 y 192.168.65, que son amistades en las que confiamos.
#
/sbin/ipfwadm -F -a accept -P tcp -S 192.168.64.0/23 \
-D 172.16.37.0/24 20:23

# aceptar y dejar pasar cualquier cosa que se origine dentro
#
/sbin/ipfwadm -F -a accept -P tcp -S 172.16.37.0/24 -D 0/0

# denegar la mayoría del resto de conexiones TCP y registrarlas
# (añade 1:1023 si tiene problemas con el FTP)
#
/sbin/ipfwadm -F -a deny -o -y -P tcp -S 0/0 -D 172.16.37.0/24

# … para UDP también
#
/sbin/ipfwadm -F -a deny -o -P udp -S 0/0 -D 172.16.37.0/24

Las buenas configuraciones de cortafuegos son un poco complicadillas.
Este ejemplo debería ser un punto de partida razonable. La página de
manual de ipfwadm ofrece más asistencia en lo que respecta al manejo
de la herramienta. Si intenta configurar un cortafuegos, asegúrese de
que hace suficientes preguntas para tener información de las fuentes
que considera fiables y haga algunas pruebas de funcionamiento con su
configuración desde el exterior de la red.

6.7. IP Firewall (para Linux 2.2)

Al nuevo código para controlar el cortafuegos se accede mediante IP
Firewall Chains. Consulte la página principal de IP Chains
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html si
desea más información. Entre otras cosas, necesitará usar ipchains en
lugar de ipfwadm para configurar sus filtros. (De
Documentation/Changes en las últimas fuentes del núcleo)

Estamos avisados de que esto está seguramente desfasado y estamos
trabajando para tener esta sección más al día. Es posible que tengamos
una versión nueva para agosto de 1999.

6.8. Encapsulación IPIP

¿Qué razón hay para encapsular datagramas IP dentro de datagramas IP?
Le parecerá una tontería si nunca ha visto antes sus aplicaciones.
Bien, aquí tenemos un par de ejemplos comunes en los que se usa:
Mobile-IP e IP-Multicast. Posiblemente su uso más extendido o al
menos el mejor conocido es Amateur Radio.

Opciones de Compilación del Núcleo:

Networking options —
[*] TCP/IP networking
[*] IP: forwarding/gatewaying
….
* IP: tunneling

Los dispositivos túneles de IP se denominan tunl0, tunl1, etc.

¿Pero por qué?. Bien, bien. Las reglas convencionales de
encaminamiento de redes IP comprenden direcciones de red y máscaras de
red. Esto hace que conjuntos de direcciones contiguas sean encaminadas
mediante una sola regla de encaminamiento. Esto es muy conveniente,
pero significa que sólo puede usar una dirección IP en particular
cuando está conectado a alguna parte de la red a la que pertenece. En
la mayoría de los casos esto vale, pero si suele desplazarse entonces
no será capaz siempre de conectar desde el mismo sitio. La
encapsulación IP/IP (IP tunneling) le permite saltarse esta
restricción permitiendo que los datagramas que están destinados a su
dirección IP sean encapsulados y dirigidos a otra dirección IP. Si
sabe que va a estar durante un tiempo trabajando en otra red IP
entonces podrá poner a punto una máquina de su red habitual para que
acepte los datagramas que van dirigidos a su IP y que los reenvíe a la
dirección que esté usando de manera temporal.

6.8.1. Una configuración de red con túneles

        192.168.1/24                          192.168.2/24

            -                                     -
            |      ppp0 =            ppp0 =       |
            |  aaa.bbb.ccc.ddd  fff.ggg.hhh.iii   |
            |                                     |
            |   /-----\                 /-----\   |
            |   |     |       //        |     |   |
            |---|  A  |------//---------|  B  |---|
            |   |     |     //          |     |   |
            |   \-----/                 \-----/   |
            |                                     |
            -                                     -

El diagrama ilustra otra posible razón para usar encapsulación IPIP,
las redes privadas virtuales. Este ejemplo presupone que tiene dos
máquinas cada una con una sola conexión ppp a Internet. Cada máquina
tiene una sola dirección IP. Tras cada una de estas máquinas hay
algunas redes privadas de área local configuradas con direcciones de
red IP reservadas. Supongamos que quiere permitir que cualquier
máquina en la red A se conecte con cualquier máquina en la red B, como
si estuvieran conectadas a Internet por una ruta de red. La
encapsulación IP se lo permitirá. Tenga en cuenta que la encapsulación
no resuelve el problema de cómo hacer que las máquinas las redes A y B
se comuniquen con otras máquinas en Internet, ya que para seguimos
necesitando trucos como el Enmascaramiento IP. La encapsulación la
realiza normalmente una máquina que esté funcionando como encaminador.

El encaminador Linux A debería configurarse así:

#!/bin/sh
PATH=/sbin:/usr/sbin
mask=255.255.255.0
remotegw=fff.ggg.hhh.iii
#
# Configuración Ethernet
ifconfig eth0 192.168.1.1 netmask $mask up
route add -net 192.168.1.0 netmask $mask eth0
#
# Configuración ppp0 (iniciar enlace ppp, establecer ruta por defecto)
pppd
route add default ppp0
#
# Configuración del dispositivo túnel
ifconfig tunl0 192.168.1.1 up
route add -net 192.168.2.0 netmask $mask gw $remotegw tunl0

El encaminador Linux `B’ debería configurarse con:

#!/bin/sh
PATH=/sbin:/usr/sbin
mask=255.255.255.0
remotegw=aaa.bbb.ccc.ddd
#
# Configuración Ethernet
ifconfig eth0 192.168.2.1 netmask $mask up
route add -net 192.168.2.0 netmask $mask eth0
#
# Configuración ppp0 (iniciar enlace PPP, establecer ruta por defecto)
pppd
route add default ppp0
#
# Configuración del dispositivo túnel
ifconfig tunl0 192.168.2.1 up
route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0

La orden:

       route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0

se leería: Envía cualquier datagrama destinado a 192.168.1.0/24 dentro
de un datagrama IPIP con dirección de destino aaa.bbb.ccc.ddd’.

Las configuraciones son recíprocas en cada extremo. El dispositivo de
túnel usa el gw dado en la ruta como destino del datagrama IP en el
que encerrará el datagrama que ha recibido para encaminar. Esa
máquina debe saber cómo desencapsular datagramas IPIP, esto es, debe
también estar configurada con un dispositivo túnel.

6.8.2. Configuración de la máquina cuyos paquetes serán encapsulados

No tiene por qué estar encaminando una red entera. Por ejemplo puede
estar encapsulando una sola dirección IP. En este caso podría
configurar el dispositivo tunl en la máquina `remota’ con su dirección
IP y el extremo A usará la máquina encaminadora (y Proxy Arp) en lugar
encaminar la red a través del dispositivo túnel. Dibujemos de nuevo y
modifiquemos apropiadamente nuestra configuración. Ahora tenemos una
máquina B que quiere actuar y comportarse como si estuviera conectada
a Internet y al mismo tiempo fuera parte de una red remota soportada
por la máquina A:

        192.168.1/24

            -
            |      ppp0 =                ppp0 =
            |  aaa.bbb.ccc.ddd      fff.ggg.hhh.iii
            |
            |   /-----\                 /-----\
            |   |     |       //        |     |
            |---|  A  |------//---------|  B  |
            |   |     |     //          |     |
            |   \-----/                 \-----/
            |                      también: 192.168.1.12
            -

El encaminador Linux A debería configurarse así:

#!/bin/sh
PATH=/sbin:/usr/sbin
mask=255.255.255.0
remotegw=fff.ggg.hhh.iii
#
# Configuración Ethernet
ifconfig eth0 192.168.1.1 netmask $mask up
route add -net 192.168.1.0 netmask $mask eth0
#
# Configuración ppp0 (iniciar enlace ppp, establecer ruta por defecto)
pppd
route add default ppp0
#
# Configuración del dispositivo túnel
ifconfig tunl0 192.168.1.1 up
route add -host 192.168.1.12 gw $remotegw tunl0
#
# Proxy ARP para la máquina remota
arp -s 192.168.1.12 xx:xx:xx:xx:xx:xx pub

El encaminador Linux B debería configurarse así:

#!/bin/sh
PATH=/sbin:/usr/sbin
mask=255.255.255.0
remotegw=aaa.bbb.ccc.ddd
#
# Configuración ppp0 (iniciar enlace ppp, establecer ruta por
# defecto)
pppd
route add default ppp0
#
# Configuración del dispositivo túnel
ifconfig tunl0 192.168.1.12 up
route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0

Esta clase de configuración es más típica de aplicaciones Mobile-IP,
donde una máquina quiere moverse por Internet y mantener una única IP
fija. Debería leer la sección Mobile-IP (IP Móvil) si quiere más
información de cómo se hace esto en la práctica.

6.9. Enmascarado IP ( IP Masquerade )

Mucha gente dispone de una sola cuenta por conexión telefónica para
conectarse a Internet. Casi todos los que utilizan esa configuración
se ve limitado a una sola dirección IP que le da el Proveedor de
Servicios de Internet. Esto normalmente es bastante para permitir un
sólo acceso completo a la red. El Enmascarado IP es un truco
inteligente que permite que varias máquinas usen una sola dirección
IP, haciendo que las otras máquinas se hagan pasar, y de ahí el
término de enmascaramiento, por la máquina que realmente tiene la
conexión. Hay un pequeño defecto y es que el enmascarado funciona casi
siempre en un sólo sentido, y este es que las máquinas enmascaradas
pueden hacer llamadas, pero no pueden aceptar o recibir llamadas de
otras máquinas remotas. Esto significa que algunos servicios de red
como talk no funcionarán y otros como ftp deberán ser configurados en
modo pasivo (PASV) para que funcionen. Afortunadamente los servicios
de red más comunes como telnet, WWW e irc funcionan bien.

Opciones de Compilación de Red:

Code maturity level options —
[*] Prompt for development and/or incomplete code/drivers
Networking options —
[*] Network firewalls
….
[*] TCP/IP networking
[*] IP: forwarding/gatewaying
….
[*] IP: masquerading (EXPERIMENTAL)

Lo normal es que su máquina Linux esté usando una línea slip o PPP
como si fuera una máquina aislada. Sin embargo, podemos tener además
otros dispositivos de red configurados, quizá una ethernet,
configurada con una de las direcciones de red privadas. Las máquinas
que van a ser enmascaradas podrían estar en esta segunda red. Cada una
de ellas debería tener asignada la dirección IP del puerto Ethernet de
la máquina Linux como la pasarela (gateway) por defecto.
Una configuración típica podría ser algo parecido a:

       -                                   -
        \                                  | 192.168.1.0
         \                                 |   /255.255.255.0
          \                 ---------      |
           |                | Linux | .1.1 |
       NET =================| masq  |------|
           |    PPP/slip    | router|      |  --------
          /                 ---------      |--| host |
         /                                 |  |      |
        /                                  |  --------
       -                                   -

Enmascarado con IPFWADM

Las órdenes más importantes para esta configuración son:

# Ruta de red hacia la Ethernet
route add -net 192.168.1.0 netmask 255.255.255.0 eth0
#
# Ruta por defecto al resto de Internet
route add default ppp0
#
# Hace que todas las máquinas de la red 192.168.1/24 sean
# enmascarados
ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0

Enmascarado con IPCHAINS

# Ruta de red hacia la Ethernet
route add -net 192.168.1.0 netmask 255.255.255.0 eth0
#
# Ruta por defecto al resto de Internet
route add default ppp0
#
# Hace que todas las máquinas de la red 192.168.1/24 sean
# enmascarados
ipchains -A forward -s 192.168.1.0/24 -j MASQ

Puede obtener más información sobre Enmascarado IP de Linux en la
página de recursos de IP Masquerade
http://www.hwy401.com/achau/ipmasq. También hay un documento muy
detallado que habla sobre enmascaramiento, que es el IP-Masquerade-
Como (que también enseña a configurar otros sistemas operativos para
trabajar teniendo un Linux como servidor enmascarador).

6.10. Proxy IP transparente

El proxy transparente de IP es una característica que le permite
redirigir servidores o servicios destinados a otra máquina a esos
servicios en esta máquina. Normalmente esto es útil cuando tiene un
Linux como encaminador que además proporciona un servidor proxy.
Debería redirigir todas las conexiones destinadas a este servicio de
forma remota al servidor local de proxy.

Opciones de Compilación del Núcleo:

Code maturity level options —
[*] Prompt for development and/or incomplete code/drivers
Networking options —
[*] Network firewalls
….
[*] TCP/IP networking
….
[*] IP: firewalling
….
[*] IP: transparent proxy support (EXPERIMENTAL)

La configuración de la característica de proxy transparente se realiza
mediante la orden ipfwadm.

Un ejemplo que podría ser útil es el siguiente:

       root# ipfwadm -I -a accept -D 0/0 telnet -r 2323

Este ejemplo hará que cualquier intento de conexión al puerto telnet
(23) por parte de otra máquina sea redirigida al puerto 2323 de esta
máquina. Si tiene un servicio activo en ese puerto, podría redirigir
las conexiones telnet, hacer un registro de lo que pasa, o cualquier
cosa que se ajuste a sus necesidades.

Un ejemplo más interesante es redirigir todo el tráfico http a través
de un almacén caché local. Sin embargo, el protocolo usado por los
servidores proxy es diferente al http nativo: mientras que un cliente
conecta a www.servidor.com:80 y pregunta por /camino/página, cuando
conecta a la caché local busca proxy.dominio.local:8080 y pregunta por
www.servidor.com/camino/página.

Para filtrar una petición http a través del proxy local, necesitará
adaptar el protocolo insertando un pequeño servidor llamado transproxy
(lo puede encontrar en la web). Si quiere puede ejecutarlo en el
puerto 8081, y ejecutar esta orden:

root# ipfwadm -I -a accept -D 0/0 80 -r 8081

Entonces, el programa transproxy recibirá todas las conexiones que
tengan que alcanzar servidores externos y las pasará al proxy local
arreglando las diferencias de protocolo.

6.11. IPv6

¡Justo ahora que creía que empezaba a entender las redes IP las reglas
cambian! IPv6 es la notación abreviada de la versión 6 del Internet
Protocol. IPv6 fue desarrollada principalmente para responder a los
temores de la comunidad de Internet al respecto de que pronto habrá
escasez de direcciones IP para asignar. Las direcciones IPv6 son de 16
bytes (128 bits). IPv6 incorpora varios cambios más, en su mayor parte
simplificaciones, que harán que las redes IPv6 sean más manejables que
las IPv4.

Linux ya tiene una implementación de IPv6 que funciona, pero no está
completa, a partir de la serie de núcleos 2.2.*.

Si quiere experimentar con esta próxima generación de tecnología de
Internet, o le hace falta, debería leerse la IPv6-FAQ que está
disponible en http://www.terra.net/ipv6.

6.12. Mobile IP

El término movilidad de IP describe la habilidad de una máquina que es
capaz de mover su conexión de red de un punto de Internet a otro sin
cambiar su dirección IP o perder conectividad. Normalmente cuando una
máquina con IP cambia su punto de conexión también debe cambiar su
dirección IP. La Movilidad de IP soluciona este problema asignando una
IP fija a la máquina móvil y usando encapsulación IP (tunneling) con
encaminado automático para asegurar que los datagramas destinados a
ella se encaminan a la verdadera dirección IP que esté usando en ese
momento.

Está en camino un proyecto para proporcionar un juego completo de
herramientas de movilidad de IP para Linux. El estado del proyecto y
las herramientas los puede obtener de la página principal de Linux
Mobile IP http://anchor.cs.binghamton.edu/~mobileip.

6.13. Multicast

IP Multicast permite encaminar datagramas IP hacia a un número
arbitrario de máquinas con IP de forma simultánea. Este mecanismo se
explota para proporcionar material de amplia distribución por Internet
como transmisiones de imagen y sonido y otras aplicaciones noveles.

Opciones de Compilación del Núcleo:

Networking options —
[*] TCP/IP networking
….
[*] IP: multicasting

Esto requiere un conjunto de herramientas y algo de configuración de
la red. Una fuente de información sobre cómo instalar y configurar
esto para Linux la encontramos en
http://www.teksouth.com/linux/multicast.

6.14. red) NAT – Network Address Translation (Traducción de direc­
ciones de

El servicio de Traducción de Direcciones de Redes IP es algo así como
el hermano mayor estandarizado del servicio de Enmascarado IP de
Linux. Está especificado con cierto detalle en el RFC-1631 en su
archivo RFC más próximo. NAT proporciona características que no posee
el Enmascarado IP que lo hacen eminentemente más apropiado para su uso
en los diseños de encaminamiento de cortafuegos corporativos y en
instalaciones a mayor escala.

Michael Hasenstein, Michael.Hasenstein@informatik.tu-chemnitz.de, ha
desarrollado una implementación alfa de NAT para el núcleo 2.0.29 de
Linux. La documentación e implementación de Michaels está disponible
en: la página Web de Linux IP Network Address http://www.csn.tu-
chemnitz.de/HyperNews/get/linux-ip-nat.html

Los núcleos más modernos de Linux 2.2.x también incluyen algo de la
funcionalidad NAT en el algoritmo de encaminamiento.

6.15. Traffic Shaper (Manipulación del ancho de banda)

El traffic shaper (regulador de caudal) es un controlador que crea
nuevas interfaces de red, las cuales tienen una limitación en el
caudal, definida por el usuario, y que actúan sobre una interfaz de
red física para hacer la comunicación real, pudiendo ser utilizadas
por el encaminador para el tráfico saliente.

El regulador fue introducido con Linux-2.1.15 y fue portado a
Linux-2.0.36 (apareció en el 2.0.36-pre-patch-2 distribuido por Alan
Cox, el autor del dispositivo regulador y mantenedor de Linux-2.0).

El regulador de caudal sólo puede ser compilado como módulo y para
configurarlo se usa el programa shapecfg con órdenes como las
siguientes:

       shapecfg attach shaper0 eth1
       shapecfg speed shaper0 64000

El dispositivo regulador sólo puede controlar el ancho de banda del
tráfico de salida, ya que los paquetes son transmitidos a través suyo
de acuerdo con las tablas de rutas; sin embargo, una funcionalidad de
rutas por dirección de origen podría ayudar a limitar el ancho de
banda global de máquinas específicas que estén usando un encaminador
Linux.

Linux-2.2 implementa también ese tipo de encaminamiento, y si lo
necesita en Linux-2.0, busque el parche de Mike McLagan, en
ftp://ftp.invlogic.com. Lea Documentation/networking/shaper.txt si
desea más información al respecto del shaper.

Si quiere probar un intento de regulación de caudal de paquetes
entrantes, use rshaper-1.01 (o más nuevo). Lo encontrará en
ftp://ftp.systemy.it/pub/develop.

6.16. Encaminamiento con Linux-2.2

La última versión de Linux, la 2.2, ofrece mucha flexibilidad en lo
que a política de encaminamiento se refiere. Desafortunadamente,
deberá esperar a la siguiente versión de este Como, o acudir a las
fuentes del núcleo.

Redes en Linux Parte 3

Los comentarios están cerrados.