Creación de una red L2 entre ubicaciones remotas a través de Internet con OpenVPN (pfSense <=> Tomato)

Las comunicaciones no se estructuran siempre como nosotros necesitaríamos y el software no funciona siempre como nos gustaría. Esto, que en definitiva y en determinados escenarios supone una problemática, debe ser un acicate para desarrollar soluciones creativas.

Vamos a suponer un escenario que no sea especialmente singular: disponemos de dos ubicaciones físicamente distantes con acceso a Internet pero sin comunicación directa entre ambas en donde vamos a ubicar dispositivos que deben ser gestionados centralizadamente (por los motivos arcanos que correspondan) mediante un software que exige que estos se encuentren en la misma red (por ejemplo porque debe «descubrirlos» mediante su MAC).

OpenVPN Layer2 VPN

Para poder dar solución a este problema no sólo tendremos que asegurarnos de que en ambas ubicaciones los dispositivos se configuren en el mismo segmento de red, sino que además deberemos asegurarnos de que estos dos segmentos de red iguales se «vean», «hablen» entre ellos y no colisionen.

En el presente artículo vamos a desglosar cómo afrontar técnicamente este reto mediante el uso de dos soluciones de networking de software libre: pfSense (un firewall de nivel enterprise) y Tomato (un firmware que extiende la versatilidad y la capacidad de determinados routers).pfSense

Configuración preliminar

Partimos de la suposición de que disponemos de dos ubicaciones físicas con conexión a Internet operativa. En uno de los extremos disponemos de una máquina con pfSense que hará las funciones de servidor en la comunicación entre los extremos y en otra de un router con Tomato que será el cliente, este último debe disponer además de almacenamiento persistente. Ambas conexiones a Internet son operativas y el extremo servidor dispone de una IP fija en su WAN o al menos de un registro DNS dinámico que la resuelve.

Por simplificar supondremos que todas peticiones contra la IP WAN del extremo servidor serán atendidas por el pfSense; en caso de no ser así (por tener la interfaz WAN del pfSense en un direccionamiento IP privado dentrás de un router de algún ISP) deberíamos configurar los NATeos correspondientes en apartados posteriores.

Debemos además elegir un rango de red privado que no se encuentre actualmente en uso (configruado, enrutado, etc) en ninguno de los extremos. Dada la finalidad didáctica del artículo supondremos que, por ejemplo, en ninguno de ambos extremos está en uso la subred de clase C 192.168.203.0/24.

Servidor pfSense

  1. Configuramos una interfaz del firewall (una pata, como algunos gustan de decir) dentro de la subred que hayamos elegido.
    • Pulsamos sobre la opción «(assign)» del menú de «Interfaces».
    • En la pantalla de interfaces, en la solapa de «Interface assignments», seleccionamos la tarjeta de red sobre el que publicaremos el nuevo segmento de red y pulsamos sobre el símbolo «+».
    • Se creará una nueva interfaz con un nombre asignado automáticamente del tipo OPTX (donde X en un número). Pulsamos sobre dicho nombre para proceder a configurarla. Si quisiésemos utilizar una interfaz ya existente no sería necesario llevar a cabo los pasos anteriores, simplemente pulsaríamos sobre ella para comprobar que su configuración se corresponde con la deseada.
    • En la pantalla de configuración de la interfaz debemos proporcionar la siguiente información (el resto de campos pueden permanecer vacíos):
      • Enable: marcar el checkbox «Enable interface».
      • Description: el nombre con que queramos identificar la interfaz.
      • IPv4 Configuration Type: seleccionamos la opción «Static IPv4».
      • IPv4 address: escribimos una dirección IP dentro del rango escogido, por ejemplo 192.168.203.1 y la máscara, 24.Configuración Interfaz
    • Pulsamos sobre el botón «Save» y posteriormente sobre el botón «Apply Changes».
  2. Configuramos un servidor OpenVPN que aceptará conexiones desde el cliente Tomato a través de Internet.
    • Pulsamos sobre la opción «OpenVPN» del menú de «VPN».
    • En la pantalla de «OpenVPN: Server», en la solapa «Server», pulsamos sobre el símbolo «+».
    • Editamos el servidor OpenVPN con los siguientes valores (el resto de campos pueden permanecer vacíos):
      • Server Mode: seleccionamos la opción «Peer to Peer ( Shared Key )».
      • Protocol: seleccionamos «UDP».
      • Device Mode: seleccionamos «tap».
      • Interface: seleccionamos la interfaz que se corresponda con la WAN (la salida a Internet).
      • Local port: escribimos el número de puerto donde queremos que el servidor escuche las peticiones de conexión del Tomato, por ejemplo el 2194 (el puerto por defecto para el servicio OpenVPN es el 1194).
      • Description: el nombre con que queramos identificar el servidor OpenVPN.
      • Shared Key: marcamos la opción «Automatically generate a shared key»; posteriormente necesitaremos el valor generado para el cliente Tomato.
      • Encryption algorithm: seleccionamos «AES-128-CBC (128-bit)».
      • Auth Digest Algorithm: seleccionamos «SHA1 (160-bit)».
      • IPv4 Tunnel Network: en este campo debemos indicar una subred distinta a cualquier otra en uso actualmente en ambos extremos del túnel y que será utilizada exclusivamente para la comunicaciones entre ambos a través de la VPN; en este ejemplo usaremos la 10.78.253.0/30, de manera que sólo dispondremos de 2 direcciones IP, una por cada extremo.Configuración Servidor OpenVPN (1)
      • Advanced: es recomendable habilitar el registro del servidor OpenVPN para poder analizarlo en caso de fallo, con lo que añadimos la siguiente línea: «log-append /tmp/openvpn_bridge.log ; status /tmp/openvpn_bridge-status.log».Configuración Servidor OpenVPN (2)
    • Pulsamos sobre el botón «Save».
  3. Asignamos una interfaz del firewall al puerto del servidor OpenVPN creado en el paso anterior.
    • Pulsamos sobre la opción «(assign)» del menú de «Interfaces».
    • En la pantalla de interfaces, en la solapa de «Interface assignments», seleccionamos el servidor OpenVPN creado en el punto anterior en el listado desplegable denominado «Available network ports» (se denominará opvnsX, donde X es un número y tendrá asociada la descripción indicada a la hora de configurarlo) y pulsamos sobre el botón «+».Asignación interfaz a servidor OpenVPN
    • Se creará una nueva interfaz con un nombre asignado automáticamente del tipo OPTX (donde X en un número). Pulsamos sobre dicho nombre para proceder a configurarla.Interfaz asignada a servidor OpenVPN
    • En la pantalla de configuración de la interfaz debemos proporcionar la siguiente información (el resto de campos pueden permanecer vacíos):
      • Enable: marcamos el checkbox «Enable Interface».
      • Description: indicamos el nombre con que queremos identificar esta interfaz.Configuración interfaz servidor OpenVPN
    • Pulsamos sobre el botón «Save» y posteriormente sobre el botón «Apply Changes».
  4. Creamos un bridge entre la interfaz del servidor OpenVPN y la interfaz de la subred que queremos transmitir.
    • Pulsamos sobre la opción «(assign)» del menú de «Interfaces».
    • Accedemos a la solapa denominada «Bridges» y pulsamos sobre el botón «+».
    • En la pantalla denominada «Bridge Configuration» debemos seleccionar en el campo «Member Interfaces» los dos interfaces creados anteriormente (el de la subred a transmitir a través de la VPN y el asociado al servidor OpenVPN) y en el campo «Description» damos un nombre con el que identificar el bridge.Configuración del Bridge entre interfaz de subred y servidor OpenVPN
    • Pulsamos sobre el botón «Save».
  5. Comprobamos que la interfaz WAN esté aceptando peticiones entrantes en el puerto que hemos indicado en el valor «Local port» de configuración del servidor OpenVPN. Es en este puerto e interfaz es donde el cliente Tomato intentará conectar.
    •  Pulsamos sobre la opción «Rules» del menú de «Firewall».
    • En la interfaz de la WAN (aquella por donde lleguen las peticiones del Tomato, que será la que hayamos indicado en el campo «Interface» de la configuración del servidor OpenVPN) añadimos una regla permitiendo las conexiones en el puerto y protocolo (en este ejemplo UDP:2194) desde cualquier IP.Configuración reglas firewall WAN servidor OpenVPN
    • Aplicamos la regla.
  6. Configuramos las reglas de las interfaces en el firewall conforme nuestras necesidades.
    • Pulsamos sobre la opción «Rules» del menú de «Firewall».
    • En la interfaz de la subred que queremos transmitir (GESTION_L2 en este ejemplo), la cual puede estar accesible mediante una solapa con su nombre o a través de un menú desplegable («Currently viewing») según la versión de pfSense y cantidad de interfaces que tengamos, especificamos las reglas del firewall que necesitamos en la configuración local.
    • En la interfaz asociada al servidor OpenVPN generamos dos reglas en el siguiente orden:
      1. Una regla denegando la transmisión de tráfico DHCP a través del túnel (sólo si deseamos este comportamiento). De este modo nos aseguramos de que las peticiones DHCP de un extremo del túnel no son atendidas por el pfSense, sino por el Tomato.
      2. Una regla permitiendo todo el resto del tráfico.Reglas interfaz servidor OpenVPN
    • Aplicamos estas reglas.

Cliente Tomato

  1. Configuramos una interfaz del Tomato  dentro de la subred que hayamos elegido, asignándole una dirección que no se encuentre ya en uso en ninguno de los extremos.
    • Seleccionamos la opción «Network» dentro del menú «Basic» del Tomato.
    • En la sección «LAN» damos de alta un nuevo «Bridge», asignando una IP que no se encuentre en uso dentro de la subred a transmitir (en nuestro ejemplo usaremos la 192.168.203.2), la máscara (24 en nuestro ejemplo = 255.255.255.0) y el rango en que queremos que asigne direcciones IP por DHCP (recordemos que en el apartado anterior habíamos deshabilitado el tráfico DHCP entre los extremos para que cada uno gestionase su pool de direcciones; las direcciones entregadas por el servidor DHCP en cada extremo no deben solaparse y no deben coincidir con IPs asignadas estáticamente en ninguna de las ubicaciones.Configuración interfaz bridge Tomato
    • Pulsamos el botón «Save».
  2. Asociamos el bridge a una VLAN que será servida por un puerto físico del router con Tomato.
    • Seleccionamos la opción «VLAN» del menú «Advanced».
    • En la sección «VLAN» damos de alta una nueva VLAN (el valor de los campos VLAN y VID debe ser igual) asociada al puerto del router que deseemos y al «Bridge» generado en el punto anterior.Configuración VLAN Tomato
    • Pulsamos el botón «Save».
  3. Configuramos el cliente OpenVPN para que se conecte al servidor pfSense.
    • Seleccionamos la opción «OpenVPN Client» del menú «VPN Tunneling».
    • En este ejemplo suponemos que no tenemos previamente ningún cliente OpenVPN configurado, así que configuraremos el cliente 1 («Client 1») con los siguientes valores (en correspondencia con los asignamos al servidor; si no se indica nada será el valor por defecto):
      • En la solapa «Basic»:
        • Start with WAN: marcamos el checkbox.
        • Interface Type: seleccionamos la opción «TAP».
        • Protocol: seleccionamos la opción «UDP».
        • Server Address/Port: indicamos la dirección IP (o registro DNS) de la interfaz del pfSense a través de la cual estableceremos la conexión y el puerto en el que el servidor escucha peticiones (en este ejemplo 2194).
        • Authorization Mode: seleccionamos la opción «Static Key».
        • Create NAT on tunnel: marcamos el checkbox.
        • Tunnel address/netmask: indicamos la IP del extremo que corresponde según el rango que asignamos al túnel en el servidor (en este ejemplo el Tomato tendrá la IP 10.100.203.2/30).Cliente OepnVPN Tomato Basic
      • En la solapa «Advanced»:
        • Encrypthion cipher: seleccionamos la opción «Adaptive».
        • Connection retry: indicamos el valor «-1».
        • Custom Configuration: escribimos lo siguiente:
          auth SHA1
          float
          script-security 3 system
          up /tmp/mnt/optware/etc/openvpn/bridgeup.sh
          log-append /tmp/openvpn_bridge.log 
          status /tmp/openvpn_bridge-status.log

          Cliente OepnVPN Tomato Advanced

      • En la solapa «Keys»:
        • Static Key: debemos pegar el valor que generamos en la configuración del servidor OpenVPN en el pfSense, el cual puede consultarse en el campo «Shared Key» de la configuración del servidor OpenVPN («VPN» => «OpenVPN» => «e»).Cliente OepnVPN Tomato Keys
    • Pulsamos el botón «Save».
  4. Montamos el bridge entre la subred a transmitir en el Tomato y su extremo OpenVPN.
    • Accedemos por SSH al Tomato y creamos, en caso de no existir, el directorio o/y el fichero indicados en la «Custom Configuration» para el script de up (bridgeup.sh).
    • Editamos el fichero e incluimos las siguientes líneas:
      #!/bin/sh
      brctl addif br3 tap11
      • br3: referencia el bridge sobre el que hemos configurado en el Tomato la subred a transmitir.
      • tap11: referencia el cliente 1 de OpenVPN.
    • Damos permisos de ejecución al fichero.
  5. Por último reiniciamos el Tomato.

En caso de encontrarnos con problemas deberemos comprobar que las peticiones del Tomato llegan efectivamente a la interfaz del pfSense donde está escuchando el servidor OpenVPN, teniendo en cuenta que si el pfSense está detrás de un router de algún ISP deberemos configurar el NAT en dicho dispositivo.

Gracias a esta configuración habremos transmitido la misma red lógica entre dos ubicaciones físicas, permitiéndonos acceder transparentemente a recursos de ambos extremos; desde el extremo del pfSense ya deberíamos poder pingar a máquinas de la red transmitida en el extremo del Tomato y viceversa.

 



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Mikel Villar

Responsable del departamento de sistemas y redes de Irontec. El resto son historias que no merecen ser contadas.

1 Comentario

¿Por qué no comentas tú también?

Queremos tu opinión :)