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).
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).
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
- 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):
- Pulsamos sobre el botón «Save» y posteriormente sobre el botón «Apply Changes».
- 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.
- 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».
- Pulsamos sobre el botón «Save».
- 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 «+».
- 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.
- En la pantalla de configuración de la interfaz debemos proporcionar la siguiente información (el resto de campos pueden permanecer vacíos):
- Pulsamos sobre el botón «Save» y posteriormente sobre el botón «Apply Changes».
- 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.
- Pulsamos sobre el botón «Save».
- 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.
- Aplicamos la regla.
- 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:
- Aplicamos estas reglas.
Cliente Tomato
- 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.
- Pulsamos el botón «Save».
- Asociamos el bridge a una VLAN que será servida por un puerto físico del router con Tomato.
- 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).
- 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
- En la solapa «Keys»:
- En la solapa «Basic»:
- Pulsamos el botón «Save».
- 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.
- 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.
1 Comentario
¿Por qué no comentas tú también?
Este articulo me ha salvado la vida, justo la información que necesita, un regalo, muchísimas gracias.
Eva Nuñez Hace 10 años
[…] estos lares, se han citado ya nuestras pasiones por Tomato Firmware con algunas de sus posibilidades, la verdad es que nosotros estamos sinceramente encantados. En nuestro caso, en Irontec, como todo […]
VoIP: Mecanismos de supervivencia local con Kamailio y Edge Router | Blog Irontec Hace 9 años
Queremos tu opinión :)