Una pregunta tipica, que al menos yo he visto en foros y en correos, es ¿Como comparto mi conexion a internet, usando Linux? (sin importar la distribución)
La respuesta es bastante simple : usando NAT.
6.1 ¿Que es NAT?
Había dicho que NAT era Traducción de Direcciones de Red. Realiza el cambio de una dirección de red a otra dentro del paquete de transmisión de datos. Generalmente, es la modificación de la dirección de origen del paquete. Es una de las funciones de algunos dispositivos de red, como enrutadores (o encaminadores, en algunos textos).
NAT generalmente se asocia a “economia de numeros IP”, por ejemplo, disponer de una dirección IP pública (visible desde internet) y más computadores a los cuales conectar a la red(el caso típico, por ejemplo, cuando se dispone de un modem o de una linea de banda ancha).
Dentro de las funciones de NAT, existen dos particularmente especiales : enmascaramiento de IP y reenvio de puertos (ya mencionados).
Para poder compartir una única dirección pública entre más de un host (LAN), es necesario que una máquina funcione de intermediaria entre dos redes : la pública y la privada. Para ello, se deben realizar ciertas alteraciones al tráfico, las cuales son transparentes, tanto para el usuario como para quien funcione de intermediario. Generalmente, estos dispositivos (intermediarios entre redes) se les conoce como enrutadores o routers. Su misión es encaminar (route) el tráfico entre dos (o más) partes. Todo esto es a nivel de direcciones de red.
Esta “alteración” es llamada IP MASQUERADING. Es decir, los computadores de la LAN, al conectarse (transparentemente) a una red pública, pareciera que lo están haciendo de forma directa (no es así, es solo a manera didáctica) y transparente. En realidad, el enrutador está
1. cambiando la dirección de origen para las peticiones usando la IP pública (así permitiendo una conexión cualquiera dentro de la red pública). 2. al recibir información de vuelta (de la petición anterior), debe reescribirla y enviarla a la LAN, cuando así haya sido.
(Recuerdan lo de “connection tracking” o seguimiento de conexiones?)
Existe otra forma de alteración, PORT FORWARDING. Esta funciona a nivel de protocolo (la anterior funciona a nivel de dirección de red). A través de PORT FORWARDING, se puede alterar el destino real (puerto) de un paquete (y de una transacción). El mejor ejemplo es Proxy Transparente (el cual se va a ver en el segundo artículo, debo dejar algo para el final ), que funciona de esta manera
- un host de la LAN realiza una peticion vía HTTP (protocolo TCP/UDP, por lo general puerto 80) a internet
- otro host (llamado servidor proxy) recibe la petición desde el puerto 80 y redirige la petición hacia el puerto en el cual está funcionando algún servicio de proxy (por lo general Squid), quedando el canal de comunicación abierto
- el software de proxy procesa la transacción y la realiza a internet (es decir, quien navega es el software de proxy) y recibe la información necesaria
- el software de proxy, a través del canal abierto anterior, envía la información pedida por el host de la LAN
- cuando la transacción ha terminado, avisa al cliente del cierre de la conexión
Proxies transparentes son requeridos cuando se quiere regular la navegación de sitios en internet o bien el control del ancho de banda utilizado para la navegación (lease control sobre lo que leemos y vemos )
6.2 El "setup" previo
Después de la cháchara anterior (que era necesaria para explicar unas pocas cosas), volvemos al ejemplo.
(Incluso, la cháchara es más larga que la solución en sí).
Tomando la siguiente situacion (ejemplo, claro):
- Proveedor : cualquiera (esto si es banda ancha)
- Hosts : 1 (Linux), 3 (Win$$)
- Hardware : 5 tarjetas de red (2 para Linux, 3 para Win$$). Si se está compartiendo una conexión por modem, o bien una conexión vía USB, 4 tarjetas de red. Cables de red suficientes y un hub ó switch
- Kernel Linux : cualquiera sobre 2.4. Ojalá el Kernel que viene con la distro, no es necesario recompilar.
Lo primero es configurar EXITOSAMENTE las dos tarjetas de red en Linux. El consejo típico es que primero configurar la eth0 BIEN para la conexión a internet, y luego agregar la eth1, para conectarla a la LAN.
(Lease : la maquina Linux debe navegar en internet PRIMERO antes de hacer que las otras naveguen)
Es necesario, ademas anotar algunos datos:
- Direcciones de servidores de DNS del proveedor
- Direccion de red para la LAN
Como se va a utilizar un segmento de red privado para la LAN (y son pocas máquinas), yo generalmente recomiendo usar direcciones del tipo 192.168.X.X/255.255.255.0. La elección, en este caso, es la subred 192.168.1.X/255.255.255.0.
Por tanto, configurar las maquinas como sigue :
- LINUX:
- Eth0 : Por lo general es una IP dinámica. Es irrelevante, por el momento
- Eth1 : Direccion IP : 192.168.1.1
- Mascara de Red : 255.255.255.0
- Gateway : Sin gateway (el gateway por defecto será la dirección de la eth0)
- DNS : los dns del proveedor, aunque este paso generalmente es automágico.
- WIN$$:
- Direcciones de Red : 192.168.1.2 - 192.168.1.3 - 192.168.1.4
- Mascara de Red : 255.255.255.0
- Gateway (o pasarela, puerta de enlace) : 192.168.1.1
- DNS : los del proveedor de internet
Ahora queda el cableado. Las maquinas Win$$ al Hub/Switch, la eth1 al Hub/Switch y la eth0 donde debe estar. :)
6.3 Grand Finale
Ahora los comandos.
Primero, enmascaramos (POSTROUTING) lo que salga por la eth0, usando la tabla nat con la acción de enmascarar (MASQUERADE)
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
No se usa la interfaz de origen por que no es necesaria.
Nota: En algunas versiones del kernel o de iptables, el enmascaramiento no funciona “explicitamente”, es decir, no asume el protocolo correcto. O simplemente, no enmascara. No estaria demas darle el protocolo a enmascarar con
# iptables -t nat -A POSTROUTING -o eth0 -p tcp -j MASQUERADE# iptables -t nat -A POSTROUTING -o eth0 -p udp -j MASQUERADE
Y el gran final, permitimos que Linux (kernel) permita IP Forwarding con
# echo 1 > /proc/sys/net/ipv4/ip_forward
Antes, claro, iniciar la conexion a internet (PPPoE, etc.).
Ahora, vamos a una máquina con Win$$ y en una linea de comandos, hacemos un ping a cualquier parte. Generalmente, la parada inicial de muchos:
C:\> ping www.google.com
Debería haber respuesta. En caso contrario, por lo general, es un error de DNS (host no encontrado) de las máquinas Win$$.
Si hay respuesta, bravo! Ahora las máquinas con Win$$ pueden conectarse a internet (navegar por lo general).
El primer problema que puede ocurrir es que las maquinas Win$$ “no puedan conectarse al mundo exterior para conversar” (IRC). Para ello, se usa el módulo ip_nat_irc. Esto es debido a que el diseño del protocolo de IRC es algo complicado de manejar por los routers. Se soluciona con
# modprobe ip_nat_irc