歡迎您光臨本站 註冊首頁

Proftpd(MySQL+Quotas)

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

Proftpd(MySQL+Quotas)

1、什麼是ProFTPD;ProFTPD 是一個FTP伺服器程序,和vsftpd、wuftp 類似的FTP伺服器,他們最終實現功能和目的都是一樣的,都是為了傳輸文件;
2、ProFTPD的下載
proftpd-1.2.9.tar.gz
proftpd-mod-quotatab-1.2.11.tar.gz
(注意:如果你的mysql是自編譯安裝的,請先別忙著安裝,請至本文最後,看完補充再裝也不遲)

3、ProFTPD的編譯和安裝;
tar zvxf proftpd-1.2.9.tar.gz
tar zvxf proftpd-mod-quotatab-1.2.11.tar.gz
cp mod_quotatab/*.c proftpd-1.2.9/contrib/
cp mod_quotatab/*.h proftpd-1.2.9/contrib/
cd proftpd-1.2.9
./configure
--prefix=/usr/local/proftpd
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio
--with-includes=/usr/include/mysql
--with-libraries=/usr/lib/mysql
make
make install

說明:
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
這句是讓編譯ProFTPD 支持MySQL的模塊,並有磁碟限額支持;
--with-includes=
這是來指定MySQL伺服器includes所在的位置;在這裡我設置的是/usr/include/mysql,因為我的MySQL伺服器的includes的確在這個目錄;你可以根據自己的機器環境來調整;
--with-libraries=
這是來指定MySQL伺服器libraries所在的位置;在這裡我設置的是/usr/lib/mysql,因為我的MySQL伺服器的libraries的確在這個目錄;你可以根據自己的機器環境來調整;
--prefix=
這是用來指定要把ProFTPD安裝在哪個位置,在這裡我把ProFTPD安裝在了 /usr/local/proftpd 目錄下,您不必自己建目錄 /usr/local/proftpd ,在安裝的時候這個目錄會自動生成;當然您也可以自己來指定ProFTPD的安裝位置;當我們不需要proftpd的時候,就可以直接刪除proftpd目錄;這樣做好象是有點方便;

創建Proftpd啟動腳本
cp contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd
vi /etc/rc.d/init.d/proftpd
找到PATH="$PATH:/usr/local/sbin"這一句
將它改成PATH="$PATH:/usr/local/proftpd/sbin"
chmod 755 /etc/rc.d/init.d/proftpd

4.建立相應的用戶和用戶組
groupadd -g 5500 ftpgroup
adduser -u 5500 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

5、ProFTPD認證中的MySQL資料庫
mysql -uroot -ppassword
create database ftpdb;
grant select, update on ftpdb.* to proftpd@localhost identified by 'password';
use ftpdb;

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 COMMENT='ProFTP group table';

INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpuser');

CREATE TABLE `ftpquotalimits` (
`name` varchar(30) default NULL,
`quota_type` enum('user','group','class','all') NOT NULL default 'user',
`per_session` enum('false','true') NOT NULL default 'false',
`limit_type` enum('soft','hard') NOT NULL default 'soft',
`bytes_in_avail` float NOT NULL default '0',
`bytes_out_avail` float NOT NULL default '0',
`bytes_xfer_avail` float NOT NULL default '0',
`files_in_avail` int(10) unsigned NOT NULL default '0',
`files_out_avail` int(10) unsigned NOT NULL default '0',
`files_xfer_avail` int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;

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;

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',
`host` varchar(30) NOT NULL default '000-000-000-000',
`lastlogin` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) TYPE=MyISAM COMMENT='ProFTP user table';


6.ProFTPD的配置文件proftpd.conf
vi /usr/local/proftpd/etc/proftpd.conf
ServerName      "ProFTPD Default Installation"
ServerType      standalone
ServerAdmin                     myunix@hotmail.com
DefaultServer      on
Port        21
Umask        022
# 注最多30個ip同時登錄使用ftp;
MaxInstances      30
# 設置最大的嘗試登陸的次數,如果超過自動斷開連接
MaxLoginAttempts                5
# 設置運行Proftpd服務的系統用戶和組
User        nobody
Group        nobody
# 匿名用戶 這裡不使用,前面加"#"注消
#
#   User        ftp
#   Group        ftp
# 刪除了anonymous登錄的設置

AllowOverwrite on

# 最大的用戶數
MaxClients      100
# 伺服器的歡迎信息
DisplayLogin      welcome.msg
DisplayFirstChdir    .message
# 連接時的MSG
DisplayConnect /usr/local/proftpd/etc/connect.msg
DisplayGoAway /usr/local/proftpd/etc/goway.msg
# 輸入quit命令后的MSG
DisplayQuit /usr/local/proftpd/etc/quit.msg
MaxHostsPerUser 1
MaxClientsPerUser 2
# 對不起,一個IP只允許一個連接
MaxClientsPerHost 1

RootLogin off
RequireValidShell off
UseReverseDNS     off
IdentLookups      off
TimeoutStalled    600
TimeoutLogin      900
TimeoutIdle       600
TimeoutNoTransfer 600
# 讓proftp支持現在流行的FXP傳輸方式,默認是不支持的
AllowForeignAddress on
# 埠也可自己指定
PassivePorts 49152 65534
# 允許斷點續傳是默認支持的,不用設置
# 這裡有一個技巧,你可以控制FTP中任一個目錄有"斷點續傳"的功能,請設置下面一行,(例:)

AllowStoreRestart      on
AllowRetrieveRestart   on

# 屏蔽伺服器版本信息
ServerIdent off
# 設置ftpuser組只能訪問自己的目錄
DefaultRoot ~ ftpgroup

#-------- load sql.mod for mysql authoritative --------#
# Backend表示用戶認證方式為MySQL資料庫的認證方式
# Plaintext表示明文認證方式,排在最前面的為最先使用的方式
SQLAuthTypes Backend Plaintext
# 資料庫的鑒別
SQLAuthenticate users* groups*
# 資料庫聯接的信息
# ftpdb是資料庫名,localhost是主機名
# proftpd是連接資料庫的用戶名,password是密碼
#(如果沒有密碼留空)
SQLConnectInfo ftpdb@localhost proftpd password
# 指定用來做用戶認證的表的有關信息
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# 如果用戶主目錄不存在,則系統會根據此用戶在用戶數據表中的homedir欄位的值新建一個目錄
SQLHomedirOnDemand on
SQLNegativeCache   on
# Update count every time user logs in
SQLLogFile /var/log/proftpd.sql.log
SQLNamedQuery getcount SELECT "count from ftpuser where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpuser where userid='%u'"
SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpuser
SQLShowInfo PASS "230" "You've logged on %{getcount} times, last login at %{getlastlogin}"
SQLLog PASS updatelogininfo
#-------- load sql.mod for mysql authoritative --------#

#-------- load qudes.mod for Quota limit --------#
#打開磁碟限額引擎
QuotaEngine on
# 設置磁碟限額
QuotaDirectoryTally on
# 設置磁碟容量顯示時的單位
QuotaDisplayUnits Mb
# 允許顯示磁碟限額信息,ftp登錄后可執行quote site quota命令查看當前磁碟使用情況
QuotaShowQuotas on
# 設置磁碟限額日誌文件
QuotaLog "/var/log/proftpd.quota.log"
# 指定磁碟限額模塊使用的資料庫信息
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
#--------- load qudes.mod for Quota limit --------#
# Logging options
# Debug Level
# emerg, alert, crit (empfohlen), error, warn. notice, info, debug
#
SyslogLevel emerg
SystemLog /var/log/proftpd.system.log
TransferLog /var/log/proftpd.xferlog
# Some logging formats
#
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
# Log file/dir access
# ExtendedLog /var/log/proftpd.access_log WRITE,READ write
# Record all logins
ExtendedLog /var/log/proftpd.auth_log AUTH auth
# Paranoia logging level....
ExtendedLog /var/log/proftpd.paranoid_log ALL default


service proftpd restart

mysql> DESCRIBE quotalimits;
+------------------+------------------------------------+------+-----+---------+-------+
| Field            | Type                               | Null | Key | Default | Extra |
+------------------+------------------------------------+------+-----+---------+-------+
| name             | varchar(30)                        | YES  |     | NULL    |       |
| quota_type       | enum('user','group','class','all') |      |     | user    |       |
| per_session      | enum('false','true')               |      |     | false   |       |
| limit_type       | enum('soft','hard')                |      |     | soft    |       |
| bytes_in_avail   | float                              |      |     | 0       |       |
| bytes_out_avail  | float                              |      |     | 0       |       |
| bytes_xfer_avail | float                              |      |     | 0       |       |
| files_in_avail   | int(10) unsigned                   |      |     | 0       |       |
| files_out_avail  | int(10) unsigned                   |      |     | 0       |       |
| files_xfer_avail | int(10) unsigned                   |      |     | 0       |       |
+------------------+------------------------------------+------+-----+---------+-------+

這個表裡的各個參數分別代表:
name 應該這樣理解,既能表示單個用戶,也能表示用戶組名;如果我們在quota_type(限額類型)中使用group來認證的話,那就得在這裡設置組名,這樣整組都具有統一的磁碟限額的特性;當然您要在ftpgroups表中插入組紀錄;並且在member欄位中得把用戶一個一個的列進去,這是后話了;先自己研究一下,只是插入紀錄的事;我們只說最簡單的單個用戶的磁碟限額;默認值可以為空NULL,如果為空則針對所在有quota_type中設置的類型,比如在quota_type中設置為user ,就是針對所有ftpusers 中的用戶起作用;如果是group名,也是對ftpgroups 所有組作用;
quota_type 磁碟限額類型,可以設置為用戶,也可以設置為用戶組group ;如果您的name寫的是用戶組,那在這裡就得設置為group來認定;默認為user認證;
per_session 默認為false;
limit_type 默認為soft;
bytes_in_avail 用戶佔用空間大小,也就是家目錄的空間最大可以讓用戶佔用多少,單位是byte;默認為0,0是不受限制,以下同理;
bytes_out_avail 注;所有下載文件的總和,默認為0;
bytes_xfer_avail 注;一個用戶上傳下載流量總和,默認為0
files_in_avail 註:限制上傳文件總數,默認為0;
files_out_avail 注;限制下載文件個數總計,默認為0
files_xfer_avail 註:允許下載和上傳的文件總和我,默認為0;

在資料庫ftpuser添加一個虛擬用戶"test",
mysql> insert into ftpuser (id,userid,passwd,uid,gid,homedir,shell) values ('1', 'test','test','5500','5500','/home/test','/sbin/nologin');

如果想刪除一個用戶,您可以用 MySQL的delete 指令;比如我想刪除test這個用戶;
mysql> delete from ftpusers WHERE userid="test";

如果想更新一條用戶紀錄,比如test用戶密碼欄位;
mysql> update ftpuser set passwd="123456" where userid="test";

如果你想設置quota,只要在ftpquotalimits表裡設置一下就行了
我們比如想讓test用戶,約束空間大小為100M,其它不受限制;則可用下面的mysql命令添加;
insert into ftpquotalimits (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) values ('test', 'user', 'true', 'soft', '104857600', '0','0','0','0','0');

運算公式:
1Kb=1024 byte
1M=1024 Kb
100M=100x1024 Kb= 100x1024x1024 byte=104857600 byte
注意:磁碟限額生效,必須讓FTP用戶重新登錄才有效;比如test用戶正在ftp上,這時要先退出,然後再登錄,這是磁碟限額就有效了;



7.設置ftp登陸歡迎信息文件:
%T 目前的時間
%F 所在硬碟剩下的容量
%C 目前所在的目錄
%R Client 端的主機名稱
%L Server 端的主機名稱
%U 使用者帳戶名稱
%M 最大允許連接人數
%N 目前的伺服器連接人數
%E FTP伺服器管理員的 email
%i 本次上傳的文件數量
%o 本次下載的文件數量
%t 本次上傳+下載的文件數量

vi /home/test/welcome.msg


引用
歡迎您%U,這是Frank的測試FTP伺服器;
目前時間是:%T;
本伺服器最多允許%M個用戶連接數;
目前伺服器上已有%N個用戶連接數;
目前你所在的目錄是%C;
目錄所在的硬碟還剩下%F位元組。





如果你的mysql是自編譯的,需要按照以下補充,解決問題
補充:
第3步前修改「/etc/ld.so.conf」
vi /etc/ld.so.conf
找到:/usr/lib/mysql
改成:/usr/local/mysql/lib/mysql
如果沒有這一行,直接當一行
然後方可安裝第3步

請重新指定mysql的lib及includes目錄(例:我的mysql是安裝在:/usr/local/mysql)
./configure \
--prefix=/usr/local/proftpd \
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio \
--with-includes=/usr/local/mysql/include/mysql \
--with-libraries=/usr/local/mysql/lib/mysql

以下列出安裝mysql的三個錯誤,請對症下藥
1.
make: *** Error 1
make: Leaving directory `/usr/local/file/proftpd-1.2.9/modules'
make: *** Error 2

vi contrib/mod_sql_mysql.c
找到#include <mysql.h> 把他改為你實際路徑:
如果你的mysql 安裝在 /usr/local/mysql 下,
就把它修改為#include "/usr/local/mysql/include/mysql/mysql.h"

2.如果按上面的方法修改仍然有同樣的錯誤,需修改
make: *** Error 1
make: Leaving directory `/usr/local/file/proftpd-1.2.9/modules'
make: *** Error 2

vi contrib/mod_sql_mysql.c
找到:1293行
把:make_scrambled_password(scrambled, c_clear, 1, NULL);
改成:make_scrambled_password(scrambled, c_clear);

3.
/usr/bin/ld: cannot find -lmysqlclient
collect2: ld returned 1 exit status
make: *** Error 1

cp /usr/local/mysql/lib/* /usr/lib/

[ 本帖最後由 djcat 於 2009-12-29 10:26 編輯 ]
《解決方案》

鼓勵!
《解決方案》

support good
《解決方案》

在使用中發現,如果用戶使用FTP客戶端軟體以多線程上傳,則可以突破磁碟限額,如何解決?
《解決方案》

不知怎麼達到禁止匿名用戶下載文件?
《解決方案》

安裝后出現問題,解決不了,請求幫助!

gcc  -DLINUX  -I.. -I../include -I/usr/include/mysql -O2 -Wall -c mod_sql_mysql.c
mod_sql_mysql.c: In function `cmd_checkauth':
mod_sql_mysql.c:1293: error: too many arguments to function `make_scrambled_password'
make: *** Error 1
make: Leaving directory `/root/proftpd-1.2.9/modules'
make: *** Error 2

不知道問題出在哪,請大家幫忙看看,感謝了!
《解決方案》

好貼!
《解決方案》

出錯了。quota無法正常使 。只要關閉可以正常使 。

Connected to 192.168.6.103.
220 192.168.6.103 FTP server ready
500 AUTH not understood
500 AUTH not understood
KERBEROS_V4 rejected as an authentication type
Name (192.168.6.103:jiangshu): test
331 Password required for test
Password:
421 Service not available, remote server has closed connection
Login failed.
No control connection for command: No such file or directory
《解決方案》

樓主知不知道FTP根目錄下掛分區,日誌會不會記錄掛的分區中文件的讀寫?

另外,日誌記錄中文正常嗎?

PS:希望高手賜教下
《解決方案》

:) 超級棒的,超級詳細的,樓主的教程我一次成功!

[火星人 ] Proftpd(MySQL+Quotas)已經有779次圍觀

http://coctec.com/docs/service/show-post-25213.html