Tag Archives: ftp

Du bist Deutschland. Ich bin Frankreich.

Wie bereits im Artikel zum Archiv für große Daten geschrieben, betreibe ich einen Spiegelserver für Kali Linux. Viel tat sich bis vor kurzem nicht, die Auslastung lag bei circa 3,5 MBit/sec durchschnittlich.

Das hat sich gestern um 11:30 Uhr CET geändert. Seitdem sieht die Auslastung des Mirrors wie folgt aus:

if_eth0-week

Fast durchgängig werden 100 Mbit/sec im Upload erreicht. Ist das ein Denial of Service Angriff? Nein. Der kleine 3,99 Euro Server ist jetzt zuständig für ganz Frankreich. Wow.

Große Datenbestände mit lftp synchronisieren

Im letzten Artikel zum File Transfer Protocol wurde die moderne Einrichtung eines FTP-Servers vorgestellt. Jetzt soll ein Verzeichnis des FTP-Servers mit einem lokalen Server synchronisiert werden.

Besonders der Maximaldurchsatz soll dabei errreicht werden. Dazu bieten viele Windows FTP-Clients zwei Modi an.

  • Segmentiert
    bedeutet, dass eine Datei in logische Abschnitte geteilt und mit mehreren Verbindungen heruntergeladen und auf dem Zielcomputer zusammengesetzt wird.
  • Threaded
    bedeutet mehrere Dateien gleichzeitig über mehrere Datenverbindungen herunterzuladen.

Sowohl Threaded wie auch Segmented Übertragungen sollen gegebenfalls vorhandene Durchsatzprobleme bei Verwendung einer einzigen Verbindung umgehen. Das geht doch auch mit Linux?

Im folgenden wird ein Skript vorgestellt, dass lftp so in einer screen Sitzung startet, dass die Vorteile der Segmented und Threaded Verfahren zusammen mit den Vorteilen einer Hintergrundsitzung bietet. Dabei kommt der FTP-Client lftp zum Einsatz, der sich zur Automatisierung besonders gut eignet, weil er umfangreiche Konfigurationsmöglichkeiten bietet.

lftp Konfigurieren

Zuerst muss die notwendige Software installiert werden.

apt-get install lftp screen

Bevor das Skript eingesetzt werden kann, muss lftp konfiguriert werden, indem im Verzeichnis ~/.lftp/ des ausführenden Benutzers eine Datei rc mit folgendem Inhalt angelegt wird.

# GENERAL
set color:use-color true

# FTP
set ftp:list-options -a
set ftp:passive-mode true
# Send multiple commands async.
set ftp:sync-mode false

# SEGMENTED
set pget:default-n 4
set pget:save-status 30

# DIRECTORES
set mirror:order "*.txt [rR]eadme"
set mirror:use-pget-n 4
set mirror:parallel-transfer-count 2
set mirror:parallel-directories true

# Always SSL!
set ftp:ssl-force true

# Foreground cmds first!
set net:connection-takeover true
# Disconnect after 30mins idle!
set net:idle 1800
# Max 32 connections to everywhere!
set net:connection-limit 32

Synchronisations-Skript

Das folgende Skript synchronisiert das Verzeichnis REMOTE_DIR mit dem Verzeichnis LOCAL_DIR. Dafür wird eine screen Sitzung mit dem Namen lftp-sync im Hintergrund gestartet, in der lftp gestartet wird. An diese Sitzung sendet das Skript den mirror Befehl und beendet sich nach dem sichergestellt ist, dass eine solche Sitzung auch existiert.

#!/bin/bash

# Information about the source
HOST="123.123.123.123"
PORT=21
USER="sync"
PASS="foobar"

# download target
LOCAL_DIR="/mnt/123.123.123.123/forschungsdaten"

# source dir
REMOTE_DIR="/forschungsdaten"

function lftpcmd()
{
screen -S lftp-sync -p 0 -X stuff "$1"`echo -ne '\015'` 2>&1 >> /dev/null
}
function lftpkill()
{
screen -ls lftp-sync | grep lftp-sync | cut -d "." -f 1 | sed -e 's/^[ \t]*//' | xargs kill -9 $1
screen -wipe
}

# Start background lftp session if none or more than 1 is found running
if ! [ "`screen -ls lftp-sync | lftp-sync | wc -l`" -eq 1 ]; then
if [ "`screen -ls lftp-sync | grep lftp-sync | wc -l`" -gt 1 ]; then
lftpkill
fi
# Start a new session
screen -dmS lftp-sync lftp
# Set up the connection using commands sent to screen
lftpcmd "open ftp://$USER:$PASS@$HOST:$PORT/"
fi

# Add a new sync to the queue
lftpcmd "queue mirror -x ^\Incoming/$ -p \"${REMOTE_DIR}\" \"${LOCAL_DIR}\""

vsftpd mit virtuellen Benutzern, FXP und Verschlüsselung in 5 Minuten

Manchmal möchte man Benutzern einen FTP-Zugang zur Verfügung stellen, aber nicht gleich einen Systemzugang anlegen. Das geht mit vsftpd besonders einfach. Vorraussetzung ist eine funktionierende Installation von vsftpd und einige kleine Anpassungen. Natürlich darf auch die Sicherheit und nützliche Zusatzfunktionen wie FXP nicht zu kurz kommen.

Zuerst werden alle nötigen Programme installiert.

apt-get install vsftpd apache2-utils ssl-cert libpam-pwdfile

Es muss die Datei /etc/vsftpd.conf wie folgt angepasst werden.

listen=YES
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

# Virtuelle Benutzer verwenden
nopriv_user=shared
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/home/shared/pub
chroot_local_user=YES
hide_ids=YES

# FXP erlauben
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=49152
pasv_max_port=50000
port_promiscuous=YES

# SSL fuer Daten- und Kontrollverbindung erzwingen
ssl_enable=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES

# Kleiner Scherz ;) (http://www.exploit-db.com/exploits/15449/)
ftpd_banner=ProFTPD 1.3.3a

Diese Konfigurationsdatei erlaubt es allen angelegten Benutzern das Verzeichnis /home/shared zu sehen. Soll jeder Benutzer nur ein eigenes Verzeichnis sehen können, muss die Option local_root auf den Wert /home/shared/pub/$USERgesetzt werden.

Dann wird das selbst-signierte SSL-Zertifikat für vsftpd angelegt.

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/vsftpd.pem

Nun muss die PAM-Authentifizierung von vsftpd angepasst werden, sodass vsftpd die Daten aus einer Datei liest. Dafür wird der Inhalt der Datei /etc/pam.d/vsftpd gelöscht und durch folgenden Inhalt ersetzt.

auth required pam_pwdfile.so pwdfile /etc/ftpd.passwd
account required pam_permit.so

Die genannte Datei /etc/ftpd.passwd kann durch das Werkzeug htpasswd mit Benutzern und Passwörtern befüllt werden.

# Für den ersten Benutzer
htpasswd -c /etc/ftpd.passwd user1
# Für alle folgenden Benutzer
htpasswd /etc/ftpd.passwd userN

Nach einem Neustart von vsftpd mittels dem Befehl /etc/init.d/vsftpd restart ist der neue FTP-Server einsatzbereit.