張微波的BLOG–proftpd–轉貼

張微波的blog-ProFTPD教學筆記。

proftpd學習筆記(一)

這幾天,公司終於放假了,終於可以安下心來好好學些proftp+mysql+quota。

安裝proftp之前,必須先做一個工作,假如你的mysql是自己編譯的,那就必須先修改/etc/ld.so.conf,否則後面運行proftp會報錯。
vi
/etc/ld.so.conf

添加下面一行:

        /usr/local/mysql/lib/mysql

注意大家如果mysql的安裝路徑於我不一樣,則填寫相應的路徑,有關mysql的編譯安裝請參考《Linux+Apache+Mysql+PHP典型配置》。

1。下載相關軟件

        wget
        ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.9.tar.gz

下載proftp的最新版本1.2.9
        請至http://www.proftpd.org/
        下載最新版的Proftpd

這是配合proftp的磁盤限額的模塊

2。解壓編譯

        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/

        vi proftpd-1.2.9/contrib/mod_sql_mysql.c

找到#include
這一行,將mysql.h改成你的系統中此文件所在的路徑,如/usr/local/mysql/include/mysql/mysql.h

編譯:

        ./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

        make

        make install

這裡我們編譯的時候已經加進了mysql,quota,ratio等模塊的支持,我會在後面講他們的應用

ok, 現在我們可以來啟動proftp了,只要

        /usr/local/proftpd/sbin/proftpd

用你的ftp客戶端試驗以下,應該可以正常登陸,包括匿名和linux用戶名可以。

其實默認的proftp滿足日常的服務器管理用還是綽綽有餘的,有個地方還是要修改一下,就是默認proftp的配置文件不支持ftp續傳,所以我們只要

        vi /usr/local/proftpd/etc/proftpd.conf

添加以下兩行

        AllowRetrieveRestart on
        AllowStoreRestart on

重新啟動以下proftp,就可以正常續傳文件了。

創建proftpd腳本

只要在proftp的源代碼目錄

cp proftpd-1.2.9/contrib/dist/rpm/proftpd.init.d
/etc/rc.d/init.d/proftpd

記得修改proftpd文件,一般要修改proftpd的實際路徑

        chmod 755 /etc/rc.d/init.d/proftpd

ok

以後就可以用這個教本來啟動,停止,重啟proftp

呵呵,今天就講這些,明天講些proftp的一些基礎配置:)
proftpd學習筆記(二)

上次我們講了proftp的基本安裝,由於我們後面有關於mysql和quota的設置,所以編譯的時候把相應的模塊都編譯進去了,如果你不需要mysql和磁盤限額的功能,完全可以不需要這麼編譯。

這裡要講一個非常實用的命令,

        /usr/local/proftpd/sbin/ftpshut

這個命令還是比較實用的,因為你可能需要不斷的調整你的服務器,而這個命令就非常靈活,可以在不停止proftpd進程的前提下,定時停止ftp連接,這裡將會詳細說它是怎麼使用的。

        ftpshut [ -l min ] [ -d min ] time [ warning-message …
        ]

-l min: 在ftp關閉服務之前的幾分鐘內,嘗試建立新的ftp連接均不被接受
-d min:
在ftp關閉服務之前的幾分鐘內,已經建立的ftp連接將被中止
time: 在多少時間後,服務器將關閉ftp服務,格式有兩種
+number
經過number分鐘後關閉
MMHH 在今天MM:HH服務器將關閉

注意,這裡我們用這個命令是把ftp服務給停了,但實際的proftpd進程還沒停止,所以一般調試ftp會使用到這個命令。

舉例:
再經過30分鐘後,FTP服務將關閉,在這之前的20分鐘不可接受任何新的ftp連接,已經建立的在服務關閉前10分鐘強制斷線,並在客戶端顯示「FTP
Server Will shutdown at time」

        ftpshut -l 20 -d 10 +30 "FTP Server Will shutdown at
        time"

其實ftpshut就是產生/etc/shutmsg ,你只要刪除這個文件ftp又可以重新服務,或者
直接

        ftpshut -R

好了,開始講一些proftpd的基本配置吧,其實大家如果熟悉apache的配置的話,你會發現proftpd的設置基本都是類似的,它的配置基本格式是

        #全局設置
        設置項目1 參數1
        設置項目2 參數2

        #某個目錄的設置

        …
        …

        #關於匿名用戶的設置

        …
        …

        …
        …

我們用到的比較多的可能是Limit的使用,Limit大致有以下動作,基本能覆蓋全部的權限了,大家靈活使用就是了。

        CMD:Change Working Directory 改變目錄
        MKD:MaKe Directory
        建立目錄的權限
        RNFR: ReName FRom 更改目錄名的權限
        DELE:DELEte 刪除文件的權限
        RMD:ReMove
        Directory 刪除目錄的權限
        RETR:RETRieve 從服務端下載到客戶端的權限
        STOR:STORe
        從客戶端上傳到服務端的權限
        READ:可讀的權限,不包括列目錄的權限,相當於RETR,STAT等
        WRITE:寫文件或者目錄的權限,包括MKD和RMD
        DIRS:是否允許列目錄,相當於LIST,NLST等權限,還是比較實用的
        ALL:所有權限
        LOGIN:是否允許登陸的權限

針對上面這個Limit所應用的對象,又包括以下範圍

        AllowUser 針對某個用戶允許的Limit
        DenyUser 針對某個用戶禁止的Limit
        AllowGroup
        針對某個用戶組允許的Limit
        DenyGroup 針對某個用戶組禁止的Limit
        AllowAll
        針對所有用戶組允許的Limit
        DenyAll 針對所有用戶禁止的Limit

關於限制速率的參數為:

        TransferRate STOR|RETR 速度(Kbytes/s) user 使用者

下面我們以例子來解說proftp的配置,這樣大家可能更加容易理解。

1。ftp服務器支持斷點續傳,且最大支持同時10人在線,每個ip只允許一個連接;
2。允許ftpusers用戶組只能訪問自己的目錄,而不能訪問上級或者其他目錄;
3。用戶登陸服務器時不顯示ftp服務器版本信息,以增加安全性;
4。建立一個kaoyan的ftp帳戶,屬於ftpusers組,kaoyan用戶只允許下載,沒有可寫的權限。下載速率限制在50Kbytes/s。
5。建立一個upload用戶,也屬於ftpusers組,同kaoyan用戶的宿主目錄一樣,允許upload用戶上傳文件和創建目錄的權限,但不允許下載,並且不允許刪除目錄和文件的權限,上傳的速率控制在100Kbytes/s

先是前期的用戶和組添加以及目錄的權限設置

        group add ftpusers
        useradd -d /home/kaoyan -g ftpusers -s
        /bin/fales kaoyan
        useradd -d /home/kaoyan -g ftpusers -s /bin/fales
        upload
        chown -R kaoyan:upload /home/kaoyan
        chmod -R 775
        /home/kaoyan

如果你只想ftpusers組的用戶訪問,可以設置成770都行。
設置/usr/local/proftpd/etc/proftpd.conf

注意#表示註釋,對設置沒影響,可以不寫

        ServerName "Frank's FTP Server"
        ServerType
        standalone
        DefaultServer on
        Port 21
        Umask 022
        MaxInstances 30
        #最多有30個proftpd的PID
        User nobody
        Group nobody
        TimeoutStalled
        10
        MaxClients 10 #最多允許10個用戶在線
        MaxClientsPerHost 1
        "對不起,一個IP只允許一個連接"
        AllowStoreRestart on

        #允許斷點續傳(上傳),斷點續續(下載)是默認支持的,不用設置
        DisplayLogin welcome.msg
        #歡迎詞文件
        ServerIdent off #屏蔽服務器版本信息
        DefaultRoot ~ ftpusers
        #設置ftpusers組只能訪問自己的目錄

        AllowOverwrite
        on

        #不允許寫
        DenyUser kaoyan

        #不允許刪除,改名,下載
        DenyUser upload

        TransferRate RETR
        50 user kaoyan
        TransferRate STOR 100 user
        upload

我這裡實現的方式還可以通過

        …

        …

        <>

        …

        …

而且更加靈活,具體用那種方式,看大家了,我只是給大家入個門而已

好了,今天就講到這裡,明天繼續講一些proftp的其他配置

proftpd學習筆記(三)

前面的兩個筆記,我想大家對proftp的設置應該有些認識,是不是跟apache的配置差不多吧。我想配置過Serv_U服務器的,再稍微看一下proftp的配置規則,應該能馬上能配置出一個強大的proftp服務器。

這裡我們再講一些proftp的其他參數配置:

MaxHostsPerUser 1 "對不起,每個帳戶最多允許來源ip為1個"
#MaxHostsPerUser
對防止ftp帳號還是比較有用的。

MaxClientsPerUser 1 "對不起,每個帳戶在每個客戶端最多可以同時登陸1次"
#這個參數可以防止多線程軟件下載對服務器的破壞

MaxClientsPerHost 1
"對不起,同一個客戶端只能最多1個帳號可以登陸"
#比如ftp服務端有好多帳戶你都有,但也只能用1個帳號登陸

呵呵,這三個Max參數比較容易搞暈,大家可要搞清他們的含義哦:)

WtmpLog on
#是否要把ftp記錄在日誌中,如果不想可以設置成off屏蔽掉log日誌。

TimeoutIdle 600
#客戶端idel時間設置,默認就是600秒

DisplayLogin welcome.msg
#設置ftp登陸歡迎信息文件

關於歡迎文件的設置包含如下參數

        %T 目前的時間

        %F 所在硬盤剩下的容量

        %C 目前所在的目錄

        %R Client
        端的主機名稱

        %L Server 端的主機名稱

        %U 使用者帳戶名稱

        %M 最大允許連接人數

        %N 目前的服務器連接人數

        %E FTP服務器管理員的 email

        %i 本次上傳的文件數量

        %o 本次下載的文件數量

        %t 本次上傳+下載的文件數量

知道這些參數,我們就可以寫出一個友好的歡迎語

vi /home/kaoyan/welcome.msg

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

讓proftp支持現在流行的FXP傳輸方式,默認是不支持的。
只要在服務端設置

        AllowForeignAddress on

        PassivePorts 49152 65534
        #端口也可自己指定喜歡的

千萬別忘了在客戶端也要設置成支持FXP哦,否則想我試驗了好幾次,一直以為服務器沒設置好,其實就是客戶端沒設置,呵呵。

如何讓root能登陸,默認proftp是不支持root登陸,我們可以設置讓root也能登陸ftp,不過我在這裡還是建議大家最好不要讓root能登陸ftp,設置如下

        RootLogin on

如何禁止某個地址訪問ftp
比如禁止10.1.1網段的機器訪問ftp,可以這麼設置

        Order deny,allow
        Deny from
        10.1.1.
        Allow from all

虛擬ftp的建立,一般用於一台ftp服務器有好多ip地址,或者ftp用不同的端口,基本設置語法是:

比如我們要做一個端口是5555的ftp服務器:

        ServerName "Frank FTP
        Server"
        Port 5555
        …

        …

        …

        …

至於虛擬主機中的其他設置跟我以前講的基本差不多

上傳/下載比率設置,我想用過Serv_U的朋友一定知道這個功能的使用,我們這裡讓proftp也實現這個功能。
要實現功能注意編譯的時候加入ratio模塊,否則proftp默認是不支持,假設有個帳戶ftp1的ftp目錄在/home/kaoyan
,然後我們設置ftp1的上傳/下載比率是1:2(即上傳1M,就可以下載2M)

        touch /home/kaoyan/ratio.dat
        touch
        /home/kaoyan/ratio.tmp
        chmod -R 666 /home/kaoyan

在proftpd.conf設置如下

        Ratios on
        SaveRatios on
        RatioFile
        /home/kaoyan/ratio.dat
        RatioTempFile /home/kaoyan/ratio.tmp

在相應的設置項裡添加

        UserRatio ftp1 0 0 2 1000

#UserRatio "使用者帳戶" fileratio filequota byteratio bytequota
#  fileratio
:以文件為基礎的比率,通常不限制,故為 0
#  filequota :預設置能下載多少文件,不限制時為 0
#  byteratio
:就是上傳/下載的比例,如果數字為2,表示1:2
#  bytequota :預設置能下載多少 KBytes
的文件
#上面設置的就是1:2的比率,默認只允許下載1M的文件

ok,重啟一下,以後ftp1就可以啟用上傳/下載比率了
proftpd學習筆記(四)

今天我們講proftp+mysql+quota的應用,我想大家最期待的就是這個了吧

1.首先我們建立相應的用戶和用戶組

        groupadd -g 5500 ftpgroup
        adduser -u 5500 -s /bin/false -d
        /bin/null -c "proftpd user" -g ftpgroup ftpuser

2.操作數據庫

        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',
        `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`)
        ) TYPE=MyISAM COMMENT='ProFTP
        user table' ;

注意這裡大家根據實際情況填寫自己數據庫的用戶名和密碼,如果大家對數據庫操作不熟悉的話,不妨可以用phpmyadmin來操作。

3.配置proftp文件

        ServerName "Frank's FTP Server" ServerType standalone DefaultServer
        on

        Port 21

        Umask 022

        MaxInstances 30
        MaxLoginAttempts 3

        User nobody
        Group nobody

        MaxHostsPerUser 1 "Sorry, you may not connect more than one
        time."
        MaxClientsPerUser 2 "Only one such user at a
        time."
        MaxClientsPerHost 3 "Sorry, you may not connect more than one
        time."

        RootLogin off
        RequireValidShell off
        TimeoutStalled 10
        MaxClients
        10
        AllowForeignAddress on
        AllowStoreRestart on
        ServerIdent
        off
        DefaultRoot ~ ftpgroup

        SQLAuthTypes Backend Plaintext
        #Backend表示用戶認證方式為MySQL數據庫的認證方式

        #Plaintext表示明文認證方式,排在最前面的為最先使用的方式
        SQLAuthenticate users* groups*

        # databasename@host database_user user_password
        SQLConnectInfo
        ftpdb@localhost proftpd password
        SQLUserInfo ftpuser userid passwd uid gid
        homedir shell
        SQLGroupInfo ftpgroup groupname gid
        members
        SQLHomedirOnDemand
        on
        #如果用戶主目錄不存在,則系統會根據此用戶在用戶數據表中的homedir字段的值新建一個目錄
        # Update count every
        time user logs in
        SQLLog PASS updatecount
        SQLNamedQuery updatecount UPDATE
        "count=count+1,accessed=now() WHERE userid is NULL %u'" ftpuser
        # Update modified
        everytime user uploads or deletes a file
        SQLLog STOR,DELE
        modified
        SQLNamedQuery modified UPDATE "modified=now() WHERE userid is NULL %u'"
        ftpuser

        QuotaEngine on
        QuotaDirectoryTally on
        QuotaDisplayUnits
        Mb
        QuotaShowQuotas on
        QuotaLog "/var/log/quota"
        SQLNamedQuery
        get-quota-limit SELECT "name, quota_type, per_session, limit_type,
        bytes_in_avail, bytes_out_avai
        l, bytes_xfer_avail, files_in_avail,
        files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name is NULL %{0}'
        AND
        quota_type is NULL %{1}'"

        SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used,
        bytes_out_used, bytes_xfer_used, files_i
        n_used, files_out_used,
        files_xfer_used FROM ftpquotatallies WHERE name is NULL %{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}'" ftpquota
        tallies

        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

ok,就這麼簡單,重啟一下proftp服務就已經能使用proftp+mysql+quota的功能

我們可以在數據庫ftpuser添加一個虛擬用戶,

        INSERT INTO `ftpuser` VALUES (1, 'test', 'ftppasswd', 5500, 5500,
        '/home/test', '/sbin/nologin');

大家可以在phpmyadmin裡直接操作添加一個用戶,相信不用我教大家怎麼添加吧:)

如果你想設置quota,只要在ftpquotalimits表裡設置一下就行了,這個表裡的各個參數分別代表:

        quotalimits表

        name: – 用戶帳號
        quota type: – user, group, class, all (we use
        user)
        per_session: – true or false (we use true)
        limit_type: – 硬限制 or 軟限制
        (我們一般用硬限制)
        bytes_in_avail: – 允許上傳的字節數
        bytes_out_avail: –
        允許下載的字節數
        bytes_xfer_avail: – 允許傳輸的字節數(包括上傳/下載)
        files_in_avail: –
        允許上傳的文件數
        files_out_avail: – 允許下載的文件數
        files_xfer_avail: –
        允許傳輸的文件數(包括上傳/下載)

老實說用mysql和quota模塊來驗證用戶和設置磁盤限額,但我總覺得還是不夠完善,因為在這個方法中,數據庫表裡還沒有相應的權限的字段,所以說相應用戶的權限還是得用實際得用戶即mysql對應得uid和gid來控制權限,那天要是mysql數據庫也能完全控制權限就好了。

大家如果覺得格式拷貝的時候可能會出錯的話,不妨直接下載我的配置文件和數據庫表

下載proftpd.conf
下載ftpdb.sql
只是我的數據庫表裡對應的uid和gid都是5500,大家可根據自己的情況修改:)注意消化哦。

這個春節一直在學習proftp,終於可以鬆口氣了,希望我的學習筆記可以對一些想學習proftp的朋友有所幫助,請多交流

轉貼自張微波的BLOG–proftpd
http://www.5ilinux.com/blog/
若有侵權請來信告知喔。^^

在〈張微波的BLOG–proftpd–轉貼〉中有 1 則留言

  1. 自動引用通知: proftpd » KB (Knowledge Base)

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料