hits counter
Este sitio web utiliza cookies para obtener estadísticas de navegación. Si sigue adelante, consideraremos que acepta su uso. Acepto | Más información

Servidores:



Servidor LEMP + Joomla + SSL

LEMP es el acrónimo que corresponde a Linux, (E)nginx, MySQL y PHP. Todos estos elementos son necesarios para poder instalar uno de los CMS más usados en la creaciónn de páginas webs y blogs: Joomla. Además, añadiremos al final una utilidad para gestionar las bases de datos de una manera fácil y cómoda: phpMyAdmin. Una vez instalados y configurados todos ellos, tendremos un conjunto de servicios con el que podremos crear un completo sitio web alojado en nuestra propia Raspberry Pi.

Requisitos previos

Puesto que Linux ya lo tenemos funcionando en nuestra máquina mediante el uso de Raspberry Pi OS, antes de ponernos manos a la obra con los demás elementos, tenemos que asegurarnos de haber hecho estas dos cosas:

  1. 1.) Asignarle a la Raspberry Pi una IP estática, tal y como se indica en este apartado.
  2. 2.) Crear un DNS dinámico para poder acceder al servidor desde Internet, algo que podemos hacer de la forma que explicamos aquí.


Nginx

Nginx es un servidor web que consume menos recursos hardware que Apache, por lo que es más adecuado para instalarlo en una pequeña placa como la Raspberry Pi. Además, es capaz de gestionar más páginas por segundo y su tiempo de respuesta es menor. Estas mejoras se producen sobre todo cuando se utiliza con páginas web estáticas.

Instalamos el servidor:

sudo apt install nginx

Podemos ver que se ha instalado correctamente accediendo desde el navegador de nuestro PC a la IP de la Raspberry, lo que nos mostrará esto:

A continuación vamos a editar su fichero de configuración:

sudo nano /etc/nginx/nginx.conf

Aquí le indicamos que por razones de seguridad no envíe la versión del servidor en las conexiones HTTP, para lo cual descomentamos esta línea:

server_tokens off;

Para que el cambio surta efecto, reiniciamos el servicio:

sudo service nginx restart

Las páginas web que queramos mostrar, como veremos más adelante, se guardan en el directorio /var/www/html. Por otro lado, conviene saber que los ficheros que guardan los registros de acceso al servidor se encuentran en /var/log/nginx y son dos: access.log y error.log. Podemos revisarlos de vez en cuando para comprobar el funcionamiento del servidor.


Instalar PHP

Hecho lo anterior, ya podemos instalar PHP en su versión 7.4:

sudo apt install php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-curl php7.4-gd php7.4-zip php7.4-xml php7.4-intl

A diferencia de Apache, Nginx no se configurará automáticamente para su uso con PHP. En su lugar, debemos realizar cambios en sus archivos de configuración para que se cargue. También tendremos que utilizar PHP-FPM y no PHP estándar debido a la forma en que funciona este servidor web.

Vamos a editar el siguiente fichero de configuración para indicarle a Nginx que se encargue de servir también archivos PHP:

sudo nano /etc/nginx/sites-enabled/default

Para ello incluimos index.php en la lista y además descomentamos las otras líneas que se indican a continuación:

# Add index.php to the list if you are using PHP  
index index.php index.html index.htm index.nginx-debian.html; 
. . . . .
. . . . .  
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
	include snippets/fastcgi-php.conf;
#
#       # With php-fpm (or other unix sockets):
	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
#       # With php-cgi (or other tcp sockets):
#       fastcgi_pass 127.0.0.1:9000;
}

Debemos comprobar que la línea fastcgi_pass unix:/var/run/php/php7.4-fpm.sock haga referencia a la versión de PHP que hemos instalado antes (7.4).

Ahora reiniciamos el servidor:

sudo systemctl reload nginx

Para asegurarnos de que PHP funciona correctamente, en la ruta /var/www/html creamos un archivo de prueba:

cd /var/www/html
sudo nano index.php

en el que incluiremos este sencillo contenido:

<?php
phpinfo();
?>

Si accedemos desde el navegador del PC a la IP local de la Raspberry (192.168.1.33) nos aparecerá un cuadro con información detallada sobre la versión de PHP instalada:

Una vez comprobado que PHP funciona, eliminamos el fichero de prueba y nos colocamos de nuevo en nuestro /home:

sudo rm index.php
cd

Certificado SSL

Con lo hecho hasta aquí, una vez que instalemos Joomla en los pasos siguientes, sólo podremos usarlo mediante el protocolo HTTP. Pero necesitamos convertir nuestro servidor Nginx en un servidor web seguro que use el protocolo HTTPS. Para ello vamos a añadir un Certificado SSL de Let's Encrypt.


MariaDB

Raspberry Pi OS, al igual que otras distribuciones de Linux, ya no incluye MySQL en sus repositorios, debido a que ha dejado de ser Open source (código abierto) al convertirse en propiedad de Oracle. En su lugar utiliza un fork o escisión del mismo llamado MariaDB. Así pues, procedemos a la instalación de este gestor de bases de datos:

sudo apt install mariadb-server

Contrariamente a lo que ocurría con MySQL, MariaDB no nos pide que pongamos una contraseña de administrador durante su instalación, así que tendremos que añadirla en el proceso de protección que tenemos que realizar seguidamente:

sudo mysql_secure_installation

Lo que nos dará como resultado lo siguiente:

Enter current password for root (enter for none):                   [Pulsamos <Enter>]
Switch to unix_socket authentication [Y/n]                             [Contestamos 'Y' a la pregunta]
Change the root password? [Y/n]                    [Escribimos 'Y' para poner una nueva password]
New password:                                                [Ponemos una contraseña y la anotamos]
Re-enter new password:                                 [La escribimos de nuevo]

Luego, a todas las demás preguntas, contestamos Y, que es la opción por defecto.

IMPORTANTE: no olvidemos anotar la contraseña de root que acabamos de poner. La vamos a necesitar a continuación para la creación de una base de datos.

Ahora vamos a crear la base de datos y el usuario con su contraseña:

sudo mysql -u root -p

Escribimos las órdenes que se muestran en negrita, cambiando mi_password por una contraseña para la base de datos (que anotaremos, ya que vamos a usarla después para configurar Joomla):

Enter password:                    [La del administrador (root), que anotamos más arriba]
MariaDB [(none)]> CREATE DATABASE joomladb;
MariaDB [(none)]> CREATE USER 'jl_user'@'localhost' IDENTIFIED BY 'mi_password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON joomladb.* TO 'jl_user'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit;

Por último, instalaremos el conector PHP-MySQL:

sudo apt install php-mysql

Instalar y configurar Joomla

Vamos al directorio donde instalaremos el CMS:

cd /var/www/html

Para instalar Joomla necesitamos conocer antes cuál es su última versión. Una vez conocida, la descargamos:

sudo wget https://downloads.joomla.org/cms/joomla4/4-0-5/Joomla_4-0-5-Stable-Full_Package.tar.gz

Ahora descomprimimos el fichero:

sudo tar -xvf Joomla_4-0-5-Stable-Full_Package.tar.gz

Y ya podemos eliminarlo:

sudo rm Joomla_4-0-5-Stable-Full_Package.tar.gz

Volvemos a nuestro /home y cambiamos recursivamente el dueño y el grupo del directorio de instalación:

cd
sudo chown -R www-data:www-data /var/www/html

Hecho lo anterior, ya podemos pasar a su configuración. Desde el PC accedemos a la Raspberry mediante HTTPS y el DNS dinámico que creamos al principio:

https://midominio.com

Y aparecerá el instalador web de Joomla:

Seleccionamos el idioma, le damos un nombre al sitio y pulsamos debajo en Configurar datos de inicio de sesión.

Pasaremos a la siguinte ventana:

En el primer campo podemos poner cualquier nombre. El segundo campo es el que contendrá el verdadero nombre del usuario administrador, que usaremos para iniciar sesión. La contraseña, como se indica, debe contener al menos 12 caracteres. Al final se nos pide una dirección de email. Y pulsamos en Configurar conexión a la base de datos.

Esto nos lleva a la siguiente ventana:

Los dos primeros campos los dejamaos como están. En el tercero escribiremos el nombre de usuario de la base de datos que creamos antes (jl_user) y luego su contraseña. A continuación pondremos el nombre de la base de datos (joomladb). Los dos últimos campos los dejamos como vienen por defecto. Finalmente, hacemos clic en Instalar Joomla.

Se nos abre otra ventana:

Pinchamos en Open Administrator y se nos pedirá que escribamos el nombre del administrador y su contraseña, que configuramos unos pasos más atrás:

Al hacer clic en Login accederemos por fin al Panel de Control de Joomla. Una vez dentro, una de la primeras cosas que podemos cambiar es el idioma. Para ello, en el panel lateral hacemos clic en System y luego, a la derecha, en la sección Manage, pinchamos en Languages. Elegimos el idioma pinchando arriba en el botón Install Languages. Para que se quede permanente y no haya que seleccionarlo en cada inicio de sesión (debajo de Username y Password), una vez dentro del Panel de Control hacemos clic en el Menú de usuario (arriba a la derecha) -- Editar cuenta -- Configuración básica (seleccionamos el "Idioma de la administración" y el "Idioma del sitio") y guardamos los cambios pinchando, arriba a la izquierda, en el botón Guardar.

Para entrar en lo sucesivo en la página de administración utilizaremos esta URL:

https://midominio/administrator/index.php

Configurar PHP

Hay algunos parámetros en PHP que podemos cambiar para mejorar el uso de nuestro recién instalado CMS. Para ello editamos el fichero de configuración de PHP:

sudo nano /etc/php/7.4/fpm/php.ini

Con la combinación de teclas Ctrl+w haremos la búsqueda de los siguientes parámetros hasta dejarlos como se muestra a continuación:

output_buffering = Off
post_max_size = 64M
upload_max_filesize = 64M

Para que estos cambios surtan efecto tenemos que reiniciar el servicio PHP-FPM:

sudo systemctl restart php7.4-fpm

phpMyAdmin

phpMyAdmin es una utilidad, escrita en PHP, que sirve para administrar las bases de datos SQL por medio de una interfaz web, por lo que su uso resulta muy fácil e intuitivo. Para su instalación vamos a escribir lo siguiente:

sudo apt install phpmyadmin

Durante el proceso de instalación se nos preguntará qué servidor web hemos instalado. Aunque estemos usando Nginx, seleccionamos apache2 con la tecla Espacio, le damos a Aceptar y continuamos. Después nos preguntará si queremos configurar la base de datos con dbconfig-common; puesto que ya tenemos una creada, contestamos que No.

Una vez finalizada la instalación, creamos un enlace entre la carpeta de la utilidad que acabamos de instalar y el directorio raíz de HTML mediante este comando:

sudo ln -s /usr/share/phpmyadmin /var/www/html

Y ahora, para acceder a la interfaz de phpMyAdmin, ponemos en el navegador lo siguiente:

http://192.168.1.33/phpmyadmin

La IP anterior debe corresponder, lógicamente, con la IP local de nuestra Raspberry. El usuario es root y su contraseña es la que le asignamos más arriba cuando instalamos MariaDB.




Servidor LAMP + WordPress + SSL

LAMP es el acrónimo que corresponde a Linux, Apache, MySQL y PHP. Todos estos elementos son necesarios para poder instalar después el CMS más usado para la creación de blogs: WordPress. Además, añadiremos al final una utilidad para gestionar las bases de datos de una manera fácil y cómoda: phpMyAdmin. Una vez instalados y configurados todos ellos, tendremos un conjunto de servicios con el que podremos crear un completo sitio web alojado en nuestra propia Raspberry Pi.


Requisitos previos

Puesto que Linux ya lo tenemos funcionando en nuestra máquina mediante el uso de Raspberry Pi OS, antes de ponernos manos a la obra con los demás elementos, tenemos que asegurarnos de haber hecho estas dos cosas:

  1. 1.) Asignarle a la Raspberry Pi una IP estática, tal y como se indica en este apartado.
  2. 2.) Crear un DNS dinámico para poder acceder al servidor desde Internet, algo que podemos hacer de la forma que explicamos aquí.


Apache

Apache es probablemente el servidor web más utilizado del mundo. Para una placa con poca potencia de hardware como la Raspberry Pi sería, sin embargo, más adecuado usar Nginx, como explicamos en el apartado anterior; pero este presenta problemas para cambiar los enlaces permanentes de WordPress, motivo por el cual nos hemos decantado por el primero.

Instalarlo y dejarlo listo para funcionar es muy fácil:

sudo apt install apache2

Si en el PC abrimos el navegador y escribimos la IP local de nuestra RasPi, podremos ver una página web de prueba que nos indica que el servidor está funcionando:

Para poder configurar más adelante en WordPress los enlaces permanentes a nuestro gusto es necesario hacer ahora un par de cambios. El primero es habilitar el módulo rewrite:

sudo a2enmod rewrite

Y el segundo es configurar adecuadamente este fichero:

sudo nano /etc/apache2/sites-enabled/000-default.conf

añadiendo las líneas que se muestran en negrita, de manera que quede así:

<VirtualHost *:80>
       . . . . . .
       . . . . . .
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html
       . . . . . .
       . . . . . .
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       . . . . . .
       . . . . . .
       <Directory /var/www/html>
            AllowOverride All
       </Directory>


</VirtualHost>

Además, por razones de seguridad, vamos a evitar que envíe la versión del servidor en las conexiones al mismo. Para lograrlo, editamos el fichero

sudo nano /etc/apache2/apache2.conf

y al final del archivo escribimos estos dos parámetros:

ServerSignature Off
ServerTokens Prod

Ahora reiniciamos el servidor:

sudo systemctl restart apache2

Instalar PHP

En segundo lugar instalaremos PHP en su versión 7.4:

sudo apt install php7.4 libapache2-mod-php7.4 php7.4-mbstring php7.4-mysql php7.4-xml php7.4-curl php7.4-gd php7.4-zip php7.4-intl

Y reiniciamos de nuevo el servidor web:

sudo systemctl restart apache2

Para asegurarnos de que todo funciona correctamente, en la ruta /var/www/html borramos el fichero actual y lo sustituimos por un PHP de prueba:

cd /var/www/html
sudo rm index.html
sudo nano index.php

en el que incluiremos este sencillo contenido:

<?php
phpinfo();
?>

Si accedemos desde el navegador del PC a la IP local de la Raspberry (192.168.1.33) nos aparecerá un cuadro con información detallada sobre la versión de PHP instalada:

Una vez comprobado que PHP funciona, eliminamos el fichero de prueba y nos colocamos de nuevo en nuestro /home:

sudo rm index.php
cd

A partir de este momento nuestra Raspberry Pi ya tiene soporte para PHP, algo imprescondible para poder ejecutar luego WordPress.

Las páginas o sitios web que queramos mostrar hemos de guardarlas, como hemos visto antes, en el directorio /var/www/html. Por otro lado, conviene saber que los ficheros que guardan los registros de acceso al servidor se encuentran en /var/log/apache2 y son dos: access.log y error.log. Podemos revisarlos de vez en cuando para comprobar el funcionamiento del servidor.


MariaDB

Raspberry Pi OS, al igual que otras distribuciones de Linux, ya no incluye MySQL en sus repositorios, debido a que ha dejado de ser Open source (código abierto) al convertirse en propiedad de Oracle. En su lugar utiliza un fork o escisión del mismo llamado MariaDB. Así pues, procedemos a la instalación de este gestor de bases de datos:

sudo apt install mariadb-server

Contrariamente a lo que ocurría con MySQL, MariaDB no nos pide que pongamos una contraseña de administrador durante su instalación, así que tendremos que añadirla en el proceso de protección que tenemos que realizar seguidamente:

sudo mysql_secure_installation

Lo que nos dará como resultado lo siguiente:

Enter current password for root (enter for none):                   [Pulsamos <Enter>]
Switch to unix_socket authentication [Y/n]                             [Contestamos 'Y' a la pregunta]
Change the root password? [Y/n]                    [Escribimos 'Y' para poner una nueva password]
New password:                                                [Ponemos una contraseña y la anotamos]
Re-enter new password:                                 [La escribimos de nuevo]

Luego, a todas las demás preguntas, contestamos Y, que es la opción por defecto.

IMPORTANTE: no olvidemos anotar la contraseña de root que acabamos de poner. La vamos a necesitar a continuación para la creación de una base de datos y también al final para entrar en phpMyAdmin.

Ahora vamos a crear la base de datos y el usuario con su contraseña:

sudo mysql -u root -p

Escribimos las órdenes que se muestran en negrita, cambiando mi_password por una contraseña para la base de datos (que anotaremos, ya que vamos a usarla después para configurar WordPress):

Enter password:                    [La del administrador (root), que anotamos más arriba]
MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'mi_password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit;

Certificado SSL

Con lo hecho hasta aquí, una vez que instalemos WordPress en el siguiente paso, sólo podremos usarlo mediante el protocolo HTTP. Pero necesitamos convertir nuestro servidor Apache en un servidor web seguro que use el protocolo HTTPS. Para ello vamos a añadir un Certificado SSL de Let's Encrypt.


Instalar y configurar Wordpress

Nos vamos al directorio en el que se guardan las páginas web, descargamos WordPress, lo descomprimimos, lo movemos de sitio, borramos todo lo que ya no es necesario y volvemos a nuestro directorio /home:

cd /var/www/html
sudo wget http://wordpress.org/latest.tar.gz
sudo tar xzf latest.tar.gz
sudo mv wordpress/* .
sudo rmdir wordpress
sudo rm latest.tar.gz
cd

Luego le cambiamos recursivamente el dueño y el grupo a la carpeta anterior:

sudo chown -R www-data:www-data /var/www/html

Hecho todo eso, ya podemos pasar a su configuración del CMS. Desde el PC accedemos a la Raspberry mediante el protocolo HTTPS y nuestro dominio:

https://midominio.com

Se nos mostrará una ventana para elegir el idioma:

Pulsamos en el botón Continuar y pasamos a una nueva ventana de bienvenida en la que se nos indica la información, relativa a la base de datos que creamos antes, que se nos van a pedir a continuación. Aceptamos y pasamos a la siguiente ventana en la que tendremos que introducir dichos datos: nombre de la base de datos (wordpress), nombre de usuario (wp_user) y contraseña (la que anotamos más arriba). Los dos últimos los dejamos como están:

Pulsamos en Enviar y en otra pequeña ventana se nos advierte de que ya ha terminado la primera parte de la instalación de WordPress, así que ahora pulsamos en Ejecutar la instalación.

Una última ventana nos pedirá la información necesaria para crear nuestro sitio web: el título que deseamos ponerle, el nombre del usuario que va a administrarlo, su contraseña (ya nos aparece una por defecto) y un correo electrónico válido:

Ya sólo queda pinchar en Instalar WordPress para que se complete el proceso. Veremos un recordatorio de cuál es nuestro usuario para administrar el sitio y la necesidad de escribir la contraseña que hemos elegido antes. Pinchamos en Acceder.

Y entraremos en la ventana de login. También lo podemos hacer escribiendo en el navegador el dominio de la Raspberry seguido de /wp-login.php:

https://midominio.com/wp-login.php

Una vez entremos en nuestro flamante CMS, lo primero que haremos será acceder al menú lateral, ir a Ajustes -- Enlaces permanentes y cambiar la opción que viene por de defecto (Día y nombre) por la que se muestra en esta imagen (Nombre de la entrada):


Este cambio es importante, ya que hace los enlaces más comprensibles para los usuarios y además ayuda al posicionamiento SEO de nuestro blog a la hora de ser indexado por los buscadores.

Para que se haga efectivo el cambio hay que pulsar en Guardar cambios.


phpMyAdmin

phpMyAdmin es una utilidad, escrita en PHP, que sirve para administrar las bases de datos SQL por medio de una interfaz web, por lo que su uso resulta muy fácil e intuitivo. Para su instalación vamos a escribir lo siguiente:

sudo apt install phpmyadmin

Durante el proceso de instalación se nos preguntará qué servidor web hemos instalado. Seleccionamos apache2 con la tecla Espacio, le damos a Aceptar y continuamos. Después nos preguntará si queremos configurar la base de datos con dbconfig-common; puesto que ya tenemos una creada, contestamos que No.

Una vez finalizada la instalación, escribiremos estos dos comandos:

sudo phpenmod mysqli
sudo systemctl restart apache2

Y ahora, para acceder a la interfaz de phpMyAdmin, ponemos en el navegador lo siguiente:

http://192.168.1.33/phpmyadmin

La IP anterior debe corresponder, lógicamente, con la IP local de nuestra Raspberry. El usuario es root y su contraseña es la que le asignamos más arriba cuando instalamos MariaDB.




Servidor de impresión

Si no disponemos de una impresora con conexión de red Ethernet, sino de una simple impresora USB, la tendremos conectada a uno de nuestros ordenadores y sólo podremos imprimir desde este PC. Para solventar este inconveniente, podemos configurar la Raspberry Pi como un servidor de impresión, lo que nos permitirá imprimir desde cualquier PC conectado a la red local. Es una solución fácil y práctica para quienes no dispongan de una impresora de red. Veamos cómo convertir nuestra RasPi en un servidor de impresión gracias a CUPS.

Instalación de CUPS

  1. 1.) Conectamos el cable de la impresora a uno de los puertos USB de la RasPi y encendemos ambas máquinas.
  2. 2.) Si no lo tenemos hecho ya antes, debemos asignar una IP fija a la Raspberry, tal y como se explica aquí.
  3. 3.) Procedemos entonces a actualizar el sistema operativo de la forma habitual:
    sudo apt update
    sudo apt upgrade
  4. 4.) Ejecutamos estos dos comandos para instalar y preparar el uso de CUPS (cambiando piuser por el nombre del usuario que estemos usando en nuestro sistema):
    sudo apt install printer-driver-gutenprint
    sudo usermod -a -G lpadmin piuser
  5. 5.) Desde el escritorio de la RasPi, abrimos el navegador y escribimos la direción
    localhost:631
    para entrar en la interfaz web de CUPS a través del puerto 631.
  6. 6.) En la pestaña "Administración", en el apartado Servidor, marcamos las casillas "Compartir impresoras conectadas a este sistema":
    y también "Permitir administración remota". Con esto último podremos acceder a la interfaz web de CUPS instalada en la Raspberry desde otro PC, escribiendo su IP:
    192.168.1.33:631
    Finalmente pulsamos en el botón "Cambiar configuración" para que se activen ambas opciones.
  7. 7.) En la misma pestaña "Administración", en el apartado Impresoras, ahora pulsamos en el botón "Añadir impresora":
  8.      Se nos pedira el usuario y contraseña de acceso a la Raspberry.
  9. 8.) Seleccionamos nuestra impresora en la parte superior (Impresoras locales) y pulsamos en el botón "Siguiente".
  10. 9.) En la siguiente pantalla comprobamos que los datos son correctos. Opcionalmente podemos poner un nombre a la impresora en Ubicación. Luego marcamos la casilla "Compartir esta impresora" y pulsamos en "Siguiente".
  11. 10.) Pasamos después a una nueva pantalla. Lo más importante aquí está en el apartado Modelo, donde debemos elegir el modelo exacto de nuestra impresora. Si no aparece en la lista (cosa que desgraciadamente es bastante habitual), en el apartado inferior (O proporcione un archivo PPD) podremos seleccionar la carpeta con el fichero PPD que corresponda a la impresora, pulsando en el botón "Examinar"; pero debemos tener en cuenta que dicho fichero habremos de buscarlo y descargarlo previamente de Internet. Hecho esto, pulsamos en "Añadir impresora".
    En última instancia, si no encontramos la impresora con ninguno de los dos métodos anteriores, puede que en la web del fabricante hallemos un instalador con el driver para CUPS, en cuyo caso tendremos que obviar los pasos anteriores e instalarlo manualmente en la Raspberry.
  12. 11.) En la pestaña "Impresoras" debe de aparecer ya la impresora que hayamos seleccionado y configurado en el punto anterior:

Imprimir en la red local

Completados los pasos anteriores, en los PCs con Linux de nuestra red local debería de aparecer automáticamente en la lista de impresoras, y si no ha habido ningún problema, podremos imprimir en ella. Las propiedades de la impresora mostrarán algo como esto:

En el caso de Windows, en cambio, la cosa es más complicada. La impresora compartida no aparecerá por sí misma en los "dispositivos e impresoras" del Panel de control. Tendremos que añadirla nosotros manualmente. Para ello, seguiremos estos pasos:

  1. 1.) Nos vamos al Panel de control - Hardware y sonido - Ver dispositivos e impresoras - Agregar impresora.
  2. 2.) En la ventana que aparece, pulsamos abajo en "La impresora no está en la lista".
  3. 3.) Elegimos "Seleccionar una impresora compartida por nombre" y escrbimos lo siguiente:
    http://192.168.1.33:631/printers/HLL2300D
    sustituyendo 192.168.1.33 por la IP local de nuestra RasPi, y HLL2300D por el nombre de nuestra impresora tal y como aparecía anteriormente en CUPS.
  4. 4.) Pulsamos en el botón "Siguiente" y la seleccionamos en la lista de impresoras, si aparece. Si no aparece en esta lista, pulsamos en el botón "Usar disco" y buscamos la carpeta donde tenemos guardados los drivers para Windows de nuestra impresora.
  5. 5.) Ahora en "Ver dispositivos e impresoras" ya aparecerá y la podremos establecer como impresora predeterminada e imprimir en ella con normalidad.



Servidor VPN WireGuard

Una VPN (Virtual Private Network, Red Privada Virtual) es un sistema que nos permitirá conectarnos a la Raspberry Pi desde cualquier lugar de Internet de una manera segura, mediante una conexión cifrada, y tener acceso a toda nuestra red local igual que si estuviéramos en casa. De hecho, una VPN es como una extensión de nuestra red local, pero realizada a través de una red pública (Internet en este caso). Una vez conectados desde el exterior al servidor VPN, nuestro dispositivo pasará a formar parte de la red doméstica y usará el router de nuestra casa para movernos por Internet, siendo por ello el encargado de asignarnos la IP pública correspondiente. Además, cuando nos conectamos a la VPN, todo el tráfico entre el cliente y el servidor (es decir, los datos generados por cualquier servicio o aplicación que usemos) viajarán con un cifrado de alta seguridad, por lo que nadie podrá ver su contenido aunque estemos usando una wifi pública y haya algún hácker espiando el tráfico de datos que circula por ella.

Vamos a instalar un servidor VPN del tipo WireGuard, ya que actualmente se ha convertido en el más usado (por encima de OpenVPN, que veremos después) debido a su mayor rapidez, facilidad de configuración y seguridad. Aunque WireGuard no es difícil de instalar y configurar, resulta mucho más fácil aún si recurrimos a PiVPN, un script que lleva a cabo todo el proceso de una forma simple y sencilla, lo que nos ahorrará el trabajo de realizar manualmente la configuración del servidor.


Requisitos previos

Antes de comenzar con la instalación, tenemos que asegurarnos de haber hecho estas tres cosas:

  1. 1.) Instalar y configurar el Sistema Operativo. Necesitamos tener instalado un SO, como puede ser Raspberry Pi OS (preferiblemente, aunque se pueden usar también otros sistemas). Para los que no tengan experiencia previa con la Raspberry, en los primeros apartados del menú Sistema explicamos cómo hacer todo el proceso: instalar el SO, acceder por SSH a la RasPi y realizar una configuración básica de la misma.
  2. 2.) Asignarle a la Raspberry Pi una IP estática, tal y como se detalla en este apartado de nuestra web.
  3. 3.) Crear un DNS dinámico o nombre de dominio virtual para poder acceder al servidor VPN desde Internet, algo que podemos hacer de la forma que explicamos en este otro apartado.

Instalación

El proceso de instalación del servidor WireGuard consistirá en realizar estos cuatro pasos:

  1. 1.) Instalar el servidor con PiVPN. Para ello ejecutaremos este script desde la línea de comandos:
    curl -L https://install.pivpn.io | bash
    Durante el proceso de ejecución se nos preguntarán algunas cosas:
  1. [a] Inicialmente el sistema hará ciertas comprobaciones, instalará algunos paquetes y veremos diversas ventanas con información que hemos de aceptar. Se nos preguntará si queremos forzar que las conexiones IPv6 pasen por la VPN (se recomienda Yes). Luego, si queremos usar DHCP reservation (contestamos No). Al final mostrará la IP estática que hemos configurado previamente y el Gateway (seleccionamos Yes).
  2. [b] El usuario local que va a usarse para la configuración del servidor (lo seleccionamos y pulsamos Ok).
  3. [c] Se nos dará a elegir entre instalar WireGuard o bien OpenVPN (elegimos WireGuard en este caso).
  4. [d] WireGuard emplea el protocolo UDP, así que sólo se nos preguntará el puerto que vamos a usar (51820 por defecto, aunque conviene cambiarlo). El puerto elegido tendremos que abrirlo en el router y redireccionarlo a la IP local de la Raspberry.
  5. [e] Elegimos un servidor de DNS concreto de la lista que se nos ofrece (Quad9, OpenDNS, Level3, Norton, CloudFlare, Google...).
  6. [f] La IP pública o el nombre de dominio que usaremos para acceder al servidor (elegimos DNS Entry).
  7. [g] Un nombre público para nuestro servidor, que será el DNS dinámico (dominio de no-ip en nuestro caso) que creamos anteriormente en el paso 3 de los REQUISITOS PREVIOS.
  8. [h] Si deseamos activar o no las actualizaciones automáticas (Yes por defecto).
  9. [i] Seremos informados sobre cómo añadir un nuevo usuario y, finalmente, se nos preguntará si deseamos reiniciar el sistema (contestamos Yes y en la siguiente ventana pulsamos en Ok para que se reinicie).

  1. 2.) Crear usuarios. Hecho lo anterior, abrimos de nuevo una terminal y añadimos los usuarios que van a acceder al servidor VPN mediante el comando
    pivpn add
    que nos pedirá el nombre del usuario y generará las claves pública y privada correspondientes. Se creará un perfil con la configuración de cada usuario en /etc/wireguard/configs y, además, una copia en /home/piuser/configs. Cada perfil consta de un fichero con la forma usuario.conf.

    Para acceder a la primera carpeta, hemos de hacerlo como root:
    sudo su
    cd /etc/wireguard/configs
    Finalmente, volvemos a nuestro usuario habitual con
    exit

  1. 3.) Instalar los clientes en todos aquellos dispositivos (PCs, portátiles, smartphones o tabletas digitales) desde los que queramos acceder al servidor. Para el sistema Android podemos usar varias apps, como por ejemplo la oficial o bien esta otra. Para iOS también está disponible la app oficial. Y en el caso de macOS y Windows, podremos descargar los clientes desde la web de WireGuard. Además, disponemos de información sobre cómo instalar y configurar los clientes para los distintos sistemas operativos en este sitio.

  1. 4.) Importar las claves. Una vez instalado el cliente en cada dispositivo, desde este tenemos que importar los ficheros que contienen la clave privada de cada usuario (usuario.conf) que vamos a usar para realizar la conexión al servidor y que se encuentran en cualquiera de las dos carpetas que indicamos en el paso 2.).

    Este proceso podemos hacerlo desde un ordenador con Linux conectándonos a la Raspberry y descargándonos los ficheros mediante el comando scp:
    scp -P xxxx piuser@192.168.1.33:/home/piuser/configs/* /home/usuario
    El argumento -P xxxx es para indicar el puerto en caso de que no usemos el estándar (22) en el servidor SSH de la Raspberry Pi. Si no es nuestro caso, entonces no hace falta escribirlo. Al final del comando, usuario será el que estemos usando en la máquina Linux.

    Pero si ya estamos en la RasPi y lo que deseamos es exportar los archivos a otra máquina Linux, lo haremos así:
    scp -P xxxx /home/piuser/configs/* usuario@192.168.x.xx:/home/usuario
    El argumento -P xxxx correspondería al puerto del servidor SSH de la máquina destino, en caso de que no use el estándar. En la última parte del comando podremos los datos concretos (usuario e IP local) también de la máquina destino.

    En lo que respecta a Windows, podemos recurrir a la aplicación WinSCP, un cliente SFTP/SCP que funciona a través del servidor SSH y que resulta muy práctico para transferir archivos a/desde la Raspberry, siendo además muy fácil de usar. Es similar a usar el comando scp de Linux, pero en modo gráfico.

    En el caso de los dispositivos móviles con Android o iOS, una de las características más interesantes y útiles de PiVPN es que permite generar un código QR (mediante el comando pivpn -qr) con la configuración de cada usuario y que luego se puede escanear desde la app móvil, de manera que la importación de las claves es un proceso completamente automático. O si se desea, también se puede utilizar una app de gestión de archivos (como esta para Android) y crear una conexión SFTP hacia la Raspberry.

    Otra posibilidad para transferir los archivos a cualquier dispositivo es hacerlo manualmente copiando los ficheros, por ejemplo, en un pendrive y de ahí pasarlos directamente al PC o, mediante un cable OTG, al smartphone o la tableta digital.

Hecho todo el proceso anterior, ya tenemos todo listo para empezar a utilizar el servidor WireGuard que acabamos de instalar. Ahora bien, si más adelante, por algún motivo, deseamos desinstalarlo, escribiremos esto:

pivpn uninstall

Iptables

Si estamos usando el cortafuegos ufw, en la configuración de WireGuard hemos de incluir un par de reglas de iptables. Para ello editamos el siguiente fichero:

sudo nano /etc/wireguard/wg0.conf

En él añadiremos las líneas que se muestran a continuación en negrita:

[Interface]
PrivateKey = server_privatekey
Address = 10.6.0.1/24
MTU = 1420
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


[Peer]
. . . . . .

Además, tenemos que hacer una modificación en el siguiente archivo:

sudo nano /etc/sysctl.conf

Buscamos la línea que se muestra a continuación y, en caso de que la tenga puesta, le quitamos la almohadilla (#), de manera que quede así:

net.ipv4.ip_forward=1

Usuarios

Más arriba, en el apartado 2.), ya vimos cómo crear usuarios. En el caso de que queramos eliminar alguno de ellos, lo primero que debemos hacer es obtener un listado de los mismos, lo que conseguiremos con esta orden:

pivpn list

Luego lo eliminaremos mediante el siguiente comando:

pivpn remove usuario

Si escribimos de nuevo pivpn list veremos que el usuario ya no aparece en la lista. El borrado consiste en eliminar el fichero correspondiente del directorio /etc/wireguard/configs y también la copia existente en /home/piuser/configs.

Por otro lado, en cualquier momento podremos saber los clientes que se encuentran conectados al servidor. Para ello tenemos que ejecutar este comando:

pivpn clients

Aumentar la seguridad

Si viajamos a determinados países (China, Irán, Irak, Rusia, Turquía, Emiratos Árabes Unidos...), los ISP o quien nos proporcione el servicio de Internet (hoteles, cafeterias, bibliotecas, etc.) pueden bloquear los servidores VPN. En el caso de los ISP, esto pueden hacerlo mediante DPI (inspeccion profunda de paquetes), que permite identificar el contenido de un flujo de datos protegido por VPN basándose en una serie de indicadores preestablecidos, pero el coste y la potencia del hardware necesario para ello es muy elevado, lo que puede producir retrasos en la conexión de los demás usuarios. Por eso, lo que suelen hacer con más frecuencia es filtrar los puertos de salida con un firewall en el momento de realizar el handshake (establecimiento de la conexion). El problema de WireGuard es que utiliza forzosamente el protocolo UDP, y el firewall sólo tendría que bloquear este protocolo para impedir su uso. El único puerto UDP que causaría graves problemas si se bloqueara es el 53, ya que se utiliza para las peticiones DNS. Así pues, en estos casos, una posible solucion sería montar el servidor con ese puerto (o bien con otro puerto UDP cualquiera, y en el router, al abrir los puertos, pondremos el 53 de entrada y lo redirigimos al que hayamos elegido en el server); luego, en los clientes, utilizaremos siempre el 53.




Servidor VPN OpenVPN

Recordemos, como dijimos antes, que una VPN (Virtual Private Network, Red Privada Virtual) es un sistema que nos permitirá conectarnos a la Raspberry Pi desde cualquier lugar de Internet de una manera segura, mediante una conexión cifrada, y tener acceso a toda nuestra red local igual que si estuviéramos en casa. De hecho, una VPN es como una extensión de nuestra red local, pero realizada a través de una red pública (Internet en este caso). Una vez conectados desde el exterior al servidor VPN, nuestro dispositivo pasará a formar parte de la red doméstica y usará el router de nuestra casa para movernos por Internet, siendo por ello el encargado de asignarnos la IP pública correspondiente. Además, cuando nos conectamos a la VPN, todo el tráfico entre el cliente y el servidor (es decir, los datos generados por cualquier servicio o aplicación que usemos) viajarán con un cifrado de alta seguridad, por lo que nadie podrá ver su contenido aunque estemos usando una wifi pública y haya algún hácker espiando el tráfico de datos que circula por ella.

Montar un servidor VPN mediante OpenVPN es mucho más seguro que hacerlo utilizando protocolos más antiguos, como PPTP, por ejemplo. Pero OpenVPN tiene el inconveniente de su complejidad a la hora de realizar su instalación y configuración. Sin embargo, podemos obviar este problema si recurrimos a PiVPN, un script que lleva a cabo todo el proceso de una forma simple y sencilla, lo que nos ahorra el trabajo de realizar manualmente, paso a paso, toda la compleja configuración del servidor.

Al contrario que otras placas, la Raspberry Pi no dispone de aceleración AES-NI por hardware para el cifrado/descifrado de datos, lo que implica que ha de hacerse por software y ello conlleva una ralentización de la velocidad de conexión cuando se usa el servidor VPN. Por eso es recomendable, durante la INSTALACIÓN (véase más adelante), escoger un nivel de cifrado que no sea demasiado alto. El que se nos ofrece por defecto proporciona un buen equilibro entre seguridad y velocidad.


Requisitos previos

Antes de comenzar con la instalación, tenemos que asegurarnos de haber hecho estas tres cosas:

  1. 1.) Instalar y configurar el Sistema Operativo. Necesitamos tener instalado un SO, como puede ser Raspberry Pi OS (preferiblemente, aunque se pueden usar también otros sistemas). Para los que no tengan experiencia previa con la Raspberry, en los primeros apartados del menú Sistema explicamos cómo hacer todo el proceso: instalar el SO, acceder por SSH a la RasPi y realizar una configuración básica de la misma.
  2. 2.) Asignarle a la Raspberry Pi una IP estática, tal y como se detalla en este apartado de nuestra web.
  3. 3.) Crear un DNS dinámico o nombre de dominio virtual para poder acceder al servidor VPN desde Internet, algo que podemos hacer de la forma que explicamos en este otro apartado.

Instalación

El proceso de instalación del servidor OpenVPN consistirá en realizar estos cuatro pasos:

  1. 1.) Instalar el servidor con PiVPN. Para ello ejecutaremos este script desde la línea de comandos:
    curl -L https://install.pivpn.io | bash
    Durante el proceso de ejecución se nos preguntarán algunas cosas:
  1. [a] Inicialmente el sistema hará ciertas comprobaciones, instalará algunos paquetes y veremos diversas ventanas con información que hemos de aceptar. Al final, en DHCP Reservation, mostrará la IP estática que hemos configurado previamente y el Gateway (seleccionamos Yes).
  2. [b] El usuario local que va a usarse para la configuración del servidor (lo seleccionamos y pulsamos Ok).
  3. [c] Tenemos la posibilidad de instalar WireGuard o bien OpenVPN (elegimos OpenVPN en este caso y pulsamos Ok).
  4. [d] A continuación se nos proponen varias opciones por defecto (como el protocolo UDP). Para aceptarlas, vamos a seleccionar No (pero si queremos modificarlas, elegiremos Yes).
  5. [e] Podremos elegir el puerto (1194 por defecto, aunque conviene cambiarlo). El puerto elegido tendremos que abrirlo en el router y redireccionarlo a la IP local de la Raspberry.
  6. [f] Escogemos luego un servidor de DNS concreto de la lista que se nos ofrece (Quad9, Level3, OpenDNS, Norton, CloudFlare, Google...).
  7. [g] Seguidamente debemos optar por la forma en que vamos acceder al servidor: mediante su IP pública o usando un nombre de dominio (elegimos DNS Entry).
  8. [h] Pondremos un nombre público para nuestro servidor, que será el DNS dinámico (el dominio de no-ip en nuestro caso) que creamos anteriormente en el paso 3 de los REQUISITOS PREVIOS.
  9. [i] Se nos preguntará si deseamos activar o no las actualizaciones automáticas (seleccionamos Yes).
  10. [j] Seremos informados sobre cómo añadir un nuevo usuario (pulsamos Ok) y, finalmente, se nos preguntará si deseamos reiniciar el sistema (contestamos Yes y en la siguiente ventana pulsamos en Ok para que se reinicie).

  1. 2.) Crear usuarios. Hecho lo anterior, entramos de nuevo por SSH y añadimos los usuarios que van a acceder al servidor VPN mediante el comando
    pivpn add
    que nos pedirá el nombre del usuario, cuántos días debe durar el certificado (1080 por defecto) y su correspondiente contraseña. De esta manera se generará la clave privada del usuario que acabamos de crear, que se guardará en la carpeta /home/piuser/ovpns y que consta de un fichero con la forma usuario.ovpn.

  1. 3.) Instalar los clientes en todos aquellos dispositivos (PCs, portátiles, smartphones o tabletas digitales) desde los que queramos acceder al servidor. Para el sistema Android podemos utilizar la app oficial. Para iOS también está disponible la la misma app oficial. En el caso de Linux podremos configurar el cliente como se indica aquí. Y en lo que respecta a Windows, el cliente lo podremos descargar desde este enlace y luego nos conectaremos según se explica en esta guía.

  1. 4.) Importar las claves. Una vez instalado el cliente en cada dispositivo, desde este tenemos que importar los distintos ficheros que contienen la clave privada de cada usuario (usuario.ovpn) que vamos a usar para realizar la conexión al servidor y que se encuentran, como vimos antes, en la carpeta /home/piuser/ovpns de la RasPi.

    Este proceso podemos hacerlo desde un ordenador con Linux conectándonos a la Raspberry y descargándonos los ficheros mediante el comando scp:
    scp -P xxxx piuser@192.168.1.33:/home/piuser/ovpns/* /home/usuario
    El argumento -P xxxx es para indicar el puerto en caso de que no usemos el estándar (22) en el servidor SSH de la Raspberry Pi. Si no es nuestro caso, entonces no hace falta escribirlo. Al final del comando, usuario será el que estemos usando en la máquina Linux.

    Pero si ya estamos en la RasPi y lo que deseamos es exportar los archivos a otra máquina Linux, lo haremos así:
    scp -P xxxx /home/piuser/ovpns/* usuario@192.168.x.xx:/home/usuario
    El argumento -P xxxx corresponderá ahora al puerto del servidor SSH de la máquina destino, en caso de que no use el estándar. En la última parte del comando podremos los datos concretos (usuario e IP local) también de la máquina destino.

    En cuanto a Windows, podemos recurrir a la aplicación WinSCP, un cliente SFTP/SCP que funciona a través del servidor SSH y que resulta muy práctico para transferir archivos a/desde la Raspberry, siendo además muy fácil de usar. Es similar a usar el comando scp de Linux, pero en modo gráfico.

    En el caso de los dispositivos móviles con Android o iOS, se puede utilizar una app de gestión de archivos (como esta para Android) y crear una conexión SFTP hacia la Raspberry.

    Otra posibilidad para transferir los archivos a cualquier dispositivo es hacerlo manualmente copiando los ficheros, por ejemplo, en un pendrive y de ahí pasarlos directamente al PC o, mediante un cable OTG, al smartphone o la tableta digital.

Hecho todo el proceso anterior, ya tenemos todo listo para empezar a utilizar el servidor OpenVPN que acabamos de instalar. Ahora bien, si más adelante, por algún motivo, deseamos desinstalarlo, escribiremos esto:

pivpn uninstall

Usuarios

Más arriba, en el apartado 2.), hemos visto cómo crear usuarios. En el caso de que queramos eliminar alguno de ellos, lo primero que debemos hacer es obtener un listado de los mismos, lo que conseguiremos con esta orden:

pivpn list

La eliminación se realiza mediante el siguiente comando, que lo que hace es revocar su certificado, lo que implica que dicho usuario ya no podrá volver a conectarse al servidor VPN:

pivpn revoke usuario

Si escribimos de nuevo pivpn list, veremos que el usuario no aparece ahora en la columna Status como válido, sino como revocado.

Por otro lado, en cualquier momento podremos saber los clientes que se encuentran conectados al servidor. Para ello tenemos que ejecutar este comando:

pivpn clients

Aumentar la seguridad

Si viajamos a determinados países (China, Irán, Irak, Rusia, Turquía, Emiratos Árabes Unidos...), los ISP o quien nos proporcione el servicio de Internet (hoteles, cafeterias, bibliotecas, etc.) pueden bloquear los servidores VPN. En el caso de los ISP, esto pueden hacerlo mediante DPI (inspeccion profunda de paquetes), que permite identificar el contenido de un flujo de datos protegido por VPN basándose en una serie de indicadores preestablecidos, pero el coste y la potencia del hardware necesario para ello es muy elevado, lo que puede producir retrasos en la conexión de los demás usuarios. Por eso, lo que suelen hacer con más frecuencia es filtrar los puertos de salida con un firewall en el momento de realizar el handshake (establecimiento de la conexion). Con OpenVPN podríamos eludir esto si, durante la instalación, en el apartado 1.)[d], modificamos las opciones por defecto y elegimos el protocolo TCP y el puerto 443. De esta manera, estaremos usando un puerto que no se debería bloquerar, ya que de hacerlo, se impediría la navegación web HTTPS a todos los clientes conectados a la red.




Servidor FTP con TLS

Un servidor FTP (File Transfer Protocol) es un servidor que funciona bajo un protocolo diseñado específicamente para la transferencia de ficheros. Por ello, si queremos compartir archivos desde fuera de la red local, es decir, desde Internet, es muy práctico disponer de un servidor FTP. En Linux podemos instalar varios de ellos. Nosotros vamos a usar ProFtpd debido a su gran flexibilidad para el manejo y configuración de las distintas carpetas que queramos poner a disposición de los demás.

Así pues, lo primero es instalar el servidor:

sudo apt install proftpd

Durante el proceso de instalacción puede que se nos pregunte qué tipo de servidor queremos instalar. Elegimos el tipo por defecto: independiente (standalone).


Carpetas compartidas

Acabado el proceso, creamos las carpetas en las que vamos a guardar los archivos. Para ello usaremos un disco duro USB que se encuentra conectado a la Raspberry y montado en la ruta /media/hdusb (si no lo tenemos instalado, aquí se explica cómo formatearlo y montarlo). En él vamos a crear una carpeta llamada ftp y dentro de ella crearemos varias subcarpetas: musica, elibros y fotos para compartir ficheros, y finalmente la carpeta recibidos para que los usuarios puedan enviar sus propios ficheros al servidor. Lo haremos así:

cd /media/hdusb                         [directorio de montaje del HD]
sudo mkdir ftp
cd ftp
sudo mkdir musica
sudo mkdir elibros
sudo mkdir fotos
sudo mkdir recibidos
sudo chmod 777 recibidos

Si hemos realizado correctamente los pasos anteriores, debemos de tener ya creadas cuatro subcarpetas:

/media/hdusb/ftp/musica
/media/hdusb/ftp/elibros
/media/hdusb/ftp/fotos
/media/hdusb/ftp/recibidos

En las tres primeras copiaremos todos los ficheros y carpetas que deseemos compartir; la última (recibidos) la dejaremos vacía para que los usuarios nos envíen a nosotros sus ficheros.


Usuario de acceso

Para acceder al servidor vamos a crear un usuario específico:

sudo adduser ftpuser

Recordemos anotar su contraseña para no olvidarla.

Luego editamos el fichero donde se guardan los usuarios del sistema:

sudo nano /etc/passwd

Al final del mismo, localizamos al usuario que acabamos de crear y hacemos dos cosas: cambiamos el directorio /home/ftpuser por el directorio donde guardaremos el contenido que vamos a compartir (/media/hdusb/ftp) y luego cambiamos el intérprete de comandos /bin/bash por /bin/false, de modo que quede así:

ftpuser:x:1001:1001:,,,:/media/hdusb/ftp:/bin/false

A continuación, y convirtiéndonos antes en administrador, incluimos dicho intérprete de comandos falso en el fichero /etc/shells:

sudo su
echo "/bin/false" >> /etc/shells
exit

Hecho esto, el nuevo usuario sólo podrá entrar por FTP, pero no por SSH. De todas formas, para una mayor seguridad, podemos editar el fichero

sudo nano /etc/ssh/sshd_config

e incluir esta línea para denegar explícitamente su acceso:

DenyUsers ftpuser

Y reiniciamos el servicio:

sudo service ssh restart

Configurar el servidor

Necesitamos configurar adecuadamente nuestro server. Lo haremos modificando el fichero que se encuentra en la ruta /etc/proftpd/proftpd.conf. Pero antes vamos a hacer una copia de seguridad de dicho fichero por si cometemos algún error grave y tenemos que volver a él:

sudo cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.original

Tomada esta medida preventiva, ya podemos proceder a configurar el servidor editando el fichero proftpd.conf:

cd /etc/proftpd
sudo nano proftpd.conf

Empezaremos, opcionalmente, por darle un nombre e identificar nuestros servidor:

ServerName "Personal FTP Server"
ServerIdent on "Uroboros FTP personal server"

Como medida de seguridad, comprobaremos que esté presente la siguiente línea, que hace que el usuario de acceso al servidor quede enjaulado en su carpeta /home, que cambiamos antes por la que contiene el árbol de directorios del servidor (/media/hdusb/ftp):

# Use this to jail all users in their homes
DefaultRoot    ~

Además, impediremos que se pueda acceder al servidor como root:

RootLogin                               off

Si estamos usando un cortafuegos, modificaremos la línea PassivePorts, que se refiere al rango de puertos pasivos que usará el servidor. La descomentamos, quitándole la almohadilla (#), y ponemos el rango que creamos adecuado; por ejemplo este:

PassivePorts                           25000 30000

Vamos a añadir también algunas líneas para configurar las descargas y las subidas:

# No permitir que los ficheros subidos sean sobrescritos
AllowOverwrite                       off
# Permitir continuar descargas/downloads interrumpidas
AllowRetrieveRestart               on
# No permitir continuar las subidas/uploads interrumpidas
AllowStoreRestart                   off
# Borrar las subidas/uploads abortadas
DeleteAbortedStores               on

Controlaremos la cantidad de usuarios que se pueden conectar simultáneamente, para lo que se incluirán las siguientes líneas:

# Número de usuarios permitidos en el servidor
MaxClients                              6 "Máximo %M usuarios conectados."
MaxClientsPerHost                  3 "Sólo se admiten 3 conexiones por Host/IP."
MaxClientsPerUser                  3 "Sólo se admiten 3 conexiones por usuario."

También configuraremos el tamaño máximo de los archivos de descarga/subida, poniendo limitaciones al usuario ftpuser y sin ninguna limitación para el resto:

# Limitaciones de los archivos de descarga y subida
MaxRetrieveFileSize                 100 Gb user ftpuser
MaxRetrieveFileSize                 *
MaxStoreFileSize                     50 Gb user ftpuser
MaxStoreFileSize                     *

O cuántos intentos de inicio de sesión vamos a permitir:

# Intentos de inicio de sesión permitidos
MaxLoginAttempts                 3

Al final del archivo añadimos esta directiva, que definirá los permisos que otorgaremos a las carpetas de descargas (los usuarios podrán descargar de ellas, pero no podrán modificar, borrar o enviar ficheros/carpetas):

<Directory /media/hdusb/ftp>
   <Limit WRITE>
	 DenyAll
   </Limit>
   <Limit READ>   
	 AllowAll	  
   </Limit>		  
</Directory>  

Mediante esta otra directiva configuraremos la subcarpeta recibidos, en la que se almacenará todo lo que los usuarios envíen al servidor, y para ello definiremos los permisos apropiados sobre la misma (se podrán enviar ficheros/carpetas, pero no se podrá descargar de ella):

<Directory /media/hdusb/ftp/recibidos>
   <Limit READ WRITE>
	 DenyAll
   </Limit>
   <Limit STOR MKD>   
	 AllowAll	  
   </Limit>		  
</Directory>  

Ahora vamos a indica qué usuarios (de todos los que tengamos activos en el sistema) permitiremos que accedan al servidor:

<Limit LOGIN>
     AllowUser ftpuser		[Tendrá acceso a /media/hdusb/ftp]
     AllowUser piuser		[Tendrá acceso a /home/piuser]
     DenyAll			[Nadie más podrá acceder al servidor]
</Limit>

Por último, denegaremos el uso de chmod para el cambio de permisos:

<Limit SITE_CHMOD>
     DenyAll
</Limit>

Y ya podemos guardar el fichero de configuración y comprobar que no hay errores en el mismo:

sudo proftpd -t

Puesta en marcha

Reiniciamos el servidor FTP y comprobamos que esté activo:

sudo service proftpd restart
sudo systemctl status proftpd.service

Recordemos que es necesario abrir los puertos pasivos indicados antes (del 25000 al 30000) y los puertos 20 y 21 en el router, redireccionándolos a la IP local de la Raspberry para permitir el acceso desde Internet. Si tenemos instalado un cortafuegos, también debemos abrirlos en él.

Una vez que el servidor esté en funcionamiento, podemos obtener información sobre los usuarios conectados al mismo utilizando alguno de estos comandos:

ftpwho
ftptop                       [Salimos pulsando Ctrl+c]

Y si deseamos ver el tráfico generado, podemos echar un vistazo de vez en cuando al contenidso de los ficheros de log:

sudo cat /var/log/proftpd/proftpd.log             [Accesos al servidor]
sudo cat /var/log/proftpd/xferlog                    [Transferencias realizadas]

Conexión segura sobre TLS

Tal y como está configurado el servidor FTP, los datos que se intercambian entre el este y el cliente viajan en "claro", es decir, sin cifrar, por lo que alguien que esté en la misma red (una wifi pública, por ejemplo) puede capturar con un sniffer (como el famoso Wireshark) los datos enviados y las credenciales de conexión. Para evitar esto, dotaremos a nuestro servidor de un sistema de cifrado, para lo cual vamos a usar el protocolo de seguridad TLS (Transport Layer Security) creando un certificado autogenerado por nosotros mismos.

En primer lugar, si no lo está ya, instalaremos openssl:

sudo apt install openssl

Creamos el directorio donde guardar las claves del certificado:

sudo mkdir /etc/proftpd/ssl

Luego generamos el certificado:

sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/proftpd/ssl/proftpd.key -out /etc/proftpd/ssl/proftpd.crt -nodes -days 1095

Se nos pedirá que escribamos una serie de datos: país (con dos letras; por ejemplo, ES), región, ciudad, organización, departamento, nombre y email. Podemos poner los datos que creamos oportunos o incluso dejar algunos en blanco (sólo hemos de pulsar Intro).

Una vez creadas las claves pública y privada, cambiamos sus permisos:

sudo chmod 600 /etc/proftpd/ssl/proftpd.crt
sudo chmod 600 /etc/proftpd/ssl/proftpd.key

Ahora, para utilizarlas en nuestro servidor, editaremos el fichero de configuración del mismo:

sudo nano /etc/proftpd/proftpd.conf

y descomentamos esta línea:

Include /etc/proftpd/tls.conf

A continuación editamos el fichero al que acabamos de hacer referencia:

sudo nano /etc/proftpd/tls.conf

Borramos todo su contenido y añadimos sólo lo siguiente:

<IfModule mod_tls.c>  
   TLSEngine                  on
   TLSLog                     /var/log/proftpd/tls.log 
   TLSProtocol                SSLv23  
   TLSOptions                 NoSessionReuseRequired  
   TLSRSACertificateFile      /etc/proftpd/ssl/proftpd.crt  
   TLSRSACertificateKeyFile   /etc/proftpd/ssl/proftpd.key  
   TLSVerifyClient            off  
   TLSRequired                on  
</IfModule>

Reiniciamos el servidor y comprobamos que está activo:

sudo service proftpd restart
sudo systemctl status proftpd.service

Desde otro PC, tendremos que usar un cliente FTP (como FileZilla, por ejemplo) y escribir los datos para conectar con el servidor:

Al realizar la conexión, debería de aparecer el certificado que creamos antes. Cuando lo haga, pulsamos en Aceptar y ya podemos estar seguros de que disponemos de cifrado TLS en nuestro servidor FTP.

Si queremos que se guarde la conexión, la creamos desde el menú Archivo -- Gestor de sitos. Pinchamos en Nuevo sitio y a la derecha ponemos los datos correspondientes, sin olvidarnos de seleccionar Requiere FTP explícito sobre TLS en el apartado Cifrado:


No se muestra el certificado

Es posible que, una vez hecho lo anterior, no se cargue el certificado y se nos avise de que la conexión no estará cifrada. Además, en la parte superior del cliente, donde se muestra la información relativa a la conexión, aparecen mensajes de error ("500 No entiendo AUTH", por ejemplo). Si es nuestro caso, haremos lo siguiente para solucionar el problema.

En primer lugar instalamos este paquete:

sudo apt install proftpd-mod-crypto

A continuación editaremos el siguiente fichero:

sudo nano /etc/proftpd/modules.conf

y descomentamos la línea relativa al módulo tls:

LoadModule mod_tls.c

Finalmente reiniciamos el servicio y comprobamos que está activo y sin errores:

sudo systemctl restart proftpd
sudo systemctl status proftpd.service

Probamos a conectarmos de nuevo por medio del cliente y ahora ya debería de aparecer el certificado.




Samba

Samba es un servicio libre que implementa el protocolo de archivos compartidos de Microsoft Windows, llamado SMB o CIFS en los sistemas UNIX/Linux. Este protocolo nos va a permitir compartir archivos y carpetas con los demás ordenadores de nuestra red.

Vamos, pues, a instalar el servidor y a crear una carpeta en la Raspberry para poner en ella todo aquello que queramos compartir con cualquiera de los demás ordenadores de nuestra red local, de manera que estos puedan acceder a dichos recursos compartidos.

Primero instalamos Samba:

sudo apt install samba samba-common-bin

A continuación añadimos los usuarios, que deben de estar previamente creados en el SO. Dado que al instalar este, ya creamos un usuario, lo añadimos a Samba (cambiando piuser por el nombre del usuario que estemos usando en la Raspberry):

sudo smbpasswd -a piuser

Nos pedirá una contraseña. Escribimos la misma que tenemos ya establecida en el sistema para dicho usuario (aunque podemos poner otra distinta).

Si tenemos más usuarios creados en el sistema operativo, podríamos añadirlos también de la misma forma que lo hemos hecho con el anterior.


Compartir una carpeta pública

Suponiendo que tenemos un disco duro conectado a la Raspberry, vamos a crear en él una carpeta para compartirla y hacerla pública, de manera que cualquiera pueda acceder a ella sin tener que escribir un nombre de usuario y una contraseña. Para ello, nos desplazamos a donde tenemos montado el disco, creamos la carpeta y le damos todos los permisos:

cd /media/hdusb
sudo mkdir musica
sudo chmod 777 musica

Ahora editamos el fichero de configuración de Samba para añadir la carpeta:

sudo nano /etc/samba/smb.conf

Nos desplazamos al final del mismo y escribimos estas líneas:

[musica]
comment = carpeta pública para compartir música
path = /media/hdusb/musica
browseable = yes
read only = no
writeable = yes
guest ok = yes
public = yes
force user = nobody
create mask = 0777
directory mask = 0777

Al comienzo ponemos entre corchetes un nombre para identificar la carpeta que queremos compartir ([musica]), luego añadimos un comentario descriptivo de la misma (comment) e indicamos su ruta exacta (path). Como se puede observar, los usuarios que accedan a la carpeta lo harán como nobody, que es una especie de usuario anónimo, que tendrá permiso para hacer cualquier modificación en ella (read only = no, writeable = yes). Para ello es neceario, además, otorgar todos los permisos para la creación de archivos y directorios (0777), tal y como se indica en las dos últimas líneas.


Compartir una carpeta privada

Pero también podemos hacer que la carpeta sea privada y que sólo el/los usuario/s autorizados accedan a la misma. Para ello tendríamos que configurarla de la siguiente forma (cambiando piuser por el nombre del usuario que estemos usando en nuestro sistema):

[musica]
comment = carpeta privada para compartir música
path = /media/hdusb/musica
browseable = yes
read only = no
writeable = yes
guest ok = no
public = no
valid users = piuser
admin users = piuser
create mask = 0644
directory mask = 0755

Como se observa, sólo se admite el acceso del usuario piuser, aunque podríamos añadir más usuarios (separados por comas o espacios). A este usuario se le conceden permisos tanto de lectura como de escritura (read only = no, writeable = yes). En este caso, create mask y directory mask se refieren a los permisos para la creación de nuevos ficheros y carpetas, respectivamente, desde Samba. Para que los permisos de escritura sobre el recurso compartido sean efectivos, deben coincidir con los permisos que posee la carpeta en el sistema de ficheros de Raspberry Pi OS. De no ser así, se aplicarán los permisos más restrictivos.

Ya sólo queda guardar el archivo de configuración y reiniciar el servidor:

sudo service smbd restart

Ahora la carpeta estará compartida y podremos usarla para intercambiar ficheros con otros ordenadores de nuestra red. Podemos comprobarlo accediendo a la carpeta mediante la IP local de la Raspberry. En el Explorador de Archivos de Windows, la RasPi aparecerá en la sección de Red; además podemos crear un acceso directo para Agregar una ubicación de red y también podremos acceder escribiendo directamente su IP en la barra superior, así:

\\192.168.1.33

Si la carpeta es privada, para tener acceso a la misma debemos escribir previamente el nombre de usuario y la contraeña que definimos al principio, después de instalar Samba.


Compartir un disco

En el caso de que quisiéramos compartir todo el contenido del disco duro (no sólo una carpeta), incluiríamos los mismos parámetros que en los ejemplos anteriores, sólo que en este caso tendríamos que cambiar la identificacióin de la carpeta por otro nombre más apropiado que nos sirva de referencia para saber que se trata de un disco ([hdusb] por ejemplo), el correspondiente comentario para describir su uso (comment) y la ruta donde se encuentra montado el disco (path):

[hdusb]
comment = carpeta para compartir el disco duro
path = /media/hdusb
. . . . . .
. . . . . .

Evitar compartir la carpeta de usuario

Normalmente, cuando instalamos el servidor Samba se comparte por defecto la carpeta de los usuarios (/home/piuser en nuestro caso). Si queremos evitar esto, tenemos que hacer algunos cambios en el fichero de configuración:

sudo nano /etc/samba/smb.conf

Buscamos con Ctrl+w la línea [homes] y comentamos (con ; o con #) a partir de aquí todos los valores referentes al directorio home de los usuarios:

#[homes]
#     comment = Home Directories
#     browseable = no
. . . . . .
#     read only = yes
. . . . . .
#     create mask = 0700
. . . . . .
#     directory mask = 0700
. . . . . .
#     valid users = %S

Ahora tendremos que reiniciar el servidor para que los cambios surtan efecto:

sudo service smbd restart

Añadir una papelera

Una interesante utilidad que podemos añadir a Samba es una papelera, lo que nos permitirá recuperar archivos o carpetas que hayamos borrado previamente, ya sea de forma voluntaria o accidental. Tomando el mismo ejemplo que hemos usado antes para crear una carpeta privada, bastará con añadir cuatro líneas al final (las escritas en negrita) para crear la papelera, de modo que quedará así:

[musica]
comment = carpeta para guardar música
path = /media/hdusb/musica
browseable = yes
read only = no
writeable = yes
guest ok = no
public = no
valid users = piuser
admin users = piuser
create mask = 0644
directory mask = 0755
vfs object = recycle
recycle:repository = papelera
recycle:keeptree = true
recycle:versions = true

Como es habitual, tendremos que reiniciar de nuevo el servicio para que los cambios surtan efecto:

sudo service smbd restart

AVISO: Es posible que la carpeta que contiene la papelera no se cree hasta que borremos algún elemento por primera vez.




DLNA

Según la Wikipedia, "DLNA (Digital Living Network Alliance o Alianza para el estilo de vida digital en red, en español) es una asociación de fabricantes de electrónica e informática sin ánimo de lucro fundada por Sony en junio de 2003. Su objetivo es definir directrices de interoperabilidad que permitan compartir medios digitales entre dispositivos de consumo como ordenadores, impresoras, cámaras, teléfono móviles y otros dispositivos multimedia."

Se trata, pues, de crear un sistema para transmitir contenido multimedia (vídeos, películas, música o fotos) a través de la red y que pueda ser reproducido en dispositivos como PCs, smart TV, videoconsolas, tabletas digitales o smartphones.

Como es obvio, lo primero que haremos es instalar el servidor DLNA en nuestra Raspberry. Debido a su escaso consumo de recursos, vamos a elegir para ello el servidor miniDLNA:

sudo apt install minidlna

Una vez instalado, debemos proceder a la configuración del servidor:

sudo nano /etc/minidlna.conf

En el fichero de configuración buscamos la línea en la que se indica dónde se encuentran ubicados nuestros archivos multimedia. Será una línea similar a esta:

media_dir=/var/lib/minidlna

Naturalmente, deberemos cambiarla por el directorio (o directorios, si son varios) donde cada uno tenga guardados sus archivos. En nuestro caso, tenemos un disco duro USB y un pendrive conectados a dos de los puertos USB de la RasPi, con sendas carpetas que incluyen, respectivamente, películas y música, por lo que nos quedaría así:

media_dir=V,/media/hdusb/peliculas
media_dir=A,/media/pen/musica

La V de la primera línea significa vídeo y la A de la segunda, audio. Y es que la configuración admite filtros de indexación de contenidos: A para audio, V para vídeo y P para fotos. Si no indicamos nada, se indexará todo.

Ahora le daremos un nombre al servidor, para que cuando accedamos a él desde otro dispositivo nos sea fácil de encontrar. Para ello bajamos unas líneas hasta que localizamos la siguiente:

#friendly_name=

Descomentamos la línea quitándole la almohadilla (#) y añadimos el nombre que queramos darle a nuestro servidor DLNA:

friendly_name=RPi DLNA Server

Ahora, un poco más abajo, le decimos que automáticamente vaya añadiendo el nuevo contenido que metamos en las carpetas indicadas antes, para lo que descomentamos también estas dos líneas, poniendo en la segunda el intervalo de tiempo (en segundos):

inotify=yes
notify_interval=600

Guardamos el fichero (Ctrl+o, Intro, Ctrl+x) y ya tenemos el servidor listo para funcionar, así que lo arrancamos:

sudo service minidlna start

La indexación de contenidos hemos de hacerla manualmente mediante este comando:

sudo service minidlna force-reload

Como es habitual en cualquier servicio, el servidor DLNA admite distintos parámetros: podemos detenerlo (stop), iniciarlo (start), conocer su estado (status) o reiniciarlo después de haber hecho alguna modificación en la configuración (restart):

sudo service minidlna parámetro

Podremos ver el número y el tipo de archivos que tenemos indexados, así como los clientes conectados, accediendo mediante un navegador a la IP local de la Raspberry seguida del puerto:

192.168.1.33:8200

Es posible utilizar una gran cantidad de clientes para acceder al servidor DLNA que acabamos de instalar en nuestra Raspberry Pi. En Windows podríamos usar Windows Media Center o el propio Reproductor multimedia del sistema; en el caso de Android, DLNA Player o bien MediaHouse UPnP / DLNA Browser, por poner un par de ejemplos. Y si tenemos una Smart TV también podremos acceder desde ella a los contenidos del servidor.

Finalmente, no hay que olvidar abrir el puerto 8200/TCP si estamos usando un cortafuegos.




Pi-hole

Pi-hole es un sistema para convertir la Raspberry Pi en un servidor de DNS caché capaz de filtrar y bloquear la publicidad a nivel de red. Una vez instalado y configurado, sólo tendremos que poner la IP local de la RasPi como servidor de DNS en el router o bien ponerla manualmente en cada dispositivo de nuestra red local. Las peticiones DNS pasarán entonces por la Raspberry y esta actuará como un filtro antipublicidad, al estilo de las extensiones "adblock" de los navegadores, pero con varias ventajas añadidas sobre estos:

  1. 1ª) Servirá para todos los dispositivos que tengamos conectados a nuestra LAN, sin necesidad de instalar nada extra en ellos.
  2. 2ª) Las webs que visitemos no serán capaces de detectar que estamos bloqueando su publicidad.
  3. 3ª) También sirve para detener algunos intentos de instalar malware que realizan ciertas webs maliciosas.
  4. 4ª) Ofrece la posiblidad de bloquear aquellas páginas web que no queramos que visiten nuestros hijos o la gente que esté conectada a nuestra red local.
  5. 5ª) Incluso bloquea la publicidad de las apps gratuitas que tengamos instaladas en el smartphone o la tableta digital.


Requisitos previos

Antes de instalar Pi-hole tenemos que cumplir estos dos requisitos:

  1. 1.) Instalar y configurar el Sistema Operativo. Necesitamos tener instalado un SO, como puede ser Raspberry Pi OS (preferiblemente, aunque se pueden usar también otros sistemas). Para los que no tengan experiencia previa con la RasPi, en los primeros apartados del menú Sistema explicamos cómo hacer todo el proceso: instalar el SO, acceder por SSH a la Raspberry y realizar una configuración básica del sistema.
  2. 2.) Asignarle a la Raspberry Pi una IP estática, tal y como se detalla en este apartado de nuestra web.

Instalación

El proceso de instalación y configuración consta de dos pasos:

  1. 1.) Instalar Pi-hole. En el caso de que usemos la Raspberry Pi 2/3/4 ejecutaremos este script desde la línea de comandos:
    curl -sSL https://install.pi-hole.net | bash
    Si en lugar de una Raspberry 2/3/4 estamos usando un modelo más antiguo (la versión 1 ó 1+), entonces modificamos ligeramente el comando anterior:
    curl -L https://install.pi-hole.net | bash
  1. [a] Inicialmente se harán ciertas comprobaciones y se instalarán varios paquetes. Después simplemente se nos informará de algunos detalles, con lo que basta con Aceptar y después se nos avisará de que debemos tener configurada una IP estática. Pulsamos en Continuar.
  2. [b] En caso de que tengamos varias interfaces de red, lo primero que se nos preguntará es la interfaz que deseamos usar (por defecto será eth0).
  3. [c] Si queremos usar la IP estática previamente configurada y el Gateway (indicamos Yes).
  4. [d] El servidor de DNS que prefiramos (Google, OpenDNS, Comodo, Quad9, CloudFlare...). Lo elegimos y pulsamos Aceptar.
  5. [e] Si queremos instalar una lista de bloqueo que ya se incluye por defecto (pulsamos en ).
  6. [f] También si deseamos instalar la interfaz de administración web (de nuevo pulsamos en ).
  7. [g] O si se instala el servidor web lighttpd y los módulos PHP (elegimos ).
  8. [h] Si queremos activar el fichero log de peticiones (una vez más se recomienda ).
  9. [i] Finalmente, el modo de privacidad para FTL (0 Show everything y luego Continuar).
  10. [j] Comenzará la instalación de los paquetes, y tras ello, se nos indicarán las IPs (IPv4/IPv6) que debemos usar en nuestros dispositivos como servidor DNS y también la contraseña de acceso a la interfaz web de administración.

  1. Posible error de FTL. Puede que al final de la instalación nos dé un error relativo al motor de FTL y no aparezca la ventana con la contraseña de acceso (lo que indicaría que Pi-hole no se ha instalado correctamente):
    [i] Checking for existing FTL binary...  
    [x] Downloading and Instaling FTL 
    Error: Unable to get latest release location from GitHub 
    [x] FTL Engine not installed 
    
    Para solucionar esto hay que desinstalar (pihole uninstall), reiniciar la Raspberry e instalar de nuevo. Pero si no funciona el comando de desinstalación, entonces simplemente reiniciamos el sistema y reinstalamos nuevamente. Esto debería de solucionar el problema.

    Si a pesar de todo el error persiste, entonces es muy probable que el fallo se deba a que la instalación de Pi-hole ha desconfigurado el servidor de DNS. En este caso habrá que editar el fichero
    sudo nano /etc/dhcpcd.conf
    y, al final del mismo, poner un servidor de DNS válido; por ejemplo:
    static domain_name_servers=8.8.8.8
    Y ya podremos proceder con la reinstalación.

  1. 2.) Usar Pi-hole como servidor DNS predeterminado, lo que podremos hacer, como dijimos al principio, de dos maneras: o bien poniendo la IP de la Raspberry Pi como servidor de DNS en el router (en lugar de las DNS que suele traer por defecto, que serán las de nuestro ISP) o bien poner dicha IP manualmente como servidor DNS en cada uno de los dispositivos conectados a nuestra red local (PCs, portátiles, Smart TV, smartphones, tabletas digitales...).

Interfaz web y contraseña

Para comprobar que el sistema está en marcha, accederemos a la interfaz web de administración escribiendo la dirección IP local de la Raspberry en el navegador de cualquier dispositivo conectado a nuestra LAN:

192.168.1.33/admin

Aquí podremos iniciar sesión escribiendo la contraseña que creamos al final del paso 1.) y tener acceso a un menú con las distintas posibilidades que nos ofrece Pi-hole:

Para cambiar la contraseña de inicio de sesión de la interfaz web usaremos este comando desde la terminal:

pihole -a -p contraseña

Pi-hole y el cortafuegos ufw

Si estamos usando el cortafuegos ufw, debemos abrir los siguientes puertos: el puerto 53 TCP/UDP, para que dnsmasq resuelva las peticiones DNS, y el puerto 80 TCP para poder acceder a la interfaz web mediante lighttpd:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 80/tcp

Puede darse el caso de que el cortafuegos no se active en los sucesivos arranques o reinicios de la Raspberry, en cuyo caso será necesario ejecutar este comando para solucionar el problema:

sudo systemctl disable netfilter-persistent

Actualizar, desinstalar, reinstalar

Cuando exista una nueva versión de Pi-hole, nos será posible actualizar, también desde la terminal, mediante la siguiente orden:

pihole -up

Y si por algún motivo tenemos la necesidad de desinstalar, usaremos este comando:

pihole uninstall

Durante la desinstalación, cuando se nos pregunte "Do you wish to go through each dependency for removal?... [Y/n]", contestaremos negativamente (n) y una vez acabado el proceso, reiniciamos el sistema.

Si tras la desinstalacción queremos volver a reinstalar, sólo tenemos que ejecutar de nuevo el script que indicamos al principio:

curl -sSL https://install.pi-hole.net | bash



OpenVPN + Pi-hole

Más arriba hemos visto cómo instalar cada uno de estos dos servidores. Usándolos por separado, de forma individual, ambos funcionan correctamente. Pero si deseamos utilizarlos a la vez, tendremos que hacer algunas modificaciones en su configuración. En caso contrario, nos toparemos con el problema de que Pi-hole no hace su trabajo de bloquear la publicidad cuando nos conectemos a nuestra red local a través de OpenVPN. Para que todo funcione como debe, tendremos que realizar algunos cambios.


1.- Instalar OpenVPN y conocer su IP

Instalamos OpenVPN y, una vez terminado el proceso, averiguamos su dirección IP:

ip a show dev tun0

Esto nos devolverá una serie de líneas, una de las cuales será similar a esta:

inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0

En ella vemos que la dirección IP del servidor VPN es 10.8.0.1


2.- Instalar Pi-hole

En el apartado anterior ya vimos cómo instalar Pi-hole. Una vez finalizado el proceso de instalación, pasamos a la siguiente etapa, que es la que nos permitirá usar ambos servicios conjuntamente, de manera que cada uno haga correctamente su función.


3.- Modificar la configuración de OpenVPN

Hemos de cambiar el servidor de DNS definido en el archivo de configuración de OpenVPN. Necesitamos modificarlo para que haga referencia a la subred que éste utiliza por defecto. Lo haremos editando el siguiente fichero:

sudo nano /etc/openvpn/server.conf

En él modificamos las dos líneas que se muestran a continuación: en la primera sustituimos la IP existente por la IP de la interfaz tun0 que averiguamos más arriba; la segunda la comentamos (ponemos el carácter # al comienzo), de forma que ambas queden así:

push "dhcp-option DNS 10.8.0.1"
#push "dhcp-option DNS 8.8.4.4"

4.- Modificar la configuración de Pi-hole

Ahora debemos establecer la interfaz tun0 del servidor VPN como la interfaz de Pi-hole. Para ello editamos este archivo:

sudo nano /etc/pihole/setupVars.conf

y modificamos la línea existente para que haga referencia a dicha interfaz:

PIHOLE_INTERFACE=tun0

A continuación creamos un nuevo archivo:

sudo nano /etc/dnsmasq.d/02-ovpn.conf

e incluimos en él las dos interfaces de red:

interface=eth0
interface=tun0

Finalmente entramos en la interfaz web de Pi-hole. En el menú de la izquierda, hacemos clic en Settings - pestaña DNS - Interface settings y comprobamos que estén marcadas las peticions de red local (Allow only local requests), que es la configuración recomendada, tal y como se muestra en esta imagen:

No debemos olvidar guardar los cambios pulsando en el botón Save que se encuentra en la parte inferior derecha.


5.- Configurar el cortafuegos ufw

Si estamos usando el cortafuegos ufw, al instalar OpenVPN + Pi-hole necesitaremos modificar algunas cosas para que el sistema funcione correctamente. Primero debemos permitir que el servidor redirija tráfico. Esto es esencial para la funcionalidad que queremos que nuestro servidor VPN proporcione. Podemos ajustar esta configuración modificando el siguiente archivo:

sudo nano /etc/sysctl.conf

Entonces buscamos una línea como la que se muestra a continuación y, en caso de que la tenga puesta, le quitamos la almohadilla (#), de manera que quede así:

net.ipv4.ip_forward=1

Y ahora, para leer el archivo y ajustar los valores de la sesión actual, escribimos:

sudo sysctl -p

También modificaremos el archivo de reglas del cortafuegos para configurar el enmascaramiento, un concepto de iptables que proporciona NAT dinámico para enrutar correctamente las conexiones de los clientes.

Pero antes de abrir el archivo de configuración del firewall para agregar enmascaramiento, necesitamos encontrar la interfaz de red pública de nuestra máquina. Para ello, escribimos:

ip route | grep default

Lo que nos devolverá lo siguiente:

default via 192.168.1.1 dev eth0 src 192.168.1.33 metric 320

La interfaz pública es la que aparece después de la palabra dev. En nuestro caso es eth0.

Una vez sepamos el nombre de la interfaz, abrimos el siguiente archivo:

sudo nano /etc/ufw/before.rules

Este archivo controla la configuración que se debe establecer antes de que se carguen las reglas convencionales de ufw. En él incluiremos la parte que a continuación destacamos en negrita:

#
# rules.before
#
# Rules that should be run before the ufw command line added rules.
# Custom rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] 
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errors
*filter
........

Una vez guardado el archivo, tenemos que decirle a ufw que permita también los paquetes enviados por defecto. Para ello abriremos este otro archivo:

sudo nano /etc/default/ufw

En él buscamos la directiva DEFAULT_FORWARD_POLICY y cambiamos el valor DROP por ACCEPT, de manera que quede así:

DEFAULT_FORWARD_POLICY="ACCEPT"

Guardamos los cambios y abrimos el puerto del servidor OpenVPN, el que indicamos más arriba en el punto 1.) [e] de la instalación del mismo:

sudo ufw allow 1194/udp

Por supuesto, también tendremos que abrirlo en el router.

Además debemos abrir (pero en este caso solamente en el cortafuegos, NO en el router) los dos puertos relativos a Pi-hole: el puerto 53 TCP/UDP, para que dnsmasq resuelva las peticiones DNS, y el puerto 80 TCP para poder acceder a la interfaz web mediante lighttpd:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 80/tcp

Es necesario deshabilitar y volver a habilitar ufw para que surtan efecto los cambios que hemos realizado en los archivos anteriores:

sudo ufw disable
sudo ufw enable

Puede darse el caso de que el cortafuegos no se active en los sucesivos arranques o reinicios de la Raspberry, en cuyo caso será necesario ejecutar este comando para solucionar el problema:

sudo systemctl disable netfilter-persistent

Hecho todo lo anterior, sólo nos queda reiniciar la Raspberry Pi y ya tendremos nuestro servidor OpenVPN funcionando correctamente junto a Pi-hole:

sudo reboot

Podemos comprobarlo si visitamos esta web de prueba, cuyo resultado debería ser este:




WireGuard + Pi-hole

Más arriba hemos visto cómo instalar cada uno de estos dos servidores. Usándolos por separado, de forma individual, ambos funcionan correctamente. Pero si deseamos utilizarlos a la vez, tendremos que hacer algunas modificaciones en su configuración. En caso contrario, nos toparemos con el problema de que Pi-hole no hace su trabajo de bloquear la publicidad cuando nos conectemos a nuestra red local a través de WireGuard. Para que todo funcione como debe, tendremos que realizar algunos cambios.


1.- Instalar WireGuard y Pi-hole

Primero instalamos WireGuard y luego hacemos lo propio con Pi-hole. Una vez finalizado el proceso de instalación, pasamos a la siguiente etapa, que es la que nos permitirá usar ambos servicios conjuntamente, de manera que cada uno realice su función de forma correcta.


2.- Modificar la configuración de WireGuard en los clientes

En los dispositivos en los que vayamos a usar el cliente WireGuard + Pi-hole (normalmente, tableta o smartphone), una vez importado el fichero de cada usuario, tendremos puestas las DNS que elegimos durante la instalación (paso 1, apartado [d]), por lo que será necesario cambiarlas manualmente: vamos al cliente y en el apartado Interfaz -- Servidores DNS cambiamos las DNS que aparecen por la IP local de la Raspberry (192.168.1.33).


3.- Modificar la configuración de Pi-hole

Tenemos que establecer la interfaz wg0 del servidor VPN como la interfaz de Pi-hole. Para ello editamos este archivo:

sudo nano /etc/pihole/setupVars.conf

y modificamos la línea existente para que haga referencia a dicha interfaz:

PIHOLE_INTERFACE=wg0

A continuación creamos un nuevo archivo:

sudo nano /etc/dnsmasq.d/02-ovpn.conf

e incluimos en él las dos interfaces de red:

interface=eth0
interface=wg0

Finalmente entramos en la interfaz web de Pi-hole. En el menú de la izquierda, hacemos clic en Settings - pestaña DNS - Interface settings y comprobamos que estén marcadas las peticions de red local (Allow only local requests), que es la configuración recomendada, tal y como se muestra en esta imagen:

No debemos olvidar guardar los cambios pulsando en el botón Save que se encuentra en la parte inferior derecha.


4.- Configurar el cortafuegos ufw

Si estamos usando el cortafuegos ufw, al instalar WireGuard + Pi-hole necesitaremos modificar algunas cosas para que el sistema funcione correctamente. Primero debemos permitir que el servidor redirija tráfico. Esto es esencial para la funcionalidad que queremos que nuestro servidor VPN proporcione. Podemos ajustar esta configuración modificando el siguiente archivo:

sudo nano /etc/sysctl.conf

Entonces buscamos la línea que se muestra a continuación y, en caso de que la tenga puesta, le quitamos la almohadilla (#), de manera que quede así:

net.ipv4.ip_forward=1

Y ahora, para leer el archivo y ajustar los valores de la sesión actual, escribimos:

sudo sysctl -p

Si no lo está ya de antes, abriremos el puerto del servidor WireGuard, el que indicamos más arriba en el punto 1.) [d] de la instalación del mismo:

sudo ufw allow 51820/udp

Por supuesto, también tendremos que abrirlo en el router.

Además del anterior, será necesario abrir (pero en este caso solamente en el cortafuegos, NO en el router) dos puertos más: el puerto 53 TCP + UDP, para que dnsmasq resuelva las peticiones DNS, y el puerto 80 TCP para poder acceder a la interfaz web mediante lighttpd:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 80/tcp

Es necesario deshabilitar y volver a habilitar ufw para que surtan efecto los cambios que hemos realizado en los archivos anteriores:

sudo ufw disable
sudo ufw enable

Puede darse el caso de que el cortafuegos no se active en los sucesivos arranques o reinicios de la Raspberry, en cuyo caso será necesario ejecutar este comando para solucionar el problema:

sudo systemctl disable netfilter-persistent

Hecho todo lo anterior, sólo nos queda reiniciar la Raspberry Pi y ya tendremos nuestro servidor WireGuard funcionando correctamente junto a Pi-hole:

sudo reboot

Podemos comprobarlo si visitamos esta web de prueba, cuyo resultado debería ser este:




Servidor de eBooks

Vamos a montar un servidor de eBooks mediante el sistema COPS, con el que crearemos una interfaz web que nos permitirá acceder a los libros electrónicos almacenados en la Raspberry y poder ojearlos, descargarlos o enviarlos por email.

Requisitos previos

Antes de ponernos manos a la obra, tenemos que asegurarnos de haber hecho estas dos cosas:

  1. 1.) Asignarle a la Raspberry Pi una IP estática, tal y como se indica en este apartado.
  2. 2.) Usar un dispositivo USB como lugar para guardar los eBooks (aquí se explica cómo formatearlo y montarlo). Suponiendo que lo tenemos montado en la ruta /media/hdusb y que lo hemos añadido al fichero /etc/fstab, sólo tendremos que crear dentro de ella una carpeta específica para almacenar los libros y darle todos los permisos:
    cd /media/hdusb
    sudo mkdir ebooks
    sudo chmod 777 ebooks

Nginx y PHP

Instalamos el servidor web:

sudo apt install nginx

Podemos ver que se ha instalado correctamente accediendo desde el navegador de nuestro PC a la IP de la Raspberry, lo que nos mostrará esto:

Hecho lo anterior, ya podemos instalar también PHP en su versión 7.4:

sudo apt install php7.4-fpm php7.4-gd php7.4-cli php7.4-sqlite3 php7.4-json php7.4-intl php7.4-xml php7.4-mbstring php7.4-zip

A diferencia de Apache, Nginx no se configurará automáticamente para su uso con PHP. En su lugar, debemos realizar cambios en sus archivos de configuración para que se cargue. También tendremos que utilizar PHP-FPM y no PHP estándar debido a la forma en que funciona este servidor web.

Vamos a editar el siguiente fichero de configuración para indicarle a Nginx que se encargue de servir también archivos PHP:

sudo nano /etc/nginx/sites-enabled/default

Para ello, en la segunda línea incluimos index.php y, más abajo, descomentamos las otras líneas que se indican a continuación, de modo que quede así:

# Add index.php to the list if you are using PHP  
index index.php index.html index.htm index.nginx-debian.html; 
. . . . .
. . . . .  
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
	include snippets/fastcgi-php.conf; 
#
#       # With php-fpm (or other unix sockets):
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
#       # With php-cgi (or other tcp sockets):
#       fastcgi_pass 127.0.0.1:9000;
}

Debemos comprobar que la línea fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; haga referencia a la versión de PHP que hemos instalado antes (7.4).

Ahora reiniciamos el servidor:

sudo service nginx restart

Para asegurarnos de que PHP funciona correctamente, en la ruta /var/www/html creamos un archivo de prueba:

cd /var/www/html
sudo nano index.php

en el que incluiremos este sencillo contenido:

<?php
phpinfo();
?>

Si accedemos desde el navegador del PC a la IP local de la Raspberry (192.168.1.33) nos aparecerá un cuadro con información detallada sobre la versión de PHP instalada:

Una vez comprobado que PHP funciona, eliminamos el fichero de prueba y nos colocamos de nuevo en nuestro /home:

sudo rm index.php
cd

A continuación vamos a editar el fichero de configuración de Nginx:

sudo nano /etc/nginx/nginx.conf

Aquí le indicamos que por razones de seguridad no envíe la versión del servidor en las conexiones HTTP, para lo cual descomentamos esta línea:

server_tokens off;

Para que el cambio surta efecto, reiniciamos el servicio:

sudo service nginx restart

Los ficheros que guardan los registros de acceso al servidor se encuentran en /var/log/nginx y son dos: access.log y error.log. Podemos revisarlos de vez en cuando para comprobar el funcionamiento del servidor.


COPS

COPS es el software PHP que usaremos para el mantenimiento de nuestra biblioteca, lo que nos permitirá servir los libros electrónicos a cualquier dispositivo que se conecte a él. Vamos a descargarlo en la Raspberry y a descomprimirlo ejecutando los siguientes comandos:

sudo mkdir -p /var/www/html/ebooks
cd /var/www/html/ebooks
sudo wget https://github.com/seblucas/cops/releases/download/1.1.3/cops-1.1.3.zip
sudo unzip cops-1.1.3.zip

Es aconsejable cambiar el dueño y el grupo de la carpeta que hemos creado y todo su contenido, para lo cual volvemos al directorio anterior (/var/www/html), realizamos dicha acción y regresamos de nuevo a donde estábamos:

cd ..
sudo chown -R www-data:www-data *
cd ebooks

Ahora procedemos a configurar COPS renombrando el fichero de ejemplo y luego editándolo:

sudo cp config_local.php.example config_local.php
sudo nano config_local.php

Buscamos la línea

$config['calibre_directory'] = './';

y la sustituimos por la ruta donde vamos a guardar los libros:

$config['calibre_directory'] = '/media/hdusb/ebooks/';                  [Ha de finalizar con /]

Luego en esta otra línea:

$config['cops_title_default'] = "COPS";

escribiremos el título que queramos que aparezca en el servidor, por ejemplo:

$config['cops_title_default'] = "Raspberry Pi eBooks Server";

Además de los cambios anteriores, añadiremos una nueva línea para indicar el máximo número de libros por página que se mostrarán por defecto, precedida de un comentario que explica su uso:

/*
* Max number of items per page
* -1 unlimited
*/
$config['cops_max_item_per_page'] = '50';

Opcionalmente podemos configurar COPS para que envíe los libros por correo. En las cuatro primeras líneas podremos los valores smtp del servidor de email que se correspondan con los datos de nuestra cuenta. Al final, en address.from escribiremos la dirección que queremos que aparezca como remitente de los correos y en subject, el asunto:

/*
* Enable and configure Send To Kindle (or Email) feature.
*
* Don't forget to authorize the sender email you configured in your Kindle's Approved
* Personal Document E-mail List.
*
* If you want to use a simple smtp server (provided by your ISP for example), you can
* configure it like that
*/
$config['cops_mail_configuration'] = array ( "smtp.host"           => "smtp.server.com",
                                                                       "smtp.username"  => "micorreo@servidor.com",
                                                                       "smtp.password"   => "contraseña",
                                                                       "smtp.secure"        => "ssl",
                                                                       "address.from"      => "correo@servidor.com",
                                                                       "subject"                => "Tu libro: "
);

En el fichero config_default.php encontraremos todas las opciones disponibles y los valores por defecto.


Copiar la librería de Calibre a COPS

La aplicación más usada para gestionar los eBooks en nuestro PC y pasarlos al lector es Calibre. Pues bien, a continuación nos toca copiar todo el contenido de la librería de Calibre (Calibre Library) a la carpeta de almacenamiento de COPS (/media/hdusb/ebooks). No hay que olvidar copiar también los ficheros de base de datos (metadata.db y metadata_db_prefs_backup.json). Podemos hacer esto desde un PC con Windows recurriendo a la aplicación WinSCP, un cliente SFTP/SCP que funciona a través del servidor SSH y que resulta muy práctico para transferir archivos a/desde la Raspberry. También podemos usar un simple servidor FTP o hacerlo a través de Samba.

Una vez copiados todos los libros, cambiamos el dueño y grupo de toda la biblioteca::

cd /media/hdusb/
sudo chown -R www-data:www-data ebooks

Y ya poodemos entrar en COPS mediante un navegador, accediendo a la IP de la Raspberry seguida de /ebooks

192.168.1.33/ebooks

Configuración

Haciendo clic en la herramienta de la parte inferior izquierda (la que se indica con la flecha amarilla en la imagen anterior) podremos realizar algunos cambios en la configuración de COPS. La primera de las opciones nos permite modificar la plantilla (Template — Click to switch to Bootstrap).

Con la opción Max. número de libros por página es posible aumentar la velocidad de respuesta del servidor si escribirmos una cifra baja. En el fichero de configuración que editamos antes pusimos 50. Si ponemos -1, que es lo que se asigna por defecto si no hubiéramos añadido esa opción en el mencionado fichero, se mostrarían todos los libros en un sola página, lo que, además de resultar incómodo de manejar, ralentizaría mucho el proceso de presentación de los resultados cuando existe una gran cantidad de libros.

En cuanto a Su correo (Para envío de libros por correo), si en el fichero que editamos con anterioridad hemos añadido y configurado un servidor de correo, aquí podremos escribir una dirección de email a la que queramos que se envíen los libros. De esta forma, una vez dentro de la ficha del libro, aparecerá un nuevo icono con forma de carta que nos permitirá enviarlo por correo:


Enviar libros por correo a lectores Kindle

Si disponemos de un lector Kindle podremos recibir los libros por correo directamente en nuestro dispositivo. Para ello hay que hacer dos cosas: en primer lugar, añadir a la cuenta de Amazon la dirección de correo del remitente de los libros que se reciben desde el servidor de eBooks, y en segundo lugar, incluir en la configuración del servidor la cuenta de correo Kindle (xxxx@kindle.com) a donde se van a enviar los libros. Veamos estos dos pasos con más detalle.

A) En Amazon:

  1. 1.- Entrar en la cuenta de Amazon.
  2. 2.- Ir a “Cuenta y listas” (parte superior derecha).
  3. 3.- En el menú desplegable elegir la opción “Gestionar contenido y dispositivos”.
  4. 4.- Pinchar sobre “Preferencias”, en la parte superior de la página.
  5. 5.- Desplazarse al apartado “Configuración de documentos personales” (está al final, abajo) y pinchar en él.
  6. 6.- Ir a “Lista de direcciones de e-mails autorizadas para el envío de documentos personales” y hacer clic en “Añade una nueva dirección de e-mail autorizada”.
  7. 7.- Escribir la dirección de correo del servidor de eBooks y hacer clic en el botón "Añadir dirección". La dirección de correo del servidor la puede conocer el usuario poniendo un email suyo en la configuración del servidor (como se explica al final del subapartado anterior), enviándose cualquier libro a dicho email y comprobando el remitente del mismo.

B) En el servidor:

Pinchamos en la configuración que hemos indicado antes (icono de herramienta, abajo a la izquierda) y en el apartado Su correo (Para envío de libros por correo) ponemos ahora nuestro email de Kindle (xxxxx@kindle.com) donde recibiremos los libros.

A partir de ahora, cada vez que estemos en la ficha de un libro que nos interese, hacemos clic en el icono con forma de carta (ver la imagen de la captura anterior) para que lo envíe por correo directamente a nuestro Kindle. Pero antes de que nos llegue el libro al dispositivo, recibiremos otro correo (en este caso, en la cuenta de email de Amazon) para que autoricemos dicho envío.


Acceder desde Internet

En estos momentos nuestro servidor de eBooks sólo tiene acceso local (LAN). Si queremos poder acceder desde fuera, necesitamos crear un DNS dinámico, algo que podemos hacer de la forma que explicamos aquí.

Una vez realizado el paso anterior, pasaremos a implementar algunas medidas de seguridad. Primero vamos a "esconder" nuestro servidor cambiando el puerto estándar por otro diferente, ya que el puerto 80 (HTTP) es uno de los más atacados por quienes intentan acceder ilegalmente a un servidor web o saturarlo con multitud de peticiones (ataque DoS, Denial of Service). Para ello editamos el fichero de configuración:

sudo nano /etc/nginx/sites-enabled/default

y ponemos un puerto distinto del 80 (por ejemplo, el 8329) en estas dos líneas del principio:

server {
            listen 8329 default_server;
            listen [::]:8329 default_server;

Reiniciamos con

sudo service nginx restart

Esto implica que a partir de ahora, para acceder al servidor, tendremos que escribir el número de puerto, de esta manera:

midominio.com:8329/ebooks/

Por otra parte, necesitamos evitar que cualquiera pueda entrar en nuestro servidor libremente. Para ello es necesario restringir el acceso mediante un usuario y contraseña. Haremos esto siguiendo unos sencillos pasos. En primer lugar instalamos este paquete de utilidades:

sudo apt install apache2-utils

Esto nos permitirá usar htpasswd para crear el usuario y la contraseña (que convendría anotar para no olvidarnos de ellos):

sudo htpasswd -c /etc/nginx/.htpasswd usuario

A continuación volvemos a editar el fichero que modificamos anteriormente:

sudo nano /etc/nginx/sites-enabled/default

e incluimos las siguientes dos líneas marcadas en negrita:

location / {
            auth_basic "Acceso restringido";
            auth_basic_user_file /etc/nginx/.htpasswd;

            . . . . . .
            try_files $url $url/ =404;
}

Reiniciamos de nuevo:

sudo service nginx restart

y podremos comprobar que ahora nos pide el usuario y contraseña que pusimos antes para dejarnos entrar en el servidor:

En ciertas circunstancias, sin embargo, algunos dispositivos o apps se pueden saltar esta protección. Pero es posible evitar que se puedan descargar libros si hacemos una modificación en el fichero de configuración de COPS. Así que lo abrimos:

sudo nano /var/www/html/ebooks/config_local.php

e insertamos la siguiente línea poniéndola a 1 (por defecto, en config_default.php está a 0):

/*
* Setting this parameter to "1" ensure that nobody can access fetch.php
* before accessing index.php or feed.php first.
* BEWARE: Do not touch this if you're not using password, not using PRS-TX
* or not using Aldiko.
*/
$config ['cops_fetch_protect'] = '1';

Por último, vamos al directorio

cd /var/www/html

y editamos el fichero index.nginx-debian.html para que incluya, por ejemplo, alguna información sobre nuestro sitio web, de manera que si un usuario accede a la raíz del sitio (midominio.com:8329), lea dicha información en lugar de recibir un mensaje de error.




Servidor Nginx con Virtual Hosts

El servidor web Nginx puede configurarse para alojar múltiples dominios o Virtual Hosts (servidores virtuales), cada uno de los cuales apuntará a una página web diferente. Veamos a continuación el proceso para lograrlo.

Lo primero que haremos, naturalmente, será instalarlo:

sudo apt install nginx

Comprobamos que se ha instalado correctamente accediendo desde el navegador de nuestro PC a la IP de la Raspberry, lo que nos mostrará esto:

A continuación vamos a editar el fichero de configuración de Nginx:

sudo nano /etc/nginx/nginx.conf

Aquí le indicamos que por razones de seguridad no envíe la versión del servidor en las conexiones HTTP, para lo cual descomentamos esta línea:

server_tokens off;

Para que el cambio surta efecto, reiniciamos el servicio:

sudo service nginx restart

Los ficheros que guardan los registros de acceso al servidor se encuentran en /var/log/nginx y son dos: access.log y error.log. Podemos revisarlos de vez en cuando para comprobar el funcionamiento del servidor.

Vamos a crear los subdirectorios donde se va a guardar la web de cada dominio:

sudo mkdir -p /var/www/html/web1
sudo mkdir -p /var/www/html/web2

A continuación crearemos una página web en cada uno de esos dos subdirectorios. En nuestro caso, haremos una web muy sencilla (index.html) como simple ejemplo:

sudo nano /var/www/html/web1/index.html

El contenido de esta primera página va a ser el siguiente:

<html>
<head>
   <title>Primera web</title>
</head>
<body>
   <h2>Te encuentras en el dominio-uno.org</h2>
</body>
</html>

Ahora creamos otro fichero index.html dentro del segundo subdirectorio:

sudo nano /var/www/html/web2/index.html

e incluimos un contenido que nos permita diferenciarla:

<html>
<head>
   <title>Segunda web</title>
</head>
<body>
   <h2>Te encuentras en el dominio-dos.net</h2>
</body>
</html>

A los dos directorios que hemos creado antes para contener las dos webs, así como a todo lo que contengan, le asignamos el dueño y el grupo adecuados:

cd /var/www/html
sudo chown -R www-data:www-data *
cd

Para obtener los dominios podemos usar un servicio de DDNS como No-ip, por ejemplo.

Nginx ya incluye en el directorio /etc/nginx/sites-available un fichero llamado default que posee una configuración por defecto a modo de plantilla. Así que vamos a usarlo para crear los archivos de configuracción de cada dominio. Podemos darles cualquier nombre, pero para identificarlos mejor, les pondremos el mismo que el de los dominios:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/dominio-uno.org
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/dominio-dos.net

Ahora editamos el primer fichero:

sudo nano /etc/nginx/sites-available/dominio-uno.org

y lo dejamos así:

server {
           listen 80;
           listen [::]:80;

           root /var/www/html/web1;

           index index.html index.htm;

           server_name dominio-uno.org;

           location / {
                try_files $uri $uri/ =404;
           }
}

A continuación el segundo fichero:

sudo nano /etc/nginx/sites-available/dominio-dos.net

y lo modificamos para que quede así:

server {
           listen 80;
           listen [::]:80;

           root /var/www/html/web2;

           index index.html index.htm;

           server_name dominio-dos.net;

           location / {
                try_files $uri $uri/ =404;
           }
}

Terminada la configuración, conviene comprobar que no hemos cometido errores, para lo que escribimos este comando:

sudo nginx -t

El directorio /etc/nginx/sites-availabe, como su nombre indica, alberga los ficheros de configuración en estado de "disponibles", pero no tienen efecto sobre el funcionamiento del servidor. Es el directorio /etc/nginx/sites-enabled el que los convierte en "activos". Por eso el siguiente paso es crear un enlace simbólico de los dos ficheros anteriores al directorio /etc/nginx/sites-enabled para que se activen y surta efecto su contenido:

sudo ln -s /etc/nginx/sites-available/dominio-uno.org /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/dominio-dos.net /etc/nginx/sites-enabled/

Este sistema de enlaces simbólicos facilita la activación o desactivación de cada página web con tan sólo crear o eliminar su enlace, sin que se pierda la configuración de cada una.

Como no lo vamos a usar, borramos el enlace que ya existe del fichero default:

sudo rm /etc/nginx/sites-enabled/default

Una vez concluido todo el proceso, reiniciamos el servidor:

sudo systemctl restart nginx

Necesitamos redireccionar en el router el puerto 80 a la IP local de la Raspberry (y abrirlo en el cortafuegos, si lo tenemos instalado), y ya podemos acceder desde cualquier ordenador a las dos páginas web alojadas en nuestro servidor, utilizando para ello el nombre de cada dominio:

dominio-uno.org
dominio-dos.net

Múltiples webs con un solo dominio

En lugar de usar varios dominios, podermos utilizar uno solo y acceder con él a páginas web distintas alojadas en el mismo servidor. Para lograrlo, lo único que hay que hacer es usar un puerto distinto para cada una de ellas. Así que procederemos a editar los ficheros de configuración que creamos antes para cada una y pondremos en ellos el mismo dominio (por ejemplo dominio-uno.org), pero asignándole puertos diferentes.

Editamos el primer fichero:

sudo nano /etc/nginx/sites-available/dominio-uno.org

y lo dejamos así:

server {
           listen 8080;
           listen [::]:8080;

           root /var/www/html/web1;

           index index.html index.htm;

           server_name dominio-uno.org;

           location / {
                try_files $uri $uri/ =404;
           }
}

A continuación el segundo fichero:

sudo nano /etc/nginx/sites-available/dominio-dos.net

y lo modificamos para que quede así:

server {
           listen 8088;
           listen [::]:8088;

           root /var/www/html/web2;

           index index.html index.htm;

           server_name dominio-uno.org;

           location / {
                try_files $uri $uri/ =404;
           }
}

Una vez más, comprobamos que no hayamos cometido errores:

sudo nginx -t

Tambén editaremos los dos ficheros index.html que creamos antes, y que corresponden a cada web, para que muestren el mensaje apropiado a las nuevas circunstancias:

sudo nano /var/www/html/web1/index.html

El contenido de esta primera página podría ser similar al de este ejemplo:

<html>
<head>
   <title>Primera web</title>
</head>
<body>
   <h2>Te encuentras en la primera web</h2>
</body>
</html>

Ahora editamos el fichero index.html del segundo subdirectorio:

sudo nano /var/www/html/web2/index.html

y le ponemos un contenido que nos permita distinguir esta web de la anterior:

<html>
<head>
   <title>Segunda web</title>
</head>
<body>
   <h2>Ahora se muestra la segunda web</h2>
</body>
</html>

Una vez concluido todo el proceso, reiniciamos el servidor:

sudo systemctl restart nginx

En este caso hemos de redireccionar en el router los puertos 8080 y 8088 a la IP local de la Raspberry (y abrirlos en el cortafuegos, si lo tenemos instalado), y ya podemos acceder desde cualquier ordenador a las dos páginas web alojadas en nuestro servidor utilizando un solo nombre de dominio, acompañado ahora del puerto correspondiente a cada una de ellas:

dominio-uno.org:8080
dominio-uno.org:8088