Utilizando Linux como puerta de enlace a Internet (un gateway)
Introducción:
Una puerta de enlace (o del inglés "gateway") es un servidor que posee
conexiones a dos o más redes distintas. De esta forma, los equipos que
estén en una red pueden pasar, a través del gateway, a la otra red.
Con esto se logran varias cosas,
la principal, es que las dos redes estan separadas, por lo tanto el
tráfico que hay en una red, no afecta a la otra. Entre otras
cualidades que se logran teniendo un gateway es que se puede controlar
mucho más como viajan los paquetes TCP/IP y lo más importante, poder
controlar quién pasa y quién no.
En este documento voy a explicar el armado de gateways en Linux y para
hacer más fácil la comprensión del mismo, voy a usar el ejemplo
típico: Teniendo una red local (LAN) de dos o más máquinas, utilizar un
equipo Linux para que las máquinas en la red local puedan navegar por
Internet.
--------------------
Requerimientos:
Para realizar esta configuración se deberá tener un equipo Linux
(casi cualquier distribución: Debian, SuSE, RedHat, OpenLinux, etc.)
y dos interfaces de red. Esto puede ser una placa de red y un modem, dos
placas de red, dos modems, un cable serial y uno paralelo. Por
interfaces de red se entiende "tipos de conexiones" (cualquier cosa
que se le pueda asignar una dirección de red). En Linux se pueden
configurar casi cualquier cosa que sirva para enviar datos, como una
interface de red.
Por otro lado se requerirá tener otro equipo que este conectado de
alguna forma al servidor Linux, para utilizarlo como gateway y poder
probar nuestra "puerta de enlace". Este segundo equipo puede estar
corriendo cualquier sistema operativo que soporte TCP/IP (Mac,
Windows 3.x/95/98/NT, Unix, OS/2, y otros).
--------------------
Configurando la red:
- En el servidor -
Como ya es bien sabido, cada distribución tiene su sistema de
administración para configurar los diferentes sub-sistemas de Linux.
Lo que se quiere lograr (más allá de la distribución que se utilize)
es configurar una placa de red con un número de IP local, digamos ...
192.168.1.10 (para ser bien originales :-)).
Para que este servidor cumpla su función de gateway, otra interface de
red es necesaria. Siguiendo el ejemplo propuesto en la introducción,
la segunda interface de red será entonces, una conexión a internet. La
conexión a internet puede ser a través de un modem o una conexión
punto a punto.
Como ya existen montones de documentos que explican cómo realizar una
conexión a internet (con modem) no voy a detallar este proceso.
Algunos URLs de interés para aquellos que no sepan cómo realizar este
tipo de configuración ...
http://aula.linux.org.ar/biblioteca/tecnicos/cHALITO-1/cHALITO-1.htm
Lo importante a tener en cuenta es que la ruta por defecto de la
configuración de la red sea la segunda interface, la que tiene el
número de IP de la otra red. Generalmente, los scripts para conectar
un Linux a internet con un modem realizan esto por Ud., pero en el
caso de que esto no se realize bien, no esta de más revisar la
configuración (una vez que el equipo se conectó a internet)
Para configurar la ruta por defecto se debe ejecutar este
comando:
/sbin/route add default <nombre_de_la_interface>
El nombre de la interface será el que se aplique a cada instalación.
Si la segunda interface es una conexión por modem a internet, el 99%
de los casos esta interface se llamará "ppp0".
Para verificar las interfaces que estan activas se puede ejecutar el
comando:
/sbin/ifconfig
- En la/s estación/es de trabajo (WS) -
Las estaciones de trabajo tienen que estar configuradas dentro de la
misma red que el servidor, en otras palabras, tienen que tener una
dirección dentro de la misma clase que el servidor. Siguiendo el
ejemplo, la dirección que podemos asignar a una de las estaciones de
trabajo de la red local podría ser 192.168.1.11 (IMPORTANTE: Todas las
máquinas que estén dentro de una misma red deben tener una dirección
diferente).
Por otro lado, hay que especificar que la puerta de enlace (o gateway)
de la estación de trabajo sea el el servidor, o sea, 192.168.1.10.
--------------------
Armando el gateway:
Lo único que se debe hacer ahora, es utilizar el núcleo de Linux para
que todos los pedidos de conexión que realicen las estaciones de
trabajo (a direcciones fuera de la red local), sean traducidos por el
gateway.
Cuando un paquete TCP/IP es enviado a la red debe informar a dónde va
y de dónde viene, las direcciones que informa el paquete TCP/IP deben
ser válidas, ya que sino lo son, estos paquetes no pueden volver al
lugar de donde vinieron. (De nada nos sirve conectarnos a una página
web si el servidor web no puede enviarnos la página que nosotros
pedimos.)
Cuando utilizamos un gateway de internet, el gateway cambia el
contenido del paquete diciendo que la dirección "remitente" es la del
propio gateway, paralelamente, el gateway genera una tabla interna que
le permite saber a quién (de la red local) debe entregar los paquetes
que vengan del servidor al cual le envío el paquete inicialmente.
Ejemplo: Cuando una estación de trabajo envia un pedido de página a un
servidor web de internet, el gateway recibe este pedido, cambia la
dirección remitente, reenvia el pedido al servidor web; cuando el
servidor web recibe el pedido, devuelve una página al gateway (ya que
desde el punto de vista del servidor web, el que pidió la página fue
el gateway) y el gateway al recibir la página, se la reenvia a la
estación de trabajo de la red local (siguiendo los datos que generó en
su tabla interna).
Esta traducción o "cambio de paquetes" se llama "enmascaramiento" o
"masquerading" (en inglés).
Como en Linux todos los paquetes TCP/IP son leidos por el núcleo, es
el núcleo quien hace el enmascaramiento. Para decirle al kernel que
"enmascare" todos los paquetes que quieran salir por la interface
"default" (o por defecto), se tiene que ejecutar este comando:
/sbin/ipchains -P forward MASQ
Este comando le ordena al kernel que todos los paquetes que necesiten
ser reenviados, sean enmascarados (esto lo realiza para los paquetes
que vienen de cualquiera de las dos redes a las cuales esta
conectado!!!!).
Si una estación de trabajo hace un pedido a un servidor de la red
local, los paquetes no serán reenviados ni enmascarados, ya que la
estación de trabajo tiene acceso directo a este servidor (los dos
equipos estan dentro de la misma red) y realizará la conexión con el
servidor en forma directa, sin pasar por el gateway.
Nota: Si se esta utilizando un kernel versión 2.2.x se recomienda
ejecutar:
echo 1 > /proc/sys/net/ipv4/ip_forward
Esto es necesario para indicarle al kernel que haga el "forwarding" o
traspaso de paquetes entre interfaces (varias distribuciones realizan
esto automáticamente, pero no todas).
--------------------
Un problema típico:
- El ftp no funciona... (ni el ICQ, ni el IRC, ...)
Hay ciertos protocolos que trabajan en forma diferente al común de los
protocolos, el ftp es uno de ellos. La mayoría de los protocolos
(http, mail, pop, imap, ssh, etc.) hablan entre el cliente y el
servidor sin realizar nuevas conexiones.
Cuando un servidor ftp recibe un requerimiento de un cliente ftp, el
servidor intenta realizar una conexión nueva desde el servidor hacia
el cliente (por otro puerto distinto al 21, el 20). Como esta conexión,
es una conexión nueva, el gateway no tiene forma de reenviar los
paquetes a la estación de trabajo, ya que el paquete que recibió va
dirigido a la dirección del gateway (y la tabla interna que generó el
gateway en su momento no tiene la suficiente información para darse
cuenta que esta conexión va dirigida realmente a una estación de
trabajo).
Para evitar este problema, es necesario utilizar un módulo de kernel
especial, el módulo se llama ip_masq_ftp y se encuentra en
/lib/modules/<version_de_kernel>/ipv4.
Para utilizarlo simplemente hay que ejecutar:
modprobe ip_masq_ftp
Existen varios de estos módulos, como dije anteriormente el ftp no es
el único protocolo que trabaja de esta forma. Los otros módulos
disponibles son:
ip_masq_cuseeme (p/ utilizar CU-SeeMe)
ip_masq_irc (p/ chatear con IRC)
ip_masq_icq (p/ enviar y recibir mensajes ICQ)
ip_masq_quake (p/ jugar al Quake)
ip_masq_raudio (p/ utilizar Real Audio)
ip_masq_vdolive (p/ utilizar conexiones de video VDOLive)
--------------------
Una lista de pasos rápidos:
Para los que les gustan las recetas, acá hay una lista con los 5
pasos para configurar un gateway con Linux:
1) Configurar la red (la interface de red local 192.168.1.10 y la
conexión a internet)
2) Conectarse a internet con el modem
3) Ejecutar:
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/route add default ppp0
/sbin/ipchains -P forward MASQ
4) Configurar las estaciones de trabajo para que usen al linux
(192.168.1.10) como puerta de enlace o "gateway"
5) modprobe ip_masq_ftp
--------------------
Algunas notas y conclusiones:
Como se puede ver, con Linux, configurar un gateway es muy sencillo,
de todas formas es importante tener en cuenta que cuando se conecta un
equipo a una red pública como internet, uno esta obligado a tomar
varios recaudos y protegerse contra ataques provenientes de la misma
red.
Los pasos descriptos en este artículo no toman estos recaudos ya que
escapa al objetivo de lo descripto.
Antes de conectar un equipo a internet, y con más razón si se esta
conectando una red local a internet (a través de un gateway), se
recomienda leer los artículos de seguridad en Linux como
Security-HOWTO, Ipchains-HOWTO entre otros.