Como crear un bridge (Puente de red) usando Debian


Introducción

Este documento explica como crear un bridge (Puente de red) usando Debian, y debe funcionar con las versiones Sarge, Etch y Sid.
Cuando este documento esté más completo, se traducirá al inglés, en la página debian-bridge, que es parte de sysadmin.
Este documento está en estado experimental, usted puede ayudar a mejorarlo. Puede editarlo usando el enlace Edit que está arriba.

Configuración básica

Un bridge pasa paquetes sin modificaciones de una interfaz a otra. El bridge mira las direcciones de los paquetes para determinar lo que ha de pasar de un lado al otro. Esto significa que el tráfico que pasa por el bridge no tiene que ser comprendido por Linux, basta con que los paquetes tengan una dirección de hardware.
El primer paso para crear un bridge es instalar el paquete bridge-utils.
apt-get install bridge-utils
Luego, se inicializan las interfaces de red. Se asume que la máquina no tiene una IP configurada en ninguna interfaz de red.
ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
Ah hacer esto, la máquina ya debe funcionar como un bridge.
Falta un paso importante, se debe levantar la interface br0
ifconfig br0 up
Puedes comprobarlo usando un sniffer como tcpdump.
tcpdump -i eth1 dst 192.168.0.10
Para que este ejemplo sea útil, el tráfico hacia la IP 192.168.0.10 debería generarse desde el segmento conectado a eth0.
Nota: No es necesario hacer IP Forwarding ni Proxy ARP para que el bridge funcione.

Bridge con IP

Opcionalmente puede ser deseable que el bridge tenga una IP, para administrar remotamente el bridge con SSH. No es necesario poner una IP en un bridge, pero se puede hacer así:
ifconfig br0 192.168.0.2 netmask 255.255.255.0 up
route add default gw  192.168.0.1 dev br0
Aquí suponemos que la IP del bridge es 192.168.0.2 y que la IP del gateway se encuentra en uno de los segmentos configurados en el bridge (eth0 y eth1 en este ejemplo).

Brouter

Una vez se tiene el bridge con IP, se puede hacer un brouter, que es un bridge + un router.
Con las IPs del ejemplo, las siguientes líneas deberían funcionar:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING --source 192.168.0.0/24 -j SNAT --to-source 192.168.0.2

Filtrando con ebtables

Lo bueno de usar un bridge, es que se pueden poner reglas de filtrado avanzadas, incluso teniendo en cuenta las IPs.
Por ejemplo, así se evitaría que el tráfico que pasa por el bridge llegue al host 192.168.0.5.
ebtables -A FORWARD -p ipv4 --ip-dst 192.168.0.5 -j REJECT

Desconfigurando el bridge

Para desconfigurar el bridge:
# Descomentar si el bridge tiene IP
#
#route del default gw 192.168.0.1 dev br0
#ifconfig br0 down

brctl delif br0 eth0
brctl delif br0 eth1
ifconfig eth0 down
ifconfig eth1 down
brctl delbr br0

Pseudo-bridges

En un pseudo-bridge funciona de forma diferente, y se porta más como un router oculto que como un bridge.
Un caso común en el que son muy útiles los pseudo-bridges es el siguiente:
Red Interna      Pseudo-bridge      Red externa

                      eth1
192.168.0.2/24 --+--[ 192.168.0.1  ]-- 10.0.0.0/8
                 |  [     10.0.0.1 ]
                 |            eth0
      [ 10.0.0.2 ]
Si uno quiere que desde la red externa se pueda acceder al computador con IP 10.0.0.2 sin hacer NAT, entonces el proxy_arp es lo más útil. Es importante tener bien hechas las tablas de enrutamiento antes de hacer Proxy ARP.
En este caso, un haría algo como:
echo "1" > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo "1" > /proc/sys/net/ipv4/conf/eth1/proxy_arp
route add -host 10.0.0.2 dev eth1
Estas líneas hacen que automáticamente, cuando un computador en la red externa intente enviar un paquete al host 10.0.0.2, este sea enrutado a través de el Linux Router. De igual forma, cuando el host 10.0.0.2 quiera enviar un paquete a la Red externa, este será enrutado a través del Linux Router.
La explicación técnica: Cuando la máquina con IP 10.0.0.5 (no aparece en la gráfica) que está en la Red Externa va a enviar un paquete a la IP 10.0.0.2, primero debe averiguar la dirección de hardware de la máquina con IP 10.0.0.2, y esto se hace a través de una solicitud de ARP (ARP request) que es enviada usando broadcast en toda la red externa. Esta solicitud le llega alLinux Router. Si el Linux Router no conoce la dirección de hardware que corresponde a esta IP, retransmitirá la solicitud a la red interna.
Cuando esto pasa, el host con IP 10.0.0.2 responde a la solicitud diciendo que la IP 10.0.0.2 corresponde a su dirección de hardware (por ejemplo 00:16:76:3C:CA:1E.
Como el Linux Router está configurado para hacer Proxy ARP, y ya sabe que alguien en la red externa está preguntando por el host con IP 10.0.0.2, él responderá a la solicitud hecha por 10.0.0.5, pero responderá diciendo que la IP 10.0.0.2 está en la dirección de hardware que tiene la interfaz eth0 del mismo, la misma que corresponde a la IP 10.0.0.1, digamos que es00:15:26:30:CD:3E
Así, 10.0.0.5 envía el paquete Ethernet a la dirección 00:15:26:30:CD:3E, que corresponde al Linux Router. Entonces el router re-envía el paquete a la dirección 00:16:76:3C:CA:1E, diciendo que el paquete Ethernet debe ser retornado a la dirección de hardware de la interfaz eth1 del router.
Cuando el paquete retorna, se hace el proceso inverso, y es así como funciona el Proxy ARP.
Note que los paquetes son modificados en la capa Ethernet.
Para que ste blog siga creciendo:


Visitenos en:

Instagram