NAT: Configuración de una conexión compartida con NAT bajo Debian GNU/LINUX y Windows
------------------------------------------------------------------------ Autor : NaTaSaB (natasab @ merlos . org) Web : http://www..merlos.org Fecha Publicación: Abril 2003 Último Cambio : Septiembre 2003 ------------------------------------------------------------------------
Introducción
En este texto se explicarán los distintos pasos que se han dado para la configuración de una pequeña red casera que tiene servidor un ordenador en el que a veces se ejecuta Linux y otras Windows y varios ordenadores clientes que también pueden usar de forma alternativa Windows o Linux. Iremos comentando paso a paso, que hay que hacer en cada sistema. La idea es la de dar los mismos servicios de internet tanto si el servidor se encuentra corriendo Linux como si está ejecutando Windows sin tener que realizar modificaciones en los clientes.
Nota: Parte de como configurar Windows como servidor está por escribir
Este tutorial no pretende sentar cátedra ni tampoco tener en cuenta todos los casos y configuraciones posibles, sino que se intenta explicar l os pasos llevados a cabo para conseguir el objetivo en un sistema particular.
Para seguir el tutorial se requieren un mínimo de conocimientos de red, no se explicarán conceptos de red como que es IP, una máscara subred, que son los DNS, etc.
Sistemas Empleados
En este caso práctico se han empleado:
Servidor
- Debian GNU/Linux (Woody) con Kernel 2.4.18
- Windows 2000 Pro
- 2 Tarjetas de red, una conectada al cablemodem (eth0) y la otra conectada a la red local (eth1)
Clientes
- Debian GNU/Linux
- Windows 98
- Windows XP
- Tarjeta de red conectada a la red local
Instalación/Configuración de las Tarjetas de Red
Windows
La instalación de tarjetas, en el caso de Windows es bastante sencillo, tan sólo hay que pinchar la tarjeta en el ordenador, y para tarjteas que sean relativamente nuevas, puesto que serán Plug&Play, se detectarán al arrancar el ordenador.
Si ya teníamos un interfaz de red instalado porque teníamos una red local y ahora tenemos que instalar la tarjeta de red del cablemodem, no tendremos ningún probema ya que nos aparecerá otro nuevo, sin embargo, si tenemos que instalar las 2 tarjetas de red simultáneamente, es mejor, pinchar una, configurarla parala red local y luego instalar la segunda, de esa forma nos evitamos el tener que averiguar que tarjeta se corresponde con cual (sobre todo si ambas son iguales)
A la hora de configurar internet, en mi caso la IP y los DNS me los proporciona mediante DHCP la empresa de cable contratada. Esta configuración es la que viene por defecto al instalar la tarjeta de red en Windows, por lo que no hay que tocar a nada en las propiedades de ésta tarjeta.
Lo primero que tenemos que hacer es ir Entorno de Red/Propiedades


En cuanto a la configuración de la tarjeta de la red local, en mi caso uso la IP 192.168.0.1/255.255.255.0 para el servidor y 192.168.0.2, 192.168.0.3...para los clientes.
Linux
Lo primero que tenemos que hacer es, si acabamos de instalar las tarjetas de red, comprobar que el kernel ha cargado el módulo (driver) que las gestiona. Para ello podemos ver los mensajes que el kernel audita al arrancar, esto es, las últimas líneas del fichero
/var/log/messages
Tendremos unas líneas parecidas a las que siguen:
Mar 30 12:26:46 natasab kernel: 8139too Fast Ethernet driver 0.9.24 Mar 30 12:26:46 natasab kernel: PCI: Assigned IRQ 12 for device 00:08.0 Mar 30 12:26:46 natasab kernel: eth0: RealTek RTL8139 Fast Ethernet at 0xc88e3000, ff:50:f0:f0:cf:ff, IRQ 12
Si no es así, tenemos que cargar el módulo para que nos reconozca la tarjeta de red. En debian tenemos un fantástico programa llamado modconf

Sólo tendremos que ir a la sección kernel/drivers/net y seleccionar el driver de nuestra tarjeta de red.
Si tienes otra distribución distinta de debian, puedes ejecutar los comandos modprobe -L |grep net para visualizar la lista de módulos, modprobe nombremódulo, para probar a cargar el módulo y lsmod para ver la lista de módulos cargados, también busca información sobre como cargar los módulos al arrancar en tu distribución, ya que modprobe sólo lo hace en la sesión actual.
Una vez que el núcleo ha detectado la tarjeta de red tendremos que configurarlas (asignarles IPs,máscara subred, etc..). En Debian para la configuración de la red tenemos un programa llamado etherconf que nos ayudará a configurar los interfaces de red del tipo ethernet. Durante la instalación ya se ejecuta y podremos configurar las tarjetass. Para instalarlo usaremos el apt-get,si no sabes usar apt-get puedes leer el APT-Cómo.
apt-get install etherconf
Nota: Para ejecutar más veces el etherconf hay que utilizar el siguiente comando:
dpkg-reconfigure etherconf
Este programa lo que hará será detectar todas las tarjetas ethernet y nos irá haciendo una serie de preguntas sencillas. En el servidor tenemos 2 tarjetas, una será el interfaz eth0 y la otra el interfaz eth1. Es de vital importancia el saber que tarjeta se corresponde con cada interfaz. Si las tarjetas son distintas, esto es, hardware distinto, no habrá problemas, sólo tendremos que mirar en los mensajes de /var/log/messages que tarjeta se corresponde con cada interfaz de red ethX,pero si las tarjetas son iguales (mismo hardware) un problema con el que nos encontraremos es que si, por ejemplo, en el servidor tenemos 2 sistemas operativos tenemos que asignarle a cada tarjeta la misma función en ambos, es decir, que por ejemplo, la tarjeta 1 esté configurada para ser el interfaz de la red local y la tarjeta 2 que esté configurada para la conexión del modemcable. Para resolver este pequeño problema, simplemente configuramos ambas tarjetas para la red local y mediante ping comprobamos que nombre le da el sistema a cada una. En mi caso, eth0 se correspondía con la tarjeta conectada al modem y eht1 con la tarjeta de la LAN.
Al ejecutar el etherconf nos preguntará el hostname (nombre del PC), el dominio (podemos poner lo que queramos), si usamos dhcp y en caso de no usarlo la IP, máscara subred, el gateway.
Para el servidor y la tarjeta de red del cablemodem contestaremos que si a la pregunta de si usamos DHCP. Para la tarjeta de red asociada a la red local contestaremos que no usamos DHCP, asignaremos la IP/máscara (192.168.0.1/255.255.255.0) y dejaremos en blanco el gateway
Para comprobar que todo ha ido bien ejecutaremos el comando ifconfig y comprobaremos que los datos introducidos son correctos, es decir, que eth0 tiene una IP de nuestro proveedor de Internet y eth1 tiene la IP/máscara que queremos:~$ /sbin/ifconfig eth0 Link encap:Ethernet HWaddr FF:FF:21:FF:71:FD inet addr:80.33.224.46 Bcast:255.255.255.255 Mask:255.255.252.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2404242 errors:0 dropped:140 overruns:0 frame:39 TX packets:1688624 errors:23 dropped:0 overruns:0 carrier:44 collisions:13673 txqueuelen:100 RX bytes:1131690037 (1.0 GiB) TX bytes:618310033 (589.6 MiB) Interrupt:10 Base address:0x6500 eth1 Link encap:Ethernet HWaddr FF:FF:21:FF:FF:D5 inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:108495 errors:0 dropped:0 overruns:0 frame:0 TX packets:120889 errors:0 dropped:0 overruns:0 carrier:0 collisions:513 txqueuelen:100 RX bytes:13073360 (12.4 MiB) TX bytes:99885590 (95.2 MiB) Interrupt:9 Base address:0x6600 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:114710 errors:0 dropped:0 overruns:0 frame:0 TX packets:114710 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:9859981 (9.4 MiB) TX bytes:9859981 (9.4 MiB)
También podemos ejecutar el comando route para ver que el encaminamiento se realiza de forma correcta:
$ /sbin/route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface localnet * 255.255.255.0 U 0 0 0 eth1 80.33.224.0 * 255.255.252.0 U 0 0 0 eth0 default 80.34.224.0 0.0.0.0 UG 0 0 0 eth0
A grosso modo, en esta tabla podemos ver que todos los paquetes que sean de la red local saldrán por el interfaz eth1,que todos los paquetes que vayan a la subred 80.33.224.0/255.255.255.0 salgan por eth0 y por último que el resto de los paquetes salgan por eth0 hacia la pasarela 80.34.224.0
Sólo falta comprobar la correcta configuración de los DNS, es decir, ver el contenido de /etc/resolv.conf y hacer algún ping
En los clientes, a la hora de configurar el interfaz de red con etherconf contestaremos que no usamos DHCP, y asignaremos IP/máscara (192.168.0.x/255.255.255), en cuanto al gateway pondremos la IP del servidor (192.168.0.1).
Una vez hecho estotendremos que indicarle cuales son los DNS de nuestro proveedor de internet. Para eso sólo tenemos que copiar el contenido del fichero del servidor /etc/resolv.conf a nuestro fichero local /etc/resolv.conf
También podemos comprobar que la tabla de encaminamiento está bien:
# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface localnet * 255.255.255.0 U 0 0 0 eth0 default principal 0.0.0.0 UG 0 0 0 eth0
Configuración de Netfilter (iptables && NAT)
Windows
Linux
De momento, si todo ha ido bien, sólo funcionará Internet en el PC que hace de servidor. Pero nosotros queremos que todos los ordenadores de la Intranet tengan acceso a la gran red, para ello Linux ya incorpora todo lo necesario en el núcleo en diversos módulos. En nuestro caso usamos un kernel 2.4.x, por lo que usaremos iptables
Tenemos dos taréas que realizar, por una parte, configurar NAT y por otra configurar el cortafuegos/firewall. Por lo general, los núcleos vienen precompilados para que los módulos que controlan esto. Aquí presentamos la configuración final del script que controla esto:
#!/bin/sh ########## CONFIGURACION ############ #Local IP L_IP="192.168.0.0" # Local Network Mask L_MASK="255.255.255.0" # Local Network Interface L_INT="eth1" # Internet Network Interface I_INT="eth0" # Squid Listening Port SQUID_PORT="8080" ################################### ########### CORTAFUEGOS ###################### echo " -- Añadiendo Politicas + Cortafuegos Básico..." # Establecemos las políticas por defecto. iptables -P INPUT DROP iptables -P OUTPUT ACCEPT # Para NAT iptables -P FORWARD ACCEPT # Creamos nueva cadena para añadir en esa cadena a los amigos iptables -N KAISER # Permitimos acceso desde localhost y sólo interfaz "lo" iptables -A INPUT -s 127.0.0.1/32 -i lo -j ACCEPT # Permitimos acceso total a los ordenadores de la red local iptables -A INPUT -s $L_IP/$L_MASK -i $L_INT -j ACCEPT echo " -- Añadiendo Reglas xMule del Servidor..." # Regla para permitir compartir ficheros con XMULE y HIGH ID. iptables -A INPUT -i eth0 -p tcp --dport 4662 -j ACCEPT iptables -A INPUT -i eth0 -p udp --dport 4672 -j ACCEPT iptables -A INPUT -i eth0 -p udp --dport 4665 -j ACCEPT # Las conexiones que estén establecidas = OK #(para cualquier interfaz) iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ################## NAT ############################ echo " -- Añadiendo Reglas de NAT..." iptables -t nat -A POSTROUTING -o $I_INT -j MASQUERADE echo " -- Añadiendo Reglas de NAT... xmule" #Con las siguientes reglas permitimos que un ordenador cliente pueda tener #el xMule/eMule con HIGH ID usando como puertos el 5662 y 5672 iptables -t nat -A PREROUTING -i $I_INT -p tcp --dport 5662 -j DNAT --to 192.168.0.122 iptables -t nat -A PREROUTING -i $I_INT -p udp --dport 5672 -j DNAT --to 192.168.0.122 ############## Proxy Transparente con Squid (puerto 8080)###### # Ojo! Para que esto funcione ha de estar bien configurado el proxy # En esta página hay un tutorial sobre la configuración del SQUID. # Se recomienda su visita en caso de que haya alguna duda echo " -- Añadiendo Regla Proxy Transparente..." iptables -t nat -A PREROUTING -i $L_INT -s $L_IP/$L_MASK -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT #### Si queremos redireccionar algún servicio a otra máquina. # en este caso estamos redirigiendo todo el tráfico que llegue al servidor # al puerto 80 hacia el PC con IP local 192.168.0.122 iptables -t nat -A PREROUTING -i $I_INT -p tcp --dport 80 -j DNAT --to 192.168.0.122:80 # Ponemos en marcha el reenvío de IP (IP forwarding) # OJO IMPORTANTEEEE!!! Si no está a 1 NO FUNCIONA! echo 1 > /proc/sys/net/ipv4/ip_forward
Copiamos este script en un fichero, lo modificamos de tal forma que se adecúe a nuestro sistema y lo ejecutamos siendo root. Es importante entender qué hace cada regla. Para saber que hace cada opción lo mejor echar mano de la página manual del iptables o de las páginas a las que hago referencia al final del texto ya que puede que haya alguna regla que he incluido que no uses como puede ser la del proxy transparente o las del xMule
Según sean nuestros hábitos de conexión a internet, podemos ejecutar a mano este script cada vez que arranquemos el ordenaodor y nos conectemos a internet o cargarlo por defecto al arrancar el ordenador. Para hacer lo segundo sólo tendremos que ejecutar:
# dpkg-reconfigure iptables
que lanzará un "amigable interfaz" y donde tendremos que indicar que se ejecuten las reglas de forma automática al arrancar el ordenador
¡Ojo! También hay que indicar que las reglas actuales son las que tiene que cargar cada vez que se arranque el ordenador, para ello hay que ejecutar el siguiente comando con el cual salvaremos las reglas que tenemos cargadas en el instante actual:
# /etc/init.d/iptables save activePor último, otra cosa que hay que indicar es que se active el ip_forward por defecto. Para ello hay que editar el fichero /etc/network/options
$ cat /etc/network/options ip_forward=yes spoofprotect=yes syncookies=no
Y ya está! Con esto tendrás que olvidarte de configurar proxys, los clientes para que usen un proxy, etc...
Más Información
La documentación que se ha empleado como referencia es la siguiente:
- Guía de referencia Debian Capítulo 10 - Construyendo una puerta de enlace en Debian
- Linux 2.4 NAT Como
- Packet Filtering HOWTO
- Página del manual de iptables(man iptables)