Introducción

La asistencia remota es una práctica que en nuestros días está cobrando cada vez más importancia. Se usa para reparar ordenadores, enseñar a distancia, etc. Gracias al desarrollo del complemento NVDA Remote, también está al alcance de cualquier persona que utilice NVDA.

Sin embargo, hasta hace algún tiempo, las conexiones indirectas sólo se podían hacer a través de dos servidores: nvdaremote.com y allinaccess.com. Más adelante se incorporó remote.nvda.es, proporcionado por la comunidad de NVDA en español. Estos servidores están lejos (dependiendo de dónde te encuentres, claro), se sobrecargan si muchos usuarios se conectan a la vez, y si se caen y la persona a la que asistes no tiene los puertos abiertos para una conexión directa, se acabó la asistencia… a no ser que tengas tu propio servidor para conexiones remotas.

En la documentación de NVDA Remote se habla de conectarse a un equipo desde fuera de casa y controlarlo. ¿Te imaginas hacer eso con una red local entera? ¿Te imaginas teniendo un servidor que nadie más conoce, donde disminuye el riesgo de que un intruso pueda acertar con alguna de tus claves?

En esta guía hablaremos de la instalación, configuración y uso del servidor de NVDA Remote. Las instrucciones para compilarlo desde el código fuente pueden encontrarse en el repositorio oficial en GitHub, y sólo están en inglés.

Descarga e instalación

La última versión del servidor para NVDA Remote, también llamado NVDA Remote Server, se puede encontrar en la página de publicaciones de GitHub (abre en nueva ventana), y en esta carpeta de Google Drive (abre en nueva ventana). Se encuentra disponible para Windows, Mac y varias distribuciones de Linux. A continuación vamos a ver los pasos para hacer la instalación en cada plataforma.

Debian

Debian es, sin duda, una de las distribuciones más populares de Linux. En este apartado se contemplan todas ellas, incluyendo Ubuntu. Encontrarás tres paquetes distintos:

  • nvda-remote-server-x.y_debian_nonsystemd.deb: para servidores vps montados en contenedores (sin kernel propio, tipo Docker y OpenVZ), y en general cualquier sistema que no tenga el paquete systemd instalado. Si no sabes cuál elegir, quédate con esta.
  • nvda-remote-server-x.y_debian.deb: para Debian 9 y versiones posteriores, y cualquier otra distribución donde systemd funcione. Si el paquete systemd-sysv no está presente en tu sistema, deberás instalarlo antes de instalar este.
  • nvda-remote-server-x.y_debian_py2.deb: es idéntica a la anterior, pero utiliza Python 2 (ya obsoleto) en lugar de Python 3.

Nota: para comprobar si tienes systemd, ejecuta el comando sudo systemctl. Si dice que no encuentra ese comando, no tienes systemd instalado. Si da un error de conexión de bus, significa que no funciona y por tanto debes usar el paquete indicado para esta situación.

Una vez descargado, ejecuta el siguiente comando para instalarlo o actualizar desde una versión anterior: sudo dpkg -i nvda-remote-server-x.y_debian.deb (x e y son los distintos números de versión, reemplázalos según corresponda).

Para desinstalar el servidor conservando la configuración (quién sabe, más adelante podrías volver a instalarlo), ejecuta: sudo dpkg --remove nvda-remote-server

Para desinstalar el servidor y eliminar todo rastro de su existencia en tu sistema, ejecuta: sudo dpkg --purge nvda-remote-server

Centos

Vamos con otra distribución bastante importante, conocida por su estabilidad. En esta familia nos podemos encontrar a RedHat, Centos, Fedora, Oracle / Amazon Linux, y casi cualquier distribución derivada que use rpm como su gestor de paquetes. Al igual que en el caso anterior, tenemos:

  • NVDARemoteServer-x.y-1.el7.nonsystemd.noarch.rpm: para Centos 7 y distribuciones similares, y para todo aquel sistema que, al igual que en el caso anterior, no tenga systemd instalado u operativo.
  • NVDARemoteServer-x.y-1.el7.noarch.rpm: para Centos 7, últimas versiones de Fedora y sistemas derivados.
  • NVDARemoteServer-x.y-1.el8.noarch.rpm: para Centos 8 y versiones posteriores.

Una vez obtenido el archivo correspondiente a nuestra plataforma, hacemos lo siguiente para instalarlo o actualizarlo desde una versión anterior: sudo rpm -U NVDARemoteServer-x.y-1.elZ.noarch.rpm

Para desinstalarlo, ejecuta el siguiente comando: sudo rpm -e NVDARemoteServer

Arch Linux y MSYS2 en Windows

Para instalar el servidor en Arch Linux y distribuciones derivadas, ejecuta el siguiente comando: sudo pacman -U NVDARemoteServer-archlinux-x.y-1-any.pkg.tar.zst

Para desinstalar, ejecuta: sudo pacman --remove NVDARemoteServer

Para desinstalar borrando también la configuración, ejecuta: sudo pacman -Rn NVDARemoteServer

MSYS2 es un proyecto para traer algunas herramientas de desarrollo nativas de Linux a Windows. Utiliza también el gestor de paquetes pacman, por lo que puedes hacer lo mismo que en Arch Linux, omitiendo la llamada a sudo.

Mac os

Nota: los procedimientos que se indican a continuación reducirán la seguridad de tu Mac, y podrían dejarte expuesto a amenazas externas. Ejecútalos bajo tu responsabilidad.

Hay dos cosas que debes hacer para instalar el servidor de NVDA Remote en el Mac, ya que es un paquete no firmado.

  1. Abre las preferencias del sistema, ve al panel seguridad y privacidad, y permite la instalación de aplicaciones desde cualquier origen. Si tienes Macos Sierra o posterior no verás esta opción, por lo que deberás ir a la terminal y ejecutar este comando: sudo spctl --master-disable
  2. Si tienes El capitan o una versión posterior, deshabilita la protección de integridad del sistema. Para ello:
    • Reinicia el sistema. Mientras se reinicia, mantén pulsado comando+r para entrar en el modo recuperación.
    • Ve al menú de utilidades, y abre la terminal.
    • Escribe el siguiente comando: csrutil disable
    • Reinicia de nuevo y vuelve al sistema principal.

Hecho todo esto, abre el paquete para Mac desde el finder e instálalo siguiendo el asistente. Si prefieres instalarlo desde una terminal, ejecuta: sudo installer -pkg NVDARemoteServer-macosx-x.y.pkg -target /

Para desinstalarlo, abre una terminal y ejecuta el siguiente comando: sudo NVDARemoteUninstall

Cygwin en Windows

Si tienes instalada una distribución Cygwin y quieres ejecutar el servidor desde allí, deberás hacerlo desde el código fuente. Para ello, descarga el archivo NVDARemoteServer-x.y-src.zip y descomprímelo en una carpeta cualquiera de tu disco duro. A continuación, abre la consola bash de Cygwin, y navega al subdirectorio cygwin que se encuentra en la carpeta donde has descomprimido el código fuente. Allí, ejecuta el siguiente comando: ./install.sh

Para desinstalar, ejecuta el comando NVDARemoteUninstall

Windows

En Windows apenas hace falta instalación. El servidor es casi portable. Para ejecutarlo con la depuración habilitada simplemente debes descomprimirlo en una carpeta de tu disco duro y abrir el archivo debug.cmd. En cambio, si quieres instalarlo como un servicio del sistema, deberás ejecutar el archivo service_manager.cmd como administrador. Cuando se abra la consola verás un menú de opciones. Desde allí podrás instalar y desinstalar el servicio, cambiar el modo que tiene de iniciarse en Windows, e iniciarlo o pararlo. ¡No olvides desinstalar el servicio antes de borrar el servidor de tu sistema!

Existen distintas versiones compiladas para Windows: de 32 y 64 bits, basadas en Python 2.7, 3.8 y 3.11, etc. Todas deberían funcionar sin problema en la versión más reciente de Windows 11 de 64 bits. Sin embargo, la versión de 64 bits basada en Python 3.11 es la más rápida, estable y eficiente. El resto se mantiene para dar compatibilidad con otras arquitecturas y versiones anteriores de Windows.

Docker

Si usas habitualmente Docker para crear contenedores y ejecutar aplicaciones en su interior, puede serte útil instalar este servidor como un contenedor más. Usa el siguiente comando para descargar o actualizar la imagen del servidor: docker pull jmdaweb/nvda-remote-server:latest

Podrás crear un contenedor usando los comandos habituales. Esta imagen expone el puerto 6837, que podrás redirigir al exterior, así como un volumen que se montará en el directorio /data. Si asocias una carpeta del equipo anfitrión, deberá pertenecer al usuario y grupo 991. Veamos algunos ejemplos:

  • Para crear e iniciar un contenedor que se autodestruye al detenerse: docker run -d -p 6837:6837 --rm -v ./data:/data jmdaweb/nvda-remote-server:latest
  • Para crear e iniciar un contenedor permanente con nombre: docker run -d -p 6837:6837 --name my_nvda_remote -v ./data:/data jmdaweb/nvda-remote-server:latest
  • Para crear un contenedor permanente con nombre sin iniciarlo: docker create -p 6837:6837 --name my_nvda_remote -v ./data:/data jmdaweb/nvda-remote-server:latest
  • Para iniciar un contenedor ya creado: docker start my_nvda_remote
  • Para detener un contenedor en ejecución: docker stop my_nvda_remote
  • Finalmente, este comando destruye un contenedor detenido: docker rm my_nvda_remote

Se puede cambiar el valor que va después del parámetro –name para dar un nombre distinto al contenedor. El puerto del servidor puede modificarse buscando los dos valores numéricos separados por el signo dos puntos y cambiando el primero. Con el volumen el funcionamiento es similar: la primera parte antes del símbolo : indica una ruta absoluta a una carpeta del sistema.

Docker-compose

Si lo deseas, puedes agilizar el despliegue del servidor con docker-compose. En el código fuente se proporciona un archivo docker-compose.yml. Tras crear la carpeta de datos y asignar con chown los permisos oportunos, ejecuta:

  • docker compose up -d para crear el servidor y ponerlo en marcha.
  • docker compose down para detenerlo y destruir el contenedor asociado.

Cómo usar el servidor

En primer lugar, comprueba que el puerto 6837 está abierto en tu cortafuegos o router. Es el que usa por defecto el servidor, aunque en el siguiente apartado te explicaremos cómo cambiarlo.

En todas las plataformas salvo en Windows, existe un script llamado NVDARemoteServer. Se instala en /usr/bin, por lo que para llamarlo desde la consola simplemente deberás escribir su nombre. Llamarlo sin argumentos sólo te servirá en Cygwin, donde se activará el servidor en modo consola, sin mostrar información por pantalla. En todos los demás sitios debes pasarle un argumento, así como opciones extra que veremos más adelante.

En Windows, hay 2 archivos que puedes ejecutar simplemente pulsando intro sobre ellos:

  • service_manager.cmd: carga un menú que te permitirá administrar el servicio del servidor de NVDA Remote.
  • debug.cmd: inicia el servidor en modo depuración.

Argumentos de NVDARemoteServer

Aparte de las opciones, los siguientes argumentos están disponibles:

  • start: inicia el servidor.
  • stop: detiene el servidor.
  • restart: reinicia el servidor.
  • kill: detiene el servidor de forma forzosa (por ejemplo, si se cuelga).
  • enable: habilita el inicio automático del servidor al arrancar el equipo (sólo en distribuciones soportadas de Linux).
  • disable: deshabilita el inicio automático del servidor (sólo en distribuciones soportadas de Linux).
  • debug: inicia el servidor en modo depuración.

Nota: salvo debug, todos los demás comandos requieren privilegios elevados en Linux y Mac.

Configuración y opciones

Puedes personalizar el servidor a tu gusto, cambiando el puerto tcp en el que escucha, la ubicación de sus archivos e incluso la interfaz de red sobre la que operará. Para ello, puedes editar el archivo NVDARemoteServer.conf. En Windows, este se encuentra en la misma carpeta del programa. En todos los demás sistemas, lo encontrarás en el directorio /etc.

Su sintaxis es muy sencilla: en cada línea hay una única clave con su valor, separados por el signo igual y sin espacios al principio, al final o en medio. Si la línea empieza con un signo de número (#), se trata como un comentario y es ignorada. Los retornos de línea deben ser siempre de estilo Unix, y el archivo debe estar codificado en UTF-8.

Las siguientes opciones están disponibles:

  • interface=ip: interfaz IPV4 en la que escuchará el servidor. Por defecto, todas las interfaces (0.0.0.0). En algunas plataformas con pila tcp/ip única, este ajuste no servirá para nada si el servidor escucha en todas las interfaces IPV6.
  • interface6=ip: escuchar en la interfaz IPV6 especificada. Por defecto, todas las interfaces (::).
  • port=puerto: puerto en el que escuchará el servidor. Por defecto 6837.
  • port6=puerto: escuchar en el puerto especificado cuando se hagan conexiones desde una dirección IPV6. Por defecto tiene el mismo valor que port.
  • logfile=ruta: establece la ruta al archivo log donde el servidor guardará los mensajes de registro. Por defecto /var/log/NVDARemoteServer.log, o la carpeta del programa si estamos en Windows.
  • pidfile=ruta: en sistemas Unix, ruta donde se alojará el archivo con el identificador de proceso del servidor. Por defecto /var/run/NVDARemoteServer.pid
  • loglevel=n: cantidad de información que se almacenará en el registro. Acepta un valor entero entre 0 y 4. Por defecto se establece a 2. Para una seguridad óptima en entornos de producción, establécelo a 0 ó 1.
  • keyfile=ruta: ruta a un archivo que contenga una clave privada para cifrar las conexiones SSL. La clave debe estar sin cifrar. Si se proporciona un archivo más abajo que contenga tanto clave privada como certificados, este parámetro debe omitirse.
  • certfile=ruta: ruta a un archivo que contenga concatenadas una clave privada y un certificado ssl, o sólo un certificado o cadena de certificados si se usa junto a keyfile. Por defecto se busca el archivo server.pem en la ruta del script server.py
  • motd=cadena: permite configurar el mensaje de bienvenida. Este mensaje aparecerá en un cuadro de diálogo cuando los clientes se conecten con una clave. Por defecto sólo aparecerá una vez, mientras no se modifique. Si recopilas datos de uso, este sería un buen lugar para indicar una URL a tu política de privacidad.
  • motd_force_display=entero: fuerza que se muestre el mensaje de bienvenida cada vez que un cliente se conecte, incluso si ya lo ha visto. Si se establece a 0 este ajuste estará desactivado. Si se establece a 1 o cualquier otro número, estará activado.
  • includeTracebacks=entero: si se produce un error, incluye la traza del mismo en el log o en la consola. Si se establece a 0 este ajuste estará desactivado. Si el valor es 1 o cualquier otro número, el ajuste estará activado. Viene desactivado por defecto.
  • allowedMessageLength=entero: limita el tamaño máximo, en caracteres, que aceptará el servidor en un mensaje entrante. Si este tamaño se supera, el servidor cortará la conexión con el cliente. Por defecto viene configurado a 0, sin límite.

Puedes probar en el modo depuración estas opciones sin tener que modificar el archivo de configuración. Para ello, ponlas en la consola anteponiendo dos guiones. Por ejemplo:
sudo NVDARemoteServer debug --interface=192.168.1.2 --interface6=::1 --port=6443
En modo depuración, las opciones logfile y pidfile no hacen nada. Además dispondrás de una nueva opción para modificar la ruta al archivo de configuración:
sudo NVDARemoteServer debug --configfile=/home/usuario/NVDARemoteServer.conf
Puedes especificar el resto de opciones junto con configfile, y tendrán prioridad sobre aquellas leídas desde la configuración.

En un contenedor Docker, puedes actualizar la configuración editando el archivo NVDARemoteServer.conf que se encuentra en la carpeta de datos y reiniciando el contenedor. Ten cuidado, alterando muchas de estas opciones puedes dejar tu servidor inaccesible. Como mucho, modifica el mensaje de bienvenida y cómo mostrarlo, el límite de tamaño de los mensajes, el nivel de registro y la inclusión de trazas.

Creación de un certificado autofirmado

La seguridad es un factor clave si deseas usar este servidor en producción. Por él circulará mucha información sensible de los usuarios, y existe el riesgo de que esta información sea interceptada y descifrada. Teniendo en cuenta que el certificado por defecto es el mismo en todas las nuevas instalaciones (con clave privada y todo), a efectos prácticos es como si no hubiera cifrado. Cualquier atacante que sepa claramente lo que quiere conseguir podría descifrar sin dificultad la información.

Para mitigar esta gran amenaza, existe la posibilidad de generar tu propio certificado. Esto lo puedes hacer ejecutando el comando sudo NVDARemoteCertificate en Linux y Mac, y el archivo NVDARemoteCertificate.cmd en Windows. Al hacerlo, un asistente interactivo te irá solicitando ciertos datos. Al acabar se generará un nuevo archivo server.pem, ya personalizado con un cifrado distinto. Para acabar y que los cambios tengan efecto, se recomienda reiniciar el servidor, aunque no es obligatorio. Basta con que todos los usuarios se desconecten y vuelvan a conectarse.

Haz esta operación la primera vez que uses el servidor, y cada vez que lo actualices (o usa las opciones certfile y keyfile).

Si tu copia del servidor se aloja dentro de un contenedor Docker, ejecuta este comando para generar un nuevo certificado. El contenedor deberá estar iniciado:

docker exec -t -i my_nvda_remote NVDARemoteCertificate

Si quieres usar otros certificados, deberás copiarlos a la carpeta de datos y actualizar los parámetros certfile y keyfile del archivo de configuración, reiniciando después el contenedor.

Uso de un certificado de Let’s Encrypt

Let’s Encrypt es una popular autoridad de certificación que expide certificados SSL gratis, con una duración de 90 días y renovables automáticamente. Por sentido común, se deberían ajustar los parámetros certfile y keyfile en la configuración para que contengan las rutas de privkey.pem y fullchain.pem del dominio en cuestión. Sin embargo, esto fallará, ya que el servidor no se ejecuta en modo superusuario. Para usar certificados de Let’s Encrypt, el código fuente incluye un hook de prueba, llamado NVDARemoteCertificate-letsencrypt. Edítalo, y actualiza la variable domain de la parte superior. Su valor debe coincidir con el nombre de la carpeta que contiene el certificado de tu dominio en /etc/letsencrypt. Después, cópialo al directorio /usr/bin, y dale permisos de ejecución con un comando como este: chmod +x /usr/bin/NVDARemoteCertificate-letsencrypt.
Finalmente, edita el archivo /etc/letsencrypt/renewal/dominio.conf, y añade esta línea al final: post_hook=/usr/bin/NVDARemoteCertificate-letsencrypt
Al ejecutar el comando sudo NVDARemoteCertificate-letsencrypt, tu certificado estará disponible para el servidor. Al tratarse de un certificado válido emitido por una autoridad de confianza, los usuarios de NVDA Remote y complementos derivados no verán un aviso de seguridad y se conectarán directamente.

Ya tengo instalado el servidor y lo he configurado a mi gusto. ¿Y ahora qué?

Si ya tienes todo listo, comparte la dirección del servidor con quien tú quieras: amigos, familiares, clientes de tu empresa, o el público en general. Los usuarios podrán conectarse a tu servidor exactamente de la misma manera que lo hacen a nvdaremote.com o allinaccess.com. Puedes pasarles un nombre de host, una dirección IPV4 o una dirección IPV6; y por supuesto, ¡el puerto!

No olvides observar periódicamente la actividad de tu servidor

El servidor anota todo lo que hace en un archivo de registro, perfectamente legible con cualquier editor de texto plano. Si se detiene espontáneamente, falla o consume demasiados recursos, es probable que encuentres la causa en dicho archivo. Este archivo de registro se vacía cada vez que se reinicia el servidor.

Puedes encontrar el archivo en las siguientes ubicaciones, dependiendo de tu sistema:

  • Mac y muchas distribuciones Linux: /var/log/NVDARemoteServer.log
  • Arch Linux: /run/NVDARemoteServer/NVDARemoteServer.log
  • Windows: archivo NVDARemoteServer.log en la carpeta del programa.
  • En un contenedor Docker, ejecuta el siguiente comando: docker logs my_nvda_remote.

Cuanto mayor sea el nivel de registro configurado, más información se almacenará. Recuerda utilizar como mucho el nivel 3 para salvaguardar la privacidad de tus usuarios. Utiliza el nivel 4 sólo en entornos de desarrollo y durante periodos muy breves de tiempo si quieres observar directamente las comunicaciones. Ten en cuenta que tus usuarios recibirán una advertencia que les permitirá saber que el nivel 4 está activado.