Escrito el 11 abril 2013 por Luis Ignacio Díaz Martínez
Tabla de contenidos
En el artículo anterior explico como instalar un servidor DHCP + DNS con Debian. Aquí explicaré una pequeña ampliación sobre el apartado de «Gateway» ( puerta de enlace )… que nos permitirá compartir la conexión a Internet con las máquinas que se encuentran en nuestra área local.
En nuestro caso tenemos una máquina con dos tarjetas de red que una apuntará al exterior y la otra a la red local, para que sea más explicativo expongo el siguiente gráfico:
Como podemos observar tenemos dos redes como he explicado antes. Nuestro principal objetivo vendría a ser que las máquinas locales ( con la red 172.16.0.0/16 ) pudieran conectarse a la red la cual tiene acceso a Internet ( 192.168.1.0/24 ) y por lo tanto convertir nuestra máquina en una puerta de enlace que nos dará plena conectividad al mundo exterior. A su vez, también conectaremos dos redes y por lo tanto vamos a redireccionar el tráfico de una red a otra permitiendo así que las dos redes sean visibles entre ellas.
Para ello tendríamos que configurar nuestras tarjetas de red de tal forma que cada una tenga la dirección que le toca y tan solo una tenga una puerta de enlace que será la interfaz que tiene la conexión a Internet.
Podemos ver un ejemplo de esta configuración ( el fichero se encuentra en /etc/network/interfaces ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# The loopback network interface auto lo iface lo inet loopback #Conexión a Internet auto eth0 iface eth0 inet static address 192.168.1.15 netmask 255.255.255.0 gateway 192.168.1.1 #Red local principal auto eth1 iface eth1 inet static address 172.16.0.1 netmask 255.255.0.0 |
Podemos observar que tan solo una tiene una puerta de enlace ( gateway ) y que por lo tanto será por donde salga a Internet ( ruta por defecto ). No obstante, por medio de IPTables tenemos que redireccionar el tráfico para que las redes puedan ser capaces de comunicarse entre ellas. Técnicamente si activamos o modificamos el kernel de GNU/Linux para que acepte redireccionamientos de paquetes en el protocolo IPv4 podríamos ya comunicarnos con el exterior ( siempre y cuando realicemos un masquerade — dar a conocer — que existe otra red ). El procedimiento sencillo sería el siguiente:
1 2 3 |
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
Podemos observar como estamos activando el «ip_forward» y como por medio de IPTables estamos dando a conocer la existencia de las dos redes. Esto debería funcionar y nuestras máquinas de nuestra red local podría conectarse a Internet sin ningún problema. Pero el problema de todo esto es que tendríamos que hacerlo cada vez que reiniciemos el equipo… ( exceptuando que ip_forward se puede configurar para que permanezca fijo en el kernel ).
Aquí dejo un script que automatiza el proceso descrito anteriormente… pero es más avanzado ya que contempla peticiones de estado en la aceptación de los paquetes entrantes y salientes. También está preparado para ser un servicio del sistema permitiendo así la automatización y el arranque automático o si lo deseamos parar el servicio de gateway de nuestra máquina. El script es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#!/bin/bash ### BEGIN INIT INFO # Provides: gateway # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Script Gateway # Description: - # ### END INIT INFO PATH=/usr/sbin:/sbin:/bin:/usr/bin #Variables rl="eth2"; #->Local re="eth1"; #->Externa if [ $USER != "root" ] then echo "No eres root!"; exit 0; fi function flushRules(){ #Borrando todas las reglas iptables -F iptables -t nat -F iptables -t mangle -F iptables -X } function addRules_gateway(){ #Aceptamos trafico interno iptables -A INPUT -i lo -j ACCEPT #Permitir conexiones establecidas, y las que no vengan desde fuera. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW ! -i $rl -j ACCEPT iptables -A FORWARD -i $rl -o $re -m state --state ESTABLISHED,RELATED -j ACCEPT #Permitir conexiones salientes desde adentro de la LAN. iptables -A FORWARD -i $re -o $rl -j ACCEPT #Enmascarar. iptables -t nat -A POSTROUTING -o $re -j MASQUERADE iptables -t nat -A POSTROUTING -o $rl -j MASQUERADE } function forward(){ # Habilite ruteo. echo $1 > /proc/sys/net/ipv4/ip_forward } #Lanzamos la app if [ $# == 1 ] then case $1 in start ) flushRules; addRules_gateway; forward "1"; echo "Servicio Gateway lanzado..."; ;; stop ) flushRules; forward "0"; echo "Servicio Gateway detenido..."; ;; * ) echo "Usage: command {start|stop}"; ;; esac else #Por defect start! $0 start; fi |
A continuación vamos a crear el directorio donde irá alojado el script y colocarlo en el directorio «/bin/» creando así un ejecutable en el sistema!
1 2 3 4 |
mkdir /etc/bashtools/ cd /etc/bashtools/ wget --no-check-certificate https://raw.github.com/luigdima/bashtools/master/gateway.sh ln -s /etc/bashtools/gateway.sh /bin/gateway |
Ahora podríamos probar que funcione de la siguiente forma:
1 2 3 4 |
root@Zion:/# gateway start Servicio Gateway lanzado... root@Zion:/# gateway stop Servicio Gateway detenido... |
El plato fuerte de este artículo es que se ejecute todo esto nada más iniciar la máquina! por lo tanto realizaremos lo siguiente:
1 2 3 |
ln -s /etc/bashtools/gateway.sh /etc/init.d/gateway chmod 755 /etc/init.d/gateway insserv gateway |
Con esto el sistema tendría que ejcutar cada vez que se inicie el script!