OVH Community, your new community space.

Proftpd + MySQL - Wolne otwieranie katalogów


desavil
21-03-2012, 17:54
Problem już rozwiązałem wcześniej poprzez usunięcie dwóch modułów:
LoadModule mod_ratio.c <- powodowało długie wczytywanie katalogów
LoadModule mod_ifsession.c <- długie listowanie katalogów/plików przy logowaniu
Po usunięciu ich działa prawie idealnie

Zobaczę jeszcze z tą opcją -n co zaproponowałeś, może będzie działać jeszcze szybciej.

brak
21-03-2012, 07:51
ListOptions -n do configa proftpd, pomogło?

desavil
16-03-2012, 18:14
Mam zainstalowane tylko: denyhosts oraz fail2ban
W iptables nie mam żadnych regułek.

Dodałem: iptables -A INPUT -p tcp --dport 30000:30050 -j ACCEPT
I pasywne porty też zmieniłem na takie, i nadal to samo... :/
I czasami na tym FTP jest też tak, że jak uda się wejść do jednego katalogu to później do pozostałych już bez problemu.

@edit
W modules.conf zostawiłem tylko:
Kod:
ModulePath /usr/lib/proftpd
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_sql.c
I wydaje mi się, że działa szybko. Pierwsze ładowanie po połączeniu głównego katalogu ok. 5s, a katalogi bez problemów.

Tylko czy mogę takie moduły zostawić, czy to czegoś nie pogorszy?
Korzystam tylko z użytkowników z bazy danych oraz quoty, również w bazie jest ustawiana. Z resztą wyżej podałem główny config.

victor
16-03-2012, 18:11
tak jak przedmówca powiedział, to problem z zamkniętymi portami na firewallu. lsof, telnet, iptables, nc.

desavil
16-03-2012, 17:15
Ładuję domyślne moduły + te do obsługi bazy danych.
Z tymi portami trybu pasywnego już wcześniej kombinowałem.

Odkomentowałem: PassivePorts 49152 65534
Próbowałem również zakomentować to: LoadModule mod_tls.c
Nic nie pomaga.

Czy problemem może być również sam mysql-server? Jest na nim tylko baza danych z kontami FTP (którą podałem wyżej) nic więcej, znajduje się na innym serwerze dedykowanym w OVH.

Joshua
16-03-2012, 17:02
To raczej śmierdzi problemami z trybem pasywnym, złym ustawieniem firewalla lub portów dostępnych dla trybu pasywnego... W proftpd ładujesz moduł TLS, a przy FTP+SSL nie ma prostych reguł firewalla kojarzących ruch wchodzący z wychodzącym.
Spróbuj odkomentować zakres portów (dyrektywa PassivePorts), wpuść je bezwarunkowo na firewallu - niewykluczone że pomoże.

desavil
16-03-2012, 16:34
Nic to nie daje.

A tak wygląda log z połączenia FTP:
Kod:
Status:	Znajdowanie adresu IP dla XXX.pl
Status:	Łączenie z XXX.XXX.XXX.XXX:21...
Status:	Połączenie nawiązanie, oczekiwanie na wiadomość powitalną...
Odpowiedź	220 ProFTPD 1.3.3a Server (Debian) [XXX.XXX.XXX.XXX]
Polecenie:	USER test
Odpowiedź	331 Password required for test
Polecenie:	PASS *********
Odpowiedź	230 User test logged in
Polecenie:	SYST
Odpowiedź	215 UNIX Type: L8
Polecenie:	FEAT
Odpowiedź	211-Features:
Odpowiedź	 MDTM
Odpowiedź	 MFMT
Odpowiedź	 TVFS
Odpowiedź	 UTF8
Odpowiedź	 MFF modify;UNIX.group;UNIX.mode;
Odpowiedź	 MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
Odpowiedź	 LANG pl-PL*
Odpowiedź	 SITE MKDIR
Odpowiedź	 SITE RMDIR
Odpowiedź	 SITE UTIME
Odpowiedź	 SITE SYMLINK
Odpowiedź	 REST STREAM
Odpowiedź	 SIZE
Odpowiedź	211 End
Polecenie:	OPTS UTF8 ON
Odpowiedź	200 UTF8 set to on
Status:	Połączono
Status:	Uzyskiwanie listy katalogów...
Polecenie:	PWD
Odpowiedź	257 "/" is the current directory
Polecenie:	TYPE I
Odpowiedź	200 Type set to I
Polecenie:	PASV
Odpowiedź	227 Entering Passive Mode (XXX,XXX,XXX,XXX,192,192).
Polecenie:	MLSD
Odpowiedź	150 Opening ASCII mode data connection for MLSD
[ TUTAJ DŁUGO SIĘ CZEKA PO TYM WYŻEJ ^^ ]
Odpowiedź	226 Transfer complete
Status:	Listowanie katalogów zakończone pomyślnie
Jak przechodzę do katalogu:
Kod:
Status:	Uzyskiwanie listy katalogów...
Polecenie:	CWD katalog
[ TUTAJ DŁUGO SIĘ CZEKA PO TYM WYŻEJ ^^ ]
Błąd:	Przekroczony czas oczekiwania na połączenie
Błąd:	Nie udało się otrzymać listy katalogów
Czasami się wejdzie do katalogu, a czasem przekroczony czas...

Spacedust
16-03-2012, 16:25
Polecam wyłączyć testowo sysloga.

desavil
16-03-2012, 16:02
Mam problem z moim serwerem proftpd połączony z bazą danych MySQL.
Polega on na tym, że czasem na otworzenie katalogu trzeba czekać nawet 1-3min! Nie wiem co tutaj może być źle. Przez sftpd (konta root) wszystko działa prawidłowo, tylko na tym proftpd coś nie.

proftpd.conf:
Kod:
#
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.
# 

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6				off
# If set on you can experience a longer connection delay in many cases.
IdentLookups			off

ServerName			"Debian"
ServerType			standalone
DeferWelcome			off

MultilineRFC2228		on
DefaultServer			on
ShowSymlinks			on

TimeoutNoTransfer		600
TimeoutStalled			600
TimeoutIdle			1200

DisplayLogin                    welcome.msg
DisplayChdir               	.message true
ListOptions                	"-l"

DenyFilter			\*.*/
PathDenyFilter "(\.ftpaccess)$"

UseReverseDNS off

# Use this to jail all users in their homes 
# DefaultRoot			~

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell		off

# Port 21 is the standard FTP port.
Port				21

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts                  49152 65534

# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress		1.2.3.4

# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours

# DynMasqRefresh 28800


# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances			30

# Set the user and group that the server normally runs at.
User				proftpd
Group				nogroup

# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask				022  022
# Normally, we want files to be overwriteable.
AllowOverwrite			on

# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd		off

# This is required to use both PAM-based authentication and local passwords
# AuthOrder			mod_auth_pam.c* mod_auth_unix.c

# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile			off

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

#
#QuotaEngine off
#


Ratios off



# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default. 

DelayEngine off



ControlsEngine        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock



AdminControlsEngine off


#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf

#
# This is used for FTPS connections
#
#Include /etc/proftpd/tls.conf

#
# Useful to keep VirtualHost/VirtualRoot directives separated
#
#Include /etc/proftpd/virtuals.con

DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users


# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  baza@ip user pass


# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid "CONCAT('/home/', homedir) AS homedir" shell
SQLUserWhereClause "status=1"

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome off

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off

TransferRate RETR 3840.0
TransferRate STOR 6400.0
modules.conf:
Kod:
#
# This file is used to manage DSO modules and features.
#

# This is the directory where DSO modules reside

ModulePath /usr/lib/proftpd

# Allow only user root to load and unload modules, but allow everyone
# to see which modules have been loaded

ModuleControlsACLs insmod,rmmod allow user root
ModuleControlsACLs lsmod allow user *

LoadModule mod_ctrls_admin.c
LoadModule mod_tls.c

# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c

# Install proftpd-mod-ldap to use this
#LoadModule mod_ldap.c

#
# 'SQLBackend mysql' or 'SQLBackend postgres' (or any other valid backend) directives 
# are required to have SQL authorization working. You can also comment out the
# unused module here, in alternative.
#

# Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c

# Install proftpd-mod-pgsql and decomment the previous 
# mod_sql.c module to use this.
#LoadModule mod_sql_postgres.c

# Install proftpd-mod-sqlite and decomment the previous
# mod_sql.c module to use this
#LoadModule mod_sql_sqlite.c

# Install proftpd-mod-odbc and decomment the previous
# mod_sql.c module to use this
#LoadModule mod_sql_odbc.c

# Install one of the previous SQL backends and decomment 
# the previous mod_sql.c module to use this
#LoadModule mod_sql_passwd.c

LoadModule mod_radius.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_file.c

# Install proftpd-mod-ldap to use this
#LoadModule mod_quotatab_ldap.c

# Install one of the previous SQL backends and decomment 
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c
LoadModule mod_quotatab_radius.c
LoadModule mod_wrap.c
LoadModule mod_rewrite.c
LoadModule mod_load.c
LoadModule mod_ban.c
LoadModule mod_wrap2.c
LoadModule mod_wrap2_file.c
# Install one of the previous SQL backends and decomment 
# the previous mod_sql.c module to use this
#LoadModule mod_wrap2_sql.c
LoadModule mod_dynmasq.c
#LoadModule mod_vroot.c
#LoadModule mod_exec.c
#LoadModule mod_shaper.c
LoadModule mod_ratio.c
LoadModule mod_site_misc.c

#LoadModule mod_sftp.c
#LoadModule mod_sftp_pam.c
# Install one of the previous SQL backends and decomment 
# the previous mod_sql.c module to use this
#LoadModule mod_sftp_sql.c

LoadModule mod_facl.c
#LoadModule mod_unique_id.c

# keep this module the last one
LoadModule mod_ifsession.c
Struktura bazy danych:
Kod:
CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `groupname` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `gid` int(11) NOT NULL,
  `members` varchar(50) COLLATE utf8_polish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES
('ftpgroup', 2001, 'ftpuser');



CREATE TABLE IF NOT EXISTS `ftpquotalimits` (
  `name` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `quota_type` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT 'user',
  `per_session` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT 'false',
  `limit_type` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT 'hard',
  `bytes_in_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  `bytes_out_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  `bytes_xfer_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  `files_in_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  `files_out_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  `files_xfer_avail` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '0',
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;



CREATE TABLE IF NOT EXISTS `ftpquotatallies` (
  `name` varchar(50) NOT NULL,
  `quota_type` varchar(50) NOT NULL DEFAULT 'user',
  `bytes_in_used` varchar(50) NOT NULL DEFAULT '0',
  `bytes_out_used` varchar(50) NOT NULL DEFAULT '0',
  `bytes_xfer_used` varchar(50) NOT NULL DEFAULT '0',
  `files_in_used` varchar(50) NOT NULL DEFAULT '0',
  `files_out_used` varchar(50) NOT NULL DEFAULT '0',
  `files_xfer_used` varchar(50) NOT NULL DEFAULT '0',
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



CREATE TABLE IF NOT EXISTS `ftpuser` (
  `userid` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `passwd` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `uid` int(11) NOT NULL DEFAULT '2004',
  `gid` int(11) NOT NULL DEFAULT '2004',
  `homedir` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `shell` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '/usr/sbin/nologin',
  `count` int(11) NOT NULL DEFAULT '0',
  `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` int(11) NOT NULL DEFAULT '1',
  UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
Liczę na pomoc