Logotipo de Bitdoze

Configura un servidor WebDAV con Nginx en Linux (guía 2026)

Monta un servidor WebDAV seguro con Nginx en Linux. Cubre SSL, autenticación básica, bloqueo de archivos, clientes davfs2 y rclone, Docker y resolución de problemas.

Dragos

Actualizado Publicado 43 min de lectura

Configura un servidor WebDAV con Nginx en Linux (guía 2026)

Mientras que NFS funciona bien para compartir archivos entre sistemas Linux y Samba cubre la compatibilidad multiplataforma, a veces necesitas acceso a archivos vía web que atraviese firewalls y NAT. Ahí es donde entra WebDAV (Web Distributed Authoring and Versioning).

Yo uso WebDAV junto a NFS y Samba en mi mini PC N100 para tener acceso remoto seguro a los archivos cuando estoy fuera de casa. A diferencia de los protocolos tradicionales para compartir archivos, WebDAV funciona sobre los puertos HTTP/HTTPS estándar, así que puedes acceder a los archivos de tu home server desde cualquier lugar con una app cliente dedicada. Esta guía cubre cómo configurar un servidor WebDAV con Nginx en Linux, incluyendo cifrado SSL, autenticación básica, bloqueo de archivos (DAV nivel 2), clientes rclone y davfs2, alternativas con Docker y resolución de problemas.

Entendiendo WebDAV

¿Qué es WebDAV?

WebDAV (Web Distributed Authoring and Versioning) es una extensión de HTTP que permite a los clientes realizar operaciones remotas de autoría de contenido web. Permite a los usuarios editar y gestionar archivos de forma colaborativa en servidores web remotos.

Ventajas clave de WebDAV

  • Amigable con firewalls: usa los puertos HTTP(S) estándar (80/443), funciona a través de la mayoría de firewalls
  • Seguro por defecto: cifrado SSL/TLS integrado
  • Amplio ecosistema de clientes: Explorador de Windows, Finder de macOS, rclone, Cyberduck, apps móviles. No hace falta navegador
  • Multiplataforma: compatible con Windows, macOS, Linux y plataformas móviles
  • Bloqueo de archivos: bloqueos de escritura exclusivos vía dav-ext (sin versionado; eso es lo que Nextcloud/Zotero añaden por encima)
  • Experiencia tipo nube: ofrece una funcionalidad estilo Dropbox en tu propio servidor

WebDAV frente a NFS, Samba y FTP

Característica WebDAV NFS Samba/SMB FTP
Acceso remoto Excelente Deficiente Deficiente Bueno
Seguridad Excelente (HTTPS) Moderada Buena Deficiente
Compatibilidad con firewalls Excelente Deficiente Deficiente Moderada
Acceso desde el navegador No (usa una app cliente) No No Limitado
Soporte móvil Excelente Deficiente Bueno Bueno
Rendimiento (LAN) Moderado Excelente Muy bueno Bueno
Complejidad de configuración Moderada Sencilla Moderada Sencilla

Requisitos previos y planificación

Antes de empezar, asegúrate de tener:

  • Servidor Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+ o Alpine) con acceso root o sudo
  • Nombre de dominio con un registro DNS A apuntando al servidor
  • Puertos 80 y 443 abiertos en tu firewall
  • (Opcional) Un VPS si necesitas acceso remoto. Un VPS asequible como Hetzner o opciones económicas como Hostinger funcionan bien para esto

Los precios de los VPS subieron en general en 2026 — si estás reconsiderando un servidor alquilado, mira qué cambió y cuándo gana un mini PC.

Visión general de la arquitectura WebDAV

Arquitectura WebDAV en Nginx para Linux. Los clientes HTTPS (Windows, macOS, Linux, móvil) se autentican con autenticación básica y acceden a los archivos a través del servidor WebDAV de nginx.

Actualiza Nginx primero: CVE-2026-27654

Seguridad: actualiza Nginx antes de continuar

Se publicó un desbordamiento de búfer en ngx_http_dav_module (CVE-2026-27654, CVSS 8.2-8.8) el 24 de marzo de 2026. Afecta a configuraciones que usan alias con COPY/MOVE de DAV, un patrón que aparece en varios ejemplos de abajo. Un atacante remoto no autenticado puede tumbar el worker de nginx o manipular nombres de archivo fuera del document root.

Corregido en: nginx 1.28.3 / 1.29.7 (upstream), Ubuntu noble 1.24.0-2ubuntu7.7 (USN-8375-1), backports de seguridad de Debian bookworm.

Comprueba tu versión:
nginx -v

Si tu versión es anterior a las compilaciones corregidas de arriba, actualiza ahora antes de continuar.

Paso 1: instala Nginx con el módulo WebDAV

El ngx_http_dav_module base de Nginx gestiona PUT, DELETE, MKCOL, COPY y MOVE. Para soporte WebDAV completo (PROPFIND, OPTIONS, LOCK, UNLOCK) también necesitas el módulo de terceros dav-ext.

Instala el módulo WebDAV de Nginx

Debian/Ubuntu

bash
# Base nginx already includes ngx_http_dav_module. Add only the ext module
sudo apt update
sudo apt install nginx libnginx-mod-http-dav-ext apache2-utils -y

RHEL/Alma/Rocky

bash
# Enable EPEL, then install
sudo dnf install epel-release -y
sudo dnf install nginx nginx-mod-http-dav-ext httpd-tools -y

Alpine

bash
# Useful for container builds
apk add nginx nginx-mod-http-dav-ext

La división de módulos explicada

El ngx_http_dav_module base (compilado en los paquetes nginx estándar de Debian/Ubuntu) gestiona los métodos de escritura: PUT, DELETE, MKCOL, COPY, MOVE. El módulo dav-ext añade los métodos de lectura/bloqueo: PROPFIND, OPTIONS, LOCK, UNLOCK. Necesitas ambos para un servidor WebDAV funcional.

Verifica que los módulos estén cargados:

bash
# Check base module
nginx -V 2>&1 | grep -o with-http_dav_module

# Check ext module (Debian/Ubuntu)
ls /usr/lib/nginx/modules/ | grep dav

Si el primer comando no devuelve nada, tu compilación de nginx carece del módulo DAV base. Si el segundo no devuelve nada, el módulo ext no está instalado.

Crea la estructura de directorios de WebDAV

bash
# Create share directories
sudo mkdir -p /var/www/webdav/{documents,media,projects,shared}

# Create temp directory on the SAME filesystem (important, see note below)
sudo mkdir -p /var/www/webdav/.tmp

# Set ownership to www-data (Nginx user)
sudo chown -R www-data:www-data /var/www/webdav

# Set permissions
sudo chmod -R 755 /var/www/webdav

Mismo sistema de archivos para la ruta temporal

El directorio client_body_temp_path debe estar en el mismo sistema de archivos que tu raíz WebDAV. Si están en sistemas de archivos distintos, nginx copia el archivo subido en lugar de hacer un renombrado atómico, que es más lento y puede fallar en subidas grandes. La ruta /var/www/webdav/.tmp de arriba mantiene todo junto.

Configura SSL con Certbot

bash
# Install Certbot
sudo apt install certbot python3-certbot-nginx -y

# Obtain SSL certificate (replace with your domain)
sudo certbot --nginx -d webdav.yourdomain.com

# Verify certificate auto-renewal works
sudo certbot renew --dry-run

El DNS debe apuntar a este servidor

Asegúrate de que el registro A de tu dominio resuelve a la IP de este servidor antes de ejecutar Certbot. El reto HTTP-01 necesita llegar a tu servidor por el puerto 80.

Paso 2: configura Nginx para WebDAV

Esta es la configuración central. Incluye todas las correcciones: dav_ext_methods correcto (sin PROPPATCH), bloqueo de archivos para DAV nivel 2, ruta temporal en el mismo sistema de archivos, workaround para el Finder de macOS y ajustes TLS modernos.

Habilita los métodos WebDAV

Crea el archivo de configuración principal:

bash
sudo nano /etc/nginx/sites-available/webdav

Añade esta configuración:

nginx
# /etc/nginx/sites-available/webdav
#
# Requires dav_ext_lock_zone in http{} context. See "Enable File Locking" below.
# Make sure /var/www/webdav/.tmp exists on the same filesystem as /var/www/webdav.

server {
    listen 80;
    server_name webdav.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    http2 on;

    server_name webdav.yourdomain.com;

    # SSL Configuration
    ssl_certificate     /etc/letsencrypt/live/webdav.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/webdav.yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    # Security Headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;

    # Authentication
    auth_basic "WebDAV Access";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # WebDAV root
    location / {
        root /var/www/webdav;

        # Write methods (base module)
        dav_methods PUT DELETE MKCOL COPY MOVE;

        # Read/lock methods (dav-ext module)
        # NOTE: PROPPATCH is NOT supported — do not add it here
        dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;

        # Enable real LOCK/UNLOCK (requires dav_ext_lock_zone in http{})
        dav_ext_lock zone=davlock;

        dav_access user:rw group:rw all:r;
        create_full_put_path on;
        min_delete_depth 1;

        # Temp path on same filesystem
        client_body_temp_path /var/www/webdav/.tmp;
        client_max_body_size 10G;
        client_body_timeout 300s;

        # Fix macOS Finder MKCOL-without-slash (creates dirs without trailing /)
        set $x $uri$request_method;
        if ($x ~ [^/]MKCOL$) { rewrite ^(.*)$ $1/; }

        # Logging
        access_log /var/log/nginx/webdav_access.log;
        error_log  /var/log/nginx/webdav_error.log;
    }

    # Block access to hidden files
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

Si nginx -t falla con 'unknown directive dav_ext_methods'

El módulo dav-ext no está cargado. Compruébalo con: ls /usr/lib/nginx/modules/ | grep dav. En Debian/Ubuntu, instala libnginx-mod-http-dav-ext. En RHEL/Alpine, instala nginx-mod-http-dav-ext.

Habilita el bloqueo de archivos para DAV nivel 2

Sin una configuración de bloqueo explícita, el servidor anuncia DAV: 1 (solo lectura/escritura básica). El Finder de macOS requiere DAV: 2 (soporte LOCK funcional) para montajes de lectura/escritura. El Explorador de Windows también comprueba esta cabecera.

Añade la zona de bloqueo a tu configuración principal de nginx (/etc/nginx/nginx.conf) dentro del bloque http {}:

nginx
http {
    # ... existing config ...

    # WebDAV lock zone — shared memory for tracking locks
    # 10MB handles thousands of concurrent locks; 300s timeout
    dav_ext_lock_zone zone=davlock:10m timeout=300;
}

DAV nivel 1 frente a nivel 2

Nivel 1 = lectura/escritura básica (PUT/DELETE/PROPFIND). Nivel 2 = añade LOCK/UNLOCK para edición concurrente. El Finder de macOS y el Explorador de Windows necesitan el nivel 2 para acceso completo de lectura/escritura. Sin la configuración de zona de bloqueo de arriba, el servidor solo anuncia DAV: 1.

Verifica que DAV nivel 2 funciona:

bash
curl -i -X OPTIONS https://webdav.yourdomain.com/ -u webdavuser:password

Busca DAV: 2 en las cabeceras de respuesta. Si solo ves DAV: 1, la zona de bloqueo no está configurada.

Crea usuarios de WebDAV

bash
# Create password file with first user (use -B for bcrypt)
sudo htpasswd -cB /etc/nginx/.htpasswd webdavuser

# Add additional users (no -c flag after first user)
sudo htpasswd -B /etc/nginx/.htpasswd john
sudo htpasswd -B /etc/nginx/.htpasswd mary

# Secure the password file
sudo chmod 640 /etc/nginx/.htpasswd
sudo chown root:www-data /etc/nginx/.htpasswd

Usa bcrypt (-B)

El hash predeterminado de htpasswd es MD5-crypt, débil frente a las GPU modernas. Usa siempre el flag -B para bcrypt. En la familia RHEL, htpasswd viene del paquete httpd-tools.

Gestión avanzada de usuarios

Para distintos niveles de acceso (admin, usuarios, lectura pública):

nginx
# Admin access — full WebDAV methods
location /admin {
    alias /var/www/webdav/admin;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
    dav_ext_lock zone=davlock;
    dav_access user:rw group:rw all:r;
    create_full_put_path on;

    auth_basic "Admin WebDAV";
    auth_basic_user_file /etc/nginx/.htpasswd-admin;
}

# User access — limited methods
location /users {
    alias /var/www/webdav/users;
    dav_methods PUT DELETE MKCOL;
    dav_ext_methods PROPFIND OPTIONS;
    dav_access user:rw group:rw all:r;
    create_full_put_path on;

    auth_basic "User WebDAV";
    auth_basic_user_file /etc/nginx/.htpasswd-users;
}

# Public read-only access
location /public {
    alias /var/www/webdav/public;
    limit_except GET {
        deny all;
    }
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}

alias + DAV es el patrón del CVE-2026-27654

La directiva alias combinada con COPY/MOVE de DAV es el disparador exacto del CVE-2026-27654. Asegúrate de que tu nginx esté parcheado antes de usar estos bloques location. Consulta el aviso del CVE en Requisitos previos.

Habilita y prueba la configuración

bash
# Test configuration syntax
sudo nginx -t

# Enable the site
sudo ln -s /etc/nginx/sites-available/webdav /etc/nginx/sites-enabled/

# Remove default site if it conflicts
sudo rm -f /etc/nginx/sites-enabled/default

# Restart and enable nginx
sudo systemctl restart nginx
sudo systemctl enable nginx

# Check status
sudo systemctl status nginx

Lista completa de verificación:

bash
# 1. Module loaded?
nginx -V 2>&1 | grep -o with-http_dav_module

# 2. Config valid?
sudo nginx -t

# 3. Methods advertised? (expect DAV: 2 + Allow list)
curl -i -X OPTIONS https://webdav.yourdomain.com/ -u webdavuser:password

# 4. Directory listing works?
curl -i -X PROPFIND https://webdav.yourdomain.com/ -u webdavuser:password -H "Depth: 1"

# 5. Upload works?
curl -i -T test.txt https://webdav.yourdomain.com/test.txt -u webdavuser:password

# 6. Move works?
curl -i -X MOVE https://webdav.yourdomain.com/test.txt \
  -H "Destination: https://webdav.yourdomain.com/final.txt" \
  -u webdavuser:password

Paso 3: conecta clientes WebDAV en cada plataforma

Windows: monta WebDAV como unidad de red

powershell
# Map WebDAV as network drive
net use W: https://webdav.yourdomain.com /user:webdavuser

# Or via File Explorer:
# 1. Open File Explorer
# 2. Right-click "This PC" → "Map network drive"
# 3. Enter: https://webdav.yourdomain.com
# 4. Check "Connect using different credentials"
# 5. Enter username and password

Problemas conocidos de WebDAV en Windows

El WebDAV nativo de Windows es quisquilloso. Problemas habituales:

  • Error 0x80070043 (“The network name cannot be found”) — normalmente significa que el servicio WebClient no está en ejecución o la URL es incorrecta
  • Autenticación básica sobre HTTP bloqueada — las versiones modernas de Windows requieren HTTPS para la autenticación básica por defecto
  • El servicio WebClient debe estar en ejecución: net start WebClient

Si el mapeo nativo falla, usa un cliente de terceros como RaiDrive, Cyberduck o WinSCP.

Linux: monta WebDAV con davfs2

bash
# Install davfs2
sudo apt install davfs2 -y

# Create mount point
sudo mkdir /mnt/webdav

# Mount WebDAV share
sudo mount -t davfs https://webdav.yourdomain.com /mnt/webdav

# Verify
mount | grep webdav

Para un montaje permanente, añade las credenciales y una entrada en fstab:

bash
# Add credentials (one line per share)
sudo nano /etc/davfs2/secrets
# Add: https://webdav.yourdomain.com webdavuser your_password

# Secure the secrets file
sudo chmod 600 /etc/davfs2/secrets

# Add to fstab for auto-mount on boot
sudo nano /etc/fstab
# Add: https://webdav.yourdomain.com /mnt/webdav davfs _netdev,user,uid=1000,gid=1000 0 0

Los gestores de archivos gráficos también funcionan:

bash
# Nautilus (GNOME): Other Locations → Connect to Server
# Enter: davs://webdav.yourdomain.com

# Dolphin (KDE): Network → Add Network Folder → WebDAV

Finder de macOS y mount_webdav

  1. Abre el Finder
  2. Pulsa Cmd + K (Conectar al servidor)
  3. Introduce: https://webdav.yourdomain.com
  4. Introduce las credenciales cuando se te pidan

Finder monta en lectura/escritura solo si el servidor anuncia DAV: 2 (soporte LOCK funcional). Si seguiste la configuración de bloqueo del paso 2, esto funciona directamente.

Montaje por línea de comandos:

bash
mkdir ~/webdav
mount_webdav https://webdav.yourdomain.com ~/webdav

# Unmount
umount ~/webdav

Apps WebDAV para móvil (iOS/Android)

App Plataforma Funciones Precio
Documents by Readdle iOS Gestión de documentos + WebDAV Gratis
FE File Explorer iOS/Android Soporte multiprotocolo Freemium
Solid Explorer Android Gestor de archivos de doble panel De pago
Total Commander Android Con plugin WebDAV Gratis
FX File Explorer Android Soporte WebDAV Freemium

Usuarios avanzados: sincroniza y monta con rclone

rclone es la navaja suiza de los clientes WebDAV. Gestiona sincronización, montaje y copias de seguridad con un solo binario.

bash
# Install rclone
curl https://rclone.org/install.sh | sudo bash

# Configure a WebDAV remote
rclone config
# Choose: New remote → name: webdav-remote → type: webdav → vendor: other
# URL: https://webdav.yourdomain.com
# User: webdavuser / Password: your_password

# Sync a local directory to WebDAV
rclone sync /data/source webdav-remote:backup

# Mount WebDAV as a local directory (with caching)
rclone mount webdav-remote: ~/webdav --vfs-cache-mode full

# List files
rclone ls webdav-remote:

rclone también funciona como un servidor WebDAV ligero por sí mismo — útil para proyectos secundarios donde no necesitas nginx:

bash
# Serve a local directory over WebDAV (single binary, TLS, user/pass)
rclone serve webdav /data/to/share --addr :8080 --user admin --pass secret

Paso 4: configuración avanzada y endurecimiento

Permitir/denegar por IP y limitación de tasa

nginx
# Restrict access by IP range
location / {
    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    deny all;

    # ... rest of WebDAV configuration ...
}

Limitación de tasa en el bloque http {}:

nginx
http {
    limit_req_zone $binary_remote_addr zone=webdav:10m rate=30r/s;

    location / {
        limit_req zone=webdav burst=50 nodelay;
        # ... WebDAV configuration ...
    }
}

Advertencia sobre la limitación de tasa

Los clientes WebDAV hacen muchas peticiones rápidas — PROPFIND con Depth: 1 en carpetas grandes, PUTs multiarchivo de rclone, etc. Ajusta la tasa con generosidad o acota los límites a los fallos de autenticación. La regulación más agresiva corresponde a fail2ban, no al limit_req de nginx.

Autenticación de dos factores con auth_request

Para autenticación externa (SSO, TOTP, etc.), usa el módulo auth_request — no hace falta ninguna dependencia de Lua:

nginx
# Internal auth endpoint
location /auth {
    internal;
    proxy_pass http://your-auth-service/verify;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

# Apply to WebDAV location
location / {
    auth_request /auth;
    # ... WebDAV configuration ...
}

Ajusta Nginx para subidas de archivos grandes

nginx
# In the WebDAV location block
client_max_body_size 50G;
client_body_buffer_size 256k;
client_body_timeout 600s;
client_header_timeout 300s;
keepalive_timeout 300s;
send_timeout 300s;

# Use sendfile for downloads
sendfile on;
sendfile_max_chunk 1m;
tcp_nopush on;
tcp_nodelay on;

min_delete_depth

La directiva min_delete_depth 1 (nginx ≥1.25.5) evita que las peticiones DELETE eliminen archivos de primer nivel en la raíz del recurso compartido. Es un mecanismo de seguridad útil — un cliente no puede borrar accidentalmente todo el recurso con una sola petición.

Ejecuta WebDAV en Docker

La imagen oficial nginx:alpine incluye el módulo DAV base pero no el módulo dav-ext. Montar una configuración con dav_ext_methods en nginx:alpine fallará con unknown directive "dav_ext_methods". Aquí tienes tres opciones que funcionan:

hacdias/webdav (recomendado)

Un servidor WebDAV basado en Go. 5,8k estrellas en GitHub, mantenido activamente (v5.14.2), permisos por usuario, soporte bcrypt.

yaml
# docker-compose.yml
services:
  webdav:
    image: hacdias/webdav:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:6065:6065"
    volumes:
      - ./webdav-config.yml:/config.yml:ro
      - /var/www/webdav:/data
    command: -c /config.yml

Archivo de configuración (webdav-config.yml):

yaml
address: 0.0.0.0
port: 6065
scope: /data
modify: true
rules: []
users:
  - username: webdavuser
    password: "$2a$10$..."  # bcrypt hash
    scope: /data

nginx-webdav-nononsense

Una imagen basada en nginx con dav-ext preinstalado. Más de 500K descargas en Docker Hub, funciona con el Finder de macOS y Windows 11 sin configuración extra.

yaml
# docker-compose.yml
services:
  webdav:
    image: dgraziotin/nginx-webdav-nononsense:latest
    restart: unless-stopped
    ports:
      - "443:443"
    volumes:
      - /var/www/webdav:/var/www/webdav
      - ./htpasswd:/etc/nginx/.htpasswd:ro
    environment:
      - WEBDAV_USERNAME=webdavuser
      - WEBDAV_PASSWORD=your_password

nginx:alpine + dav-ext

Para quienes quieren nginx puro en un contenedor. Requiere instalar el módulo ext dentro del contenedor.

yaml
# docker-compose.yml
services:
  webdav:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "443:443"
    volumes:
      - /var/www/webdav:/var/www/webdav
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - /etc/letsencrypt:/etc/letsencrypt:ro
    entrypoint: >
      sh -c "apk add --no-cache nginx-mod-http-dav-ext &&
             nginx -g 'daemon off;'"

Añade al nginx.conf montado, en el nivel superior:

nginx
load_module modules/ngx_http_dav_ext_module.so;

Evita bytemark/webdav

La imagen bytemark/webdav lleva más de 7 años sin actualizarse. Está basada en una configuración de Apache sin mantenimiento. Usa una de las opciones de arriba en su lugar.

Para más ideas con Docker, consulta contenedores Docker para tu home server y un gestor de archivos web autoalojado como FileBrowser.

Integra con NFS, Samba y copias de seguridad

Crea un punto de acceso unificado que combine tus recursos compartidos existentes:

bash
# Symlink NFS and Samba shares into WebDAV
sudo ln -s /srv/samba/media /var/www/webdav/media
sudo ln -s /srv/nfs/documents /var/www/webdav/documents

# Set ownership on symlinks (note -h flag)
sudo chown -h www-data:www-data /var/www/webdav/media
sudo chown -h www-data:www-data /var/www/webdav/documents

Combínalo con tu estrategia de copias de seguridad — y prueba la restauración, no solo la copia:

bash
#!/bin/bash
# webdav-backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/www/webdav/backups"

mkdir -p "$BACKUP_DIR/$DATE"

# Backup configs
cp /etc/nginx/sites-available/webdav "$BACKUP_DIR/$DATE/"
cp /etc/nginx/.htpasswd "$BACKUP_DIR/$DATE/"

# Backup content (use -l to preserve symlinks as-is)
rsync -av /var/www/webdav/documents/ "$BACKUP_DIR/$DATE/documents/"

Paso 5: monitoriza y mantén tu servidor WebDAV

Análisis de logs

bash
# Monitor access in real time
sudo tail -f /var/log/nginx/webdav_access.log

# Check for errors
sudo tail -f /var/log/nginx/webdav_error.log

# Top IPs by request count
sudo awk '{print $1}' /var/log/nginx/webdav_access.log | sort | uniq -c | sort -nr | head -20

# Recent PUT/GET activity
sudo grep -E "(PUT|GET)" /var/log/nginx/webdav_access.log | tail -20

Para una visión más amplia de la salud del servidor, mira cómo monitorizar la CPU, la memoria y el disco de tu servidor.

Script de monitorización de WebDAV
bash
#!/bin/bash
# webdav-monitor.sh

echo "=== WebDAV Server Monitor ==="
echo "Date: $(date)"
echo

echo "Nginx Status:"
sudo systemctl status nginx --no-pager -l
echo

echo "SSL Certificate Status:"
sudo certbot certificates
echo

echo "Active Connections:"
ss -tlnp | grep :443 | wc -l
echo

echo "Disk Usage:"
df -h /var/www/webdav
echo

echo "Recent Access (Last 10 entries):"
sudo tail -10 /var/log/nginx/webdav_access.log
Script de mantenimiento automatizado
bash
#!/bin/bash
# webdav-maintenance.sh

# Rotate logs
sudo logrotate /etc/logrotate.d/nginx

# Clean temp files older than 1 day
sudo find /var/www/webdav/.tmp -type f -mtime +1 -delete 2>/dev/null

# Check SSL certificate expiry
DAYS_LEFT=$(sudo certbot certificates 2>/dev/null | grep "VALID" | head -1 | grep -oP '\d+(?= days)')
if [ -n "$DAYS_LEFT" ] && [ "$DAYS_LEFT" -lt 30 ]; then
    echo "WARNING: SSL certificate expires in $DAYS_LEFT days"
fi

# Fix permissions
sudo chown -R www-data:www-data /var/www/webdav
sudo find /var/www/webdav -type d -exec chmod 755 {} \;
sudo find /var/www/webdav -type f -exec chmod 644 {} \;

Mejores prácticas de seguridad para WebDAV

Usa solo HTTPS y endurece TLS

Nunca expongas WebDAV por HTTP plano. La configuración anterior ya redirige HTTP a HTTPS y solo habilita TLS 1.2+1.3.

Para perfiles de cifrado personalizados, usa el Mozilla SSL Configuration Generator para generar una configuración acorde a tu versión de nginx. Los valores por defecto de Certbot están bien para la mayoría de los casos.

Bloquea la fuerza bruta con fail2ban o CrowdSec

bash
# Install fail2ban
sudo apt install fail2ban -y

# Create WebDAV jail
sudo nano /etc/fail2ban/jail.local
ini
[webdav]
enabled  = true
port     = 443
filter   = webdav
logpath  = /var/log/nginx/webdav_access.log
maxretry = 5
bantime  = 3600
findtime = 600

Corrección del logpath de fail2ban

Las respuestas 401 de autenticación fallida se registran en el log de acceso, no en el log de errores. Asegúrate de que logpath apunte a webdav_access.log, no a webdav_error.log. El jail no encontrará coincidencias si vigila el archivo equivocado.

Crea el filtro:

bash
sudo nano /etc/fail2ban/filter.d/webdav.conf
ini
[Definition]
failregex = ^<HOST> -.*"(GET|POST|PUT|DELETE|PROPFIND|MKCOL|COPY|MOVE|LOCK|UNLOCK)" .* (401|403) .*$
ignoreregex =

Para un enfoque más moderno, considera CrowdSec como alternativa moderna a fail2ban — comparte inteligencia de amenazas a través de una red comunitaria.

Script de copia de seguridad y restauración
bash
#!/bin/bash
# webdav-backup-config.sh

BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_ROOT="/backup/webdav-config"

mkdir -p "$BACKUP_ROOT/$BACKUP_DATE"

# Backup Nginx configuration
cp /etc/nginx/sites-available/webdav "$BACKUP_ROOT/$BACKUP_DATE/"

# Backup authentication files
cp /etc/nginx/.htpasswd* "$BACKUP_ROOT/$BACKUP_DATE/" 2>/dev/null

# Backup SSL certificates
cp -r /etc/letsencrypt "$BACKUP_ROOT/$BACKUP_DATE/"

# Create restoration script
cat > "$BACKUP_ROOT/$BACKUP_DATE/restore.sh" << 'EOF'
#!/bin/bash
set -e
sudo cp webdav /etc/nginx/sites-available/
sudo cp .htpasswd* /etc/nginx/
sudo cp -r letsencrypt /etc/
sudo nginx -t && sudo systemctl restart nginx
echo "WebDAV configuration restored"
EOF

chmod +x "$BACKUP_ROOT/$BACKUP_DATE/restore.sh"
echo "Backup completed: $BACKUP_ROOT/$BACKUP_DATE"

Prueba la restauración — ejecuta el script de restauración en un servidor de staging o en un contenedor antes de necesitarlo en producción.

Mantén Nginx parcheado

Mantente al día con los parches

CVE-2026-27654 no es la única corrección de seguridad de nginx en 2026. Comprueba tu versión con regularidad:

nginx -v
Si usas el paquete de la distro, las actualizaciones de seguridad llegan con apt upgrade / dnf update. Si usas el repo de nginx.org, sigue sus anuncios de versiones. En cualquier caso, no ejecutes un nginx sin parchear expuesto a internet.

Resolución de problemas comunes de WebDAV

405 Method Not Allowed

El módulo WebDAV no está cargado o los métodos no están configurados.

bash
# Verify module
nginx -V 2>&1 | grep dav

# Check config syntax
sudo nginx -t

# Test methods
curl -X OPTIONS https://webdav.yourdomain.com/ -u webdavuser:password -v

Fallos de autenticación

bash
# Check password file exists and is readable
ls -la /etc/nginx/.htpasswd

# Test auth with curl
curl -X GET https://webdav.yourdomain.com/ -u webdavuser:password -v

# Reset a user's password
sudo htpasswd -B /etc/nginx/.htpasswd webdavuser

Problemas de SSL/TLS

bash
# Test SSL handshake
openssl s_client -connect webdav.yourdomain.com:443 -servername webdav.yourdomain.com

# Check certificate validity
sudo certbot certificates

# Force renewal
sudo certbot renew --force-renewal -d webdav.yourdomain.com

Errores específicos de Windows

  • 0x80070043 “The network name cannot be found”: inicia el servicio WebClient (net start WebClient), verifica que la URL use HTTPS y comprueba que el servidor responde a peticiones OPTIONS.
  • “The user has not been authenticated”: Windows bloquea la autenticación básica sobre HTTP por defecto. Usa HTTPS.
  • ¿Sigue fallando?: usa RaiDrive, Cyberduck o WinSCP en lugar del Explorador de Windows.

Problemas del Finder de macOS

  • Montaje de solo lectura: el servidor no está anunciando DAV: 2. Añade las directivas dav_ext_lock_zone y dav_ext_lock del paso 2.
  • Errores MKCOL 409: el workaround para el MKCOL del Finder de macOS ya está en la configuración principal de arriba.

Permiso denegado por SELinux (RHEL/Fedora)

Si PROPFIND devuelve 500 en sistemas de la familia RHEL, lo más probable es que SELinux esté impidiendo que nginx lea el directorio WebDAV.

bash
# Set the correct SELinux context
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/webdav(/.*)?"
sudo restorecon -Rv /var/www/webdav

# Verify
ls -laZ /var/www/webdav/

SELinux bloquea PROPFIND

Revisa /var/log/audit/audit.log buscando entradas avc: denied relacionadas con nginx. El viejo consejo de usar httpd_exec_t es incorrecto para directorios de datos — usa httpd_sys_rw_content_t en su lugar.

Subida/descarga lenta

nginx
# Increase buffer sizes
client_body_buffer_size 256k;
large_client_header_buffers 4 256k;

# Optimize workers
worker_processes auto;
worker_connections 1024;

# Enable HTTP/2 (use the directive, not the deprecated listen parameter)
http2 on;

Casos de uso y ejemplos de integración

Configuración para trabajo remoto

Crea una ubicación de trabajo dedicada con sus propias credenciales:

nginx
location /work {
    alias /var/www/webdav/work;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
    dav_ext_lock zone=davlock;
    dav_access user:rw group:rw all:r;
    create_full_put_path on;

    auth_basic "Work Files";
    auth_basic_user_file /etc/nginx/.htpasswd-work;
}

Para acceso con restricción horaria, usa reglas de fail2ban o listas blancas de IP en lugar de comprobaciones de hora basadas en Lua — más sencillo y sin dependencia de módulos extra.

Copia de seguridad de fotos desde el móvil

nginx
location /photos {
    alias /var/www/webdav/photos;
    dav_methods PUT MKCOL;
    dav_ext_methods PROPFIND OPTIONS;
    dav_access user:rw group:rw all:r;
    create_full_put_path on;

    # Allow large image uploads
    client_max_body_size 100M;

    auth_basic "Photo Backup";
    auth_basic_user_file /etc/nginx/.htpasswd-photos;
}

Endpoint unificado con NFS y Samba

Combina WebDAV con los recursos compartidos de archivos de tu home server existente:

bash
# Create unified access point
sudo mkdir -p /var/www/webdav/unified
sudo ln -s /srv/nfs/media /var/www/webdav/unified/media-nfs
sudo ln -s /srv/samba/documents /var/www/webdav/unified/docs-samba
sudo ln -s /var/lib/docker/volumes /var/www/webdav/unified/container-data

# Set permissions on symlinks
sudo chown -h www-data:www-data /var/www/webdav/unified/*

Esto crea un único endpoint WebDAV que da acceso a archivos de tus configuraciones de NFS, Samba y contenedores Docker.

Conclusión

WebDAV con Nginx te da acceso remoto seguro a los archivos y complementa tu infraestructura de archivos compartidos existente. A diferencia de NFS, que funciona mejor en redes locales, o Samba para compartir en local entre plataformas, WebDAV gestiona el acceso remoto a través de firewalls y NAT.

En mi mini PC N100, WebDAV sirve de puente para acceder a los archivos en remoto mientras los protocolos locales cubren el acceso en la red interna. Ejecutar los tres protocolos cubre todo, desde el streaming de medios en local hasta el acceso remoto seguro a documentos.

Empieza con la funcionalidad básica — pon primero en marcha SSL y la autenticación, luego añade el bloqueo, fail2ban y controles de acceso personalizados según los necesites. Si expones WebDAV a internet, mantén nginx parcheado y considera CrowdSec para el bloqueo automatizado de amenazas. Para acceso solo personal, una VPN como autoalojar tu propio servidor de control de Tailscale suele ser la mejor opción — elimina por completo la superficie de ataque pública.

Para más información sobre cómo montar un home server completo, consulta mis guías sobre monitorización de servidores y los mejores mini PCs para home servers.

Despliega tu servidor WebDAV