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.
Inhaltsverzeichnis
vsftpd Paket installieren
$ sudo apt update
$ sudo apt install -y vsftpdService stoppen (für Änderungen)
$ sudo systemctl stop vsftpdvsftpd 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=YESlisten=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 mitchroot_list_enable/chroot_list_filebehandeln.
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_portverwendet 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/xferlogoder durchxferlog_filegesetzt.
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 fail2banJail 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 = 3600enabled = 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.confDie 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 fail2banStatus prüfen
$ sudo fail2ban-client status vsftpdGibt es einen Fehler weite prüfen mit
$ sudo systemctl status fail2banHier 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 startAusflug 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 -fMeine 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 blkidMeine 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/fstabErgänze analog zum Beispiel oben (/dev/sda1) ist ja meine SSD
UUID=1f9c75d6-10fc-40e9-b248-a89667d5c509 /mnt/data/ ext4 defaults 0 2Achtung. 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 rebootNach einem Neustart solltest du mittels
$ df -hdie 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/dataBei 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 successfullyZugriff 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 iptablesStandardmä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-persistentPort 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 DROPDauerhaft speichern
$ sudo netfilter-persistent saveRegeln überprüfen
$ sudo iptables -L INPUT -n -vWeitere 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 vsftpdvsftpd starten
Falls der Dienst nicht läuft, kannst du ihn mit diesem Befehl starten:
$ sudo systemctl start vsftpdvsftpd automatisch starten (beim Systemstart)
Damit vsftpd automatisch beim Booten startet, aktiviere den Dienst:
$ sudo systemctl enable vsftpdSonstiges
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 ❤️

Hallo, hier schreibt Lars. Dipl-Ing. Ingenieurinformatik (FH). Seit Jahrzehnten in der IT tätig. Geprüfter (und begeisterter) Webmaster. Ebenso begeisterter Windows-, Apple-, und Office-User. Ich schreibe über alle möglichen Themen rund um IT. Mehr über mich erfährst du hier: Über mich. Danke für deinen Besuch!
