Publi

Hacer funcionar tu viejo ordenador de router, y filtrar por dirección MAC

computers

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
CREATE TABLE IF NOT EXISTS `iptables_mac_ip` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `mac` varchar(64) NOT NULL,
  `ip` varchar(32) NOT NULL,
  `descript` text NOT NULL,
  `active` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mac` (`mac`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

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

También podría interesarte...

There are 2 comments left Ir a comentario

  1. Pingback: BlogESfera.com /

  2. Pingback: Bitacoras.com /

Leave a Reply