在安装ProFTPd与配置MySQL虚拟用户之前,请确保你的系统已经正常运行MySQL服务器。
编译安装ProFTPd
- wget ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.proftpd.net/distrib/source/proftpd-1.3.1.tar.gz
- tar xzvf proftpd-1.3.1.tar.gz
- cd proftpd-1.3.1
- ./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql \
- --with-includes=/usr/include/mysql \
- --with-libraries=/usr/lib/mysql
- make && make install
请根据你的MySQL安装路径修改–with-includes和–with-libraries的参数。
添加ftp用户和用户组
- groupadd -g 5500 ftpgroup
- adduser -u 5500 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
MySQL配置
登录MySQL并创建数据库。
- mysql -u root -p
- create database ftpdb;
- grant select, insert, update on ftpdb.* to proftpd@localhost identified by 'password';
-
- use ftpdb;
-
- #
- # Table structure for table `ftpgroup`
- #
-
- CREATE TABLE ftpgroup (
- groupname varchar(16) NOT NULL default '',
- gid smallint(6) NOT NULL default '5500',
- members varchar(16) NOT NULL default '',
- KEY groupname (groupname)
- ) TYPE=MyISAM;
-
- #
- # Dumping data for table `ftpgroup`
- #
-
- INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpuser');
- INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpguest');
-
- CREATE TABLE `ftpquotatallies` (
- `name` varchar(30) NOT NULL default '',
- `quota_type` enum('user','group','class','all') NOT NULL default 'user',
- `bytes_in_used` float NOT NULL default '0',
- `bytes_out_used` float NOT NULL default '0',
- `bytes_xfer_used` float NOT NULL default '0',
- `files_in_used` int(10) unsigned NOT NULL default '0',
- `files_out_used` int(10) unsigned NOT NULL default '0',
- `files_xfer_used` int(10) unsigned NOT NULL default '0'
- ) TYPE=MyISAM;
-
- # --------------------------------------------------------
-
- #
- # Table structure for table `ftpuser`
- #
-
- CREATE TABLE ftpuser (
- id int(10) unsigned NOT NULL auto_increment,
- userid varchar(32) NOT NULL default '',
- passwd varchar(32) NOT NULL default '',
- uid smallint(6) NOT NULL default '5500',
- gid smallint(6) NOT NULL default '5500',
- homedir varchar(255) NOT NULL default '',
- shell varchar(16) NOT NULL default '/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',
- PRIMARY KEY (id),
- UNIQUE KEY userid (userid)
- ) TYPE=MyISAM;
- INSERT INTO `ftpuser` VALUES (1, 'testaccount', 'ftppasswd', 5500, 5500, '/home/testdomain.com', '/sbin/nologin',0,'','');
-
- exit;
proftpd配置文件
要目录下建proftpd.conf配置文件,请在下面的代码修改好MySQL数据库登录信息。
- ServerName "Khoosys Proftpd Server"
- ServerType Standalone
- ServerAdmin stephen@khoosys.net
-
- # Hide as much as possible to outside users
- ServerIdent on "Welcome to the Khoosys FTP server. Please login..."
- DeferWelcome on
-
- DefaultServer on
-
- # Allow FTP resuming.
- # Remember to set to off if you have an incoming ftp for upload.
- AllowStoreRestart on
-
- # Port 21 is the standard FTP port.
- Port 21
-
- # Umask 022 is a good standard umask to prevent new dirs and files
- # from being group and world writable.
- Umask 022
-
- # 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 under which the server will run.
- User ftpuser
- Group ftpgroup
-
- # To cause every FTP user to be "jailed" (chrooted) into their home
- # directory, uncomment this line.
- DefaultRoot ~
-
- # Normally, we want files to be overwriteable.
-
- AllowOverwrite on
-
- # The passwords in MySQL are encrypted using CRYPT
- SQLAuthTypes Plaintext Crypt
- SQLAuthenticate users* groups*
-
- # used to connect to the database
- # databasename@host database_user user_password
- SQLConnectInfo ftpdb@localhost proftpd password
-
- # 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 homedir shell
-
- # 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
- SQLHomedirOnDemand on
-
- # Update count every time user logs in
- SQLLog PASS updatecount
- SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE" ftpuser
-
- # Update modified everytime user uploads or deletes a file
- SQLLog STOR,DELE modified
- SQLNamedQuery modified UPDATE "modified=now() WHERE" 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
proftpd启动文件
创建/etc/init.d/proftpd文件,并写入下面的代码。
- #!/bin/sh
- # $Id: proftpd.init,v 1.1 2004/02/26 17:54:30 thias Exp $
- #
- # proftpd This shell script takes care of starting and stopping
- # proftpd.
- #
- # chkconfig: - 80 30
- # description: ProFTPD is an enhanced FTP server with a focus towards \
- # simplicity, security, and ease of configuration. \
- # It features a very Apache-like configuration syntax, \
- # and a highly customizable server infrastructure, \
- # including support for multiple 'virtual' FTP servers, \
- # anonymous FTP, and permission-based directory visibility.
- # processname: proftpd
- # config: /etc/proftp.conf
- # pidfile: /var/run/proftpd.pid
- # Source function library.
- . /etc/rc.d/init.d/functions
-
- # Source networking configuration.
- . /etc/sysconfig/network
-
- # Check that networking is up.
- [ ${NETWORKING} = "no" ] && exit 0
-
- [ -x /usr/sbin/proftpd ] || exit 0
-
- RETVAL=0
-
- prog="proftpd"
-
- start() {
- echo -n $"Starting $prog: "
- daemon proftpd
- RETVAL=$?
- echo
- [ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
- }
-
- stop() {
- echo -n $"Shutting down $prog: "
- killproc proftpd
- RETVAL=$?
- echo
- [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/proftpd
- }
-
- # See how we were called.
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- status)
- status proftpd
- RETVAL=$?
- ;;
- restart)
- stop
- start
- ;;
- condrestart)
- if [ -f /var/lock/subsys/proftpd ]; then
- stop
- start
- fi
- ;;
- reload)
- echo -n $"Re-reading $prog configuration: "
- killproc proftpd -HUP
- RETVAL=$?
- echo
- ;;
- *)
- echo "Usage: $prog {start|stop|restart|reload|condrestart|status}"
- exit 1
- esac
-
- exit $RETVAL
- chmod 755 /etc/init.d/proftpd
之后,我们可以使用
service proftpd (start|stop|restart|reload|condrestart|status)来管理proftpd服务器。
测试proftpd
之前在配置MySQL的时候,我们添加了测试帐号testaccount和密码ftppasswd,可以用这个帐号来测试proftpd是否运行正常。