FTP einrichten unter Debian

Zuletzt aktualisiert am 22. Dezember 2025 von Lars

Schritt-für-Schritt Anleitung, damit vsftpd auf Port 21 nur eine einzelne IP akzeptiert.

Dieser Artikel dient im Wesentlichen als Installationsanleitung für einen von mir betriebenen Server für Backups von Websites. Vielleicht aber auch hilfreich für den ein oder anderen.

vsftpd Paket installieren

$ sudo apt update
$ sudo apt install -y vsftpd

Service stoppen (für Änderungen)

$ sudo systemctl stop vsftpd

vsftpd Basis-Konfiguration anpassen

Erstelle eine /etc/vsftpd.conf oder passe diese entsprechend an:

$ sudo vim /etc/vsftpd.conf
# vsftpd.conf

listen=YES
listen_ipv6=NO

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES


# Passive Mode (optional, falls NAT/Firewall)
pasv_min_port=30000
pasv_max_port=30100

# Logging
xferlog_enable=YES
log_ftp_protocol=YES
xferlog_file=/var/log/vsftpd.log

# Sicherheit
ssl_enable=NO
listen=YES

listen=YES

  • sftpd startet als eigenständiger Daemon und hört auf einem IPv4-Sock.
  • Werte: YES / NO.

listen_ipv6=NO

  • Bedeutet: keine IPv6-Listener aufbauen.
  • Werte: YES / NO.

anonymous_enable=NO

  • Bedeutet: anonyme Logins (ftp / Gastaccount) sind deaktiviert.
  • Werte: YES / NO.
  • Empfehlung: in Produktivbetrieb fast immer NO.

local_enable=YES

  • Bedeutet: lokale Systembenutzer dürfen sich anmelden (Accounts aus /etc/passwd).
  • Werte: YES / NO.
  • Wenn NO, können nur anonyme/andere Mechanismen genutzt werden.

write_enable=YES

  • Bedeutet: Schreiboperationen über FTP sind erlaubt (STOR, DELE, RNFR/RNTO, etc.).
  • Werte: YES / NO.
  • Achtung: erlaubt Uploads/Löschungen — kombiniert mit passenden Dateisystem-Rechten absichern.

chroot_local_user=YES

  • Bedeutet: alle lokalen User werden ins Home-Verzeichnis „gechrootet“ (Sicht/Root auf dieses Verzeichnis beschränkt).
  • Werte: YES / NO.
  • Sicherheit: verhindert Ausbruch aus Home-Verzeichnis, wichtig für Multi-User-FTP. Wenn NO, kannst du einzelne Benutzer mit chroot_list_enable/chroot_list_file behandeln.

allow_writeable_chroot=YES

  • Zweck: erlaubt ein chroot auch wenn das Home-Verzeichnis für den Benutzer schreibbar ist.
  • Hintergrund: vsftpd verweigert standardmässig chroot auf schreibbare Homes (Sicherheitsmassnahme). Mit dieser Option wird das Verhalten aufgehoben.

pasv_min_port=30000

  • Legt die untere Grenze des passiven Portbereichs fest. Passive Datenverbindungen nutzen Ports aus diesem Bereich.
  • Muss zusammen mit pasv_max_port verwendet werden.

pasv_max_port=30100

  • Obere Grenze des passiven Portbereichs. In diesem Beispiel stehen 101 Ports (30000–30100) zur Verfügung.
  • Wichtig: diesen Bereich in Firewall/NAT freigeben (und ggf. am Router weiterleiten). Sonst funktionieren passive Übertragungen nicht.

xferlog_enable=YES

  • Aktiviert das klassische xferlog-Logging (Aufzeichnungen von Dateiübertragungen).
  • Output: typischerweise /var/log/xferlog oder durch xferlog_file gesetzt.

log_ftp_protocol=YES

  • Aktiviert detailliertes Protokoll-Logging der FTP-Befehle/Antworten (nützlich für Audit/Debug).
  • Hinweis: erzeugt viel mehr Logeinträge; Log-Rotation und Platzbedarf beachten.

xferlog_file=/var/log/vsftpd.log

  • Legt die Logdatei für den Transfer-Log fest. Standardpfad kann abweichen; hier explizit auf vsftpd.log gesetzt.
  • Stelle sicher, dass der vsftpd-Prozess Schreibrechte für diese Datei/Verzeichnis hat und Logrotation konfiguriert ist (z. B. logrotate).

ssl_enable=NO

  • Deaktiviert TLS/SSL für FTP (keine FTPS-Verschlüsselung).
  • Werte: YES / NO.
  • Sicherheitsfolge: Login-Daten und Dateitransfer laufen unverschlüsselt über das Netz — nicht empfohlen über untrusted Netzwerke/Internet. Empfehlung: ssl_enable=YES + Zertifikate (rsa_cert_file, rsa_private_key_file) oder besser: SFTP (über SSH) verwenden, falls möglich.

Fail2Ban für vsftpd installieren und aktivieren

Installation

$ sudo apt update
$ sudo apt install fail2ban

Jail konfigurieren

$ sudo vim /etc/fail2ban/jail.local
[vsftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 3600

enabled = true → Jail aktivieren

port → welche Ports überwacht werden

filter → Name des Filter-Files (Filter überprüft Logeinträge auf fehlgeschlagene Logins)

logpath → Pfad zum vsftpd-Logfile

maxretry → Anzahl der Fehlversuche, bevor gesperrt wird

bantime → Sperrdauer in Sekunden

Filter definieren, bzw. überprüfen

$ sudo vim /etc/fail2ban/filter.d/vsftpd.conf

Die meisten Installationen bringen bereits eine passende Filterregel mit und diese muss nicht editiert werden.

Beispiel

[Definition]
failregex = ^%(__prefix_line)sFAIL LOGIN:.*\sfrom $
ignoreregex =

Fail2Ban neustarten

$ sudo systemctl restart fail2ban
$ sudo systemctl enable fail2ban

Status prüfen

$ sudo fail2ban-client status vsftpd

Gibt es einen Fehler weite prüfen mit

$ sudo systemctl status fail2ban

Hier kam eine Fehlermeldung bei mir betreffend Log-File. Nachdem ich /var/log/auth.log und die vsftpd-Log /var/log/vsftpd.log als Root neu angelegt habe, konnte ich fail2ban starten.

Die Ausgabe sollte dann so aussehen

$ sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-11-17 16:46:09 UTC; 2s ago
Docs: man:fail2ban(1)
Process: 2668 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 2669 (fail2ban-server)
Tasks: 7 (limit: 1132)
Memory: 13.6M
CPU: 879ms
CGroup: /system.slice/fail2ban.service
└─2669 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Ausflug externe Disk mounten

Ich habe den FTP-Server auf einem einfachen Radxa Rock Minicomputer installiert. Als Speicher habe ich eine externe Disk angehängt.

Angeschlossene Laufwerke zeigen

Führe folgenden Befehl aus, um die Liste der angeschlossenen Laufwerke anzuzeigen:

$ lsblk -f

Meine Ausgabe

NAME        FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                 
└─sda1      ext4   1.0          1f9c75d6-10fc-40e9-b248-a89667d5c509                
mmcblk0                                                                             
├─mmcblk0p1 vfat   FAT16 config 0B8E-9AD4                              15.5M     2% /config
├─mmcblk0p2 vfat   FAT16 efi    0B8F-301D                             299.8M     0% /boot/efi
└─mmcblk0p3 ext4   1.0   rootfs af7f59ac-222f-4ce8-a7c9-c4acad6e2322   50.9G     8% /
zram0                                                                               [SWAP]

Suche nach deiner SSD (hier zum Beispiel sda1).

Angeschlossene Laufwerke zeigen

Mount-Verzeichnis erstellen

Erstelle das Verzeichnis /mnt/data/, falls es noch nicht existiert:

$ sudo mkdir -p /mnt/data/

SSD mounten

sudo mount /dev/sdX1 /mnt/data/

Automatisches Mounten beim Systemstart

Falls die SSD dauerhaft gemountet bleiben soll, muss sie in die /etc/fstab eingetragen werden.

Ermittle die UUID der SSD

$ sudo blkid

Meine Ausgabe

$ sudo blkid
/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL_FATBOOT="config" LABEL="config" UUID="0B8E-9AD4" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="primary" PARTUUID="f6b87944-2a66-48d0-ae56-90e5b8f0572e"
/dev/mmcblk0p2: SEC_TYPE="msdos" LABEL_FATBOOT="efi" LABEL="efi" UUID="0B8F-301D" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="primary" PARTUUID="98b1a07f-1d9c-4a34-a6d3-f8b9a3b20388"
/dev/mmcblk0p3: LABEL="rootfs" UUID="af7f59ac-222f-4ce8-a7c9-c4acad6e2322" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="1603df89-a900-4d29-a49c-4eabf2dae4aa"
/dev/sda1: UUID="1f9c75d6-10fc-40e9-b248-a89667d5c509" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="442e675f-01"
/dev/zram0: UUID="6f1c125d-be7d-4cdf-881d-6824b6e195f6" TYPE="swap"
$ sudo vim /etc/fstab

Ergänze analog zum Beispiel oben (/dev/sda1) ist ja meine SSD

UUID=1f9c75d6-10fc-40e9-b248-a89667d5c509 /mnt/data/ ext4 defaults 0 2

Achtung. Wenn hier ein Fehler passiert, dann kann es sein, dass dein Rechner nicht mehr bootet. Dann bleibt nur noch über das Notsystem zu booten und die Zeile aus der /etc/fstab wieder zu löschen

Teste das automatische Mounten mit

$ sudo reboot

Nach einem Neustart solltest du mittels

$ df -h

die SSD sehen.

Ausgabe bei mir:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            472M  8.0K  472M   1% /dev
tmpfs            98M  1.0M   97M   2% /run
/dev/mmcblk0p3   59G  4.8G   51G   9% /
tmpfs           490M     0  490M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1   16M  402K   16M   3% /config
/dev/mmcblk0p2  300M     0  300M   0% /boot/efi
tmpfs            98M   44K   98M   1% /run/user/106
tmpfs            98M   40K   98M   1% /run/user/1000
/dev/sda1       458G   79G  356G  19% /mnt/data

Bei mir ist die letzte Zeile die 500 GB SSD. Nach einem Neustart kann die Reihenfolge unterschiedlich sein.

Benutzer anlegen und Home-Verzeichnis auf externe Platte legen

Wenn du möchtest, dass die FTP-Benutzer z. B. in /mnt/data/ftp-schlageterli landen:

Benutzer anlegen mit speziellem Homeverzeichnis und Passwort festlegen

$ sudo useradd -m -d /mnt/data/ftp-schlageterli ftp-schlageterli
$ sudo passwd ftp-schlageterli
New password: 
Retype new password: 
passwd: password updated successfully

Zugriff mit iptables einschränken

iptables installieren

iptables ist auf den meisten Linux-Distributionen bereits vorinstalliert. Falls es bei dir nicht vorhanden ist, kannst du es einfach nachinstallieren.

Öffne ein Terminal und gib folgenden Befehl ein:

$ sudo apt update
$ sudo apt install iptables

Standardmässig gehen deine iptables-Regeln nach einem Neustart verloren. Um sie dauerhaft zu speichern, benötigst du ein zusätzliches Paket:

$ sudo apt install iptables-persistent

Port 21 nur für bestimmte Ips zulassen (192.0.2.1 und 198.51.100.1)

$ sudo iptables -I INPUT -p tcp -s 192.0.2.1 --dport 21 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -s 198.51.100.1 --dport 21 -j ACCEPT
$ sudo iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 21 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 21 -j DROP

Dauerhaft speichern

$ sudo netfilter-persistent save

Regeln überprüfen

$ sudo iptables -L INPUT -n -v

Weitere Regeln muss ich hier nicht sperren, da ich auf den Server nur über 21 von aussen zugreifen kann.

vsftpd Dienst

Status von vsftpd abfragen

Führe diesen Befehl aus, um den aktuellen Status des vsftpd-Dienstes zu überprüfen:

$ sudo systemctl status vsftpd

vsftpd starten

Falls der Dienst nicht läuft, kannst du ihn mit diesem Befehl starten:

$ sudo systemctl start vsftpd

vsftpd automatisch starten (beim Systemstart)

Damit vsftpd automatisch beim Booten startet, aktiviere den Dienst:

$ sudo systemctl enable vsftpd

Sonstiges

Ich habe ausserdem für Skripts auch lsftpd installiert.

Zeit gespart? Dann unterstütze doch it-zeugs.de

Wenn dieser Tipp dir geholfen hat, Zeit zu sparen, überlege bitte, eine kleine Spende zu hinterlassen. Dein Beitrag hilft mir, weiterhin wertvolle Inhalte zu erstellen. Du kannst unter diesem Linke spenden: Spende it-zeugs.de

Falld du nicht spenden willst oder kannst, dann wäre es toll, wenn du deinen nächsten Amazon Einkauf mit diesem Link beginnen würdest: Amazon Link. Für dich wird es nicht teurer, ich bekomme aber einen kleinen Beitrag.

Vielen herzlichen Dank ❤️

Schreibe einen Kommentar