Dado que en los foros de Redes-Linux, varias veces se ha
preguntado como se llevaba a cabo esta operación con Linux, he desarrollado este pequeño documento,
en el que explico como podemos realizar esta operación.
Varias formas de hacerlo
Para compartir nuestra conexión a internet, podemos hacerlo de dos formas bien distintas:
1) Mediante el uso de un proxy-web como squid.
2) Mediante el uso de iptables (ipchains/ipfw).
Cada una de estas, tiene sus pros y sus contras y es el usuario el que debería valorarlas.
La primera de ellas, será una forma muy conocida por la gente que proviene de
windows, ya que es muy utilizada por estos usuarios (se nota que han probado la
aplicación propia que lleva windows "compartir conexión a internet"...) y tiene la
ventaja que si se hace uso de un proxy-caché como squid, podemos ahorrar ancho de
banda en nuestra red local. ¿Por qué?, pues porque squid, abrirá un puerto por donde
escuchará las peticiones web de nuestros clientes de la LAN y será él, el que haga la
"petición en sí", guardándose una copia, de manera que si otro cliente desea visitar
la misma web, es el proxy el que se la sirve.
Para que se observe de forma más ilustrativa veámoslo en una imagen:
De esta forma, ahorraremos ancho de banda, el cual es un "don muy preciado".
La gran pega que tiene hacerlo de esta manera, es que Squid solo es compatible
con HTTP, FTP, HTTPS, GOPHER y WAIS, por lo que si queremos compartir enteramente la
conexión, esta solución no nos valdrá (a no ser que utilicemos otro proxy compatible
que escuche por otro puerto, para esos menesteres). Es decir, por ejemplo, si
lo que queremos es que toda nuestra red local pueda consultar correo externo,
no podremos hacerlo con Squid.
La segunda forma es mi preferida, pues iptables da mucho más juego que
un proxy squid, ya que con este, además de poder compartir la conexión a internet,
podremos poner en marcha un firewall para nuestra red local, además de poder gestionar
todo el filtrado de paquetes hacia las maquinas de nuestra LAN.
De esta forma, sí podremos hacer uso de cualquier tipo de protocolo en todos los
clientes de nuestra red local (si hemos puesto en marcha un firewall con iptables,
debemos de tener en cuenta las restricciones que hayamos puesto).
Compartir la conexión con un proxy Squid
1.1.- Instalación del proxy Squid (si no lo tenemos ya instalado)
Segun que distribución de Linux sea la nuestra, podremos instalar Squid de
una forma o de otra:
1.2.- Puesta en marcha de Squid
Una vez lo tenemos instalado, podremos poner en marcha el proxy de esta forma:
/etc/init.d/squid start
/etc/rc.d/init.d/squid start (esto para algunas distribuciones basadas en rpm)
Si hemos instalado desde fuentes, es posible que no tengamos este script de
arranque, debiendo de arrancarlo con el comando:
/usr/local/squid/sbin/squid
Si este es nuestro caso y queremos que nos arranque en el
inicio del sistema, podemos hacer nosotros un script en "/etc/init.d"
llamado "squid", que contenga esto:
/usr/local/squid/sbin/squid &
y lo ponemos en el arranque de nuestro sistema de esta manera:
ln -s /etc/init.d/squid /etc/rc2.d/S99squid
ln -s /etc/init.d/squid /etc/rc3.d/S99squid
ln -s /etc/init.d/squid /etc/rc4.d/S99squid
ln -s /etc/init.d/squid /etc/rc5.d/S99squid
1.3.- Configurar Squid para compartir la conexión
Para configurar squid, basta configurar el fichero "squid.conf" que según
si hemos instalado desde paquetes binarios o desde fuentes lo encontraremos en
un lugar u otro. En el caso de paquetes binarios, lo podremos encontrar en "/etc"
(paquetes .deb de debian), "/etc/squid (paquetes .rpm), mientras que si hemos
instalado desde fuentes estará en "/usr/local/squid/etc" (el --prefix que le
indicamos al hacer el ./configure).
En dicho fichero, deberemos prestar atención a varias directivas que nos
serán necesarias para compartir la conexión a internet, las cuales vamos a ver
resumidas ahora (presuponemos que nuestra red local es del tipo 192.168.1.0/255.255.255.0):
http_port 3128 (este es el puerto por el que queremos que escuche nuestro proxy)
cache_mem 8 (tamaño máximo que pueden alcanzar los objetos cacheados, sería
recomendable ponerlo a 16 MB si poseemos varios clientes).
cache_dir ufs /var/spool/squid 100 16 256 (es el directorio donde se almacenará la caché
y como se estructurará éste. No lo tocaremos)
acl all src 0.0.0.0/0.0.0.0 (creamos una lista de acceso con todas las redes)
acl localhost src 127.0.0.1/255.255.255.255 (creamos una lista de acceso con
la propia maquina)
acl mired src 192.168.1.0/255.255.255.0 (creamos una lista de acceso con mi red)
http_access allow localhost (permitimos el acceso a la propia maquina)
http_access allow mired (permitimos el acceso a nuestra red local)
http_access deny all (denegamos el acceso al resto de la red)
httpd_accel_host virtual
httpd_accel_port 0 (habilitamos cache acelerada para cualquier puerto)
http_accel_with_proxy on
Y todas las demás opciones las dejamos como vienen por defecto (No es objeto
de este articulo, explicar enteramente el funcionamiento de squid, sino solo la
tarea de compartir la conexión a internet)
Solo recordaremos que si tuviéramos más redes, deberíamos definir una acl
nueva con esa otra red (acl nombre_de_red src dirección_de_red/mascara) y permitir
el acceso justo antes de denegar al resto de las redes, pues la aplicación de las
reglas van siguiendo un orden y si se cumple una de estas reglas, ya no se aplicaría
la siguiente. Es decir, si hubiésemos puesto primero el "httpd_access deny all",
nuestra red local entra dentro de esta aplicación (all hacía referencia a todas
las redes) y ya no miraría el "httpd_access allow mired" y por tanto, no tendría
acceso a nuestro proxy. Tal como esta puesto en el ejemplo, nuestra red cumpliría
la aplicación "httpd_access allow mired" y ya no se fijaría en el "httpd_access
deny all", afectando como decía anteriormente, solo al resto de las redes.
También recordar que ante cualquier cambio en el fichero de configuración
de squid, deberemos reiniciar este servicio:
/etc/init.d/squid stop
/etc/init.d/squid start
/etc/rc.d/init.d/squid stop (esto para algunas distribuciones basadas en rpm)
/etc/rc.d/init.d/squid start
1.4.- Configuración de los clientes
En los clientes, solo comentar que en cada una de las aplicaciones que
utilicemos de cara a internet (los proxies son también conocidos como firewall
de aplicación), habrá que configurar como proxy el que acabamos de configurar.
Por ejemplo, en el Internet Explorer, nos tendremos que ir a:
Herramientas - Opciones de internet - Conexiones - Configuración Lan
Aquí, marcamos la casilla de "Usar servidor proxy", poniendo como dirección,
la ip de nuestro proxy y como puerto el 3128 (que es el que le hemos indicado
a squid).
En el mozilla sería:
Edición - Preferencias - Avanzadas - Proxies
Aquí, marcamos la casilla de "Configuración manual del proxy" y en la casilla
"Proxy HTTP" ponemos la dirección IP y como puerto el 3128 (que es el que le
hemos indicado a squid),
Y hasta aquí la parte de la explicación de los clientes, ya que no es objetivo
de este articulo, el desarrollo de esta parte, ya que deberíais saber como se hace.
2.- Compartir la conexión con Iptables
Iptables funciona de forma parecida a las reglas de acceso del proxy squid, es
decir, será un conjunto de reglas puestas en orden y si cumplimos una que restringe
a la siguiente, no cumpliremos esta última. Es decir, imaginemos que en una primera
regla impedimos el acceso de una dirección ip a nuestra web o mejor dicho al puerto
80 de nuestra maquina, si en una regla posterior aceptamos de todo el mundo los paquetes
(o para que lo entendamos todos, conexiones), a este mismo puerto 80, la dirección ip
que antes habíamos restringido, seguirá sin poder ver nuestra web, pues la primera
regla ha restringido a la segunda, convirtiéndose esta última en: "aceptamos el
acceso de todos menos de esa ip".
Pero bueno, como no es objetivo de este articulo, explicar como se pone en
marcha un firewall, sino compartir la conexión a internet o dicho de mejor forma,
"Hacer NAT de nuestra red local", vamos a ver sin más dilación como vamos a llevar
a cabo esta faena.
2.1.- ¿Qué es hacer NAT/MASQUERADE de una red?
Explicado de manera rápida, hacer NAT/MASQUERADE de una red, es simplemente
enmascarar las ip's de dicha red con otra diferente, es decir, imaginemos una
maquina cuya ip es 192.168.1.1 que sirve de pasarela de otra maquina cuya ip es
192.168.1.2. Hacer NAT de esta última maquina, significa que de cara al exterior
las conexiones las estará haciendo 192.168.1.1, aunque sea 192.168.1.2, la que
esté accediendo al exterior.
Pero al igual que antes, para comprenderlo mejor, veamos un gráfico:
2.2.- Sencillo ejemplo de NAT/MASQUERADE con iptables
Una vez sabemos qué es hacer NAT/MASQUERADE, vamos a ver como hacerlo de
nuestra red local, para poder compartir la conexión a internet.
La forma de utilizar iptables, es ir escribiendo regla por regla, recordando
la misma limitación del orden de las reglas que teníamos en el proxy. La pega
de esto, es que estas reglas se guardan en memoria, perdiéndose cuando apagamos
el ordenador. Para evitarlo, existe un script llamado iptables-save que hace una
copia de seguridad de la tabla de reglas de iptables.
Además de esto, lo que podemos hacer es escribir en orden las reglas en un
script, el cual podemos ejecutar en el inicio del sistema (esta es la forma que
veremos aquí). Para ello, editamos un fichero de texto, por ejemplo,
"/etc/init.d/firewall", donde pondremos esto (contando que tu red local es del
tipo 192.168.1.0 y sales a Internet a traves de la interfaz eth0. Si te
conectas con modem de 56K cambia esta interfaz por ppp0):
modprobe iptable_nat
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Una vez lo tenemos, le damos permisos de ejecución:
chmod +x /etc/init.d/firewall
Y lo ponemos en el arranque del sistema:
ln -s /etc/init.d/firewall /etc/rc2.d/S99firewall
ln -s /etc/init.d/firewall /etc/rc3.d/S99firewall
ln -s /etc/init.d/firewall /etc/rc4.d/S99firewall
ln -s /etc/init.d/firewall /etc/rc5.d/S99firewall
2.3.- Configuración de los clientes
En los clientes de nuestra red local, lo único que tendremos que hacer
es poner como puerta de enlace predeterminada (o gateway), la ip de la maquina
que acabamos de configurar.
Conclusión
Con estos dos métodos que hemos visto, podríamos compartir la conexión
a internet fácilmente con las demás maquinas de nuestra red local, pero
jugando un poco más con ellos, podremos hacer cosas mucho más sofisticadas,
como un firewall para proteger nuestra red local, un proxy transparente, para
que no puedan saltárselo los usuarios, proxy autentificado mediante samba, ldap,
etc, etc..
|