Página de Alejandro Muñoz Fernández

Servidor casero con Raspberry Pi

Pasos para instalar un servidor web, de archivos (NAS) y XRDP en una Raspberry Pi. Esta guía es fácilmente adaptable a otras placas SBC (Single Board Computers) como Orange Pi, Tinker Board, Nano Pi, etc.

1. Instalar Raspberry Pi OS (Raspbian)

Descarga la imagen del sistema operativo (versión completa):

wget -c [https://downloads.raspberrypi.org/raspbian_full_latest](https://downloads.raspberrypi.org/raspbian_full_latest)

Descomprime el archivo descargado:

unzip raspbian_full_latest

(El archivo extraído, por ejemplo 2020-02-13-raspbian-buster-full.img, tendrá la fecha de la versión que hayas descargado).

Graba la imagen en la tarjeta MicroSD. Asegúrate de sustituir /dev/sdX por la ruta correcta de tu tarjeta (puedes averiguarlo usando el gestor de particiones de KDE u otro similar):

sudo dd if=2020-02-13-raspbian-buster-full.img of=/dev/sdX bs=512k

1.1. Activar SSH por defecto

Para que el servidor SSH se inicie automáticamente en el primer arranque, crea un archivo vacío llamado ssh en la partición boot de la tarjeta:

touch /ruta/a/la/particion/boot/ssh

1.2. Primer arranque

Introduce la tarjeta MicroSD en la Raspberry Pi, conecta el cable de red ethernet y enciende el dispositivo.


2. Configuración básica

2.1. Primer acceso y cambio de contraseña

Para acceder remotamente por SSH, ejecuta la siguiente orden desde tu ordenador principal (sustituye la X por la IP asignada por tu router):

ssh pi@192.168.1.X

La contraseña predeterminada es raspberry. Por seguridad, cámbiala inmediatamente:

passwd

2.2. Actualizar el sistema

Actualiza los repositorios y el software instalado:

sudo apt update && sudo apt upgrade -y

Elimina los paquetes huérfanos e innecesarios:

sudo apt autoremove -y

2.3. Cambiar el nombre del servidor (Hostname)

Inicia la herramienta de configuración de Raspberry Pi:

sudo raspi-config

Navega a 2 Networking OptionsN1 Hostname y establece el nuevo nombre para tu servidor.

2.4. Localización e Idioma

Dentro de raspi-config, ve a 4 Localisation Options. Desde aquí debes configurar:

Pide reiniciar el sistema tras aplicar estos cambios.

2.5. Desactivar el entorno gráfico en el arranque

Por defecto, el sistema inicia el servidor gráfico X, lo cual consume recursos innecesarios en un servidor. Desactívalo para que solo arranque al iniciar sesión remotamente con XRDP.

En raspi-config, ve a 3 Boot OptionsB1 Desktop / CLI y selecciona B1 Console.

2.6. Cambiar el nombre de usuario predeterminado

Para cambiar el nombre del usuario pi por otro más seguro, primero debemos crear un usuario temporal con permisos de administrador:

sudo useradd -m temporal -s /bin/bash
sudo passwd temporal
sudo usermod -a -G sudo temporal

Cierra la sesión actual con el usuario pi:

exit

Inicia sesión con el usuario temporal:

ssh temporal@192.168.1.X

Cambia el nombre del usuario pi (sustituye “otro” por el nombre que desees):

sudo usermod -l otro -d /home/otro -m pi
sudo groupmod -n otro pi

Crea un enlace simbólico de la antigua ruta a la nueva para evitar errores con programas que busquen la carpeta /home/pi:

sudo ln -s /home/otro /home/pi

Cierra sesión y vuelve a entrar con tu nuevo usuario:

exit
ssh otro@192.168.1.X

Añade tu nombre real a los metadatos del usuario (solo caracteres estándar, sin tildes ni eñes):

sudo chfn -f "Nombre Apellidos"

Finalmente, elimina el usuario temporal y su directorio:

sudo userdel -r temporal

2.7. Configurar una IP privada fija

Es fundamental asignar una IP estática al servidor para no depender del DHCP del router. Edita el archivo de configuración:

sudo nano /etc/dhcpcd.conf

Añade al final del archivo (ajustando a tu rango de red). Si usas Wi-Fi, cambia eth0 por wlan0:

interface eth0
static ip_address=192.168.1.XXX/24
static routers=192.168.1.1
static domain_name_servers=1.1.1.1 8.8.8.8

Reinicia para aplicar la nueva IP:

sudo reboot

3. Servicios e Infraestructura

3.1. Acceso seguro por SSH (sin contraseña)

Genera un par de claves (pública/privada) en tu ordenador cliente si no lo has hecho ya:

ssh-keygen

Copia la clave pública a la Raspberry Pi:

ssh-copy-id otro@192.168.1.XXX

Edita la configuración del demonio SSH en el servidor para endurecer la seguridad:

sudo nano /etc/ssh/sshd_config

Asegúrate de que estas directivas estén configuradas así:

IgnoreRhosts yes
PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin no
MaxAuthTries 3
PubkeyAuthentication yes
PrintMotd no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2

Recomendación: Cambia el puerto predeterminado (22) por otro para evitar ataques de fuerza bruta automatizados:

Port 2222

Abre el nuevo puerto en el cortafuegos, reinicia la Raspberry Pi, comprueba que puedes entrar por el nuevo puerto y cierra el puerto 22:

sudo ufw allow 2222/tcp
sudo reboot

Vuelve a conectar especificando el puerto:

ssh -p 2222 otro@192.168.1.XXX

Cierra el puerto antiguo en el servidor:

sudo ufw delete allow 22/tcp

3.2. Servidor RDP (XRDP)

Para tener acceso al escritorio remoto desde Windows u otros clientes RDP:

sudo apt install xrdp

Para que el tráfico esté cifrado correctamente, añade el usuario al grupo ssl-cert:

sudo adduser xrdp ssl-cert

3.3. Servidor de Archivos (NAS)

Vamos a utilizar un disco SSD conectado por USB. Primero, formatéalo (asegúrate de que /dev/sdX1 es tu SSD):

sudo mkfs.ext4 /dev/sdX1

Móntalo de forma permanente en /mnt/mi-ssd editando el archivo /etc/fstab:

UUID=pegar-uuid-de-la-partición-aquí       /mnt/mi-ssd  ext4    defaults,noatime,errors=remount-ro      0       1

Crea la carpeta que vas a compartir y otórgale permisos a tu usuario:

sudo mkdir /mnt/mi-ssd/Compartido
sudo chown -R otro:otro /mnt/mi-ssd/Compartido

Podemos compartir esta carpeta por varios protocolos:

3.3.1. Opción A: NFS (Rápido y nativo para Linux)

Instala el servidor NFS:

sudo apt install nfs-kernel-server

Edita el archivo /etc/exports:

sudo nano /etc/exports

Añade la ruta (necesitas saber tu UID y GID, que habitualmente es 1000. Puedes comprobarlo ejecutando el comando id):

/mnt/mi-ssd/Compartido *(rw,all_squash,insecure,async,no_subtree_check,anonuid=1000,anongid=1000)

Aplica los cambios:

sudo exportfs -ra

3.3.2. Opción B: Samba (CIFS - Universal para Windows/Mac/Linux)

Instala Samba (si pregunta sobre usar la configuración WINS de DHCP, responde «Sí»):

sudo apt install samba samba-common-bin

Edita la configuración /etc/samba/smb.conf y añade al final:

[compartido]
comment = Carpeta compartida
path = /mnt/mi-ssd/Compartido
writeable = Yes
create mask = 0644
directory mask = 0755
browseable = Yes
valid users = @users
force user = otro

Asigna una contraseña de Samba a tu usuario (Samba no usa las contraseñas del sistema PAM):

sudo smbpasswd -a otro

Reinicia los servicios:

sudo systemctl restart smbd nmbd

4. Servidor Web (Apache)

Instala Apache:

sudo apt install apache2

Ajusta los permisos del directorio web para que el grupo www-data pueda gestionarlo:

sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 775 {} \;
sudo find /var/www/html -type f -exec chmod 664 {} \;

Añade tu usuario al grupo web:

sudo usermod -a -G www-data otro

Activa el protocolo HTTP/2 para mayor rendimiento:

sudo a2enmod http2
sudo systemctl restart apache2

Nota: Para implementar HTTPS con Let’s Encrypt, puedes seguir esta guía oficial de DigitalOcean.

4.1. DNS Dinámico con NoIP

Si no tienes IP pública estática en casa, instala el cliente de NoIP:

mkdir noip-duc && cd noip-duc
wget [http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz](http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz)
tar xzf noip-duc-linux.tar.gz
cd noip-2.1.9-1
make
sudo make install

Para crear un demonio que se inicie automáticamente con systemd, crea el archivo /etc/systemd/system/noip2.service:

[Unit]
Description=No-ip.com dynamic IP address updater
After=network.target syslog.target

[Install]
WantedBy=multi-user.target
Alias=noip.service

[Service]
ExecStart=/usr/local/bin/noip2
Restart=always
Type=forking

Activa e inicia el servicio:

sudo systemctl daemon-reload
sudo systemctl enable noip2
sudo systemctl start noip2

5. Calendarios y Contactos (Radicale)

Radicale es un servidor ligero para CalDAV (calendarios) y CardDAV (contactos).

sudo apt install radicale apache2-utils python3-bcrypt python3-passlib

Crea el archivo de usuarios y añade el primero (el parámetro -c crea el archivo, no lo uses para añadir usuarios adicionales):

sudo htpasswd -c -B /etc/radicale/users usuario

Prepara los directorios y permisos necesarios:

sudo mkdir -p /var/lib/radicale /var/log/radicale
sudo chown radicale:radicale /var/lib/radicale
sudo chown radicale:adm /var/log/radicale
sudo chmod g-w,o-rwx /var/lib/radicale /var/log/radicale

(Para el resto de la configuración, sigue la guía oficial de Debian para Radicale).


6. Compartir Ficheros (P2P)

6.1. Transmission (Torrents)

Instala el demonio de Transmission:

sudo apt install transmission-daemon

Detén el servicio antes de editar la configuración:

sudo systemctl stop transmission-daemon

Edita /etc/transmission-daemon/settings.json prestando especial atención a estos parámetros:

"blocklist-enabled": true,
"blocklist-url": "[http://john.bitsurge.net/public/biglist.p2p.gz](http://john.bitsurge.net/public/biglist.p2p.gz)",
"download-dir": "/mnt/mi-ssd/Compartido/Descargas",
"incomplete-dir-enabled": true,
"incomplete-dir": "/mnt/mi-ssd/Compartido/Descargas/Incompletas",
"rpc-username": "TuUsuario",
"rpc-password": "TuContraseña",

Inicia de nuevo el servidor:

sudo systemctl start transmission-daemon

Accede a la interfaz web en: http://192.168.1.XXX:9091

6.1.1. Opcional: Proxy inverso con Apache

Si quieres acceder a Transmission a través del puerto 80/443 tradicional en lugar del 9091:

sudo a2enmod proxy proxy_http
sudo systemctl restart apache2

Añade esto al bloque virtualhost de tu sitio web en Apache (/etc/apache2/sites-available/tusitio.conf):

<IfModule mod_proxy.c>
  ProxyRequests Off
  <Proxy *>
    AddDefaultCharset off
    Require all granted
  </Proxy>

  ProxyPass /transmission http://localhost:9091/transmission
  ProxyPassReverse /transmission http://localhost:9091/transmission
  
  Redirect permanent /transmission [https://tuservidor.com/transmission/web/](https://tuservidor.com/transmission/web/)
</IfModule>

6.2. aMule

Pendiente de documentar.


7. Seguridad

7.1. Cortafuegos (UFW)

Mi aspiración es bloquear todo el tráfico, permitiendo solo:

Instala el cortafuegos UFW:

sudo apt install ufw

Aplica las políticas predeterminadas (bloquear entrada, permitir salida):

sudo ufw default deny incoming
sudo ufw default allow outgoing

Abre los puertos necesarios:

# SSH en puerto modificado (ej. 2222)
sudo ufw limit 2222/tcp comment "SSH Alternativo"

# Servidor Web (HTTP/HTTPS y futuro HTTP/3 sobre UDP)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp

# Samba (Solo red local)
sudo ufw allow from 192.168.1.0/24 to any port 137,138 proto udp
sudo ufw allow from 192.168.1.0/24 to any port 139,445 proto tcp

# NFS (Solo red local)
sudo ufw allow from 192.168.1.0/24 to any port nfs

# XRDP (Solo red local)
sudo ufw allow from 192.168.1.0/24 to any port 3389

# Transmission (Puerto de escucha P2P entrante)
sudo ufw allow 51413/tcp

# Transmission (Acceso a la interfaz web solo desde red local)
sudo ufw allow from 192.168.1.0/24 to any port 9091 proto tcp

Activa el cortafuegos:

sudo ufw enable

7.2. Fail2ban (Protección contra intrusiones)

Protege el servidor contra ataques de fuerza bruta bloqueando las IPs maliciosas.

sudo apt install fail2ban

Copia la configuración base para crear tu propia configuración local:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Asegúrate de ajustar los reintentos y el puerto SSH que hayas elegido:

maxretry = 3

[sshd]
enabled = true
filter = sshd
port = 2222

Reinicia el servicio:

sudo systemctl restart fail2ban

7.3. Actualizaciones desatendidas

Para garantizar que el sistema recibe parches de seguridad automáticamente:

sudo apt install unattended-upgrades
Etiquetas: