Manual para implantacion de un gateway sobre linux con un modem ADSL
Versión 0.3
Edgar Gómez García
Dudas, comentario sugerencias: [email protected]
1.- Introducción.
Este manual explica de una forma breve la implantación de un gateway sobre linux para conectarse a internet por medio de un enlace ADSL. En este manual no se explica el funcionamiento de ADSL en este caso en particular Infinitum de Prodigy. Este documento solo trata sobre los requerimientos, instalación y configuración, ademas de algunos conceptos básicos de seguridad necesarios para mantener la red interna o Intranet fuera de posibles riesgos que lleva una conexión continua a Internet. ADSL es básicamente una conexión PPP sobre Ethernet, por lo que se requiere un cliente especial para esta conexión y el soporte para el protocolo PPPoE.
2.- Requerimientos del sistema.
Para la elaboración de este manual se utilizo RedHat 7.1 (tambien funcionaria en 7.2), un disco de 6 Gigas (mucho espacio con un disco de 2 seria suficiente), el procesador es Pentium a 90 Mhz y 16 M de RAM, y 2 tarjetas de red ethernet 3com. Seria bueno que verificara el hardware en la HCL de redhat, o la distribución que piense utilizar.
Por la parte de software se requiere que nuestra caja linux maneje NAT, tambien ya tenga instalado el cliente PPPoE, RH7.1 Ya trae el cliente de Roaring Penguin, que es muy bueno y estable y facil de configurar, el cliente como tal no requiere cambios en el kernel pero si tu maquina va a ser un gateway habra que soportar NAT e iptables.
3.- Instalación.
Se necesitaran los discos de RH, estos los puede conseguir de www.redhat.com, si su maquina acepta boot desde cdrom solo inserte el disco 1 e inicio el proceso se instalación en caso de no ser asi necesitara crear 1 disco de arranque con las utilerias que vienen en el disco 1. Solo necesita ejecutar el programa rawcopy indicar la imagen boot.img y el destino a:\ . Para mayor información sobre este proceso revise:
Usted empieza a instalar RedHat de forma normal, seleccionando Custom para poder seleccionar los paquetes de nuestra preferencia.
Usted no necesitara interfaz grafica ni soporte para windows. Unicamente seleccione los grupos de paquetes que le permitiran trabajar sobre el kernel, utilerias de red como lynx telnet, etc, y lo necesario para poder compilar. Recomiendo seleccionar el desarrollo de kernel para tener el codigo fuente. Puede seleccionar la caja de ?Select Individual Packages?, esto para que usted seleccione con mayor libertad lo que necesita y lo que no.
4.- Configuración.
En este punto usted ya podra hincar sesiones en linux como root y empezaremos con la configuración de las tarjetas de red.
La configuración tipica es la siguiente:
eth0 conectada al modem ADSL (speed touch de alcatel)
eth1 conectada a la red internet
Si usted utiliza tarjetas 3com necesitara cargar el modulo 3c95x. Otras tarjetas requieren otros modulos.
Es necesario revisar el Linux IP Masquerade HOWTO el punto 3.2 la pagina es:
http://tldp.org/HOWTO/IP-Masquerade-HOWTO/ y revisar los puntos que se explican, no creo necesario rescribir esta parte. Sera necesario conceptos básicos sobre la modificación y compilación del kernel si necesitas mayor información revisa el HOWTO del kernel.
Pasos resumidos.
Bajar la ultima versión del kernel de www.kernel.org.
Bajar la ultima versión de iptables de http://netfilter.samba.org/
Se procede a descomprimirlos con tar.
$ tar -xjvf linux-2.4.18.tar.bz2
$ tar -xjvf iptables-1.2.x.tar.bz2
Dentro del directorio de iptables se ejecuta el siguiente comando:
$ make
pending-patches KERNEL_DIR=/usr/src/kernel/linux
$ make
KERNEL_DIR=/usr/src/kernel/linux
$ make
install KERNEL_DIR=/usr/src/kernel/linux
Despues de realizado esto, se procede a configurar el kernel
$ cd
/usr/src/linux
$ make
menuconfig
Para la configuración es necesario ir a esta pagina: http://en.tldp.org/HOWTO/IP-Masquerade-HOWTO/ipmasq-compiling3.1.html.
Después de configurar tu kernel ejecuta el siguiente comando
$ make
dep; make clean; make bzImage; make modules; make modules_install
Este proceso... en la maquina donde estoy tardo mas de 1 hora... recomiendo hacer otras actividades... como leer documentación de iptables para configurar adecuadamente esta maquina como ?proxy? o al menos direccionamiento de puertos para que puedan poner una servidor de web u otra cosa.
Después que el kernel se compilo es necesario escribirlo en el lilo.
En este punto tu caja ya soportara NAT y solo tendremos que configurar las tarjetas de red, a continuación muestro el script que utilizo, este se llama desde /etc/rc.d/rc.local para distribuciones de redhat, puedes modificar este archivo usando vi.
*******************************
# script para enmascarar la red
# eth0 esta hacia el modem
# eth1 esta hacia la red lan
#damos de alta eth1 con 192.168.1.254
#ifconfig
eth0 0.0.0.0 down
ifconfig
eth0 0.0.0.0 down up
ifconfig
eth1 192.168.1.254 up
modprobe
ipt_MASQUERADE
iptables -F
iptables -t nat
-F
iptables -t
mangle -F
# al final de la siguiente linea se escribe la ip que regresa cuando
# hacemos ipconfig ppp0 (la primer ip)
# si fuera ip stattica
#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 200.67.147.183
#dinamica <- infinitum maneja ip?s dinamicas o estaticas en mi caso es dinamica.
iptables -t nat
-A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 >
/proc/sys/net/ipv4/ip_forward
# para
dial-up ppp0
iptables -A
INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A
INPUT -m state --state NEW -i ! eth0 -j ACCEPT
#esta opcion no permite salir paquetes
#iptables
-P INPUT DROP
iptables -P
INPUT ACCEPT
iptables -A
FORWARD -i eth0 -o eth0 -j REJECT
# para ver como esta la tabla escribimos:
# iptables -t nat ?L
*****************************
eth0 no debe tener IP, ya que esta interfaz esta conectada al MODEM.
eth1 debe tener la una ip fija, regularmente se utiliza 254 para gateway si utilizas un firewall revisa tu configuración de modo que nadie salga directamente por el gateway.
ppp0 es el MODEM, cuando se realice la conexión podras ver este dispositivo.
El siguiente punto es instalar el cliente PPPoE. Si seleccionaste este cliente en la instalación de RH7.1 no sera necesario instalarlo, en caso contrario ve a www.roaringpenguin.com/pppoe, lo bajas y lo instalas. En la pagina hay información de la instalación. Posiblemente necesitas escribir este comando:
$ rpm ?Fvh rp-pppoe-3.3-1.i386.rpm
Este cliente ya tiene scripts que te ayudaran a este proceso, se puede hacer manualmente. A continuación muestro el archivo /etc/ppp/pppoe.conf que tengo y funciona correctamente:
*****************************
#***********************************************************************
#
#
pppoe.conf
#
# Configuration
file for rp-pppoe. Edit as appropriate
and install in
#
/etc/ppp/pppoe.conf
#
# NOTE:
This file is used by the adsl-start, adsl-stop, adsl-connect and
# adsl-status shell scripts. It is *not* used in any way by the
# "pppoe" executable.
#
# Copyright
(C) 2000 Roaring Penguin Software Inc.
#
# This file
may be distributed under the terms of the GNU General
# Public
License.
#
# $Id:
pppoe.conf,v 1.12 2001/01/01 20:20:35 dfs Exp $
#***********************************************************************
# When you
configure a variable, DO NOT leave spaces around the "=" sign.
# Ethernet
card connected to ADSL modem
ETH='eth0'
# ADSL user
name. You may have to supply
"@provider.com" Sympatico
# users in
Canada do need to include "@sympatico.ca"
# Sympatico
uses PAP authentication. Make sure
/etc/ppp/pap-secrets
# contains
the right username/password combination.
# For
Magma, use [email protected]
USER='tu_nombre_de_usuario'
# Bring
link up on demand? Default is to leave
link up all the time.
# If you
want the link to come up on demand, set DEMAND to a number indicating
# the idle
time after which the link is brought down.
DEMAND=no
#DEMAND=300
# Obtain
DNS server addresses from the peer (recent versions of pppd only)
USEPEERDNS=no
### ONLY
TOUCH THE FOLLOWING SETTINGS IF YOU'RE AN EXPERT
# How long
adsl-start waits for a new PPP interface to appear before
#
concluding something went wrong. If you
use 0, then adsl-start
# exits
immediately with a successful status and does not wait for the
# link to
come up. Time is in seconds.
#
# WARNING
WARNING WARNING:
#
# If you
are using rp-pppoe on a physically-inaccessible host, set
#
CONNECT_TIMEOUT to 0. This makes SURE
that the machine keeps trying
# to connect
forever after adsl-start is called.
Otherwise, it will
# give out
after CONNECT_TIMEOUT seconds and will not attempt to
# connect
again, making it impossible to reach.
CONNECT_TIMEOUT=0
# How often
in seconds adsl-start polls to check if link is up
CONNECT_POLL=6
# Character
to echo at each poll. Use
PING="" if you don't want
# anything
echoed
PING="."
# File
where the adsl-connect script writes its process-ID.
# Three
files are actually used:
# $PIDFILE contains PID of adsl-connect script
# $PIDFILE.pppoe contains PID of pppoe
process
# $PIDFILE.pppd contains PID of pppd process
CF_BASE=`basename
$CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
# Do you
want to use synchronous PPP?
"yes" or "no".
"yes" is much
# easier on
CPU usage, but may not work for you. It
is safer to use
#
"no", but you may want to experiment with "yes". "yes" is generally
# safe on
Linux machines with the n_hdlc line discipline; unsafe on others.
SYNCHRONOUS=no
# Do you
want to clamp the MSS? Here's how to
decide:
# - If you
have only a SINGLE computer connected to the ADSL modem, choose
# "no".
# - If you
have a computer acting as a gateway for a LAN, choose "1412".
# The setting of 1412 is safe for either
setup, but uses slightly more
# CPU power.
CLAMPMSS=1412
#CLAMPMSS=no
# LCP echo
interval and failure count.
LCP_INTERVAL=20
LCP_FAILURE=3
#
PPPOE_TIMEOUT should be about 4*LCP_INTERVAL
PPPOE_TIMEOUT=80
#
Firewalling: One of NONE, STANDALONE or MASQUERADE
FIREWALL=NONE
# Any extra
arguments to pass to pppoe. Normally,
use a blank string
# like
this:
PPPOE_EXTRA=""
# Rumour
has it that "Citizen's Communications" with a 3Com
#
HomeConnect ADSL Modem DualLink requires these extra options:
#
PPPOE_EXTRA="-f 3c12:3c13 -S ISP"
# Any extra
arguments to pass to pppd. Normally,
use a blank string
# like
this:
PPPD_EXTRA=""
DEVICE=ppp0
BOOT=no
***********************************
Si no deseas configurarlo manualmente, ejecuta el script
adsl-setup
Mayor información sobre el cliente pppoe en www.roaringpenguin.com/pppoe.
Lo unico que necesitas hacer seria darlo de alta en /etc/rc.d generalmente el roaringpenguin lo hace, y el archivo se encuentra en /etc/rc.d/init.d/adsl en redhat.
5.- Mantener la conexión continua.
En el caso particular, Infinitum de Telmex (México), es un servicio que se cae si la conexión no se usa, se puede configurar el cliente de adsl para que cuando se requiera se conecte, o mantenga la conexión activa siempre. De cualquier forma, lo configure para mantener la conexión activa y como no se utilizaba por mas de 10 minutos infinitum nos desconecta, por lo que decidi hacer un pequeño evento continuo con crontab. El proceso es el siguiente:
$ crontab ?e
Este comando abre el archivo (script) de eventos personal , y agregamos las siguientes lineas:
SHELL=/bin/bash
PATH=/sbin:/bin/usr/sbin:/usr/bin
HOME=/
#run-parts
*/5 * * * *
/bin/ping 200.33.146.193 -c 3
"crontab.15939"
18L, 562C written
crontab:
installing new crontab
$
Y con eso doy 3 pings cada 5 minutos al dns de infinitum, y el servicio se mantiene por dias!.
6.- Ligas
http://www.linuxdoc.org/HOWTO/Masquerading-Simple-HOWTO/faq.html
http://www.roaringpenguin.com/pppoe/how-to-connect.txt
http://www.roatingpenguin.com/pppoe
http://www.linuxdoc.org/HOWTO/IP_Masquerade-HOWTO
http://www.linuxdoc.org/HOWTO/DSL_HOWTO
7.- Contribuciones
Javier Gómez Sierras [email protected], por su colaboración en la optimización del cron.