Bridge IPv6 con OpenVPN, primera parte

Tras tener olvidado durante un tiempo IPv6 ayer volví a conectar las estaciones y portátiles que tenemos en el trabajo con este protocolo a través del servicio de go6. La necesidad de usar IPv6 es para empezar a experimentar en el funcionamiento de la señalización SIP y transporte RTP para sesiones de audio y video. Una de las premisas fundamentales era que siempre se dispusiera de la misma dirección IPv(4|6) independientemente de que uno se encontrara en la LAN o en la VPN. Lo que viene a continuación es una guía básica de como ponerlo en funcionamiento sin entrar en detalle de como funciona y las diferentes opciones de las que disponemos.

Bien, lo primero que deberíamos tener funcionando es un concentrador con OpenVPN que se dedique a repartir direccionamiento fijo o dinámico a cualquier usuario que disponga de las claves y certificados correspondientes. Los scripts de ejemplo que acompañan al paquete y los documentos disponibles en openvpn.org son bastante claros y no debería suponer mayor problema para cualquiera que sepa algo de redes en entornos UNIX/Linux.

Una vez tenemos lo anterior funcionando es hora de montar el bridge así que a continuación pego la configuración básica del servidor OpenVPN en el que habrá un bridge con dos interfaces, una la pata de la LAN y otra la pata de la VPN:

apardo@debaser:/etc/openvpn$ cat server.conf
port 1194
proto udp
dev tap0
tls-auth keys/ta.key 0
dh keys/dh1024.pem
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
server-bridge 192.168.23.30 255.255.255.224 192.168.23.2 192.168.23.29
ifconfig-pool-persist ipp.txt
# Inyectamos rutas a los clientes
push "route 192.168.23.32 255.255.255.224"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-tun
persist-key
verb 3

Lo siguiente que necesitamos es crear el bridge antes de levantar el demonio de OpenVPN y destruirlo cuando lo matamos. La solución más sencilla es incluir las dos llamadas a los shell scripts desde las funciones start_vpn() y stop_vpn() del script /etc/init.d/openvpn. Por ejemplo

start_vpn () {
  # Iniciar el bridge
  /usr/local/bin/bridge-start 2> /dev/null
  if grep -q '^[       ]*daemon' $CONFIG_DIR/$NAME.conf ; then
    # daemon already given in config file
    DAEMONARG=
  else
    ...
stop_vpn () {
  kill `cat $PIDFILE` || true
  rm $PIDFILE
  rm -f /var/run/openvpn.$NAME.status 2> /dev/null
  # Parar el bridge
  /usr/local/bin/bridge-stop 2> /dev/null
}

Los scripts para el bridge son muy sencillos, es necesario tener instaladas las bridge-utils.

apardo@debaser:~$ cat /usr/local/bin/bridge-start
#!/bin/sh

br="br0"
tap="tap0"
eth="eth0"
eth_ip="192.168.230.30/27"

for t in $tap; do
  openvpn --mktun --dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
  brctl addif $br $t
done

for t in $tap; do
  ip link set $t up promisc on
done

ip link set $eth up promisc on

ip addr add $eth_ip dev $br
apardo@debaser:~$ cat /usr/local/bin/bridge-stop
#!/bin/sh

br="br0"
tap="tap0"

ip link set $br down
brctl delbr $br

for t in $tap; do
  openvpn --rmtun --dev $t
done

En este punto ya tenemos configurado el servidor de túneles que fusiona el direccionamiento de la LAN con el de la VPN. Mañana veremos como configurar los clientes y como añadir el soporte para IPv6 el protocolo que parece que nunca llegará, si no vas a por él claro…

One Response to “Bridge IPv6 con OpenVPN, primera parte”

  1. Bridge IPv6 con OpenVPN, segunda parte Says:

    […] Como hoy me encuentro inspirando, y Saúl me recordó el otro día que tenía algo pendiente, vamos a completar la historia que iniciamos el otro día. […]

Leave a Reply