Compartir conexión a internet en linux | Algo de Linux

jueves, 11 de septiembre de 2008

Compartir conexión a internet en linux

El otro día alguien me preguntaba cómo configurar una máquina linux para actuar como servidor de acceso a internet. Pues bien, como la cosa es sencilla, os pongo un ejemplo que me parece interesante:

Imaginemos que tenemos un equipo con linux y dos interfaces de red, que vamos a usar como servidor de acceso a internet:
  • eth0, una interfaz de red ethernet que conecta el equipo a nuestra red de área local.
  • wlan0, una interfaz de red wifi que permite conectar nuestro equipo a una red wifi.
Y supongamos que lo que queremos hacer es poder salir a internet desde cualquier equipo de nuestra red local a través de cualquier wifi a la que nos conectemos.

Pues bien, haciendo uso de iptables (el firewall interno de linux) conseguiremos nuestro objetivo. Para ello, creamos un script similar al siguiente en /etc/init.d y lo llamamos como queramos, por ejemplo: firewall (tenemos que ser root)

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -Z
iptables -X
iptables -F -t nat
iptables -Z -t nat
iptables -X -t nat

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

iptables -A INPUT -i eth0 -j ACCEPT

Éste sería un script básico que nos permitirá hacer lo que queremos.

Veamos qué hacen las reglas de nuestro script:

La primera línea del script define que estamos creando un script bash:
#!/bin/bash
La segunda línea activa el ip forwarding, que, por decirlo de alguna manera, permite redirigir los paquetes que no son para el propio host.

echo 1 > /proc/sys/net/ipv4/ip_forward
Cuando el kernel recibe un paquete de red, primero compara la dirección de destino del paquete para ver si es para el propio host.
Cuando ip_forward esta desactivado (0) y la dirección de destino del paquete es distinta a todas las direcciones locales, ese paquete se descarta.
Cuando ip_forward esta activado (1) y la direccion de destino del paquete es distinta a todas las direcciones locales, ese paquete se reenvía.
Por defecto, ip_forward está desactivado.

El siguiente conjunto nos permiten limpiar vaciando todas las reglas de iptables que pudiera haber:
iptables -F
iptables -Z
iptables -X
iptables -F -t nat
iptables -Z -t nat
iptables -X -t nat

La siguiente regla hace que todo el tráfico dirigido al interfaz de red wlan0 sea enmascarado:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Y eso es todo. Podemos añadir todas las reglas de filtrado que queramos.

Para terminar el trabajo, damos permisos 755 a dicho script:

chmod 755 /etc/init.d/firewall

Y creamos un enlace en el nivel o niveles que queramos que arranque nuestro script al iniciar la máquina. Por ejemplo, imaginemos que nuestro servidor arranca en el nivel 2:

ln -s /etc/init.d/firewall /etc/rc2.d/S99firewall

Si además, hemos instalado squid en el servidor para filtrar, añadiremos la siguiente regla a nuestro script:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Esta regla lo que hace es redirigir el tráfico http al puerto 3128, que es donde escucha por defecto squid.

Por otra parte, si tenemos varias máquinas en nuestra red, por comodidad, podemos montar un dnsmasq en el equipo servidor que asigne direcciones IP a los clientes de nuestra red.

4 comentarios:

Daniel Noriega dijo...

Hola amigo gracias por tu entrada, es la mas sencilla de todas que he visto, que funciona y muy importante dices en pocas palabras que hace cada vaina =P...

Pero te faltó decir que hace el
iptables -A INPUT -i eth0 -j ACCEPT

Esteban M. Navas Martín dijo...

Hola, Daniel:

Esta es la regla más sencilla. Lo que hace es aceptar todos los paquetes que pasen por la tabla INPUT y que provengan del a interfaz eth0.

Esteban M. Navas Martín dijo...

Hola, Daniel:

Esta es la regla más sencilla. Lo que hace es aceptar todos los paquetes que pasen por la tabla INPUT y que provengan del a interfaz eth0.

Esteban M. Navas Martín dijo...

Hola, Daniel:

Esta es la regla más sencilla. Lo que hace es aceptar todos los paquetes que pasen por la tabla INPUT y que provengan del a interfaz eth0.