Aislar subred con iptables (excepto la puerta de enlace)

De todos es conocido la facilidad con la que hoy en día se
pueden romper las claves de muchas redes WIFI, ya sean WEP (todas) o WPA
(algunas). El caso es que ayer me encontré con un amigo que, como mucha
gente, se alimenta del internet del vecino. Es un entendido de la
informática sin llegar a ser informático. Le sacó la clave del wifi al
vecino y se ha puesto en su casa un router para que:

  • Conecte con la red del vecino
  • Cree su propia wifi independiente

Llamamos a mi a mi amigo… Jose Andrés, por ejemplo. El esquema sería algo así:

 

El tema es que Jose Andrés me comentaba la posibilidad de ser
descubierto por el vecino, aunque este no tuviese conocimientos
informáticos. ¿Cómo? El tema es que hoy hay varias tecnologías diseñadas
para facilitarnos la vida que podrían ir en nuestra contra. Por
ejemplo, DLNA y uPNP, así como los ya tradicionales NetBIOS o SAMBA.
Estas tecnologías podrían advertir al vecino de nuestra presencia
incluso sin que él lo solicitase.

Supongamos que el vecino está tranquilamente sentando frente a su
portátil leyendo el periódico. Entonces decide poner música, abre el
Reproductor de Windows Media y este le informa de que ha encontrado un
nuevo dispositvo con librería de reproducción llamado Samsung SmartTV
XXXX. El vecino se pregunta ¿qué es eso? Yo no tengo ninguna tele
Samsung. Simplemente el Reproductor de Windows Media ha encontrado la
tele de Jose Andrés, que es compatible con DLNA e informa de ello.
Situaciones como esta pueden pasar también con una Playstation o con un
móvil. Mucho más fácil es si simplemente el vecino está en el ordenador y
pincha en Mis sitios de red, le saldrá un listado de los ordenadores
que forman la red y lo que comparte cada uno, gracias a NetBIOS,
tecnología de la edad media en la que se basa Windows para buscar
equipos en la red (aunque también los puede encontrar por DNS).

¿Cómo puedo evitar esto? – pregunta Jose Andrés

La solución que él emplea es intentar configurar todos los
dispositivos de su casa desactivando estas funcionalidades (DLNA, uPnP,
SAMBA…) pero es un follón y normalmente siempre se te olvida algo.
Además, ve limitadas sus posibilidades. ¿Y si quiere reproducir un vídeo
de su móvil en su tele mediante DLNA? No podría por tener OFF estas
tecnologías.

¿Cuál es la solución buena? Montar un firewall. Susto.

No es para tanto. El router de Jose Andrés probablemente tenga un
firewall integrado que se puede configurar de una forma u otra. Tan sólo
hay que decirle al firewall que bloquee todos los paquetes desde su red a la red del vecino, salvo que los paquetes tengan como destino la puerta de enlace (la conexión a internet).

Cada router administra su firewall como quiere, pero existen routers
que lo que llevan en su interior es linux, y podemos acceder a la línea
de comandos de linux a través de telnet o de ssh. Es más, algunos
routers se pueden flashear con un nuevo firmware (DD-WRT, OpenWRT,
Tomato…) para que funcionen con linux.

El caso es que el router de Jose Andrés soporta linux así que es muy fácil. En linux el firewall se configura con el comando iptables. Tenemos que añadir tan sólo dos reglas a la tabla FILTER en la cadena FORWARD (encargada de enrutar paquetes).

  1. Si el paquete va a la puerta de enlace: Permitirlo
  2. Si el paquete va a la red del vecino: Bloquearlo

Así de fácil. En iptables las reglas se ejecutan en orden, de
forma que si un paquete encuentra una regla coincidente pasa por ella y
no por las siguientes. Así cuando un paquete tenga como destino la
puerta de enlace del vecino (192.168.1.1) encontrará la regla 1 y no
llegará a evaluar la regla 2. Sin embargo, un paquete destinado por
ejemplo al ordenador portátil del vecino (192.168.1.32) no encontrará
conincidencia con la regla 1, así que pasará a evaluar la regla 2, con
la que conincide y por tanto será desechado.

¿Como añadimos estas dos reglas con iptables?

Con estos dos comandos:

  • iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -j DROP
  • iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.1 -j ACCEPT

El parámetro -I indica que inserte la regla al principio de la cadena
FORWARD, que es la encargada de enrutar paquetes (en la tabla FILTER,
que es la tabla por defecto). El parámetro -s indica el origen del
paquete (source) y el parámetro -d el destino (destination). El
parámetro -j indica qué hacer con el paquete, DROP sería bloquearlo y
ACCEPT sería permitirlo. Tener en cuenta que al usar -I las reglas se
insertan al principio de la cadena, por lo que la última en insertarse
quedará la primera en la cadena. También podríamos haber usado el
parámetro -A que inserta al final de la cadena de reglas, pero no
sabemos qué reglas se aplicarían antes que las nuestras. Fácil ¿verdad?

Con esto Jose Andrés ya está protegido de la detección de su vecino, su red está aislada de la red de su vecino.

Nota: Recordar que estos dos comandos de iptables deben
ejecutarse cada vez que se inicie el router, por lo que tendremos que
ponerlos en un script de inicio. Cada router permite esto de un modo u
otro, por ejemplo en DD-WRT sería:

En el botón SAVE FIREWALL.

 

Autor: Tomás Crespo García

ASP Site Map multi-idioma, también el parámetro URL

En la red existen varios tutoriales sobre cómo localizar (ajustar al
idioma) un site map de asp.net. De hecho, incluso Microsoft tiene una página con una breve explicación de ello, pero haciendo hincapié en que se pueden localizar los parámetros title y description pero no el parámetro url. En esa misma página deja unas ligeras pistas de cómo localizar el parámetro url,
pero demasiado ligeras, pues no encuentro nadie que lo haya conseguido.
Existen varios intentos por la red, algunos dicen que funcionan, pero
eso no es lo que yo he comprobado. Por ejemplo en este link
hay una solución un poco rebuscada que sólo funciona la primera vez que
se ejecuta la aplicación, desde ese momento guarda la preferencia de
lenguaje y siempre muestra el sitemap para ese mensaje. Un buen intento
que se queda corto, y un poco complicado, pues hay que crear un
SiteMapProvider personalizado.

Mi solución

Mi solución es la siguente. Creamos un sitemap para cada idioma, por
ejemplo Web.es.sitemap y Web.en.sitemap. En cada uno definimos los nodos
con sus atributos title, description, url y cualquier otro que queramos en su idioma correspondiente.

Site Map en inglés

Site Map en español

Ahora debemos configurar nuestra aplicación para que disponga de dos
proveedores de site maps, ojo, dos proveedores. Así quedaría nuestro
Web.config:

A continuación, en nuetra página maestra que es la que se debería
encargar de crear el menú de navegación a partir del sitemap, debemos
definir un método que en tiempo de ejecución cambie de proveedor de sitemap al datasource que empleemos para generar el menú de navegación. Yo lo hago en el método Page_Load:

En mi caso utilizo un par de Repeaters para crear el menú de navegación a
partir del Datasource SiteMapDataSource1 (original, eh), mostrando
tanto los parámetros url, title y description como otros personalizados como Image, ulid o pseudoUrl. Así se crea mi menú de navegación a partir de un site map con el parámetro url localizado de acuerdo al idioma.

Espero que a alguien le sirva.