# Servidor FTP

ProFTPD és un servidor FTP de codi obert, molt configurable i robust, àmpliament usat en entorns GNU/Linux. Suporta connexions segures via TLS/SSL, hosts virtuals, xroot per usuari i autenticació flexible.

![ProFTPD logo](https://proferamon.com/tic/imatges/proftpd/proftpd01.png)

# 1. Prepara el sistema

Abans d'instal·lar res, actualitza el sistema:

```bash
sudo apt update
sudo apt upgrade -y
```

# 2. Instal·la ProFTPD

ProFTPD es troba als dipòsits oficials d'Ubuntu:

```bash
sudo apt install proftpd -y
```

Verifica que el servei s'ha iniciat correctament:

```bash
sudo systemctl status proftpd
```

Gestió bàsica del servei:

```bash
sudo systemctl start proftpd       # Iniciar
sudo systemctl stop proftpd        # Aturar
sudo systemctl restart proftpd     # Reiniciar
sudo systemctl enable proftpd      # Activar a l'arrencada
sudo systemctl disable proftpd     # Desactivar a l'arrencada
```

# 3. Fitxer de configuració principal

El fitxer de configuració es troba a `/etc/proftpd/proftpd.conf`. Fes sempre una còpia de seguretat abans de modificar-lo:

```bash
sudo cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.bak
```

Obre'l per editar-lo:

```bash
sudo nano /etc/proftpd/proftpd.conf
```

# 4. Opcions de configuració principals

A continuació es descriu un fitxer de configuració complet amb les opcions més importants comentades:

```ini
# Nom del servidor (visible als clients FTP)
ServerName                      "Servidor FTP Exemple"

# Tipus d'arrencada (standalone o inetd)
ServerType                      standalone

# Adreça IP on escolta (0.0.0.0 = totes les interfícies)
# ServerAddress                 192.168.1.100

# Port FTP estàndard
Port                            21

# Usuari i grup amb els quals s'executa el dimoni
User                            proftpd
Group                           nogroup

# Nombre màxim de connexions simultànies
MaxInstances                    30

# Màxim d'intents d'autenticació fallits per connexió
MaxLoginAttempts                3

# Temps d'inactivitat màxim (en segons) abans de tancar la sessió
TimeoutIdle                     600

# Temps màxim per completar l'autenticació
TimeoutLogin                    120

# Temps màxim sense transferència activa
TimeoutNoTransfer               300

# Confinament de cada usuari al seu directori home (chroot)
DefaultRoot                     ~

# No cal que l'usuari tingui una shell vàlida al sistema
RequireValidShell               off

# Ports per al mode passiu (PASV) — cal obrir-los al tallafocs
PassivePorts                    49152 65534

# IP pública del servidor per al mode passiu (si hi ha NAT)
# MasqueradeAddress             203.0.113.10

# Registre d'accessos i transferències
TransferLog                     /var/log/proftpd/xferlog
SystemLog                       /var/log/proftpd/proftpd.log

# Format del registre de transferències (compatible amb wu-ftpd)
WtmpLog                         off

# Oculta l'usuari i grup reals dels fitxers (mostra "ftp ftp")
DirFakeUser                     on  ftp
DirFakeGroup                    on  ftp

# Deshabilita la resolució DNS inversa (millora el rendiment)
UseReverseDNS                   off

# Identd (normalment es desactiva)
IdentLookups                    off

# Amaga la versió de ProFTPD a la benvinguda
ServerIdent                     on "FTP Server ready."

# Missatge de benvinguda
# DisplayLogin                  /etc/proftpd/welcome.txt

# Missatge en entrar a un directori (fitxer .message dins cada dir)
DisplayChdir                    .message true

# Permet reprendre transferències interrompudes
AllowRetrieveRestart            on
AllowStoreRestart               on

# Límit de velocitat de pujada i baixada (en bytes/segon, 0 = sense límit)
# TransferRate                  RETR 102400   # 100 KB/s baixada
# TransferRate                  STOR 51200    # 50 KB/s pujada

# Permisos per defecte dels fitxers pujats (màscara umask)
Umask                           022

# Bloc de permisos per al directori arrel
<Directory />
  AllowOverwrite                on
</Directory>

# Accés anònim (desactivat per defecte — descomenta per activar)
# <Anonymous /home/ftp>
#   User                        ftp
#   Group                       nogroup
#   UserAlias                   anonymous ftp
#   MaxClients                  10
#   DisplayLogin                welcome.msg
#   DisplayChdir                .message
#   <Limit WRITE>
#     DenyAll
#   </Limit>
# </Anonymous>
```

Després de qualsevol canvi, reinicia el servei:

```bash
sudo systemctl restart proftpd
```

# 5. Crea usuaris FTP

Per seguretat, es recomana crear usuaris dedicats per a l'FTP, sense accés a la shell del sistema.

## Usuari bàsic

```bash
# Crea l'usuari sense shell de login
sudo adduser --shell /usr/sbin/nologin ftpusuari

# Crea l'estructura de directoris FTP
sudo mkdir -p /home/ftpusuari/ftp/fitxers
sudo chown nobody:nogroup /home/ftpusuari/ftp
sudo chmod a-w /home/ftpusuari/ftp          # El directori arrel no ha de ser escrivible
sudo chown ftpusuari:ftpusuari /home/ftpusuari/ftp/fitxers
```

## Afegeix l'usuari a la llista d'usuaris permesos

Edita `/etc/ftpusers` — aquest fitxer conté els usuaris que **no** poden accedir per FTP. Assegura't que el teu usuari **no** hi apareix:

```bash
cat /etc/ftpusers
```

## Limita l'accés a usuaris concrets

Edita el fitxer de configuració:

```bash
sudo nano /etc/proftpd/proftpd.conf
```

Afegeix al `proftpd.conf`:

```nano
# Permet accés només als usuaris llistats
<Limit LOGIN>
  AllowUser ftpusuari
  AllowUser altreUsuari
  DenyAll
</Limit>
```

# 6. Configura el tallafocs (UFW)

```bash
# Obre el port FTP de control
sudo ufw allow 21/tcp

# Obre el rang de ports per al mode passiu
sudo ufw allow 49152:65534/tcp

# Aplica els canvis
sudo ufw reload

# Comprova l'estat
sudo ufw status
```

# 7. Xifrat TLS/SSL (FTPS)

## 7.1. Genera un certificat autosignat

```bash
sudo openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/ssl/private/proftpd.key \
  -out /etc/ssl/certs/proftpd.crt

# Ajusta els permisos
sudo chmod 600 /etc/ssl/private/proftpd.key
sudo chmod 644 /etc/ssl/certs/proftpd.crt
```

## 7.2. Activa el mòdul TLS

```bash
sudo nano /etc/proftpd/proftpd.conf
```

Assegura't que la línia següent no estigui comentada:

```nano
Include /etc/proftpd/tls.conf
```

## 7.3. Configura el fitxer TLS

```bash
sudo nano /etc/proftpd/tls.conf
```

Contingut recomanat:

```nano
<IfModule mod_tls.c>
  # Activa el motor TLS
  TLSEngine                     on

  # Registre TLS
  TLSLog                        /var/log/proftpd/tls.log

  # Protocols acceptats (TLSv1.2 i TLSv1.3 — descarta versions antigues)
  TLSProtocol                   TLSv1.2 TLSv1.3

  # Certificat i clau privada
  TLSRSACertificateFile         /etc/ssl/certs/proftpd.crt
  TLSRSACertificateKeyFile      /etc/ssl/private/proftpd.key

  # No requereix certificat del client
  TLSVerifyClient               off

  # Obliga a usar TLS (canvia a "off" per permetre connexions no xifrades)
  TLSRequired                   on

  # Opcions addicionals
  TLSOptions                    NoSessionReuseRequired NoCertRequest
</IfModule>
```

Reinicia el servei:

```bash
sudo systemctl restart proftpd
```



# 8. Hosts virtuals (VirtualHost)

ProFTPD permet tenir múltiples servidors FTP en una mateixa màquina, cadascun amb la seva pròpia IP o configuració:

```apache
<VirtualHost 192.168.1.200>
  ServerName          "Servidor FTP Secundari"
  Port                21
  DefaultRoot         /var/ftp/segon
  MaxClients          5
  TransferLog         /var/log/proftpd/vhost2_xfer.log
</VirtualHost>
```



# 9. Quotes de disc per usuari

Instal·la el mòdul de quotes:

```bash
sudo apt install proftpd-mod-quotatab -y
```

Edita el fitxer de configuració `proftpd.conf`:

```bash
sudo nano /etc/proftpd/proftpd.conf
```

Afegeix al `proftpd.conf`:

```nano
<IfModule mod_quotatab.c>
  QuotaEngine               on
  QuotaLog                  /var/log/proftpd/quota.log
</IfModule>

<IfModule mod_quotatab_file.c>
  QuotaLimitTable           file:/etc/proftpd/ftpquota.limittab
  QuotaTallyTable           file:/etc/proftpd/ftpquota.tallytab
</IfModule>
```

Crea les taules i assigna quotes:

```bash
# Inicialitza les taules
sudo ftpquota --create-table --type=limit  --table-path=/etc/proftpd/ftpquota.limittab
sudo ftpquota --create-table --type=tally  --table-path=/etc/proftpd/ftpquota.tallytab

# Assigna quota a un usuari (500 MB de pujada, 1 GB total)
sudo ftpquota --add-record --type=limit --name=ftpusuari --quota-type=user \
  --bytes-upload=524288000 --bytes-download=0 --bytes-xfer=1073741824
```


# 10. Confina usuaris

En el context de ProFTPD (i servidors FTP en general), **engabiar** un usuari significa **confinar-lo al seu directori home**, de manera que no pugui navegar per la resta del sistema de fitxers.

## La directiva `DefaultRoot`

La manera més senzilla amb ProFTPD és afegir al `proftpd.conf`:

```ini
DefaultRoot ~
```

El símbol `~` significa "el directori home de cada usuari". Un cop connectat, l'usuari veu `/`, però en realitat és el seu `/home/ftpusuari/` — no pot pujar més amunt.

## Engabia un usuari concret

```ini
DefaultRoot /var/ftp/ftpusuari  ftpusuari
```

O per a un grup específic:

```ini
DefaultRoot ~  ftpgroup
```

Qualsevol usuari que **no** sigui del grup `ftpgroup` no quedarà confinat.

## Estructura de directoris recomanada

ProFTPD exigeix que el **directori arrel de la gàbia no sigui escrivible** per l'usuari:

```bash
# Directori arrel de la jaula (propietat de root, no escrivible per l'usuari)
sudo mkdir -p /home/ftpusuari/ftp
sudo chown root:root /home/ftpusuari/ftp
sudo chmod 755 /home/ftpusuari/ftp

# Subdirectori on l'usuari sí que pot pujar fitxers
sudo mkdir /home/ftpusuari/ftp/fitxers
sudo chown ftpusuari:ftpusuari /home/ftpusuari/ftp/fitxers
```

I al `proftpd.conf`:

```nano
DefaultRoot /home/ftpusuari/ftp  ftpusuari
```

## Verificació

Un cop connectat, si l'usuari intenta fer `cd ..` des de l'arrel, el servidor li retornarà un error o simplement no es mourà. La gàbia funciona correctament.


# 11. Registres i monitoratge

## Fitxers de log principals

| Fitxer | Contingut |
|---|---|
| `/var/log/proftpd/proftpd.log` | Connexions, errors generals |
| `/var/log/proftpd/xferlog` | Registre de transferències |
| `/var/log/proftpd/tls.log` | Esdeveniments TLS/SSL |

## Consulta els logs en temps real

```bash
sudo tail -f /var/log/proftpd/proftpd.log
sudo tail -f /var/log/proftpd/xferlog
```

## Amb journalctl

```bash
sudo journalctl -u proftpd -f              # Seguiment en temps real
sudo journalctl -u proftpd --since today   # Logs d'avui
```

# 12. Resol problemes habituals

| Problema | Causa probable | Solució |
|---|---|---|
| Error 530 Login incorrect | Usuari a `/etc/ftpusers` o sense permisos | Comprova `/etc/ftpusers` i la directiva `<Limit LOGIN>` |
| No es pot connectar en mode passiu | Ports PASV tancats al tallafocs | Obre el rang `49152:65534/tcp` a UFW |
| Error de certificat TLS | Certificat autosignat no acceptat | Accepta l'excepció al client FTP (FileZilla, etc.) |
| L'usuari pot veure tot el sistema | `DefaultRoot ~` absent o comentat | Assegura't que `DefaultRoot ~` estigui actiu |
| ProFTPD no arrenca | Error de sintaxi al config | Executa `sudo proftpd --configtest` |

## Verifica la configuració

```bash
sudo proftpd --configtest
```

# 13. Connecta des d'un client (FileZilla)

| Camp | Valor |
|---|---|
| Protocol | FTP - Protocol de transferència de fitxers |
| Amfitrió | IP o domini del servidor |
| Port | 21 |
| Xifratge | Requereix FTP explícit sobre TLS |
| Tipus d'entrada | Normal |
| Usuari | ftpusuari |
| Contrasenya | (la configurada) |

![Configuració a FileZilla](https://proferamon.com/tic/imatges/proftpd/proftpd02.png "Configuració a FileZilla")

# 14. Resum de fitxers importants

| Fitxer / Directori | Descripció |
|---|---|
| `/etc/proftpd/proftpd.conf` | Configuració principal |
| `/etc/proftpd/tls.conf` | Configuració TLS/SSL |
| `/etc/ftpusers` | Usuaris que **no** poden usar FTP |
| `/etc/ssl/certs/proftpd.crt` | Certificat TLS |
| `/etc/ssl/private/proftpd.key` | Clau privada TLS |
| `/var/log/proftpd/` | Directori de registres |

#### Versions d'aquest document

+ HTML - [proftpd.html](https://proferamon.com/tic/proftpd.html)
+ PDF - [proftpd.pdf](https://proferamon.com/tic/docs/proftpd.pdf)
+ ODT - [proftpd.odt](https://proferamon.com/tic/odt/proftpd.odt)
+ MD - [proftpd.md](https://proferamon.com/tic/md/proftpd.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

