Creación de un bridge de un puerto

Índice

Preámbulo: Contexto y cómo leer este texto

  • Este texto explica un procedimiento para ser usado en sistemas Linux, puede que parte de él funcione en otras variantes de UNIX pero no hay ninguna garantía.
  • Como de costumbre el procedimiento está probado en Debian y orientado a ésta o sus derivadas (como la popular Ubuntu), parte de él funcionará tal cual en otras distribuciones mientras que el resto necesitará de algo de investigación extra.
  • A la hora de escribir comandos y salidas de programas he usado el estilo que suelo usar siempre. Puedes ver una explicación de los estilos usados en esta web si lo necesitas.

Además, el texto está pensado para un sistema conectado por cable ethernet y con una configuración tradicional (no gestionado por NetworkManager).

Volver al principio

Introducción

En este artículo explico cómo crear un bridge (puente por software, con el objetivo principal de usarlo para una máquina virtual (emulador) en vez del uso clásico de un bridge. En la práctica la idea es crear un interfaz de red virtual y/o poder conectar a nuestro ordenador con más de una dirección IP y una única tarjeta de red.

Uso tradicional de un bridge

La función tradicional de un bridge es unir dos redes (la diferencia con un router es que éste interconecta dos redes y regula el paso de información entre ellas, un bridge, por contra, simplemente une las dos redes como si fueran una sola).

Para conseguir esta función lo único que se necesita es copiar los datos que pasen por cada tarjeta de red que forme parte del bridge al resto de tarjetas.

Existen dispositivos de hardware para cumplir esa función pero también se puede hacer con un ordenador y el software adecuado. En Linux ese software son las bridge-utils.

Otros usos: dispositivos virtuales

Ya he dicho que en Linux podemos crear un bridge y por lo explicado hasta ahora necesitaremos al menos dos tarjetas de red conectadas a redes diferentes para que cumpla su función, pero también hay una opción alternativa que sólo requiere de una tarjeta de red: crear dispositivos de red virtuales y añadirlos al bridge.

Estos dispositivos en realidad se comunicarán con la red por la única tarjeta física existente pero permitirán, por un lado, acceder al ordenador mediante varias IPs, cada una correspondiendo a uno de los dispositivos virtuales, y por otro asignar tareas específicas a cada uno de esos dispositivos.

Por poner un ejemplo simple, podríamos correr un servidor de correo en una IP y un servidor web en otra, correspondiendo ambas en realidad al mismo equipo, y pudiendo correr dentro un emulador para estar totalmente aislados (o para usar un sistema operativo diferente para cada servidor).

Objetivo

El objetivo de este texto es preparar un sistema para poder correr un emulador con su propia IP, en un artículo posterior intentaré explicar como correr un Windows dentro del emulador permitiendo a todos los ordenadores de la red acceder a él, y ése es el objetivo último.

Volver al principio

Kernel

La mayoría de distribuciones actuales deberían estar preparadas a nivel de kernel para lo que necesitamos, pero para máxima seguidad mejor comprobarlo.

Necesitamos tener compilado el los módulo bridge. Busquémoslo en la configuración del kernel:

$ egrep '^CONFIG_BRIDGE=.$' /boot/config-`uname -r`
CONFIG_BRIDGE=m

Si la salida es CONFIG_BRIDGE=m o CONFIG_BRIDGE=y tenemos el módulo bridge disponible.

De no estarlo habrá que recompilar el kernel con esta opción activada, lo siento pero eso se escapa de este artículo :/.

No está de mas comprobar que el módulo carga (si el resultado era =yno hace falta), se puede comprobar con:

# modprobe -vvv bridge
# modprobe -vvv tun

Volver al principio

Paquetes necesarios

Necesitamos el paquete de utilidades del bridge, en debian bridge-utils.

Para otras distribuciones busca el paquete que provea el ejecutable brctl, normalmente en /usr/sbin.

Instalación en debian: # apt-get install bridge-utils.

Volver al principio

Configuración del dispositvo de bridge

Nota: Ésta parte es bastante más específica de Debian y derivadas, las redes se configuran de manera diferente en algunas distribuciones.

En condiciones normales estarás usando un dispositivo de red llamado algo así como eth1, wlan0 o similar, lo que vamos a hacer es crear un nuevo dispositivo de bridge, br0 y hacer que el viejo dispositivo forme parte de éste.

Identificación del dispositivo actual

Echemos un vistazo al archivo /etc/network/interfaces, que describe las tarjetas de red del sistema, en mi caso:
$ cat /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
auto eth0
iface eth0 inet dhcp

En este caso eth0 es el interfaz que corresponde a mi tarjeta de red. Da igual si está configurado por DHCP (iface eth0 inet dhcp) o si tiene una IP fija asignada (iface eth0 inet static).

Creación manual

Ahora crearemos un bridge temporal, que desaparecerá al reiniciar el sistema.

# brctl addbr br1
Esto crea el bridge br1, sin configurar, podemos comprobar sus detalles:
$ /sbin/ifconfig br1

br1       Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
# ifconfig eth0 down
# brctl addif br1 eth0

Esto, primero desactiva eth0 y luego añade eth0 como un puerto de br1, ahora br1 ha adquirido características de eth0, en concreto su dirección MAC, es decir, el bridge aparenta ser el interfaz real:

$ /sbin/ifconfig br1

br1       Link encap:Ethernet  HWaddr 02:16:F7:7B:7F:C7
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
# ifconfig eth0 0.0.0.0 up
# ifconfig br1 192.168.1.12 up
# route add -net default gw 192.168.1.1 dev br1

Por último activamos eth0 sin IP, activamos el bridge dándole una IP (podríamos asignársela por DHCP pero ya que solo estamos de prubas no hace falta), y añadimos la puerta de enlace predeterminada, en este caso 192.168.1.1

Cabe decir que el bridge tarda un tiempo (unos 30 segundos por ahora) en empezar a funcionar, antes de ese tiempo parecerá que no podemos conectar. Pasada ese espacio de tiempo hacemos la prueba:

$ ping 64.233.167.99
ping 64.233.167.99
PING 64.233.167.99 (64.233.167.99) 56(84) bytes of data.
64 bytes from 64.233.167.99: icmp_seq=1 ttl=242 time=160 ms
64 bytes from 64.233.167.99: icmp_seq=2 ttl=242 time=157 ms
64 bytes from 64.233.167.99: icmp_seq=3 ttl=242 time=217 ms

--- 64.233.167.99 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 157.607/178.632/217.364/27.425 ms

Funciona 🙂

Ahora podemos volver a la normalidad, primero desactivando el bridge:

# ifconfig eth0 down
# ifconfig br1 down
# brctl delif br1 eth0
# brctl delbr br1

Y luego reactivamos la red con la configuración anterior: # /etc/init.d/networking restart.

Si por casualidad no funcionase un reinicio debería ser suficiente 😛

Configuración persistente

Ahora pasaremos a editar la configuración de red para crear el bridge en el arranque, gracias al archivo que hemos visto antes (/etc/network/interfaces) todo el proceso anterior será automático 🙂

Éste es mi /etc/network/interfaces después de hacer los cambios pertinentes:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# auto eth0
iface eth0 inet dhcp

# Bridge
auto br0
iface br0 inet dhcp
	bridge_ports	eth0
	bridge_fd	9
	bridge_hello	2
	bridge_maxage	12
	bridge_stp	off

He mantenido eth0 de manera que si br0 no funcionase bastaría con cambiar de interfaz activo (# ifdown br0 seguido de # ifup eth0).

Aquí estamos declarando a eth0 como el puerto físico (tarjeta de red) (bridge_ports eth0), el resto de opciones son las opciones recomendables en la mayoría de situaciones.

Volver al principio

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.