jump to navigation

Equipo linux haciendo routing transparente (pseudo-bridge) 9 septiembre, 2008

Posted by ubanov in Informática-Linux, seguridad.
Tags: , , ,
trackback

Os voy a explicar una configuración que he realizado.

Básicamente es un equipo linux que se conecta de forma transparente entre una red e Internet, es decir tendrá una configuración como si fuese un bridge, aunque en realidad estará haciendo routing. Esto nos dará la ventaja que se podrá meter sin que algunos usuarios se enteren (y quitar si por ejemplo se nos rompe la máquina) y que tendremos un control total de lo que pase por él.

El esquema de conexión sería el siguiente:

Como ejemplo supondremos que tenemos nuestro router con la dirección 192.168.1.1, y nuestro pseudo-bridge con la 192.168.1.2. Como funciona como si fuese un bridge, en ambos interfaces (el de Internet y el de la red) tendrá la misma dirección IP configurada.

La configuración de la red (en debian) sería la siguiente:

cat >/etc/networking/interfaces <<EOF

auto lo eth0 eth1

iface lo inet loopback

iface eth0 inet static

address 192.168.1.2

netmask 255.255.255.0

gateway 192.168.1.1

iface eth1 inet static

address 192.168.1.2

netmask 255.255.255.0

EOF

Para ponerlo en modo pseudo-bridge se ejecutarán los siguientes comandos:

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

echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp

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

/sbin/route del -net 192.168.1.0 netmask 255.255.255.0 dev eth0

/sbin/route add -host 192.168.1.1 dev eth0

/usr/sbin/arp -i eth1 -Ds 192.168.1.1 eth1 pub

¿Qué harían todos estos comandos? Si de la red quieren acceder al router (al 192.168.1.1) nuestra máquina contestará a la petición ARP poníendose en medio de la comunicación (última línea). Una vez que le llegue a él el paquete hará un forwarding. Es decir, ahora si hiciesemos un traceroute al 192.168.1.1, apesar de estar en nuestra red nos dará como que pasa por dos máquinas, primero por la 192.168.1.2 y luego por el 192.168.1.1.

Por el otro interface se ha borrado la ruta de la red y en su lugar se ha creado una ruta a la máquina del router. Después se ha activado el proxy_arp, esto lo que va a hacer es que si recibe una petición de la cual no tengamos ruta contestará por defecto a la dirección mac del interface eth0. Por ejemplo, si el router quiere hablar con un puesto con dirección 192.168.1.10, mandará la petición a la red y nuestro pseudo-bridge le responderá que es él. Una vez que le llegue a él la petición hará el forwarding a la otra red.

Qué ventaja tiene esto, al final aunque estemos funcionando como si fuese un bridge, en realidad se está haciendo routing de todos los paquetes, por lo tanto podemos jugar con iptables para hacer lo que nos de la gana… por ejemplo, podríamos deshabilitar el acceso a correo externo (iptables -A FORWARD -p tcp –destination-port pop3 -j DENY), podríamos ejecutar que todo lo que vaya al puerto 80 pase primero por un proxy que tengamos en modo transparente (iptables -t nat -A PREROUTING -p TCP –dport 80 -i eth1 -j REDIRECT –to-port 3128)…

Un problema típico que suele ocurrir al instalar esto es que como juega con los ARP, puedes encontrarte que los equipos tengan cacheadas las entradas de ARP, por lo tanto lo mejor suele ser reiniciar el router y los diferentes equipos (aunque vale con borrar la entrada arp, con el comando ARP, ya sea un equipo linux o windows). Para desinstalarlo pasa lo mismo.

El otro problema es que en el momento que pongas esto para meter nuevos equipos en la red de Internet (entre el router y nuestro pseudo-bridge, no se podrá salvo que metamos nuevos comandos para darlos de alta, la ruta a la máquina y la publicación de la mac).

Espero que os sirva, si teneis dudas o cosas que creeis que no quedan claras ya sabeis, podéis escribirme.

La información básica sobre cómo hacer esta configuración la saqué hace un par de años de la siguiente página web: http://lartc.org/howto/lartc.bridging.proxy-arp.html, en esta página teneis más detallado cómo funciona y cual es la idea, en la mía lo tenéis todo más «másticado» y tenéis los comandos para hacerlo de forma rápida 😀 cada uno que elija su camino 😀

Actualización Oct 2010. Este artículo está desfasado. Actualmente podría hacerse un bridge con permisos y no es necesario hacer este pseudobridge (en su momento esto era beta). Esto se hace con el ebtables. Se puede mirar por ejemplo la siguiente página: http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html

Comentarios»

1. Sebastian - 29 diciembre, 2008

Hola Ivan

Muy buen post!

Queria preguntarte si el equipo debe tener 2 interfaces de red o puede hacerse con una?

Esto viene a cuento porque me interesa hacerlo pero en una máquina virtual (sobre vmware)?

Muchas Gracias.

2. ubanov - 29 diciembre, 2008

Yo creo que NO se puede hacer con un sólo interface de red.

Si vas a hacer una prueba en virtual el VMWare si te deja crear más de un Interface de red (puedes crear una nueva red donde conectes el cliente y el equipo haciendo routing transparente).

Si lo vas a hacer en un entorno virtual y quieres tener el pseudo bridge virtualizado, creo que el VMWare Server si te permite tener dos tarjetas físicas en la máquina y mapear las virtuales a la que quieras…. (en las soluciones más grandes de virtualización de VMWare seguro que se puede hacer, por que te da mucha flexibilidad en el tema de la red, creando switch virtuales y cosas de esas…).

Si necesitas ayuda dime.

3. Sebastian - 30 diciembre, 2008

Ivan, tienes razón!!! Si que se puede.

Te consulto, puede ser que en el ejemplo hayas utilizando la misma ip para las 2 interfaces lo cual sería un error?

Según entiendo una de las interfaces debería tener la ip 192.168.1.1?

Muchas Gracias.

4. Juan Carlos - 8 octubre, 2009

Ivan Hola!
No sabes lo contento que me he puesto al leer este post!
Mira te cuento un poco el invento que llevamos meses pensando y que en parte la idea es algo parecido a lo que nuestro compañero Sebastián indicaba, mi caso es el siguiente, tenemos unos equipos que hacen de router / firewall / dhcp y terminadores VPN (cajas Nortel), bien el esquema sería algo así como:

Internet —– IP WAN (Router ISP) 10.0.0.1 —- 10.0.0.2 (Nortel) 192.168.108.1—- da DHCP a la LAN 192.168.108.xxxx —- clientes 108.xxx

Luego un tracert wan-lan sería:

Internet – isp – nortel – desktop

La caja Nortel hace de router puro sin optimizar por Proxy, sin filtros y sin nada 😦 (de ahí querer meter squid, itables, sarg, etc), pero comunica las oficinas y esto es prioritario, no quieren Open VPN.

Llevamos tiempo queriendo meter una caja entre medias de la LAN y de la Nortel pero esta tenia q permitir que la caja Nortel viera su LAN de modo virtual para los paquetes de vuelta, es decir si coloco lo que has descrito

Internet —– IP WAN (Router ISP) 10.0.0.1 —- 10.0.0.2 (Nortel) 192.168.108.1—-
192.168.108.2(Linux)192.168.108.1 da DHCP a la LAN 192.168.108.xxxx —- clientes 108.xxx con gw 192.168.108.1

Configurando DHCP en Linux adaptador 192.168.108.1 que lo vean como verían la Nortel los clientes y que en un recorrido de salida salieran por realmente la nortel, por los túneles VPN IPSEC, pero me preocupa el camino de vuelta, es decir si la petición viene a la dirección 192.168.108.200 y la Nortel no tiene la máquina visible en su pata LAN 192.168.108.1 sino que la ve realmente el Linux con este sistema transparente, si dará error a la hora de entregar esto¿?

Ese es mi kit de la cuestión, según tu dibujo, si no fuera como dice Sebastián por esa duda de la ip que pones del lado interno como .2, y yo a mi entender me “gustaría” que fuera la .1,

Has probado esto con la idea que te he tratado de Mostar, jo me ha salido un chorro de cosas raras pero estoy seguro que “nos” hacemos entender : )

Agradecido desde ya!

5. ubanov - 8 octubre, 2009

Sebastian, perdona pero no leí tu post.

Os contesto a los dos… en ambos interfaces se pone la misma IP… es un equipo que funciona como si fuese un bridge, no necesita tener dos direcciones de red. A nivel de rutas es donde decimos por dónde debe enviar las respuestas.

Ej, Si tienes la dirección 192.168.1.2/24 y tu gw es la .1, resultará que tienes una ruta para ir a 192.168.1.0/24 en el interface interno, y una ruta para ir a la máquina .1 en el interface externo. Además con los truquillos del ARP harás que él conteste por la red interna a la dirección del .1 y por la red externa a toda la red. Si haces un ping de la interna al .1 y al .2, y luego ejecutas un arp -a, verás que ambas máquinas les contesta la misma MAC….

Esto no es un bridge de verdad, con lo que los paquetes broadcast de una red no van a llegar a la otra… esto imposibilita por ejemplo que las peticiones de DHCP pasen de un lado a otro (por lo tanto el DHCP no podrá estar en tu router). Yo en mi caso lo he arreglado haciendo que la máquina linux sea también servidor de DHCP e ignorando el del router, no se si se podrá hacer algún tipo de reenvío. En realidad configuras para que de el mismo rango de IPs de forma que si un día falla lo quitas y sin tocar nada todo sigue funcionando.

Pruebalo que va de puta madre!!!

6. jean paul - 31 octubre, 2013

Hola.
Espero me puedas aclarar un poco el panorama, sucede que mi proveedor de Internet me limito a 2 pc’s en una conexión adsl, el problema y tras hacer infinidad de reclamos sin solución tomando en cuenta que en mi zona es el único proveedor es optar por alguna alternativa como esta.. como sabrás ahora desde una tv y los celulares sumados a las laptop y un acces point tengo 12 equipos que hacen uso del servicio y colo el ap y el tv imposibilita la navegación.. me percate que cuando hay 3 maquinas en funcionamiento mi router cambia de entorno y de mac denegando el acceso a la web a todos.. mi pregunta después de todo este royo seria si es posible implementar esta solución para que.. toda mi red navegue a través del proxy sin que sean visibles desde la wan, es decir que todo el trafico sea detectado como si se tratase de una sola maquina??? espero me ayudes ya que estoy desesperado por no poder trabajar ni nada.. un saludo Jean Paul


Replica a Sebastian Cancelar la respuesta