"La Gaceta de Linux... haciendo de Linux algo un poco más divertido!"


Redes Privadas y "Roadrunner" usando IP Masquerading

Por: Mark Nielsen y Andrew Byrd

Traducido al Español por Andoni Sáenz de Santamaría Zavala y David Barbarin Aramendia
el día 2 de Agosto del 2000 para La Gaceta de Linux


Abstract

El propósito de este artículo es el de ayudar a configurar una red TCP/IP privada mascarada conectada a Internet a través del servicio cable modem Roadrunner de Time Warner's. Es una reescritura de un artículo anterior sobre el mismo tema. Este es un serio ejercicio de redes, involucrando conceptos desde DNS a firewalls. Cuando complete este proyecto, realmente tendrá alguna experiencia en redes de pequeña escala.

Hay dos “yo”es en este artículo. A veces es Andrew y otras es Mark.

There are two "I"'s in this document. Sometimes it is Andrew talking, and sometimes it is Mark.


Table of Contents

  1. Lecturas requeridas

  2. La Visión Completa

  3. Eligiendo el equipo

  4. Instalando y configurando el encaminador o Gateway

  5. Configurando IPChains / Masquerading

  6. Configurando el DNS en la Red Privada

  7. Instalando y configurando las Estaciones de Trabajo

  8. Puntos relevantes sobre Seguridad

  9. DNS Dinámico

  10. Comentarios y Notas adicionales

  11. Archivos de Ejemplos

Lecturas requeridas

Los siguientes COMOS y documentos contienen la información básica necesaria requerida para entender el resto de éste documento. Si se procede sin haber leido éstos se corre el riesgo de no entender completamente lo que se está haciendo.

  1. Networking - Información básica de Ethernet y TCP/IP. Las ecciones 5 y 6 son las mas relevantes.

  2. IPCHAINS - IP Firewall Chains llevarán a cabo la mayor parte del trabajo en nuestra configuración. Además tienen que ver son implicantes de seguridad.

  3. DNS - configurando el DNS será mucho mas fácil si se entiende como funciona.

  4. IP Masquerading - cobierto de manera más general de lo que lo haremos aquí.

  5. Nuestro artículo anterior sobre éste mismo tema.

  6. Sitio de ayuda de RRLinux

  7. Seguridad Unix de Yahoo.

  8. The Central Ohio Linux User Group -- de donde provienen muchas de las ideas.

La Visión Completa

This diagram demonstrates the basic idea:


Cada punto grueso negro del diagrama corresponde a una interfaz de tarjeta Ethernet, y cada línea conectora is un cable CAT5, con la excepción del que sale del cable modem, que es su conexión a Timer Warner. Es de destacar que es necesario una tarjeta en cada estación de trabajo, y dos en el gateway (encaminador).

Su estación de trabajo y el hub (concentrador) están dentro de su red privada, indicado por un fondo blanco en la imagen, y el resto del mundo se muestra en la zona gris. Obsérvese que el gateway está entre ambos, haciendo de frontera. Cada uno de las tarjetas Ethernet tiene una asignada una dirección IP, y su encaminador tiene una dirección en la red pública (externa), y otra en la privada (interna). Configurado de esa forma, el encaminador tiene la responsabilidad de encargarse de las comunicaciones de la red privada hacia el exterior, y viceversa.

Para el propósito de este artículo, se ha asignado a la red interna la dirección privada 10.x.x.x (máscara de red 255.0.0.0), y se ha escogido el dominio "local". Esto puede ser cambiado si sabe lo que se está haciendo, pero debería funcionar para todo el mundo.

Las estaciones de trabajo se designan desde la "et1.local" (10.0.0.10) hasta la "et3.local" (10.0.0.30) y el encaminador de masquerading se denomina "principal.local" (10.0.0.1 en su interfaz de red privada.) Al igual que antes, este esquema puede ser modificado acorde con sus necesidades.



Eligiendo el equipo

La máquina encaminadora requiere relativamente pocos recursos, y puede incluso ser un viejo '486 con poca memoria, ya que el enrutado de paquetes no requiere una gran potencia. El truco está en que pueda correr Linux.

Las estaciones de trabajo pueden ser cualquier máquina que corra sobre un sistema operativo que soporte TCP/IP, como Linux, MacOS, o incluso sistemas operativos de MicroSoft, y habrá que poner en cada máquina una tarjeta ethernet.

Escoja un concentrador 10/100 con detección de velocidad, simplificará mucho las cosas. Use tarjetas Ethernet de 100 Mbit en la red interna, y la tarjeta Ethernet que conecta a su encaminador hacia fuera puede ser de 10 Mbits. Es recomendable usar el mismo tipo de tarjetas Ethernet, todas a 10/100.

Una buena idea es usar tarjetas Ethernet PCI en máquinas linux. Las tarjetas Ethernet hoy en día son bastante baratas, y el que sean PCI puede evitar posibles quebraderos de cabeza en la fase de configuración. Se ha usado la tarjeta Netgear FA310TX. En cualquier caso, es recomendable comprobar la compatibilidad de la tarjeta de red que vaya a usar con el sistema operativo que vaya a usar. Si han de usarse tarjetas ISA, las tarjetas 3com 3c509s y compatibles, son bastante sencillas de usar. Téngase en cuenta que si se está usando una máquina antigua como encaminador, puede que sólo tenga ranuras ISA, obligándole a usar dos ranuras ISA. En ese caso, habrá que configurar las tarjetas de red para que usen una IO (dirección de memoria) y una IRQ predeterminadas, para prevenir conflictos. Normalmente esto se suele hacer mediante un programa de DOS o físicamente mediante jumpers. También se puede hacer con las utilidades del paquete isapnptools (plug & play) de Linux si la tarjeta es plug&play.


Instalando y configurando el encaminador o Gateway

La máquina que ha de ser su encaminador será el odenador al que se conecta el RR.

En primer lugar, instale físicamente las tarjetas Ethernet en la máquina. Es menos confuso usar dos tarjetas de red en el encaminador; teniendo un único driver por cada tarjeta, así podrá saber con seguridad cuál es la inerfaz eth0 y cuál es la eth1, y también disminuir las posibilidades de conflictos entre las tarjetas.

Empiece en el encaminador con una instalación limpia de la distribución Redhat 6. Si se dispone de espacio en el disco duro, siga adelante e instale todo, pero realmente no necesitará el Servidor X, software de procesamiento gráfico, etc. en esta máquina. Asegúrese de que se está instalando ipchains, BIND, cacheo del servidor de nombres, pump, y otros paquetes típicos que se han tratado anteriormente. Al mismo tiempo dígale al programa de instalación que inicie named al arrancar.

En este artículo, eth0 será la interfaz que se comunica con el cable modem, y eth1 será la interfaz dentro de la red privada. Probablemente pueda levantar la primera interfaz de red durante la instalación inicial. Tenga la interfaz eth0 conectada al cable modem con el cable cruzado y dígale que use DHCP para conseguir su dirección IP (no especifique ninguna) porque el servicio Roadrunner le asignará una dirección IP. Utilice el programa netconf (o edite los ficheros /etc/sysconfig/network-scripts/ifcfg-eth? Y /etc/conf.modules directamente) para iniciar la interfaz eth1 al arrancar el ordenador, y asignarle a esta una dirección IP en la red privada (10.0.0.1). Puede costar tener las dos tarjetas detectadas y en marcha. Asegúrese de especificar los módules de kernel/drivers correctos, y una vez que pueda hacer 'ifconfig' y ver ambos (o ver levantar ambos durante el proceso de arranque), debería estar listo para seguir adelante. Es posible compilar los drivers de la tarjeta de red en el núcleo (se hacía con frecuencia en el pasado) pero es frecuente y perfectamente aceptable simplemente usar módulos como hemos sugerido aquí.

Asegúrese de que su /etc/sysconfig/network se asemeja a esta y reemplace /etc/hosts con su propia versión de este archivo. El fichero /etc/hosts no es absolutamente necesario porque vamos a poner en marcha un servidor de nombres (DNS).

NOTA SOBRE DOS TARJETAS DE RED 3c509:
Monte ambas tarjetas Ethernet ISA antes de instalar RedHat Linux.

NOTA SOBRE DHCP:
Puede configurar DHCP usando Panel de control de RedHat, netconf, editando los ficheros manualmente, o durante la instalación de RedHat (o cualquier otra distribución de Linux que se esté usando).

Configurando IPChains / Masquerading

Intente hacer algún ping o traerse alguna página web mediante en lynx para ver si la conexión Roadrunner funciona. Si es así, está preparado para añadir masquerading. Añada al final this directivas de modprobe y comandos ipchains a su script /etc/rc.d/rc.local para habilitar el forwarding/masquerading y también proporcionar algunas normas estrictas de firewall.

Configurando el DNS en la Red Privada

'pump' (que recoge la información DHCP para eth0) también configura el fichero /etc/resolv.conf para usar el servidor de nombres de Roadrunner. Esto no proporciona ninguna funcionalidad para buscar nombres de servidores en nuestra red privada y requeriría que cada estación de trabajo tuviese una copia idéntica de /etc/hosts y establecer manualmente en cada estación un servidor de nombres Roadrunner. Esto puede resultar un poco confuso, por lo que se recomienda el uso de un servidor de nombres propio.

Con alguna información del DNS-COMO, debe crear o modificar /etc/named.conf, /etc/resolv.conf, y los ficheros relacionados en /var/named. Al mismo tiempo deberá crear o editar /etc/pump.conf para que pump no reescriba su configuración de resolv.conf cada vez que se levanta la interfaz de eth0. Verifique que 'named' se está iniciando en el arranque (deberá haber un enlace S??named en /etc/rc.d/rc3.d/ si lo es) y debería tener una cache del servidor de nombres en marcha desde el reinicio, además del servidor de nombres para su red privada.

Instalando y configurando las Estaciones de Trabajo

Asegúrese de que todas las máquinas de su red privada (incluyendo el gateway) está conectado a través de un concentrador y un cable Cat5, y entonces configure la estación de trabajo. Proporcione a cada máquina/interfaz una dirección IP única dentro de la red privada, y aquí hay un ejemplo /etc/sysconfig/network para estaciones de trabajo Linux. Añada un /etc/hosts personalizado y este fichero /etc/resolv.conf , y ya estará encaminado. Intente algunos pings y lea algunos documentos web desde una de las estaciones de trabajo para comprobar que el masquerading y el DNS funcionan correctamente.

He aquí un ejemplo para otros ordenadores de su red:

  1. dirección IP = 10.0.0.10

  2. nombre de la estación de trabajo = et1.local

  3. netmask = 255.255.255.0

  4. /etc/resolv.conf para sus otros ordenadores Linux.

  5. /etc/hosts es un fichero que puede ser usado, pero no es necesario. Es útil cuando el servidor de nombres está fuera de servicio.

Lo único que tiene que cambiar en cada ordenador de la red es la dirección IP y el nombre de la estación de trabajo. et2.local y 10.0.0.20 serán usados en el siguiente ordenador. Y así sucesivamente.

Si está usando clientes pc o mac o de otra clase échele un vistazo al masquerading mini-howto.

La idea general es especificar su máquina de masquerading (10.0.0.1) como encaminador y el servidor de nombres para cada máquina. IP-Masquerading HOWTO tiene una excelente sección sobre cómo configurar estaciones de trabajo con diferentes sistemas operativos.

Puntos relevantes sobre Seguridad

Estar permanentemente conectado a Internet tiene su riesgo. Hay gente que no tiene nada mejor que hacer que destruir sistemas mal protegidos, y mucha más que quisiera usar su sistema como plataforma para actividades ilegales.


El masquerading es algo inseguro porque debemos permitir que el tráfico entre a través del firewall. Desabilitando telnet, ftp, o cualquier otro de los demonios que escuchan en los puertos de su gateway se puede prevenir gran parte del riesgo.

Un reenviador de puertos como ipportfw también puede ser usado para redireccionar peticiones entrantes de conexiones a otras máquinas de la red (que entonces tendrán en marcha el servicio requerido), haciendo que el peligro quede fuera de su encaminador.

Puede prevenir el acceso a su servidor de nombres moviéndolo a otra máquina dentro de su red, o simplemente dándole la orden adecuada a named (consulte la página del manual correspondiente a named.conf para más información) para prevenirla de accesos a puertos de su interfaz externa. Si desea un más alto nivel de seguridad pero necesita que los usuarios accedan desde el exterior, consulte openssh, que le permite logins similares a los de telnet sobre una conexión encriptada. También es recomendable instalar un logger como tcplogd que detecte e informe de los escaneos de puertos y actividades sospechosas.

Finalmente, en muchos casos simplemente desconecte la interfaz al mundo exterior cuando no vaya a usar la conexión, reduciendo de este modo el riesgo de que alguien no autorizado acceda al sistema. Simplemente teclee 'ifdown eth0' en su encaminador para desabilitar la conexión, e 'ifup eth0' cuando la vuelva a necesitar.


Summary of Security

  1. El único servicio que debe estar en su encaminador es openssh. No debe tener su servidor de nombres en el encaminador. Aunque la configuración de servidor tenga el servidor de nombres, es recomendable poner este servidor en cualquiera de los ordenadores de la red interna. Si no le queda otro remedio, por lo menos manténgalo de forma que nadie del exterior pueda usarlo.

  2. El resto de los servicios (como el servidor web) que quiere que estén disponibles desde el exterior deben ser reenviados por puertos usando ipportfw a otro ordenador de la red interna.

  3. NO tenga ningún servicio en marcha en /etc/inetd.conf, o simplemente no tenga en marcha inet.
    chkconfig inet off ### para usuarios RedHat
    /etc/rc.d/init.d/inet stop

  4. Mantenga el resto de los servicios internos en un ordenador diferente (impresión, compartición de ficheros, bases de datos, etc).

  5. Instale tcplogd y envíe un aviso a aquellas personas que hayan escaneado su ordenador.

  6. Hay métodos para encapsular VNC, correo, ftp, y otros programas a través de OpenSSH. Esto permite mantener las cosas de un modo seguro.

  7. Consulte Abacus Project - The Intrusion Prevention System

DNS Dinámico

A menos que pida una dirección IP fija, RoadRunner le da una dirección IP diferente cada vez que acceda. El servidor de nombres dinámico le da un alias para que pueda encontrar su máquina de casa cuando esté en el trabajo o permitirle a otros usuarios saber dónde se encuentra.

Dyndns.org puede proporcionarle un nombre de dominio estático aunque su dirección IP sea dinámica, proporcionando al resto de usuarios de Internet una ayuda para recordar un nombre constante para su encaminador. Una vez que se haya registrado con dyndns, una utilidad llamada 'ddup' puede contactar con dyndns.org y actualizar el registro de su servidor de nombres cuando su dirección IP cambien. Añadiendo this fragmento de script en /etc/rc.d/rc.local se actualizarán sus registros dyndns cuando arranque, pero sólo si su dirección IP ha cambiado (dyndns no actualiza el registro si no es necesario.) Se asume que 'ddup' está instalado correctamente.

Si tiene pensado dejar su encaminador durante semanas sin ser reiniciado, posiblemente quiera que cron ponga en marcha el script ocasionalmente para asegurarse que el registro dyndns es siempre el actual.


Comentarios y Notas adicionales

  1. Para mayor seguridad, puede adquirir un conmutador de red con el que podrá aislar el tráfico interno de la red. Estos dispositivos son caros.

  2. Puede hacer cosas más avanzadas una vez que la red interna está configurada. Puede bajarse todo el correo de un determinado dominio, y emparejarlo con las direcciones de correo de los usuarios locales, usar un servidor proxy para ahorrar ancho de banda, configurar correctamente servicios de Redes Privadas Virtuales (VPN) a través de openssh, etc.

Mark Nielsen trabaja como encuadernador de libros en ZING and TCU y Andrew es un consultor de Linux.


Archivos de Ejemplos

(estos son ejemplos sintácticos, probablemente deberá modificar nombres de dominio, etc. para su propio uso)

(/etc/rc.d/rc.local (gateway)

# Configuración del Firewall - Debería ser añadido al final del fichero /etc/rc.d/rc.local para que se ejecute al arrancar.
# Adaptado de los  ejemplos de IP Masquerading HOWTO e IPChains HOTWO. Véanse los documentos originales para aprender más.

# Estos ejemplos deberían darle un masquerading bastante seguro en el firewall.
echo "Cargando los módulos de IP masquerading ..."
# carga los módulos para manejar el masquerading de algunos protocolos “interesantes” :-))
/sbin/depmod -a
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
echo "Poniendo en marcha el IP forwarding ..."
# se asegura de que el forfwarding está en marcha
echo "1" > /proc/sys/net/ipv4/ip_forward
# Recibe la dirección IP dinámicamente assignada vía DHCP
# y el nombre de la interfaz externa, los guarda en variable para un uso fácil
extip="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
extint="eth0"
# Hace lo mismo para la interfaz interna
intint="eth1"
intnet="10.0.0.0/8"
echo "Configurando firewall chains:"
echo -n "input..."
#############################################################################
# Cadena de entrada: flush and set default policy of reject. Actually the default policy
# is irrelevant because there is a catch all rule with deny and log.
ipchains -F input
ipchains -P input REJECT
#interfaz local, máquina local , puede ir donde quiera
ipchains -A input -i $intint -s $intnet -d 0.0.0.0/0 -j ACCEPT
#interfaz remota, que dicen ser locales, IP spoofing, perderlos
ipchains -A input -i $extint -s $intnet -d 0.0.0.0/0 -l -j REJECT
# remote interface, bounce anything trying to open a connection to us
# this should keep anyone from opening TCP connections to this machine from
# the outside world. Just an example of what we can do with IPChains, and not
# a bad idea unless you have a reason for letting people connect to your firewall.
# ipchains -A input ! -f -i $extint -p TCP -y -j REJECT
# remote interface, any source, going to roadrunner dhcp address is ok
ipchains -A input -i $extint -s 0.0.0.0/0 -d $extip/32 -j ACCEPT
# loopback interface is valid.
ipchains -A input -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
# catch all rule, all other incoming is denied and logged.
ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
echo -n "output..."
#############################################################################
# Output chain: flush and set default policy of reject. Actually the default policy
# is irrelevant because there is a catch all rule with deny and log.
ipchains -F output
ipchains -P output REJECT
# local interface, any source going to local net is valid
ipchains -A output -i $intint -s 0.0.0.0/0 -d $intnet -j ACCEPT
# outgoing to local net on remote interface, stuffed routing, deny
ipchains -A output -i $extint -s 0.0.0.0/0 -d $intnet -l -j REJECT
# outgoing from local net on remote interface, stuffed masquerading, denyipchains -A output -i $extint -s $intnet -d 0.0.0.0/0 -l -j REJECT
# anything else outgoing on remote interface is valid
ipchains -A output -i $extint -s $extip/32 -d 0.0.0.0/0 -j ACCEPT
# loopback interface is valid.
ipchains -A output -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
# catch all rule, all other outgoing is denied and logged.
ipchains -A output -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
echo -n "forward..."
#############################################################################
# Forward chain: defina y da a conocer la política de negación. Por ahora la político por defecto
# es irrelevante porque  se captura todo con accesos denegados y registros
#
ipchains -F forward
ipchains -P forward DENY
# Enmascara desde la red local en la interfaz local a cualquier parte.
# Esta es la línea que hace todo el trabajo el resto de las línea
# son principalmente por motivos de seguridad.
ipchains -A forward -i $extint -s $intnet -d 0.0.0.0/0 -j MASQ
# atrapa la regla, el resto de las transmisiones son denegadas y registradas
# opción de log (registro) en la política, pero esto hace el trabajo.
ipchains -A forward -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
echo "done."



/etc/sysconfig/network (encaminador)

NETWORKING="yes"
FORWARD_IPV4="yes"
HOSTNAME="main.local"
DOMAINNAME="local"
GATEWAY="10.0.0.1"
GATEWAYDEV="eth0"



/etc/sysconfig/network (estaciones de trabajo)

NETWORKING="yes"
FORWARD_IPV4="no"
# cambiar el nombre en cada máquina
HOSTNAME="et1.local"
DOMAINNAME="local"
GATEWAY="10.0.0.1"
GATEWAYDEV="eth0"



/etc/hosts (encaminador y estaciones de trabajo)

127.0.0.1       localhost       localhost.localdomain
10.0.0.1        main            main.local
10.0.0.10       et1              et1.local
10.0.0.20       et2              et2.local
10.0.0.30       et3              et3.local



/etc/resolv.conf (encaminador y estaciones de trabajo)

search local columbus.rr.com
nameserver 10.0.0.1             #nuestro servidor de nombres local
nameserver 128.146.1.7          #servidor de nombres secundario. NO usar, es sólo para studiantes de OSU.



/etc/pump.conf (sólo en el encaminador)

device  eth0 {          nodns   }



/etc/named.conf (sólo en el encaminador)

options {
        directory "/var/named";
};
zone "." {
        type hint;
        file "named.ca";
};
zone "local"{
        type master;
        file "local.zone";
        notify no;
};
zone "0.0.10.in-addr.arpa"{
        type master;
        file "local.reverse";
        notify no;
};
zone "0.0.127.in-addr.arpa"{
        type master;
        file "named.local";
};



/var/named/local.zone (sólo en el encaminador)

@               IN      SOA     main.local.     root.main.local. (
                                200001151 ; serial
                                8 ; refresh
                                2 ; retry
                                1 ; expire
                                1 ; default_ttl
                                )
@               IN      NS      main.local.
localhost       IN      A       127.0.0.1
main            IN      A       10.0.0.1
et1             IN      A       10.0.0.10
et2             IN      A       10.0.0.20
et3             IN      A       10.0.0.30



/var/named/local.reverse (sólo en el encaminador)

0.0.10.in-addr.arpa.    IN      SOA     main.local. root.main.local. (
                                        1997022700 ; serial
                                        28800 ; refresh
                                        14400 ; retry
                                        3600000 ; expire
                                        86400 ; default_ttl
                                        )
1.0.0.10.in-addr.arpa.  IN      PTR     main.local.
10.0.0.10.in-addr.arpa. IN      PTR     et1.local.
20.0.0.10.in-addr.arpa. IN      PTR     et2.local.       30.0.0.10.in-addr.apra. IN      PTR     et3.local.



append to /etc/rc.d/rc.local (soporte de dyndns con ddup)

# Actualizar la entrada en dyndns.org entry with crafty abuse prevention
# Esto no funcionará si no se tiene una cuenta en dyndns y el paquete ddup instalado.
# Esto requiere algunas variables que se ponen en el  script de configuración del firewall config script,
# por lo que se debería añadir al final del script de firewall.
# reemplaza dummy.hostname con el nombre registrado.
reghost="dummy.hostname" regip="`nslookup $reghost main.dyndns.org | tail -n 3 | grep 'ddress' | awk '{print $2}'`"
echo -e "\n Dyndns.org abuse prevention IP address check:"
echo "$reghost registrado: $regip"
echo -e "$extint tiene la dirección IP: $extip \n"
if [ "$regip" = "$extip" ]; then
        echo "La direección no ha cambiado. DDUP no se ejecutó.";  else
        echo "La dirección ha cambiado. Actualizando tu registro.";
        ddup --host $reghost;
fi



/etc/conf.modules (encaminador; sólo las líneas de 'alias ethx' son relevantes)

alias eth0 3c509
alias parport_lowlevel parport_pc
pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start
alias eth1 tulip
Copyright © 2000, Mark Nielsen, Andrew oyd
Publicado en el número 51 de Linux Gazette, Marzo 2000