Installation ProFTP
Installation
Zunächst installiert man den entsprechenden Port:
pkg install proftpd
Eine Liste aller ProFTP Module gibt es hier.
Dann brauchen wir noch das MySQL Modul
pkg install proftpd-mod_sql_mysql
Sollte der MySQL-Client nicht installiert sein, so wird dies automatisch mitinstalliert. Nachdem die Installation abgeschlossen ist, müssen einige Änderungen am System durchgeführt werden.
Config
proftpd.conf
Anpassungen in der Config /usr/local/etc/proftpd.conf
TLS Verschlüsselung aktiveren
Dies ist optional, macht aber ganz klar Sinn 😉
mkdir /usr/local/etc/proftpd/ssl
Dann Zertifikat machen. Ich mach gleich eins für die nächsten 10 Jahre, da ich keine Lust habe, dies jedes Jahr zu erneuern 😉
openssl req -new -x509 -days 3650 -nodes -out /usr/local/etc/proftpd/ssl/proftpd.cert.pem -keyout /usr/local/etc/proftpd/ssl/proftpd.key.pem
Hier ist nun wichtig, dass man bei Common Name den Hostnamen des Servers eingibt.
Country Name (2 letter code) [AU]:CH State or Province Name (full name) [Some-State]:ZH Locality Name (eg, city) []:Zürich Organization Name (eg, company) [Internet Widgits Pty Ltd]:Firma GmbH Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:hostname.example.com Email Address []:info@example.com
Im Config File dann noch folgende Zeilen einfügen:
TLSEngine on TLSLog /var/log/proftpd-tls.log TLSProtocol TLSv1 TLSOptions NoCertRequest NoSessionReuseRequired TLSRSACertificateFile /usr/local/etc/proftpd/ssl/proftpd.cert.pem TLSRSACertificateKeyFile /usr/local/etc/proftpd/ssl/proftpd.key.pem TLSVerifyClient off TLSRequired on AllowForeignAddress on
Ausserdem den Port von default 21 auf 990 umstellen:
Port 990
Dann ProFTP neu starten.
/usr/local/etc/rc.d/proftpd restart
Im FTP Client nun bei der Verschlüsselung „Explizites FTP über TLS fordern“ auswählen. Da wir die Option TLSRequired gesetzt haben, ist eine unverschlüsselte FTP Verbindung nicht mehr möglich. Ausserdem muss auch der Port 990 angegeben werden. Transfermodus ist Passiv.
Aktivieren der Module
Um zu sehen, welche Module per Default in ProFTP reinkompiliert sind, kann man diesen Befehl benutzen.
root@corky(/usr/local/etc)> proftpd -l Compiled-in modules: mod_core.c mod_xfer.c mod_auth_unix.c mod_auth_file.c mod_auth.c mod_ls.c mod_log.c mod_site.c mod_delay.c mod_facts.c mod_dso.c mod_ident.c mod_auth_pam.c mod_lang.c
Alle zusätzlichen Module sind hier zu finden:
# ll /usr/local/libexec/proftpd/ total 2140 drwxr-xr-x 2 root wheel 1024 Mar 16 08:39 ./ drwxr-xr-x 4 root wheel 512 Mar 16 08:03 ../ -rw-r--r-- 1 root wheel 20596 Mar 16 08:03 mod_copy.a -rwxr-xr-x 1 root wheel 1018 Mar 16 08:03 mod_copy.la* -rwxr-xr-x 1 root wheel 17016 Mar 16 08:03 mod_copy.so* -rw-r--r-- 1 root wheel 26984 Mar 16 08:03 mod_deflate.a -rwxr-xr-x 1 root wheel 1043 Mar 16 08:03 mod_deflate.la* -rwxr-xr-x 1 root wheel 19848 Mar 16 08:03 mod_deflate.so* -rw-r--r-- 1 root wheel 16922 Mar 16 08:03 mod_ifsession.a -rwxr-xr-x 1 root wheel 1053 Mar 16 08:03 mod_ifsession.la* -rwxr-xr-x 1 root wheel 15768 Mar 16 08:03 mod_ifsession.so* -rw-r--r-- 1 root wheel 8722 Mar 16 08:03 mod_ifversion.a -rwxr-xr-x 1 root wheel 1053 Mar 16 08:03 mod_ifversion.la* -rwxr-xr-x 1 root wheel 9880 Mar 16 08:03 mod_ifversion.so* -rw-r--r-- 1 root wheel 6830 Mar 16 08:03 mod_readme.a -rwxr-xr-x 1 root wheel 1032 Mar 16 08:03 mod_readme.la* -rwxr-xr-x 1 root wheel 8496 Mar 16 08:03 mod_readme.so* -rw-r--r-- 1 root wheel 748154 Mar 16 08:03 mod_sftp.a -rwxr-xr-x 1 root wheel 1118 Mar 16 08:03 mod_sftp.la* -rwxr-xr-x 1 root wheel 370040 Mar 16 08:03 mod_sftp.so* -rw-r--r-- 1 root wheel 16168 Mar 16 08:03 mod_sftp_sql.a -rwxr-xr-x 1 root wheel 1046 Mar 16 08:03 mod_sftp_sql.la* -rwxr-xr-x 1 root wheel 13848 Mar 16 08:03 mod_sftp_sql.so* -rw-r--r-- 1 root wheel 151018 Mar 16 08:03 mod_sql.a -rwxr-xr-x 1 root wheel 1011 Mar 16 08:03 mod_sql.la* -rwxr-xr-x 1 root wheel 86552 Mar 16 08:03 mod_sql.so* -rw-r--r-- 1 root wheel 31970 Mar 16 08:39 mod_sql_mysql.a -rwxr-xr-x 1 root wheel 1118 Mar 16 08:39 mod_sql_mysql.la* -rwxr-xr-x 1 root wheel 24416 Mar 16 08:39 mod_sql_mysql.so* -rw-r--r-- 1 root wheel 26544 Mar 16 08:03 mod_sql_passwd.a -rwxr-xr-x 1 root wheel 1060 Mar 16 08:03 mod_sql_passwd.la* -rwxr-xr-x 1 root wheel 20440 Mar 16 08:03 mod_sql_passwd.so* -rw-r--r-- 1 root wheel 198714 Mar 16 08:03 mod_tls.a -rwxr-xr-x 1 root wheel 1026 Mar 16 08:03 mod_tls.la* -rwxr-xr-x 1 root wheel 122168 Mar 16 08:03 mod_tls.so* -rw-r--r-- 1 root wheel 39246 Mar 16 08:03 mod_wrap2.a -rwxr-xr-x 1 root wheel 1121 Mar 16 08:03 mod_wrap2.la* -rwxr-xr-x 1 root wheel 28400 Mar 16 08:03 mod_wrap2.so* -rw-r--r-- 1 root wheel 8048 Mar 16 08:03 mod_wrap2_file.a -rwxr-xr-x 1 root wheel 1060 Mar 16 08:03 mod_wrap2_file.la* -rwxr-xr-x 1 root wheel 9040 Mar 16 08:03 mod_wrap2_file.so*
Nun sieht man, dass die zusätzlichen Module, die wir Installiert haben nicht aufgeführt werden. Die muss man im Config File proftpd.conf aktivieren:
LoadModule mod_copy.c LoadModule mod_deflate.c LoadModule mod_ifsession.c LoadModule mod_ifversion.c LoadModule mod_sftp.c LoadModule mod_sql.c LoadModule mod_sql_passwd.c LoadModule mod_readme.c LoadModule mod_tls.c LoadModule mod_wrap2.c LoadModule mod_wrap2_file.c
Dann geht auch das SQL Login etc.
Erstellen einer MySQL Tabelle für Logins
Innerhalb der DB Corky_admin erstellen wir diese Table:
CREATE TABLE `ftp_login` ( `id` int(11) NOT NULL auto_increment, `username` varchar(30) NOT NULL default '', `password` varchar(30) NOT NULL default '', `uid` int(11) NOT NULL default '80', `gid` int(11) NOT NULL default '80', `homedir` varchar(60) NOT NULL default '', `count` int(11) NOT NULL default '0', `last_host` varchar(50) NOT NULL default '', `last_ip` varchar(20) NOT NULL default '', `last_login` timestamp(14) NOT NULL, `active` tinyint(4) NOT NULL default '1', `shell` varchar(250) NOT NULL default '/sbin/nologin', PRIMARY KEY (`id`), KEY `id` (`id`), KEY `username` (`username`), KEY `homedir` (`homedir`) ) TYPE=MyISAM COMMENT='FTP Login Informations';
in der mysql DB noch Berechtigungen geben:
MySQL User erstellen:
INSERT INTO `user` ( `Host` , `User` , `Password` , `Select_priv` , `Insert_priv` , `Update_priv` , `Delete_priv` , `Create_priv` , `Drop_priv` , `Reload_priv` , `Shutdown_priv` , `Process_priv` , `File_priv` , `Grant_priv` , `References_priv` , `Index_priv` , `Alter_priv` , `Show_db_priv` , `Super_priv` , `Create_tmp_table_priv` , `Lock_tables_priv` , `Execute_priv` , `Repl_slave_priv` , `Repl_client_priv` , `ssl_type` , `ssl_cipher` , `x509_issuer` , `x509_subject` , `max_questions` , `max_updates` , `max_connections` ) VALUES ( 'localhost', 'ftp', PASSWORD( 'yourpass' ) , 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0' );
Berechtigungen:
INSERT INTO `tables_priv` ( `Host` , `Db` , `User` , `Table_name` , `Grantor` , `Timestamp` , `Table_priv` , `Column_priv` ) VALUES ( 'localhost', 'Corky_admin', 'ftp', 'ftp_login', '', NOW( ) , 'Select', 'Select,Insert,Update' );
Nach Anpassungen an den den Berechtigungen sollte man entweder die Datenbank neu starten oder die forcieren, die Privilegien-Datenbank neu zu laden:
mysqladmin -u root -p flush-privileges Enter password:
PAM
PAM wird bei dieser Lösung nicht benötigt, da ProFTPD dies über das lokale mod_sql abwickelt.
/etc/rc.conf
Hinzufügen
#-----------------------------------------------# # FTP Server # #-----------------------------------------------# proftpd_enable="YES"
ProFTP starten
/usr/local/etc/rc.d/proftpd start
Probleme
Falls es beim starten Probleme gibt, im debug level starten:
/usr/local/sbin/proftpd -n -d 9 -c /usr/local/etc/proftpd.conf
-d 9 setzt den debug level auf 9 (ziemlich brauchbar)
-n verhindert, dass der Daemon in den Hintergrund geschoben wird
-c zeigt an, welches config-file benutzt werden sollte
Wenn man einfach nicht zu ProFTP connecten kann und es keine Fehlermeldungen gibt…
Dann wie oben beschrieben im debug Modus manuell starten:
/usr/local/etc/rc.d/proftpd stop proftpd -n -d15
Jetzt sieht man gleich live die Output Messages. Im letzten Fall sah man so die Fehler
80.74.159.5 (127.0.0.1[127.0.0.1]) - dispatching LOG_CMD command 'PASS (hidden)' to mod_sql 80.74.159.5 (127.0.0.1[127.0.0.1]) - mod_sql/4.2.4: unrecoverable backend error: (1142) UPDATE command denied to user 'ftp'@'localhost' for table 'ftp_login' 80.74.159.5 (127.0.0.1[127.0.0.1]) - mod_sql/4.2.4: check the SQLLogFile for more details
Also MySQL Table die Berechtigungen anpassen. Fehler behoben.
Es gibt noch die Möglichkeit per trace.log zu debuggen. Dort ist der Fehler jedoch nicht angezeigt worden. Einfach noch für den Fall dass ich es trotzdem mal damit versuchen möchte:
vi /usr/local/etc/proftpd.conf
TraceLog /var/log/ftp_trace.log Trace DEFAULT:10
ProFTP restarten und tracelog beobachten. Weitere Infos über Tracing von ProFTP
Bleibt beim Transfer hängen
Client bleibt hängen entweder direkt nach dem Login (Verzeichnis konnte nicht angezeigt werden) oder wenn man ein File rüberschieben möchte…
Filezilla Logfile (versuch Verzeichnis anzuzeigen):
Antwort: 227 Entering Passive Mode (80,74,159,5,201,12). Befehl: LIST -a Antwort: 200 PORT command successful Fehler: Verzeichnisinhalt konnte nicht empfangen werden Status: Empfange Verzeichnisinhalt... Befehl: CWD /doc/ Fehler: Verbindung vom Server geschlossen Fehler: Verzeichnisinhalt konnte nicht empfangen werden
Filezilla Logfile (versuch Datei zu transferieren):
Befehl: TYPE A Antwort: 250 CWD command successful Befehl: PASV Antwort: 200 Type set to A Befehl: PORT 192,168,1,102,12,215 Antwort: 227 Entering Passive Mode (80,74,159,5,203,150). Befehl: STOR loggedIn.html Antwort: 200 PORT command successful Fehler: Dateitransfer fehlgeschlagen Status: Starte Upload von H:testindex.html Status: Empfange Verzeichnisinhalt... Befehl: TYPE I Antwort: 425 Unable to build data connection: Connection refused
Auf dem Server ist dann jeweils immer (bzw. nicht immer, das Problem tritt randommässig auf) Schluss, sobald in den Passive Mode gewechselt wurde.
Nun ist es so, dass im Passive Modus theoretisch die Ports
1024 - 65535
benutzt werden könnten. Das Beste ist allerdings, die Passiven Ports etwas zu reduzieren
vi /usr/local/etc/proftpd.conf
machen wir mal folgende Ports (falls Zeile nicht existiert, hinzufügen):
PassivePorts 51000 52000
Nun ProFTP restarten. Ab sofort sollten nur noch die Ports in dieser Range benutzt werden. Das kann man so erkennen:
227 Entering Passive Mode (80,74,159,5,200,168).
Hier wird Port 51368 benutzt. Diese Zahl wird so berechnet: Die ersten 4 Zahlen sind die IP Adresse des Servers (80,74,159,5). Die letzten beiden Zahlen beschreiben den Port: (200*256)+168 = 51368 Weitere Infos sonst auch hier: http://wiki.filezilla-project.org/Network_Configuration
Sollte es nun immernoch Probleme geben, IPFW mal restarten.
/etc/rc.d/ipfw restart
Eventuell die Passiven Ports im ipfw eintragen, sollte es weiterhin Verbindungsprobleme geben. Ipfw hab ich mal testweise das eingetragen, aber ich glaube, das funktioniert noch nicht so…
vi /etc/ipfw.corky # ftp passive mode added by sunci add 23010 allow tcp from any to me 51000-52000 in setup keep-state
Das hab ich bisher über IPFW gefunden, aber noch nichts konkretes angepasst:
[snip] # FTP ipfw add allow tcp from any to any 20 ipfw add allow tcp from any to any 21 ipfw add allow tcp from any to any 1024-65000 keep-state
You can just write a rule (stateful or not, as you choose) to permit outgoing connections either to the high range ports, or more generally to any port: ipfw add allow tcp from ${myip} to any 49152-65535 keep-state out xmit ${oif} ${myip} is your local IP address range, and ${oif} is the outward facing ethernet interface on your firewall: eg. fxp0, rl1) hope this will help you.
und das: http://www.omnigroup.com/mailman/archive/macosx-admin/2004-March/045902.html
Fehlermeldungen
getaddrinfo ‚ftp.example.com‘ error: hostname nor servname provided, or not known
Starting proftpd. - getaddrinfo 'ftp.example.com' error: hostname nor servname provided, or not known
Grundsätzlich ist dieser Fehler normal und nix schlimmes. Der FTP Server funktioniert deswegen trotzdem.
Ev. Lösung: Checke /etc/hosts. Wahrscheinlich hat es dort einen falschen Eintrag drin.
ProFTPD terminating (signal 11)
Die MySQL Library wurde falsch verlinkt. Wenn man make macht und danach ein grep nach mysql, sieht man, dass er
/usr/local/lib/mysql
verlinkt statt
/usr/local/lib
Dachte, das gehe so…
root@corky(/usr/ports/ftp/proftpd-mysql)> make CONFIGURE_ARGS+=--with-libraries=/usr/local/lib
Aber es funktioniert nicht!! So wird mysql nicht kompiliert…. hab’s jetzt so gemacht.
vi work/proftpd-1.3.3d/config.h
und habe einfach die beiden zeilen lib/mysql mit lib ersetzt.
ok, nochmals versuchen. erstemal alles sauber löschen:
make deinstall make clean make rmconfig
nun konfigurieren.
make
jetzt in allen files lib/mysql ersetzen
grep -l "lib/mysql" *
Make.rules Make.rules.bak config.h config.log config.status proftpd
ok, geht immernoch nicht. es liegt glaub ich nicht an der library… denn die wurde anscheindne trotzdem korrekt verlinkt. muss den fehler noch suchen.
Lösung
Das Problem lag an MySQL. Nach einem Upgrade des MySQL Clients funktionierte es wieder. Der alte Port hatte anscheinend einen Bug, der in der neuen Version behoben wurde.
Alarm clock: 14
Nach einem MySQL Server Upgrade hat ProFTP immer 1-2 Sekunden nach der ersten Connection abgebrochen bzw. den Prozess gekillt. Mit der Debug Option ergab der letzte Output „Alarm clock: 14“.
Um das Problem zu lösen, muss man einfach ProFTP neu kompilieren. Anscheinend hatte einfach eine Library nach dem MySQL Server Upgrade Probleme.
cd /usr/ports/ftp/proftpd make deinstall make reinstal
GnuTLS error -110: The TLS connection was non-properly terminated.
Im Config File noch folgende Zeile einfügen, dann klappts:
AllowForeignAddress on
dispatching LOG_CMD_ERR command ‚MLSD‘ to mod_fact
Verzeichnisinhalt konnte nicht angezeigt werden. Nach der Aktivierung von TLS hat dies nicht mehr geklappt. Die Lösung war, im FTP Client den Transfermodus von Aktiv in Passiv zu wechseln.
ProFTP Alternativen
Falls es wieder mal zu (unlösbaren) Problemen kommen sollte und man einen Alternativen FTP Server benötigt, wäre vsftp ev. eine gute Option
/usr/ports/ftp/vsftpd
mysql auth:
Leider ist es nicht möglich die Config-Dateien zu sehen.
(Es wird nach einem Login gefragt)
Ist das gewollt?
LG