Router de acceso a internet mediante PPP (ejemplo)

Santiago González Herrero, sgonzale@bigfoot.com
Agosto 1999


En el IES Valliniello - Avilés  tenemos la necesidad de conectar nuestra intranet a Internet de una forma transparente, de manera que cada puesto de cualquier aula pueda acceder a cualquier servicio de internet. Para ello disponemos de una Intranet que conecta 5 segmentos de red (aulas de Informática) y un segmento especial en el que residen los servidores. Mediante una línea RDSI y un ordenador ejecutando Red Hat Linux 6.0 que, entre otros servicios, hace de router hacia internet mediante IP_Masquerade nos es posible realizar una conexión eficiente a Internet a un coste ridículo..

Nota Importante: Este documento es una chuleta para un administrador de redes habituado a trabajar con Linux. En ningún caso pretende ser un tutorial. Como se puede comprobar hay muchos aspectos que no se tocan (compilación del kernel, del puerto serie, módem, nociones TCP/IP, etc). Para un manual más exhaustivo, te vuelvo a remitir a las magníficas guías que constituyen los HOWTO y sus traducciones al castellano en INSFLUG, así como el trabajo de LuCAS en su traducción del LDP al castellano.


Introducción

Router es un equipo informatico conectado a diferentes redes. Por cada red a la que está conectado, dispondrá de un interfaz de red y su correspondiente IP (NET-3-HOWTO es un documento imprescindible para la introducción a las redes en general y en Linux en particular). Lo que diferencia un router de otro equipo con varios interfaces es que el router hace IP-FORWARD de paquetes, esto es, si por un interfaz llega un paquete cuyo destino es un host conectado a otra red, y tenemos un camino (en la tabla de encaminamiento, man route) hacia ese host a través de algún otro interfaz, el router propagará ese paquete por el otro interfaz.

Simplificando, si un router está conectado a las redes A y B, y por el interfaz de A llega un paquete destinado a un host que reside en la red B, el router recogerá el paquete de la red A como suyo y lo pondrá en la red B donde llegará a su destino.

En este documento, comenzaré explicando cómo conectar un sistema Linux a Internet mediante PPP, para luego explicar cómo configurar este equipo para que actúe de router para una red privada.

Nota: Propongo una solución en la que existen diferentes proveedores de acceso y que puedan realizar la conexión, no sólo root, sino los usuarios pertenecientes a un grupo concreto. Por otro lado, al utilizar diferentes proveedores, prefiero usar un único servidor de nombres en el mismo línux, para lo que instalo un DNS sólo caché (caching-nameserver). Esto simplifica el uso de conexiones de diferentes proveedores y me permite (quizá lo ponga en otro documento) inventarme un dominio privado para mi Intranet (útil también en redes con muchos equipos en las que sincronizar los ficheros hosts sería laborioso).

Requerimientos

Para poder conectar a Internet (u otra Intranet), obviamente debemos tener un módem conectado a un puerto serie, soporte en el kernel, directamente incluido o como módulo, para el protocolo PPP, el paquete ppp, y la solución que yo adopto incluye un servidor de nombres de sólo caché. En Red Hat 6.0 se dispone de:
 
  • Kernel 2.2.5
  • ppp-2.3.7
  • caching-nameserver-6.0
  • /etc/ppp/options

    Es el archivo en el que se almacenan las opciones que se pasan al programa pppd para su ejecución. Este archivo siempre es examinado por el programa pppd, por lo que pondremos en él las opciones comunes a todas las conexiones, su contenido será:
     

            debug
            lock
            noipx
            connect /etc/ppp/conectar
            crtscts
            modem
            passive
            noipdefault
            defaultroute
            asyncmap a0000
            /dev/modem
            115200

    Nota: /dev/modem debe ser un enlace simbólico al puerto serie utilizado, en mi caso /dev/ttyS1

        debug envía información de depuración, mediante syslog (facility daemon).
        lock crea ficheros de bloqueo al estilo UUCP para el puerto serie
        noipx evita el protocolo IPX sobre la conexión PPP
        connect fichero usa ese fichero como script de conexión
        crtscts indica que se utilice control de flujo hardware (RTS/CTS) en el puerto serie
        modem indica que se utilicen las líneas de control del módem.
        passive indica que se espere por una trama LCP si no contestan el intento de negociación
        noipdefault hace que se solicite una dirección IP al otro extremo explícitamente
        defaultroute provoca que ese interfaz sea nuestra ruta por defecto una vez establecido
        asyncmap establece el mapa para configurar caractéres de control en la transmisión
        /dev/modem indica qué puerto serie utilizar (es un enlace simbólico a /dev/ttySx)
        115200 es la velocidad de comunicación del puerto serie
     

    /etc/ppp/pap-secrets y /etc/ppp/chap-secrets

    Este es el archivo donde se almacenan las contraseñas que entregamos cuando nos son solicitadas por PPP mediante autentificación PAP o CHAP. Tienen idéntico formato por lo que es útil hacer un enlace duro y que sean el mismo fichero. Es importante que sólo tenga derecho de lectura y escritura el propietario del fichero.

    Su contenido será:

        usuario1@proveedor1        *    clave1    *
        usuario2@proveedor2        *    clave2    *
        usuario3                   *    clave3    *

    Nota, usuario1 y 2 son a través de Infovía, usuario3 tiene nodo directo.
     

    /etc/ppp/conectar

    Este es el script que realiza la llamada. Es fuertemente dependiente del módem que se utilice, ya que cada uno admite unas cadena de control diferente. Este es de lo más sencillito (es el que uso yo). Ojo con el número de teléfono.

        #!/bin/sh
        /usr/sbin/chat -v "" "AT&FM0" OK ATDT985158000 CONNECT ""
     

    El servidor de nombres

    Normalmente en una conexión ppp se configura el fichero /etc/resolv.conf para que apunte a los servidores DNS de nuestro proveedor, por ejemplo:

        search proveedor1.es
        nameserver 195.143.112.1
        nameserver 195.143.112.2

    Cuando se tienen diferentes proveedores, hay que cambiar el contenido de este fichero cada vez que se establece la conexión mediante un proveedor distinto. Una solución que no penaliza en exceso la velocidad del acceso a Internet es configurar un servidor de nombres de sólo caché. Esto es un DNS local que no resuelve ningún dominio y que todas sus consultas las hace mediante servidores raíz.

    Para ello se instala el paquete (en RedHat) caching-nameserver-version.rpm que hará que nosotros seamos nuestro propio DNS, simplificando la conexión a Internet.

    Ejecutar pppd como usuario

    Para que un usuario cualquiera pueda realizar la conexión PPP, es necesario hacer setuid el programa pppd. En Red Hat 6.0 se hace mediante la orden:

        # chmod u+s /usr/sbin/pppd

    Y para restringir el uso de la conexión a ciertos usuarios, se incluyen éstos en un grupo, por ejemplo dip, y se cambian los propietarios a los ficheros contenidos en el directorio /etc/ppp para que pertenezcan al usuario root y al grupo dip.

        # chown root.dip /etc/ppp/*

    En RedHat 6.0 es necesario incluir un enlace simbólico en /usr/local/bin para acceder a /usr/sbin/pppd, ya que los usuarios no tienen en su path el directorio en que reside pppd.

        # ln -s /usr/sbin/pppd /usr/local/bin/pppd

    y para detener la conexión, se ejecuta el script ppp-off. Este se encuentra en /usr/doc/ppp-2.3.7/scripts:

        # cp /usr/doc/ppp-2.3.7/scripts/ppp-off /usr/local/bin

    Sólo nos queda la llamada al pppd para efectuar la conexión. Como tenemos diferentes proveedores, uso un alias para cada cuenta de acceso a internet. En /etc/profile incluyo los alias:

        alias internet.usuario1='pppd user usuario1@proveedor1'
        alias internet.usuario2='pppd user usuario2@proveedor2'

    Fijarse que en el fichero /etc/ppp/options no está incluida la opción user, ya que se la paso en la llamada a pppd. Por tanto, para conectar a internet con la cuenta del proveedor2, cualquier usuario perteneciente al grupo dip, puede hacer:

        $ internet.usuario2
     

    Enmascaramiento IP

    El enmascaramiento IP ( IP Masquerade) es una función de red de Linux. Si un sistema Linux está conectado a Internet y tiene IP Masquerade activado, entonces ordenadores que se conecten a él (tanto en la misma red, como conectados vía modem) pueden alcanzar internet también, incluso sin tener direcciones IP oficiales asignadas.

    Esto permite que un conjunto de máquinas accedan de forma transparente a Internet escondidas tras una pasarela, que aparece como mel único sistema que utiliza Internet.

    Para activar el enmascaramiento IP en un sistem Linux basta con compilar el kernel (2.0.x ó 2.2.x) con las siguientes opciones activadas (algunas puede que cambien en tu versión de kernel).

        * Prompt for development and/or incomplete code/drivers
          CONFIG_EXPERIMENTAL
        * Enable loadable module support
          CONFIG_MODULES
        * Networking support
          CONFIG_NET
        * Network firewalls
          CONFIG_FIREWALL
        * TCP/IP networking
          CONFIG_INET
        * IP: forwarding/gatewaying
          CONFIG_IP_FORWARD
        * IP: firewalling
          CONFIG_IP_FIREWALL
        * IP: masquerading
          CONFIG_IP_MASQUERADE
        * IP: ipportfw masq support
          CONFIG_IP_MASQUERADE_IPPORTFW (recomendable)
        * IP: ipautofw masquerade support
          CONFIG_IP_MASQUERADE_IPAUTOFW (opcional)
        * IP: ICMP masquerading
          CONFIG_IP_MASQUERADE_ICMP (recomendable)
        * IP: always defragment
          CONFIG_IP_ALWAYS_DEFRAG (muy recomendable)
        * Dummy net driver support
          CONFIG_DUMMY (recomendable)

    Una vez compilado e instalado el nuevo kernel, insertar los módulos necesarios en el arranque para poder utilizar determinados protocolos con IP-Masquerade:

    En mi caso, incluyo lo siguiente en el script /etc/rc.d/rc.local

        insmod ip_masq_irc
        insmod ip_masq_ftp
        insmod ip_masq_raudio
        insmod ip_masq_vdolive
        insmod ip_masq_cuseeme

    y la reglas necesarias para activar el IP-Forward mediante IP-Masquerade
    Para los kernel 2.0.x se utiliza el programa ipfwadm:

        ipfwadm -F -p deny
        ipfwadm -F -a m -S 192.168.0.0/16 -D 0.0.0.0/0

    Para los kernel 2.2.x se utiliza el nuevo ipchains:

        ipchains -P forward DENY
        ipchains -A forward -s 192.168.0.0/16 -j MASQ

    Nota1: En el IES Valliniello, tenemos 6 segmentos de red, por lo que si queremos usar una sola regla, nuestras direcciones son 192.168.0.0/16, si tan sólo se dispone de un segmento de red, sea 192.168.25.0, el conjunto de direcciones se denotaría: 192.168.25.0/24.

    Nota2: El programa ipfwadm/ipchains nos permite un filtrado de paquetes en función de muy diversos criterios. Es muy recomendable establecer unas reglas de filtrado en el ordenador que hace de router para evitar desagradables accesos desde Internet hasta nuestra red privada. El documento "Configuración de un cortafuegos en Linux" nos ayuda a establecer una protección genérica bastante eficiente.

    Nota3: Una conexión más eficiente a Internet se consigue añadiendo un servidor Proxy-caché para acelerar el acceso a la WWW y descargas FTP. Ver Squid, WWWOffle y Apache. Un índice muy completo de servidores proxy lo tienes en FreshMeat.


    Santiago González Herrero, sgonzale@bigfoot.com
    Agosto 1999