Ponga a toda su oficina en Internet con un solo módem y RedHat Linux

Por Max de Mendizábal max@acer.com.mx

1.0 ($Revision: 1.00 $), 6 July 1999
Resuelve de forma simple el problema de conectar una pequeña oficina al Internet utilizando Linux con énfasis en la distribución de RedHat versiones 5.2 y 6.0

1. Copyright/Copyleft

El copyright de esta guía es el mismo que la licencia de GNU versión 2 de junio de 1991 o, a su elección, una versión superior. Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA. Cualquier persona tiene derecho a copiar y distribuir copias exactas de este documento, pero no está permitido alterarlo sin consentimiento del autor.

2. Motivación de esta guía

Enmascarar direcciones IP tiene un sabor a misterio muy particular, pero su significado es quizá aún más apetitoso, pues permite que una sola máquina Linux conectada a través de un simple módem pueda actuar como puente entre una pequeña red local y el Internet.

Esto quiere decir que, cualquier computadora conectada a la red local puede gozar de los beneficios del Internet utilizando sólo una línea telefónica.

Aún cuando ésto es posible conseguirlo con algunos programas para Windows muy populares como WinGate, WinProxy y hasta el muy costoso MS Proxy, las ventajas de Linux sobre estos sistemas son muy grandes como se verá más adelante en esta guía.

Para fines prácticos, en esta guía sólo se considerará una red local con Windows 95 o 98 y una máquina Linux que tiene instalado un módem que se puede conectar al Internet. Al final de esta guía se dará bibliografía que enseña como aprovechar estos beneficios con otros sistemas operativos.

3. La brújula de ésta guía

  1. Motivación de esta guía
  2. La brújula de ésta guía
  3. Lista de materiales
  4. La conexión
  5. El enmascaramiento
  6. Configuración de un Windows 95/98
  7. El proxy con cache transparente
  8. El manejo de cuentas de correo
  9. Configuración de un servidor de nombres para la red local
  10. Conclusión
  11. Bibliografía

4. Lista de materiales

Esta lista no sólo contiene materiales físicos, sino que también enlista algunos programas que no son parte de la distribución estándar de RedHat pero que facilitan mucho la puesta a punto de nuestro enmascarador de direcciones IP.

4.1 Hardware

  1. Una computadora 386 con 8 MB de RAM y un disco duro de 300 Mb es la configuración mínima recomendada
  2. Un módem de verdad, no un winmódem

4.2 Software

  1. Cualquier versión moderna de RedHat Linux, de preferencia 5.0 o mejor http://www.redhat.com
  2. El wvdial que se puede encontrar, como un paquete RPM en http://www.worldvisions.ca/wvdial/index.html
  3. El fetchmail si se quiere traer el correo al servidor local http://www.tuxedo.org/~esr/fetchmail
  4. El ssh si se requiere de seguridad http://www.ssh.fi/sshprotocols2/

Es importante apuntar que algunas distribuciones de RedHat, como la de México, ya contienen todo este software y que no es necesario conseguirlo en los sitios antes mencionados.

5. La conexión

La parte fundamental para que tengamos este sistema en operación es lograr una conexión a un proveedor de Internet. La forma más fácil de lograrlo es utilizando el programa wvdial. Consígalo e instálelo de la siguiente manera:

rpm -ivh wvdial-1.20-1.i386.rpm 

Por una extraña razón, el wvdial estará instalado en /usr/local/bin, por lo cual deberá colocar correr desde allí todos los programas, o colocarlo en su variable ambiental PATH. Para que quede para siempre, debe editar el archivo /etc/profile y agregar a la línea de PATH la ruta anterior, por ejemplo, mi línea quedó así:

PATH="$PATH:/usr/X11R6/bin:/usr/local/bin"

Luego ejecute el siguiente programa

wvdialconf /etc/wvdial.conf

Este programa detectará su módem y generará un guión básico en el archivo /etc/wvdial.conf

Edite el archivo con su editor preferido para poner los siguientes datos: el teléfono de su proveedor de internet, el nombre del usuario y su clave o password. Como se ve en el siguiente ejemplo:

[Dialer Defaults]
Modem = /dev/ttyS3
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 & C1 & D2 S11=55 +FCLASS=0
Phone = 5666-3333
Username = max
Password = xxxxxxx

Observe que las únicas líneas que tiene que cambiar son las últimas tres, las demás las ha generado el programa de configuración. Ahora, simplemente, marque el teléfono con la siguiente orden

wvdial

Y listo! Muy probablemente estará conectado al Internet. Para garantizarlo pruebe escribir

ping -c3 www.linux.org.mx

Si le indica que no puede encontrar el host, es probable que necesite editar el archivo /etc/resolv.conf y allí poner la dirección ip de un servidor de nombres. Esa dirección del servidor de nombres normalmente es proporcionada por el proveedor de internet. Así, un ejemplo del archivo /etc/resolv.conf es el siguiente:

search miredlocal.org.mx
nameserver 192.168.1.254
nameserver 200.23.80.17

Cuando logre ver algunas computadoras del Internet usted habrá terminado con esta sección. Si quiere ampliar más la información sobre este tema, puede leer el COMO del PPP en español http://lucas.linux.org.mx/COMO-INSFLUG/COMOs/PPP-Como/PPP-Como.html.

Para automatizar el marcado a internet, puede colocar la siguiente línea en el archivo /etc/crontab

0,15,30,45 * * * * root /usr/local/bin/wvdial >> /var/log/wvdial.log 1>&2 &

6. El enmascaramiento

Esta es la sección en donde se hace la verdadera magia: convertir una dirección interna en otra externa y ˇno confundir los paquetes IP! Parece complicado, pero como se verá a continuación es verdaderamente simple hacer un archivo de configuración para lograr nuestra meta.

Edite el archivo /etc/sysconfig/network y allí verifique que la línea que permite el traspaso de paquetes IP diga lo siguiente:

FORWARD_IPV4=true

Edite el archivo /etc/ppp/ip-up.local. Si no existe, no hay problema, cree uno nuevo. Allí se escribirán las instrucciones que son el tema nuclear de este documento:

#!/bin/bash
# ip-up.local
# Este archivo se ejecuta una vez que el enlace PPP se ha levantado

# Envía los mensajes pendientes
sendmail -q &

# Inicia el enmascaramiento

if [ ! -e /proc/net/ip_fwchains ] ; then
        # Versión que utiliza ipfwadm para núcleos 2.0.xx
        # Rechaza todo
        /sbin/ipfwadm -F -p deny

        # Permite el enmascaramiento de las direcciones de la red local
        /sbin/ipfwadm -F -a masquerade -S 192.168.1.0/24 -D 0.0.0.0/0

        # Redirige el puerto 80 (el de web) al servidor local para hacer el
        # proxy cache con el Squid, tema que trataremos más adelante
        /sbin/ipfwadm -I -a accept -P tcp -D 0.0.0.0/0 80 -r 80
else
        # Hace exactamente lo mismo que arriba pero con ipchains (kernel 2.1.102 o mayor)

        /sbin/ipchains -P forward DENY
        /sbin/ipchains -A forward -j MASQ -s 192.168.1.0/24 -d 0.0.0.0/0
        /sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80
fi


(
cd /lib/modules/preferred/ipv4
insmod ip_masq_cuseeme
insmod ip_masq_ftp
insmod ip_masq_quake
insmod ip_masq_raudio
insmod ip_masq_vdolive
)

No olvide cambiar los permisos para que el ip-up.local pueda ser ejecutado pues, si no lo hace no funcionará. Para ello escriba simplemente

chmod +x /etc/ppp/ip-up.local

Si quiere más información sobre las opciones del ipfwadm, debe leer el siguiente documento http://lucas.linux.org.mx/COMO-INSFLUG/COMOs/Cortafuegos-Como/Cortafuegos-Como.html. Si utiliza un kernel 2.2.x o superior, ya no funciona el programa ipfwadm y deberá utilizar el programa ipchains, cuya sintáxis varía ligeramente. Para más información sobre cómo utilizar ipchains puede ver el siguiente documento http://www.rustcorp.com/linux/ipchains/translations/ipchains-HOWTO-html-spanish/HOWTO.html

7. Configuración de un Windows 95/98

Lo único que debe hacer es instalar el protocolo TCP/IP en su computadora y configurar las siguientes cajitas: dirección IP, gateway y servidor de nombres.

Por simplicidad tomaremos una clase C que puede tener un máximo de 254 computadoras conectadas a una misma red y entonces los datos por cada computadora son los siguientes:

Dirección IP         192.168.1.nn       nn es un número entre 1 y 253
                                        que NO puede estar duplicado en la misma red
Máscara              255.255.255.0      es la estándar de la clase C
Gateway              192.168.1.254      es la dirección IP de
                                        la computadora con Linux
Servidor de nombres  192.168.1.254      ˇde nuevo la dirección IP del Linux!

Para más explicaciones sobre este asunto de la clase C y ese tipo de rarezas, puede leer el excelente libro de Comer citado en la bibliografía.

8. El proxy con cache transparente

Esto no sólo suena misterioso, sino verdaderamente indescifrable. Intentaré explicarlo: proxy, en español, es apoderado. Como cuando uno firma un documento llamado poder y que sirve para que un pariente o amigo puedan actuar en nombre de uno mismo. De nuestro amigo o pariente se dice que es nuestro apoderado. En el caso computacional, Linux actúa como el apoderado de nuestra máquina Windows conectada a la red local para hacer las peticiones de páginas Web. żY que es eso de cache transparente? żun nuevo tipo de lencería? Pues no, es un espacio en el disco duro de la máquina Linux que designamos para el almacenamiento temporal de las páginas Web que vayamos consultando, así, si una persona dentro de la red local, visita un conocido sitio para adultos, la próxima persona que lo visite no tendrá que ir hasta el sitio pues simplemente tomará la misma página del disco duro de la máquina Linux, con lo cual se ahorrará muchísimo tráfico en la red y, por consiguiente, la velocidad de acceso del conjunto de la red local mejorará. ży la transparencia? Esa consiste en que no configuramos nada en nuestra máquina Windows, simplemente usamos el Netscape o el Explorer como si estuviésemos conectados directamente al Internet. żClaro como el agua? Bueno, si no quedó suficientemente claro es posible leer el siguiente documento http://squid.nlanr.net/Squid/ en donde se explican éstas y muchas más cosas.

Si aún no ha instalado el squid, que es el proxy, instálelo de la siguiente manera

rpm -ivh squid-1.1.22-2.i386.rpm 

Si ya está instalado el squid que viene con el RedHat, simplemente habrá que indicarle a Linux que lo arranque siempre que tengamos red, para ello habrá que hacer lo siguiente: primero edite el archivo /etc/rc.d/init.d/squid y revise que la opción

SQUID_OPTS="-D"

no tenga un signo # que lo preceda, ya que ésto invalidaría su funcionamiento cuando no se está conectado al internet.

Luego agrégelo a los programas de arranque de la siguiente manera:

chkconfig --level 345 squid on

Para ver el resultado de su configuración deberá escribir

chkconfig --list squid

quien contestará algo similar a lo siguiente

squid 0:off 1:off 2:off 3:on 4:on 5:on 6:off

Para que esto funcione de forma transparente, es necesario evitar que corra el apache en el puerto 80. Por simplicidad se evitará esta discusión y simplemente supondré que el apache no correrá en esta máquina. Para evitar que el apache corra puede escribir lo siguiente

chkconfig --del httpd

Finalmente, edite el archivo /etc/squid.conf y modifique los siguientes parámetros de tal forma que queden como sigue:

http_port       80
icp_port        3130
httpd_accel virtual 80
httpd_accel_with_proxy on

Opcionalmente puede ampliar el espacio de disco duro dedicado al cache, modificando la siguiente opción

cache_swap 300

En donde 300 representan 300 Mb de disco duro dedicados a almacenar páginas Web. Con esto terminamos la parte de la configuración del proxy cache transparente.

Si utiliza el squid versión 2, es probable que sea necesario hacer unos pequeños cambios con respecto a lo que escribimos anteriormente. Para empezar, cambió un poco la sintáxis y ahora deberá escribir:

http_port 80
icp_port 3130
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on

acl localnet src 192.168.1.0/255.255.255.0
http_access allow localnet

9. El manejo de cuentas de correo

Lo primero que hay que hacer es relajar un poco la seguridad del sendmail, pues en sus nuevas versiones, está ciego y sordo al mundo que lo rodea. Para que podamos mandar correo desde la red local utilizando al servidor, deberemos dar de alta el conjunto de direcciones al que le es permitido mandar correo hacia afuera y esto se consigue editando el archivo /etc/mail/ip_allow en donde simplemente escribiremos lo siguiente

192.168.1.

De la misma forma procedemos con el archivo /etc/mail/relay_allow

192.168.1.

ˇY listo! Con esto basta para que SendMail se comporte decentemente con los miembros de la red local.

Nota importante. A partir de la versión 8.9.3 de sendmail hay cambios importantes en las tablas.

Revise el archivo /etc/services. Allí debe verificar que existan los servicios para pop-2, pop-3 e imap

pop-2           109/tcp         postoffice      # POP version 2
pop-2           109/udp
pop-3           110/tcp                         # POP version 3
pop-3           110/udp
...
imap2           143/tcp         imap            # Interim Mail Access Proto v2
imap2           143/udp         imap

También debe revisar el archivo /etc/inetd.conf en donde los protocolos pop-2, pop-3 e imap deben estar activados:

# Pop and imap mail services et al
#
pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop2d
pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d
imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd

Luego, si se tiene una serie de cuentas de correo electrónico en un servidor externo a nuestra red local, en donde se pueda guardar nuestra información hasta que la recojamos, se puede utilizar el sistema fetchmail.

Por ejemplo para recoger el correo de todos nuestros usuarios cada media hora deberemos escribir un archivo llamado /root/.fetchmailrc con el siguiente contenido:

# /root/.fetchmail
set postmaster "root"
set logfile "/var/log/fetchmail.log"

poll maquina_externa.xxx.com.mx port 110 with protocol pop3:
   user juanperez with pass xxxxx is JuanPerez here
   user pedroglez with pass xxxxx is PedroGlez here
   user robertohdz with pass xxxxx is RobertoHernandez here
   user concepcion with pass xxxxx is ConcepcionGomez here
# ... hasta poner a todos los usuarios
# Limitamos a máximo 1.5 Mb
   limit 1500000

Los derechos que debe tener este archivo son 0600. Para poner estos derechos deberemos escribir

chmod 0600 /root/.fetchmail

Luego editamos el archivo /etc/crontab para que fetchmail traiga el correo cada media hora en un horario de oficina normal, es decir, de esclavistas.

# /etc/crontab

0,30 8-22 * * * root /usr/bin/fetchmail

Si lo prefiere, puede invocar a fetchmail como a un demonio. Dibuje con sangre un pentáculo en el suelo y... bueno, no es precisamente una buena idea hacerlo así. Mejor genere un archivo llamado /etc/rc.d/init.d/fetchmail con el siguiente contenido:

#!/bin/sh
#
# fetchmail       Este guión sirve para iniciar y detener al programa
#                 fetchmail como un demonio
#
# chkconfig: 345 45 50
# description: fetchmail sirve para traer mensajes de correo de \
#              uno o varios usuarios desde un servidor de correo remoto

# Trae el fuente de la biblioteca de funciones
. /etc/rc.d/init.d/functions

# Trae la configuración de la red
. /etc/sysconfig/network

# Revisa que la red esté activada
[ ${NETWORKING} = "no" ] && exit 0

# Analiza la forma como fue invocado
case "$1" in
  start)
        # Arranca al demonio y trae el correo cada 1800 segundos
                # (media hora)
        echo -n "Starting fetchmail: "
        daemon fetchmail -d 1800
        echo
        touch /var/lock/subsys/fetchmail
        ;;
  stop)
        # Detiene al demonio de fetchmail
        echo -n "Shutting down fetchmail: "
        killproc fetchmail
        echo "done"
        rm -f /var/lock/subsys/fetchmail
        ;;
  status)
        status fetchmail
        exit $?
        ;;
  restart)
                killproc fetchmail
                daemon fetchmail -d 1800
                echo "restarted"
        ;;
  *)
        echo "Usage: fetchmail {start|stop|status|restart}"
        exit 1
esac

exit 0

chmod 0755 /etc/rc.d/init.d/fetchmail
chkconfig --add fetchmail

10. Configuración de un servidor de nombres para la red local

Configurar un servidor de nombres local puede ser útil para algunas cosas. La más simple es para que el telnet hacia la máquina Linux sea rapidísimo pues, de otra forma, Linux desconfiará de la dirección local, de quien no sabe su verdadero nombre.

Primero es importante asegurarse de que el programa bind esté instalado y configurado para ser un DNS cache. Si no es así, simplemente instale los paquetes de la siguiente manera.

rpm -ivh bind-8.1.2-5.i386.rpm
rpm -ivh bind-utils-8.1.2-5.i386.rpm
rpm -ivh caching-nameserver-5.2-1.noarch.rpm

Luego es necesario escribir un par de archivos de configuración muy estándar, tanto que puedo poner a la disposición de todos los archivos de DNS que con seguridad funcionarán correctamente en su red local.

; /var/named/miredlocal.hosts
$ORIGIN miredlocal.org.mx.
@       IN      SOA     linux.miredlocal.org.mx. root.linux.miredlocal.org.mx.  (
                                      1999051000 ; Número de serie
                                                                                                 ; que debe ser cambiado cada vez
                                                                                                 ; que se modifica este archivo
                                      28800      ; Refresco cada 8 horas
                                      14400      ; Reintenta cada 4 horas
                                      3600000    ; Expira cada 1000 horas
                                      86400 )    ; Mínimo cada día
                IN      NS      linux
                IN      MX      10      linux
linux           IN      A       192.168.1.254
m1              IN      A       192.168.1.1
m2              IN      A       192.168.1.2
m3              IN      A       192.168.1.3
m4              IN      A       192.168.1.4
m5              IN      A       192.168.1.5
m6              IN      A       192.168.1.6
...
m253                    IN              A               192.168.1.253

Si le da pereza rellenar todos los números, del 1 al 253, puede escribir lo siguiente:

perl -e'for($i=1;$i<254;$i++){print "m$i\t\tIN\tA\t192.168.1.$i\n";}' >> /var/named/miredlocal.hosts

Ahora se muestra el archivo de resolución inversa:

; /var/named/miredlocal-r.hosts
$ORIGIN 1.168.192.in-addr.arpa.
@       IN      SOA     linux.miredlocal.org.mx. root.linux.miredlocal.org.mx.  (
                                      1999051000 ; Número de serie
                                                                                                 ; que debe ser cambiado cada vez
                                                                                                 ; que se modifica este archivo
                                      28800      ; Refresco cada 8 horas
                                      14400      ; Reintenta cada 4 horas
                                      3600000    ; Expira cada 1000 horas
                                      86400 )    ; Mínimo cada día
                IN      NS      linux.miredlocal.org.mx.
254             IN              PTR             linux.miredlocal.org.mx.
1       IN      PTR     m1.miredlocal.org.mx.
2       IN      PTR     m2.miredlocal.org.mx.
3       IN      PTR     m3.miredlocal.org.mx.
4       IN      PTR     m4.miredlocal.org.mx.
5       IN      PTR     m5.miredlocal.org.mx.
6       IN      PTR     m6.miredlocal.org.mx.
...
253     IN      PTR     m253.miredlocal.org.mx.

De manera similar, también se pueden rellenar automáticamente todos los números.

perl -e'for($i=1;$i<254;$i++){print "$i\tIN\tPTR\tm$i.miredlocal.org.mx.\n";}' >> /var/named/miredlocal-r.hosts

En las versiones más nuevas de Bind, como la 8.2, es posible abreviar las últimas 253 líneas con una sola:

$GENERATE 1-253 $ PTR m$.miredlocal.org.mx.

Para saber que versión de bind se está usando, se puede escribir

rpm -qi bind

Finalmente es necesario editar el archivo /etc/named.conf y allí agregar las siguientes líneas.

# /etc/named.conf
# ...
zone "miredlocal.org.mx" {
        type master;
        file "miredlocal.hosts";
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "miredlocal-r.hosts";
};

Para activar el servidor de nombres escriba lo siguiente

/etc/rc.d/init.d/named restart

Para verificar que no haya errores, debe escribir lo siguiente y leer la bitácora así

tail -80 /var/log/messages |grep named

Si todo funcionó correctamente verá un par de mensajes como los siguientes:

May 12 17:37:48 linux named[271]: master zone "miredlocal.org.mx" (IN) loaded (serial 1999051000)
May 12 17:37:49 linux named[271]: master zone "1.168.192.in-addr.arpa" (IN) loaded (serial 1999051000)

Si por algún motivo desea hacer algún cambio en el DNS no olvide cambiar el número de serie del encabezado pues, si no lo hace, el cambio no surtirá efecto.

11. Conclusión

Antes de concluir propiamente, es conveniente apuntar que es posible hacer a esta máquina un servidor de internet completo. Para ello es necesario un enlace dedicado, o bien, un servicio de DNS dinámico que permita enrutar nuestro correo al lugar correcto, es decir, a nuestro servidor. Estos servicios existen y por lo pronto le sugiero dos: http://www.sashanet.com/internet/dynip.html y http://www.dhs.org/. Con cualquiera de estos servicios podrá registrar su propio dominio y recibir correo directamente hacia su máquina Linux. Es muy importante que su servidor Linux esté el mayor tiempo posible conectado a Internet, de otra forma, podría perder mensajes de correo.

Finalmente es posible concluir que es muy simple configurar un servidor de Internet con RedHat Linux y los beneficios son muchísimos. Una pequeña oficina puede operar con todos los servicios de Internet a un costo ridículamente bajo y con la confiabilidad que proporcionan todos los sistemas Linux: un 98% de tiempo funcionando sin problemas.

12. Bibliografía

La mayor parte de la bibliografía es electrónica, pero también es conveniente mencionar algunos magníficos libros en papel que tienen un alcance mayor y que tratan con profundidad muchos de los temas que van más allá del alcance de este documento.

http://lucas.linux.org.mx/COMO-INSFLUG/COMOs/PPP-Como/PPP-Como.html

http://lucas.linux.org.mx/COMO-INSFLUG/COMOs/IP-Masquerade-Como/IP-Masquerade-Como.html

http://www.rustcorp.com/linux/ipchains/translations/ipchains-HOWTO-html-spanish/HOWTO.html

Comer, Douglas. Internetworking with TCP/IP Vol. I   3a. ed., New Jersey. Prentice Hall, 1995.

Nemeth, Evi. Unix System Administration Handbook   2a. ed., New Jersey. Prentice Hall, 1995.

Albitz, Paul. DNS and BIND in a Nutshell   Sebastopol, O'Reilly & Associates, 1992.