Si tenemos un viejo ordenador, una de las funciones que puede hacer es de router. Personalmente, yo lo tengo de router, centro de descargas, almacenamiento compartido, copias de seguridad remotas, ejecutar cron jobs en ciertos servidores que no los soportan y para ver películas en la tele.
Para que un ordenador pueda funcionar como router, es tan fácil como incluir en /etc/sysctl.conf la siguiente línea:
net.ipv4.ip_forward=1
(Aún con IPv4, sí, aunque podemos utilizar el forward ipv6, teóricamente sin ningún problema)
En muchos sistemas ya funcionaría, pero dependiendo de la distribución debemos dar un permiso adicional:
$ sudo iptables -A FORWARD -j ACCEPT
Aunque si queremos restricción por MAC tendremos que currar un poco más. Primero, lo que necesitamos es una lista de las IPs con sus MAC correspondientes, y en este ejemplo utilizaremos una tabla MySQL, voy a echar mano de mi artículo anterior para poder crear el Script.
He creado un usuario (system), y una tabla para almacenar la información:
1 2 3 4 5 6 7 8 9 |
Además, la he poblado con datos acerca de los ordenadores, y dispositivos que se pueden conectar:
1 2 3 4 5 6 7 | INSERT INTO `iptables_mac_ip` (`id`, `mac`, `ip`, `accesstype`, `descript`, `active`) VALUES (1, '00:12:0f:19:44:8a', '192.168.0.2', 'Portátil Viejo', 1), (2, 'd8:15:10:56:aa:d7', '192.168.0.6', 'Ordenador de sobremesa de Nuevo', 1); (2, 'e8:24:02:56:ab:d7', '192.168.0.22', 'Ordenador de sobremesa de Nuevo', 1); (2, 'f8:37:30:56:ac:d7', '192.168.0.10', 'Ordenador de sobremesa de Nuevo', 1); (2, 'g8:43:04:56:ad:d7', '192.168.0.21', 'Ordenador de sobremesa de Nuevo', 1); (2, 'h8:52:50:56:af:d7', '192.168.0.9', 'Ordenador de sobremesa de Nuevo', 1); |
La tabla nos permitirá incluir y excluir elementos, marcando el campo active a 0, lo que puede ser útil para las visitas.
El objetivo es permitir el FORWARD sólo a los equipos cuya IP y MAC coincida con la que sale en la lista, para eso hacemos el listado de IPs y MACs, directamente obtenido de la tabla MySQL:
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 | #!/bin/bash MYSQL_USER=system MYSQL_PASSWORD=#Password MYSQL_HOST=localhost OLDIFS=IFS IFS="`echo -e "\t\n\r\f"`" declare -a IPS SQL="SELECT \`ip\`,\`mac\`, \`descript\` FROM system.iptables_mac_ip WHERE active=1" IPS=(`echo $SQL | mysql -u $MYSQL_USER --password=$MYSQL_PASSWORD -h $MYSQL_HOST --skip-column-names`) COLUMNS=3 ROWS=$[${#IPS[@]} / $COLUMNS] echo "COLUMNS: "$COLUMNS echo ${#IPS[@]} echo "ROWS: "$ROWS for (( i=0; i<$ROWS; i++ )); do FIRST=$[$i * $COLUMNS] _IP=${IPS[$[$FIRST + 0]]} _MAC=${IPS[$[$FIRST + 1]]} _DESCRIP=${IPS[$[$FIRST + 2]]} echo "Dando permiso a: "$_DESCRIP " (IP: " $_IP" MAC: " $_MAC")" iptables -A FORWARD -i eth2 -s $_IP -m mac --mac-source $_MAC -j ACCEPT # Desde la IP hacia el servidor iptables -A FORWARD -i eth3 -d $_IP -j ACCEPT # Desde el servidor hacia la IP done IFS=OLDIFS |
Este script cogerá directamente la lista de IPs y MACs obtenida desde MySQL y la insertará en iptables. Eso sí, cada vez que se haga un cambio en la base de datos, debemos lanzar el script de nuevo, también podemos crear un cron job para que se lance cada cierto tiempo. Este script debe ser lanzado con privilegios de root (o si queremos más flexibilidad, podemos configurar sudo para que no nos pida contraseña cuando ejecutemos iptables)
Un apunte más, si queremos saber la MAC de un dispositivo que se acaba de conectar, podemos escribir:
$ sudo arp -n
Ahí podremos ver el interfaz por el que nos ha llegado la conexión, la IP y la MAC asociada.
Foto: cote (Flickr): CC-by a 25/08/2012
Pingback: BlogESfera.com /
Pingback: Bitacoras.com /