Cómo construir un encaminador (router) DSL

TÍTULO:		Cómo construir un encaminador (router) DSL
VERSIÓN LFS:	Todas
AUTOR:		Florin Boariu <florin@bnv-bamberg.de>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
	Esta receta explica cómo montar tu propia puerta de enlace
(gateway) PPPoE/DSL. O mejor dicho: Explica cómo lo hice _yo_  y asumo
que tu podrás hacer lo mismo ;)

RECETA:
Necesitarás tres cosas:

o Un sistema Linux con dos tarjetas de red (NICs) configuradas
o Un núcleo (kernel) capaz de manejar PPP y PPPoE (PPP-over-Ethernet 
  (PPP-sobre-Ethernet))
o Un demonio PPP capaz de manejar PPPoE y DoD (Dial-on-Demand 
  (Conexión-bajo-demanda))


El sistema Linux
----------------

Comprueba el libro LFS, lo explica claramente. Lo que no explica es 
cómo añadir una segunda tarjeta de red (NIC): No hay ningún problema,
asegúrate de haber compilado el controlador (driver) correcto y añade 
las siguientes líneas a tu /etc/inet.d/network (o a cualquiera que sea 
tu guión-de-arranque-de-red).

#
# estas lineas estarán presentes si ya tienes funcionando una interfaz 
# de red en los ordenadores de tu red, esta es la dirección del 
# encaminador(router)/puerta de enlace(gateway).
#
ifconfig eth0 10.1.1.200
route add net 10.1.1.0 netmask 255.255.255.0

#
# añade esta linea para configurar la segunda interfaz
#
ifconfig eth1 10.10.10.254


El núcleo (kernel)
------------------

Debes activar las siguientes opciones en el núcleo (bien como 'm', 'módulo',
 o como  'y', 'si')

CONFIG_NETDEVICES=y

CONFIG_PPP=y
CONFIG_PPPOE=y

No necesitas activar ningún tipo de soporte de compresión 
(compression/deflate) para PPP, ya que PPPoE solamente funciona con la 
compresión desactivada (al menos aquí en Alemania -- donde tu vives 
puede que no sea así).

Y no olvides asegurarte de que están cargados los módulos necesarios, 
en el caso de que hayas compilado algo como módulo.

Por supuesto, el núcleo debe tener los controladores (drivers) que 
necesiten tus tarjetas de red activados, por ejemplo:

CONFIG_ETHERNET=y
CONFIG_NET_PCI=y
CONFIG_8139TOO=y

Como siguiente paso debes activar en tu núcleo el soporte para 
encaminamiento (routing). No estoy muy seguro de todas las opciones, 
pero con estas me funcionó a mi (núcleo 2.4, ipv4). Algunas se que son
necesarias, otras lo supongo y probablemente algunas sobren.

Si alguien sabe de esto, por favor que me mande sus correcciones.

En cualquier caso, estas son las opciones que utilizo:

CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK=y
CONFIG_RNETLINK=y
CONFIG_NETLINKDEV=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_FWMARK=y
CONFIG_IP_ROUTE_NAT=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_TOS=y
CONFIG_NET_IPIP=y
CONFIG_SYN_COOKIES=y

# Netfilter Configuration (configuración del filtrado)
<bien... He marcado todo, parte dentro del núcleo, parte como módulos.
Tu hazlo pensando en tus necesidades. Sin embargo, la opción
CONFIG_IP_NF_TARGET_BALANCE causa algunos problemas de compilación en 
el núcleo 2.4.3, así que quizás prefieras desactivarla>


El demonio PPPoE con Conexión-bajo-demanda (Dial-on-Demand)
-----------------------------------------------------------

Para la conexión-bajo-demanda necesitas pppd-2.4.1 parcheado con el 
parche pppoe4. Me ha sido imposible encontrar este parche en la red, 
lo conseguí porque me lo envió su autor: Michal Ostrowski 
<mostrows@styx.uwaterloo.ca>. Nota: pppd-2.4.0-pppoe3 no sirve. 
Funciona para un uso _normal_ de pppoe, pero no para 
conexión-bajo-demanda (dial-on-demand).

Hasta donde yo conozco (2001-07-01) no se puede descargar de la red el 
parche pppoe4-patched para pppd. La única manera de conseguirlo es 
escribir un correo electrónico a Michal. Como alternativa, puedes echar 
un vistazo a http://www.linuxfromscratch.org/ -- puede que esté
disponible para su descarga mientras tanto...

Tan sólo tienes que instalar el nuevo pppd y escribir las siguientes 
líneas en tu fichero /etc/ppp/options:

#
# /etc/ppp/options: <corta_aquí>
#
plugin /usr/lib/pppd/plugins/pppoe.so

demand
connect /bin/true
ipcp-accept-remote
ipcp-accept-local

# el tiempo de espera sin hacer nada (idle time) en segundos -- quizás quieras ajustar esto
idle 600
noipdefault
defaultroute
user <tunombredeusuario@tuproveedor.com>
hide-password
noaccomp
nopcomp
nocrtscts
lcp-echo-interval 10
lcp-echo-failure 3
lock
nodetach
#
# /etc/ppp/options: </corta_aquí>
#

También necesitarás un fichero /etc/ppp/pap-secrets, con una clave 
valida para <tunombredeusuario@tuproveedor.com>.

El siguiente paso es iniciar el demonio como administrador (root) 
ejecutando:

# pppd eth0

Desde ahora, deberías ser capaz de realizar una conexión con un simple 
ping a un ordenador remoto:

# ping 195.30.20.19

Si no funciona es que has hecho algo mal. Puedes encontrar la solución 
en el PPP-CÓMO o en la documentación que acompaña al pppd-2.4.1... 
¡buena suerte!

Si funciona, el enlace se terminará automáticamente si estas sin hacer
nada durante el tiempo especificado en la opción idle. Entonces debes 
ser capaz de conectar de nuevo mediante un ping. No te rías, hay una 
razón para que te diga esto: la versión 2.4.0 de pppd parcheada con 
pppoe no conecta la segunda vez. ¡_Necesitas_ pppd-2.4.1-pppoe4 o una 
versión posterior!

Ahora puede que te interese iniciar el demonio pppd desde algún sitio 
de /etc/init.d/ (/etc/rcX.d/).


Realizar el encaminamiento
--------------------------

Tu máquina puede conectarse a Internet, pero se necesita algo más para 
tener un encaminador (router). Tienes que instalar iptables 
(http://netfilter.samba.org/). Su instalación me parece bastante 
curiosa. No da ningún problema cuando es el típico software del que 
esperas que los de -- Estoy contento de haber adivinado la 
configuración correcta, pero estoy muy lejos de comprender en 
profundidad como funciona este software, así que básicamente estas 
sólo ... :-/ Hay una cosa que te puedo decir: Necesitaras iniciar 
el patch-o-matic ('make patch-o-matic') y aplicar el parche TCPMSS. 
Esto modifica el MTU (unidad máxima de transferencia) de los clientes, 
pero realmente nunca he entendido lo que hace.

Cuando hayas conseguido la instalación ejecuta lo siguiente:

--------<corta-por-aquí>-----------

#
# prepara el núcleo para redireccionamiento IP (ip forwarding) y
# direcciones dinámicas
#
/bin/echo "1" /proc/sys/net/ipv4/ip_forward
/bin/echo "1" /proc/sys/net/ipv4/ip_dynaddr

#
# acepta los paquetes FORWARD provenientes de 10.x.x.x a través de 
# eth0 (de dentro de la red interna) o a través de ppp0 (de fuera de 
# la red interna) así como los paquetes de entrada de eth0 (red 
# interna)
#
/usr/sbin/iptables -A FORWARD -i eth0 -s 10.1.1.0/24 -j ACCEPT
/usr/sbin/iptables -A FORWARD -i ppp0 -s 10.1.1.0/24 -j ACCEPT
/usr/sbin/iptables -A INPUT -i eth0 -s 10.1.1.0/24 -j ACCEPT

#
# establece la política de desechar (DROP) los restantes paquetes 
# INPUT y FORWARD
#
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -P FORWARD DROP

#
# activa el enmascaramiento (masquerading) para todos los paquetes 
# que vengan de 10.x.x.x
#
/usr/sbin/iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE

#
# establece el tamaño correcto al MTU de todas las interfaces. Suelen
# ser mas pequeñas de lo usual, porque pppoe hace más encapsulamiento.
# Si no lo haces, un ping al resto del mundo funcionará, pero el resto
# de conexiones TCP (como FTP o HTTP) no lo harán. Daniel 
# Roethlingsberger explica que también se puede hacer al nivel de 
# interfaz (prueba 'ifconfig mtu XXX'), pero no hay nada malo en
# hacerlo así.
#
/usr/sbin/iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j \
			TCPMSS --clamp-mss-to-pmtu

-----------</corta-por-aquí>-------------

Esto te dará soporte para un encaminamiento básico. Si tienes problemas 
y/o quieres profundizar en el conocimiento de iptables (si estas 
interesado en establecer un cortafuegos (firewall) en tu encaminador 
(router)) lee el iptables-HOWTO:
http://www.linuxgrill.com/anonymous/fire/netfilter/iptables-HOWTO.html.

También puedes buscar en  http://www.linuxdoc.org/ por la palabra clave
'iptables' para encontrar documentos más avanzados sobre sobre el funcionamiento 
como encaminador (router) y/o como servidor puente intermedio transparente 
(transparent proxy) ;)

¡Buena suerte!

Florin Boariu <florin@bnv-bamberg.de>