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 Options → N1 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:
I1 Change Locale(Idioma del sistema)I2 Change Timezone(Zona horaria)I3 Change Keyboard Layout(Distribución del teclado)I4 Change Wi-fi Country(País para la red Wi-Fi)
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 Options → B1 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:
- Entrante: Web (80/443 TCP/UDP), XRDP (Local), Transmission y SSH (en puerto no estándar).
- Saliente: DNS, Web (actualizaciones), NTP (imprescindible en Raspberry Pi al no tener reloj RTC).
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