引言:Linux下的ftp服务器的配置方法网上的教程很多,以下我选了一篇介绍ProFTPD的教程,这篇教程对入门者很有帮助。在此,先谢谢原文作者鸟哥:-)

簡易 FTP Server 架設 -- Pro FTPD
最近更新日期:2003/09/05
前言:
  • 眾所皆知的, FTP 是一個行之有年的網路通訊協定,我們可以透過 FTP 這個協定在不同的作業平台上面進行檔案的傳輸、刪除與移動等等的工作,而使用最為廣泛的 FTP 架設軟體就是那個 Wu FTP 了!但是由於 Wu FTP 畢竟在『安全歷史』的過程中,實在是被發現了太多的危險漏洞了,所以目前有相當多強調安全性的 FTP 伺服器軟體漸漸抬頭,其中之一就是這個有名的 Professional FTPD 了!底下我們來談一談為何需要有這個伺服器軟體以及相關的其他說明吧!
     

    為什麼要使用 Professional FTP daemon 呢?
     
    既然 Wu FTP 這個伺服器軟體並不是十分的安全,所以這個 Pro FTPD 當然主要就是以較為安全的角度去設計的一個全新的 FTP 伺服器軟體了!在 ProFTPD 的官方網站上面也提出了,最早設計這個 FTP 的理念不是想要『幹掉 Wu FTP 』,而是希望給予大家一個更為安全,且在設定上面更為便利的一個 FTP 伺服器軟體囉!除了安全性之外,為何還要強調『設定便利性』呢?這是因為目前在 Windows 的系統當中 ( Win32 ),有個相當有名氣的 FTP 伺服器軟體,那就是鼎鼎大名的 Server-U 囉!這個 Server U 實在是很厲害,在設定上面相當的簡易,此外,還可以根據不同的使用者給予不同的傳輸速度與上傳、下載比例,設定上面又很有彈性,實在是難能可貴的一套軟體!那麼我們的 Wu FTP 能否達到這樣的功能呢?當然可以囉!不過.....設定上確實比較麻煩~因此上,這個 proftpd 可就幫了個大忙囉!
     
    基本上, ProFTPD 主要具有底下的幾個特徵:
    • 主要的設定檔僅有一個,設定上甚為簡易;
    • 每一個開放出去的目錄底下的 .ftpaccess 可以用來取代 ProFTPD 的主要設定檔規範的參數, .ftpaccess 功能類似於 Apache.htaccess 喔;
    • 設定 FTP 成為具有虛擬 FTP 主機與匿名登入 FTP 主機的設定甚為簡易;
    • 可以依據個人的設定要求,以 stand-alone 的方式或者 inet/xinet (Super daemon) 的管理方式來啟動;
    • 匿名登入時,使用者所登入的目錄底下,不需要額外的 binary 執行程式的支援,具有較佳的安全性;
    • 不需要 Linux System 本機的執行程式的支援,由於使用 Linux 本機的程式可能會造成系統安全上的顧慮, ProFTPD 在自己的原始碼當中已經含有所需要的執行指令了,所以不需要系統的 binary 執行檔的支援,系統安全上面較可靠;
    • 仍然具有 Linux 系統本身的 user/owner 權限屬性,以及隱藏檔的屬性等等均存在;
    • 使用者登入 ProFTPD 時,登入的資訊將會存放一份在 utmp/wtmp 的登錄檔中,這是什麼呢?這就是使用 last 可以顯示出登入資訊的重要登錄檔囉!
    • 登錄密碼可支援 Shadow 密碼檔案 ( /etc/shadow ),亦同時支援已經死亡的帳號 ( 請參考『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的 帳號管理部分關於 shadow 的介紹 )

    看起來覺得真的很不錯吧!呵呵!尤其是那個 .ftpaccess 檔案更是能夠引起使用者的『興趣』呢!怎麼說呢?還記得在 Apache 裡面如果使用者想要架設一個屬於自己的個人首頁時,可以依照 .htaccess 設計自己的風格啊!同樣的,在 ProFTPD 當中,使用者也可以藉由 .ftpaccess 這個檔案來『設計屬於自己的 FTP 主機』喔!可以不必依照 Linux 本機 FTP 伺服器軟體的僵化設定呢!呵呵!真是粉不錯喔!
     

    架設之前你需要瞭解的原理
     
    與之前我們所說明各個 Server 的架設時需要知道的原理一樣,這裡我們還是得針對 FTP 的『連線原理』來說明一下,但是這部份我們已經在 Wu FTP 裡面說過了,所以請前往 Wu FTP 那一章節好好閱讀一下吧!在開始 FTP 的設定之前,你必須要知道的原理有:
    • FTP 在 Client 與 Server 進行連線時,主要使用到的 port 有幾個?分別具有什麼用途?
    • Client 與 Server 進行 FTP 連線時,其模式分為 Active 與 Passive ,這兩種模式的差異為何?
    • 當 FTP 架設在防火牆內部時,則這個 FTP 需要使用的連線模式為何?

    如果你能夠瞭解上面的幾個細節,那麼設定 FTP 是一點也不困難的呢!底下我們就來談一談這個好用的 proftpd 吧!

套件安裝
  • 雖然 Wu FTP 可能還是目前使用上最廣泛的 FTP 伺服器軟體,不過,畢竟安全上面有點小問題,所以近年來各主要的 Linux distributions 在發佈 FTP 伺服器軟體時,漸漸的都以 ProFTPD 來取代 Wu FTP 了!例如近期的 Mandrake 9.x 等等!而由於這些主要的 distribution 使用的是 RPM 的安裝方式,因此,呵呵!如果您的系統是屬於這些較近期的版本,那麼就直接以 RPM 的方式來安裝這個 FTP 伺服器軟體即可!
     
    不過,畢竟使用 Wu FTP 的朋友大有人在,而且在提供 Wu FTP 套件的 distributions 通常是不提供 proftpd 的 RPM 版本的,所以這裡我們主要也以 Tarball 的方式來安裝 ProFTPD 。如此一來,不論您原先是使用 Wu FTP 還是原本就是 ProFTPD ,都可以經由 Tarball 的方式來重新安裝一次你的 FTP 伺服器軟體呢!廢話不再多說了,趕緊來看看怎麼以 Tarball 的方式安裝 ProFTPD 吧!
    • 下載 proftpd:

    • 您可以前往 ProFTPD 的官方網站下載 proftpd ,不過,蠻建議在台灣的中山大學 FTP 網站下載的,他的速度也是粉快的喔!中山大學關於 ProFTPD 的網址在: http://ftp.nsysu.edu.tw/Unix/FTP/proftpd/distrib/source/,我在這裡測試的版本是 1.2.8 這個在 2003/03 出的最新版的 ProFTPD 喔!所以他的檔名應該是:proftpd-1.2.8.tar.gz 這個檔案的啦!你也可以在我們網站下載 ( http://linux.vbird.org/download/index.php#proftpd ),你可以使用 wget 或者是 ncftp 來到各大 FTP 網站下載喔!
    • 設定、編譯與安裝 proftpd:

    • 又到了這個時刻了!請注意您的 gcc 以及 make 有沒有安裝啊!如果沒有安裝的話,就趕緊先安裝吧!我們要來安裝 ProFTPD 囉 ( 註:我是在 Red Hat 9 上面進行編譯測試的! ):
      1. 將剛剛下載的 proftpd 解壓縮:
      [root@tet root]# wget  /
      http://ftp.nsysu.edu.tw/Unix/FTP/proftpd/distrib/source/proftpd-1.2.8.tar.gz
      [root@test root]# cd /usr/local/src
      [root@test src]# tar -zxvf /root/proftpd-1.2.8.tar.gz
      # ...(略)...會主動產生 proftpd-1.2.8 的目錄
      [root@test src]# cd proftpd-1.2.8
      # 在這個目錄底下的 INSTALL 請詳細的閱讀,裡面有安裝的幾個重要資訊!
       
      2. 進行編譯前的參數設定:
      [root@test proftpd-1.2.8]# ./configure --prefix=/usr/local/proftpd /
      > --enable-shadow --enable-autoshadow  /
      > --with-modules=mod_ratio:mod_readme:mod_wrap
      # 請注意,那個 prefix 表示我預計要安裝 proftpd 的目錄;
      # 至於 --enable-shadow 與 --enable-autoshadow 則是預計要以
      # 系統的 /etc/shadow 做為我的 FTP 登入時的密碼驗證檔案!
      # 此外,還加入許多的支援模組,會讓我們的 Proftpd 變的更活潑!
       
      [root@test proftpd-1.2.8]# make && make install
      # 經過這個步驟之後,你的 proftpd 就會安裝在 /usr/local/proftpd 之內,
      # 其中,設定檔在 /usr/local/proftpd/etc/proftpd.conf !
      # 至於說明檔 (man pages)則在 /usr/local/proftpd/man 當中!
       
      3. 設定一些查詢的相關功能!
      [root@test proftpd-1.2.8]# vi /etc/man.config
      # 加入底下這一行,這樣才能以 man 來查詢指令的用法!
      MANPATH /usr/local/proftpd/man
      很簡單吧!這樣就已經編譯並且安裝好了 Proftpd 囉!^_^!接下來就要開始來測試看看囉!
    • 設定以 xinetd 來啟動 proftpd :

    • 事實上,目前大部分的 FTP daemon 多是以 super daemon 來啟動的!所以這裡我們也直接以 xinetd 來設定 proftpd 吧!畢竟多了一層管理,會更安全的啊! ^_^!設定的方法也真是很簡單~只要編輯 xinetd 底下的 proftpd 以及 proftpd.conf 檔案裡面的一些內容即可!
      [root@test root]# vi /etc/xinetd.d/proftpd
      service ftp
      {
        disable        = no
             flags           = REUSE
             socket_type     = stream
             wait            = no
             user            = root
        server         = /usr/local/proftpd/sbin/proftpd
             server_args     = -c /usr/local/proftpd/etc/proftpd.conf 
             log_on_success  += DURATION USERID
             log_on_failure  += USERID
      }
      # 上面的重點在於兩行粗體字的地方!尤其是 server =.. 那一行!
      # 由於我們是使用 Tarball 安裝的,自然就以我們的檔案放置目錄為主,
      # 如果您使用 RPM 安裝,這裡就不太相同囉!
      # 另外,那個 server_args 後面接的則是設定檔的檔名咯!
       
      [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
      # 找到底下這個設定值:
      ServerType                      standalone
      Group                           nogroup
      # 因為我們的系統預設並沒有 nogroup 這個群組,所以必須要將他改成
      # 系統裡面有的群組才行吶!而伺服器啟動的方式有 super daemon 與 
      # stand alone ,所以:
      ServerType                      inetd
      Group                           nobody
       
      [root@test root]# /etc/rc.d/init.d/xinetd restart
      [root@test root]# netstat -tlnp
      tcp        0      0 0.0.0.0:21    0.0.0.0:*    LISTEN  8483/xinetd
      # 呵呵! 21 這個埠口出現了!理論上沒有問題,不過還是需要分析一下
      # /var/log/messages 這個檔案的內容才行喔!
      一般來說,我們還是比較建議使用 xinetd 的方式來啟動服務的,尤其是 FTP 之類的伺服器架設。在這個案例當中,我們就使用了 xinetd 來啟動,不過, proftpd 的設定檔 proftpd.conf 裡面就必須要規定好 ServerType 這個設定值,有兩個選擇:
      • standalone:表示獨立啟動的意思;
      • inetd:表示使用 super daemon ,不論是 inetd 或者是 xinetd 均使用這個設定值。

      所以囉,這裡需要修訂好才行!然後就可以正確的來啟動囉!很簡單吧! ^_^! 好了,準備來詳細的分析 proftpd 囉!

Server 端設定:
  • Proftpd 在設定上簡單是很簡單,不過,如果要說複雜的設定的話,又很多樣化喔!那麼就來談一談吧!
     

    proftpd 的結構
     
    這個 proftpd 伺服器的架構其實也是很簡單的!主要設定檔僅有一個而已,我們就來說一說 proftpd 需要注意的檔案吧!
    • proftpd.conf:這個就是主要的 proftpd 的設定檔了!在 RPM 安裝的範例中,他所在的目錄為 /etc/proftpd.conf ,在鳥哥的這個範例中,則是放置在 /usr/local/proftpd/etc/proftpd.conf 當中喔!我們未來要談的種種 proftpd 的設定,均是在這個檔案裡面設定的。他詳細的設定方法其實在這個 proftpd.conf 檔案裡面就已經寫得很詳細咯!而且 proftpd 也提供了很詳細的文件資料了,如果是以 RPM 安裝您的 proftpd 的話,那麼文件檔案放置在 /usr/share/doc/proftpd-"版本"/Configuration.html ,若以 Tarball 安裝則在 /usr/local/src/proftpd-"版本"/ Configuration.html。不過,該說明檔實在是太複雜了~只要知道其中一些主要設定即可!這也是我們在後續的介紹所想要傳達的喔!

    • proftpd:這個是主要的 proftpd 的 daemon 執行檔!我們得要啟動他才行喔!此外,這也是 TCP Wrappers (/etc/hosts.deny(allow))設定裡頭的服務檔案檔名。另外,當 proftpd 在啟動的時候會去讀取設定檔,也就是 proftpd.conf 這個檔案,不過,我們也可以指定其他的檔案來進行 proftpd 的設定喔!果真如此,就必須要這樣啟動 proftpd 了:
    • [root@test root]# proftpd -c 設定檔檔名
      [root@test root]# proftpd -c /usr/local/proftpd/etc/proftpd.conf
    • ftpcount:目前在主機上面使用 proftpd 的連線數,直接在指令列下達 ftpcount 即可!

    • ftpshut:指定再過多久之後 proftpd 服務會終止!有的時候我們會需要維護 FTP 主機對吧!所以需要關機啊!關掉 ftp 服務之前,可以使用這個 ftpshut 指令來進行喔!他的語法如下所示:
    • [root@test root]# ftpshut [-l 分鐘] -d [分鐘] 時間 "訊息"
      參數說明:
      -l  :在 FTP 伺服器關閉服務之前的多少分鐘,嘗試建立新的 FTP 連線者均不被接受
      -d  :在 FTP 伺服器關閉服務之前的多少分鐘,以建立的 FTP 連線將強制被終止
      時間:在什麼時候或多少分鐘後, FTP 伺服器將關閉 FTP 服務!格式有兩種:
         +number :再經過 number 分鐘後 FTP 會關閉
         MMHH    :在今天的 MM:HH 時間 FTP 會關閉
      訊息:顯示給 user 看的資訊!
      範例:
       
      範例一:
      # 再經過 180 分鐘後,FTP 會關機,且關機前 20 分鐘即不可再接受新連線,
      # 而以建立的連線在關機前 10 分鐘強制斷線,並在 client 端顯示:
      # FTP will shutdown at time
      [root@test root]# ftpshut -l 20 -d 10 +180 "This FTP will shutdown at time"
      事實上, ftpshut 僅會建立一個檔案,亦即是 /etc/shutmsg 而已,還記得這個檔案吧?!在前一章 Wu FTP 主機設定裡面的 最簡單的 ftpaccess 設定,裡頭第八項提到的項目,呵呵!沒錯!就是這個檔案咯!如果您想要重新啟動 FTP 服務的話,只要將這個檔案殺掉,或者是將這個檔案裡面的相關數字修改一下即可!請翻至前一章節查閱喔!
    • ftpwho:可以用來察看目前有多少人使用 proftpd 這個服務喔!簡單的語法直接下達 ftpwho 即可,如下所示:
    •  
      [root@test root]# ftpwho
      standalone FTP daemon [8451]:
      10194 badbird    [ 0m11s]   0m6s (idle)
      Service class                      -   1 user
      # 如上所示,目前有一個使用者,名為 badbird 的帳號,在使用 proftpd 喔!
    大致上就是這樣啦!咦!怎麼沒有提到 anonymous 登入 FTP 時的根目錄呢?呵呵!那個咚咚是在 proftpd.conf 裡面設定的啦!等一下再告訴你!
     

    proftpd.conf 的設定方式
     
    Proftpd 最重要的設定是在 proftpd.conf 這個檔案內了!好了,那麼這個檔案的內容是如何設定的呢?基本上,這個檔案的設定與 Apache 很類似吶!有點像這樣:
    # 關於主機相關的設定
    設定項目一  參數內容
    設定參數二  參數內容
     
    # 關於某些目錄的權限設定
    <Directory "完整目錄名稱">
    ...
    ...
    ...
    </Directory>
     
    # 關於 Anonymous 的目錄與權限設定
    <Anonymous "匿名登入時候的匿名者根目錄">
    ...
    ...
     <Limit 一些動作>
     ...
     ...
     </Limit>
    </Anonymous>

    是否與 Apache 主機的設定檔: httpd.conf 語法很類似呢?所以囉,呵呵,設定上也有很相似的參數喔!反正,只要是沒有被 <xxx> </xxx> 包含在內的設定參數,都是屬於主機與 Real User 的設定值,而與匿名者有關的設定則是在 <Anonymous> 與 </Anonymous> 內的設定值!此外,我們還可以透過 <Limit> 這個設定參數來訂定某些動作是否可做喔!至於在這個檔案內,只要該行是以 # 開頭,表示該行是『註解』而已的啦!好了,那麼 Limit 有哪些動作呢?!基本上有底下這些:
    • CWD  :Change Working Directory,變換目錄之意;
    • MKD  :MaKe Directory,可建立目錄與否;
    • RNFR :ReName FRom,可更改檔名與否;
    • DELE :DELEt,可刪除檔案語法;
    • RMD  :ReMove Directory,可移除目錄與否;
    • RETR :RETRieve,下載之意!由 Server 傳送資料到 Client;
    • READ :可讀取與否
    • WRITE:可寫入與否
    • STOR :STORe,上傳之意,由 Client 傳送資料到 Server !
    • ALL  :全部的動作!

    除此之外,我們還可以指定 .ftpaccess 這個檔案的設定呢!這與 proftpd.conf 內的 AllowOverride 參數有關!這個 .ftpaccess 就是允許使用者自行設定 FTP 的風格,當 FTP 的 Client 軟體登入某個目錄,而該目錄內支援 .ftpaccess 時,那麼該 FTP Client 軟體將接受 .ftpaccess 的使用者自訂風格喔!這個 .ftpaccess 與 Apache 的 .htaccess 有類似的用法咯! ^_^!還有, proftpd.conf 也支援變數,變數的內容如下:
     
    %T 目前的時間
    %F 所在硬碟剩下的容量
    %C 目前所在的目錄
    %R Client 端的主機名稱
    %L Server 端的主機名稱
    %U 使用者帳號名稱
    %M 最大允許連線人數
    %N 目前的主機連線人數
    %E FTP 主機管理員的 email 
    %i 本次上傳的檔案數目
    %o 本次下載的檔案數量
    %t 本次上傳+下載的檔案數量


    最簡單的 proftpd.conf 設定檔
     
    事實上,當我們安裝好了 proftpd 之後,就已經提供了一個很簡單但是已經夠用的 proftpd.conf 的設定內容了!我們就來談一談這個簡易的設定內容吧!
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 底下是 FTP 主機的環境設定,每個項目的內容為:
    # ServerName :當使用者登入主機的時候,proftpd 會顯示在 Client 端
    #       的 FTP 軟體的一些基本訊息啦!
    # ServerType :啟動 proftpd 的方法,有兩種方式,分別是 standalone
    #       與 inetd ,因為我們是以 super daemon 啟動的,所以
    #       設定為 inetd 喔!如果您想獨立啟動(不透過 xinetd )
    #       就需要設定為 standalone 了
    # DefaultServer:預設的主機啊!這個項目可以設定為 on 或 off ,基本上,
    #        除非您有兩個 IP 或者是設定了虛擬主機 (virtualhost),
    #        否則這個項目都應該要設定為 on 才行!不然有些 uknown 
    #        的連線會無法連接到您的 FTP 服務喔!
    # Port :設定主機的 FTP 命令通道埠口!如前面 Wu FTP 所說明的,FTP
    #    命令通道通常為 21  ,您也可以更改,不過,這個設定只有當
    #    ServerType 為 standalone 時才有效!若為 inetd 則與 xientd 及
    #    /etc/services 有關那!請前往參考 wu FTP 的修改 port 設定
    # Umask :與建立目錄及檔案的預設屬性有關的設定喔!用 022 就夠了!
    # MaxInstances:同一時間允許的連線數目,這個設定項目與 process (PID) 有關!
    #        所以您的 FTP 主機中,proftpd 啟用的 process 最多能有30個
    #        這個與 MaxClients 不一樣喔!
    # User 與 Group:proftpd 預設的服務啟動者!後面接的使用者與群組
    #        必須在 /etc/passwd 與 /etc/group 裡面存在方可!
    ServerName                      "這個是鳥哥的測試用的 Proftp 主機"
    ServerType                      inetd
    DefaultServer                   on
    Port                            21
    Umask                           022
    MaxInstances                    30
    User                            nobody
    Group                           nobody
     
    # 底下則是與目錄有關的設定!在這個設定中,顯示允許讀寫與覆蓋檔案!
    # AllowOverwrite 就是允許覆寫的意思!
    <Directory />
      AllowOverwrite                on
    </Directory>
     
    # 底下與匿名登入者有關!由 <anonymous ~ftp> 顯示:『預設的匿名登入之
    # 根目錄為 ftp 這個使用者的家目錄!』,因為 ~ 代表家目錄的意思!
    # 而且,匿名登入主機後,該 process 取得的 user:group 權限為 ftp:ftp!
    # 至於那個 UserAlias 就是在設定『名字的別名』啊!語法為:
    # UserAlias "登入者的帳號" "實際 Linux 主機的帳號"
    # MaxClients:最多僅允許 10 個 anonymous 登入我們主機的意思!
    # DisplayLogin:當使用者登入之後的歡迎畫面的檔案內容!
    # DisplayFirstChdir:轉換到某目錄時(cd指令),顯示該目錄的注意事項檔案內容
    <Anonymous ~ftp>
      User                          ftp
      Group                         ftp
      UserAlias                     anonymous ftp
      MaxClients                    10
      DisplayLogin                  welcome.msg
      DisplayFirstChdir             .message
     # 底下則是限制 anonymous 『不具有寫入的權限!』因為 WRITE 是寫入,
     # 加上 DenyAll 則是寫入的權限被取消之意!
      <Limit WRITE>
        DenyAll
      </Limit>
    </Anonymous>

    所以,在這個例子當中,我們的 proftpd 具有下列功能:
    • 以 super daemon 啟動 proftpd ,且啟動 proftpd 的權限為 nobody:nobody ,此外,最多僅具有 30 個 process;
    • proftpd 使用 port number 為 port 21 喔(其實是需要看 /etc/xinetd.d/proftpd 的設定)!
    • 這個 proftpd 同時允許實體用戶(real user)與匿名用戶(anonymous)登入!
    • real user 可以跳離自己的家目錄(沒有 chroot),且具有寫入的權限,此外,建立目錄與檔案預設權限為 dir:755, file:644;
    • anonymous 用戶最多僅能同時 10 人上線,且具有的權限為 ftp:ftp,並且『anonymous 沒有寫入的權限!』

    事實上,這樣的設定已經能夠符合一般主機的設定囉!如果您還不滿意,可以額外的再加入其他的設定喔!底下就來談一談!
     

    針對實體用戶的設定
     
    事實上,在上面的 最簡單 proftpd.conf 設定 當中就已經針對了實體用戶( Real User )進行了若干的設定了!不過,如果您還想額外的加入某些設定,那麼就繼續來修改吧!假設我們需要這樣的設定項目:
    • 使用主機本地端時間,而不要使用 GMT 時間;
    • 主機最多允許 50 條連線,且最多允許 100 個使用者上線,當超過 100 個使用者還有其他 FTP 要求時,就顯示:『很抱歉,上線人數額滿了!』;
    • 同一個 IP (或主機) 來源最多僅能具有 5 個 FTP 服務;
    • 允許續傳的動作;
    • 被動式資料流(passive mode)的埠口為 65400 到 65420 這21個埠口!
    • 主機不允許 Root 登入;
    • 想建立一個名為 badbird 的群組,在該群組內的所有使用者都無法離開自己的家目錄(chroot);
    • 在 badbird 這個群組當中的 nogoodbird 這個使用者,該使用者能夠使用 ftp 但是無法使用 ssh 連到主機;
    • 在這個公開的目錄 /home/ftp/pub 中,所有人均不可寫入,只有讀取的權限;
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 底下是 FTP 主機的環境設定:
    ServerName                      "這個是鳥哥的測試用的 Proftp 主機"
    ServerType                      inetd
    DefaultServer                   on
    Port                            21
    User                            nobody
    Group                           nobody
    TimesGMT                        off  # 所謂的 GMT 時間就是格林威治時間,
                       # 詳細的時區觀念請參考後續的NTP伺服器
                       # 因為要使用本地時間,所以設為 off !
    MaxInstances                    50   # 最多僅有 50 條 prftpd 的 PID
    MaxClients  100  "很抱歉上線人數額滿了" # 最多允許 100 個使用者在線上
    MaxClientsPerHost               5    # 同一個主機最多可以同時 5 個 FTP 連線
    AllowStoreRestart               on   # 允許使用者上傳續傳!預設是 off 
    PassivePorts   65400  65420
    # 後面接的是埠口,最小到最大的埠口共 21 個!
     
    # 其他與實體用戶較相關的設定值!
    Umask                           022
    RootLogin                       off  # 不許 root 登入!預設就是 off
    RequireValidShell               off 
    # 這個設定可以讓使用者不需要具有『能夠執行的 shell 』!例如讓
    # nogoodbird 這個具有 /bin/false 的使用者,依然可以使用 ftp 喔!
    DefaultRoot                     ~ badbird
    # 注意啊!那個 ~ 代表家目錄的意思喔!特別特別留意! DefaultRoot
    # 後面接的是『群組』喔所以在這裡 badbird 為群組,而不是使用者喔!
    # 這裡特別容易搞混亂,請再特別的留意一下阿!只要不屬於  badbird
    # 這個群組的 User 就可以離開自己的家目錄了!(沒有被 chroot ) ^_^
    <Directory />
      AllowOverwrite                on
    </Directory>
    <Directory /home/ftp/pub>
      <Limit WRITE>
      Denyall
      </Limit>
    </Directory>
    # 上面的設定中,在根目錄內的所有目錄均具有可讀寫的權力,但是在
    # /home/ftp/pub 這個目錄中,不論 Linux 屬性為何,使用者均無法寫入!
    # 但是可以瀏覽以及下載喔!在我們這個設定當中, badbird 這個群組無法離開
    # 自己的家目錄,至於其他可以離開自己家目錄的使用者,來到這個
    # /home/ftp/pub 當中,也不具有寫入的權限喔!
     
    [root@test root]# useradd -g badbird -m -s /bin/false nogoodbird
    # 建立這個 nogoodbird 由於不具有 shell 所以不能 SSH 但可以 ftp 喔!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart

    事實上,對於實體用戶實在不需要限制的太多!要不然就不要開放,要不然就直接改成 sftp 說!此外,在上面這個設定當中,我們暫時拿掉了 anonymous 的登入,所以使用 anonymous 將無法登入喔!
     

    針對匿名者的設定
     
    談完了實體用戶之後,我們來談一談,那麼 anonymous 的相關登入權限要怎麼設定呢?!我們的要求假設如下:
    • 主機環境與實體用戶的需求與上面相同;
    • anonymous 的根目錄為 /var/ftp 這個目錄;
    • anonymous 登入後取得的 PID 在 Linux 的權限為 ftp:ftp 這個人物;
    • 當 anonymous 登入 FTP 之後,在 Client 端的 FTP 軟體顯示一些歡迎訊息!;
    • 最多允許 30 個 anonymous 的登入;
    • 限制上傳/下載速度為 100Kbytes/s 與 50 Kbytes/s;
    • 在 /var/ftp/ 裡面,除了 /var/ftp/upload 之外,其他的目錄均不可寫入;
    • 在 /var/ftp/upload 這個目錄中,僅可以寫入,不能下載,並且在使用者進入這個目錄後,顯示出一些相關的資訊;
    • 使用者帳號為 nogoodbird 因為不乖,所以將他們的 FTP 使用權限降級而設定為 anonymous 而已!

    如何設定呢?!我們沿用上面的設定項目,再額外的新增底下的項目即可!
    1. 建立基本的設定檔案:
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 關於主機與實體用戶的設定如同前一小節所示,所以我這裡就略過了!
    ...(沿用上一小節的設定,這裡略過).....
     
    # 底下則是 anonymous 的設定喔!
    <Anonymous /var/ftp>
      # 底下為建立 Anonymous 在 Linux 系統下的 PID 權限擁有者!
      # 此外,使用 UserAlias 將 nogoodbird 降級為 anonymous 的帳號!
      User                  ftp
      Group                 ftp
      UserAlias             anonymous ftp
      UserAlias             nogoodbird ftp
      # 建立顯示的訊息給 anonymous 觀察用的!
      DisplayLogin          welcome.msg
      DisplayFirstChdir     .message
      MaxClients            30  "匿名登入者連線數已經飽和了!"
      # 這個就重要啦!用來限制傳輸速率的吶!基本語法為:
      # TransferRate (STOR|RETR) 速度(Kbytes/s) user 使用者
      # STOR 為上傳而 RETR 為下載的意思!速度為 Kbytes/second 喔!
      TransferRate  STOR    100  user anonymous,ftp # 單位為 KBytes/second
      TransferRate  RETR    50   user anonymous,ftp
      <Limit WRITE>
        Denyall
      </Limit>
      # 底下這個則僅與 upload 這個目錄以及其下的子目錄有關而已!
      <Directory /var/ftp/upload/*>
        <Limit READ>
          Denyall
        </Limit>
        <Limit WRITE>
          Allowall
        </Limit>
      </Directory>
    </Anonymous>
     
    2. 建立歡迎畫面:
    # 特別留意,因為我的 anonymous 根目錄在 /var/ftp ,因此,我的
    # welcome.msg 就必須放置在 /var/ftp/welcome.msg 了!
    [root@test root]# vi /var/ftp/welcome.msg
    歡迎光臨!這個是鳥哥的測試 FTP 站台喔!
    我的主機: %L
    目前時間: %T
    最大連線: %M
    目前連線: %N
    您的主機: %R
    您的帳號: %U
    目前目錄: %C
     
    3. 建立特殊注意事項:
    # 剛剛提到,需要在 /var/ftp/upload 裡面建立一個特殊訊息!
    [root@test root]# vi /var/ftp/upload/.message
    這個目錄僅能上傳不能下載;
    您的身份為 anonymous 喔!
     
    4. 建立 upload 的權限:
    [root@test root]# chown ftp:ftp /var/ftp/upload
    [root@test root]# chmod 755 /var/ftp/upload
     
    5. 重新啟動!
    [root@test root]# /etc/rc.d/init.d/xinetd restart

    呵呵!這樣就將您的 Anonymous 設定好了!等你一進站,哇!怎麼這麼棒啊!已經將您的資訊都給他設定好了,歡迎畫面可真的是不錯啊! ^_^
     

    建立特殊交流帳號 (建立一個 ftpguest 群組!將所有的 guest 設定在這個群組內!
     
    我想,很多朋友都有使用 FTP 網站與其他網站交流的經驗了!您可以給予某些站長一些上傳與下載的權限,並且這些權限是可以保留或者是累積的,真的是很棒啊!在 Windows 系統上面有 Server-U 這個好用的傢伙,那麼我們的 Linux 上頭的 FTP 可以達到這樣的功能嗎?!呵呵! proftpd 就可以!而且設定還真的是很簡單喔!假設我們要達成這樣的功能好了:
    • 主機環境、實體用戶、anonymous 的環境都與前兩節的內容相同;
    • 建立一個群組名為 ftpguest ,如果使用者屬於該群組,則該使用者登入主機之後他的根目錄會在 /var/ftp2 這個目錄下;
    • 有三個使用者,名為 ftpuser1, ftpuser2, ftpuser3 ,都屬於 ftpguest 群組,他們沒有家目錄,不能使用 ssh,但是他們在 /var/ftp2/upload 有寫入的權限,但不可讀取資料;
    • 在 /var/ftp2 內的所有相關下載中,最高流量為 50 Kbytes/second;
    • ftpuser1 的上傳/下載比例為 1:2 ,且具有 100 MB 的預設下載量; ftpuser2 與 ftpuser3 的上傳/下載比例則為 1:1,僅具有 30MB 的預設下載量;
    • 當使用者進入 /var/ftp2 時,會顯示該使用者的上傳/下載比例,以及剩下的下載容量,還有其他的相關訊息;
    • 與使用者有關的上傳/下載比例以及剩下的可下載容量,都記錄在 /var/ftp2/work/ratio.dat, /var/ftp2/work/ratio.tmp 當中,所以使用者在這個目錄都無法讀、寫!

    在這個案例當中,最重要的就是那個『 紀錄使用者上傳/下載的 ratio 以及可用空間的記錄檔』了,在我的案例當中,使用的就是 /var/ftp2/work/ratio.dat 這個檔案,請注意,這個檔案必須要能被 ftpuser1, ftpuser2, ftpuser3 所讀取與寫入才行!相當的重要喔!所以,我應該要這樣設計我的設定檔:
    1. 建立所需要的群組與使用者:
    #  我要建立一個群組為 ftpguest ,此外,所有相關的使用者都是這個群組!
    [root@test root]# groupadd ftpguest
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser1
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser2
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser3
    [root@test root]# passwd ftpuser1
    # 請依序建立 ftpuser1 ftpuser2 ftpuser3 的密碼!
     
    2. 建立所需要的 FTP 相關路徑:
    #  我要的路徑在 /var/ftp2 當中,而且 ftpguest 必須要能夠寫入!
    [root@test root]# mkdir -p /var/ftp2
    [root@test root]# mkdir -p /var/ftp2/upload
    [root@test root]# mkdir -p /var/ftp2/work
    [root@test root]# chmod -R 775 /var/ftp2
    [root@test root]# touch /var/ftp2/work/ratio.dat #底下兩個檔案用在 ratio
    [root@test root]# touch /var/ftp2/work/ratio.tmp
    [root@test root]# chown -R ftpuser1:ftpguest /var/ftp2
    [root@test root]# chmod 666 /var/ftp2/work/*

    3. 建立基本的設定檔案:
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 關於主機,實體用戶,anonymous 的設定如同前兩小節所示,所以我這裡就略過了!
    ...(沿用上兩小節的設定,這裡略過).....
     
    # 底下則是 /var/ftp2 的設定喔!就是與 ftpguest 有關的設定喔!
    DefaultRoot             /var/ftp2 ftpguest
    DisplayLogin            welcome.msg
    # 開始設定上傳/下載比例
    Ratios                  on
    SaveRatios              on
    RatioFile               /work/ratio.dat
    RatioTempFile           /work/ratio.tmp
    # 上面這兩個檔案需要比較注意!他的路徑與 DefaultRoot 有關係!
    # 因為我們的 DefaultRoot 在 /var/ftp2 ,因此,這個檔案在
    # 『根目錄為 /var/ftp2 時,路徑為 /work/』也就是說, /work/ratio.dat
    # 其實就是 /var/ftp2/work/ratio.dat (因為 / 是 /var/ftp2 喔)
    # 這個地方是最容易搞錯的!請再次的看清楚喔! ^_^
     
    # 至於底下的設定就是要讓 /var/ftp2/work 這個目錄下的檔案都無法被使用!
    <Directory /var/ftp2/work>
      <Limit All>
        Denyall
      </Limit>
    </Directory>
     
    # 這裡就是在設定使用者的上傳/下載比例啦!語法為:
    # UserRatio  "使用者帳號"  fileratio filequota byteratio bytequota
    #  使用者帳號:就是登入 proftpd 的帳號啊!
    #  fileratio :這個是以檔案為基準的『比例』,通常不限制,故為 0
    #  filequota :預設能夠下載多少檔案,不限制時為 0 
    #  byteratio :就是上傳/下載的比例,這個數字代表『 1:下載 』之意!
    #  bytequota :預設能夠下載多少 KBytes 的檔案!注意單位喔!
    UserRatio               ftpuser1  0  0 2 100000 # 上/下 比例為 1:2
    UserRatio               ftpuser2  0  0 1  30000
    UserRatio               ftpuser3  0  0 1  30000
    # UserRatio             ftpuser3  0  0 -2  30000 
    # 上面這行有意思!當下載比例為負值時,表示 上/下 比例為 2:1 的意思!
    <Directory /var/ftp2>
      Umask                 002
      # 這裡就是在進行『下載速度的限制』囉!
      TransferRate  RETR    50  group  ftpguest
      <Limit WRITE>
        Denyall
      </Limit>
    </Directory>

    <Directory /var/ftp2/upload/*>
      <Limit READ>
        Denyall
      </Limit>
      <Limit WRITE>
        Allowall
      </Limit>
    </Directory>
     
    4. 建立歡迎畫面:
    # 特別留意,因為我的 ftpguest 群組的根目錄在 /var/ftp2 ,因此,我的
    # welcome.msg 就必須放置在 /var/ftp2/welcome.msg 了!
    [root@test root]# vi /var/ftp2/welcome.msg
    歡迎光臨!這個是鳥哥的測試 FTP 站台喔!
    我的主機: %L
    目前時間: %T
    最大連線: %M
    目前連線: %N
    您的主機: %R
    您的帳號: %U
    目前目錄: %C
     
    5. 重新啟動!
    [root@test root]# /etc/rc.d/init.d/xinetd restart


    這樣就設定妥當,並且也可以正確的啟用囉!好了!那麼我們就趕緊來測試看看能不能記錄每個使用者的上傳/下載比例呢?如下所示:
    [root@test ftp2]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 ProFTPD 1.2.8 Server (這個是鳥哥的測試用的 Proftp 主機) [test.localhost]
    Name (localhost:root): ftpuser1
    331 Password required for ftpuser1.
    Password:  <== 這裡輸入 ftpuser1 的密碼
    230-歡迎光臨!這個是鳥哥的測試 FTP 站台喔!
     我的主機: test.localhost
     目前時間: Fri Sep  5 01:08:10 2003
     最大連線: 100
     目前連線: 1
     您的主機: localhost.localdomain
     您的帳號: ftpuser1
     目前目錄: /
    230-User ftpuser1 logged in.
    230 Down: 0 Files (0mb)  Up: 0 Files (0mb)   1:2B CR: 97
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bye 

    看到上面的粗體字了吧?那表示:
    • Down:下載方面,目前下載過 0 個檔案,共下載 0 MBytes;
    • Up  :上傳方面,目前上傳過 0 個檔案,共上傳 0 MBytes ;
    • 1:2B:上傳/下載 (為 Bytes 限制)的比例為 1:2 咯!也就是上傳 1MB 可以下載 2MB 咯!
    • CR  :剩餘的可以下載的 MBytes 數!注意單位為 MBytes 喔!

    未來您只要有上傳或者是下載,那麼上面那行粗體自就會隨之而變喔!事實上,這些資訊是記錄在 proftpd.conf 裡面的參數『RatioFile』指定檔案當中!您可以檢查一下該檔案:
    [root@test ftp2]# vi /var/ftp2/work/ratio.dat
    ftpuser1|0|0|0|0
    # 這個檔案的格式為:(註:以符號『|』隔開各個欄位)
    # 帳號|上傳檔案數|上傳檔案總量(KBytes)|下載檔案數|下載檔案總量(KBytes)

    該檔案的格式如同上面的說明,以符號『 | 』來隔開成為五個欄位,每次使用者登入 proftpd 主機之後, Proftpd 會先去開啟這個檔案,將資料讀出來,然後再與 UserRatio 的設定直比較,就可以持續的紀錄每個使用者的剩餘可下載容量囉!那麼 未來如果想要新增其他使用者在這個設定群組當中,只要進行(1)新增使用者,注意這個使用者的群組需要是 ftpguest ,並且(2)再到 proftpd.conf 裡面設定好 UserRatio 的設定值,(3)最後重新啟動 xinetd ,就 OK 了!其他的步驟不需要進行!設定是否方便很多呢!?^_^
     

    小結語
     
    就鳥哥的感覺來看, Proftpd 真的是挺不錯用的,編譯上並不難,設定上也挺簡單的,此外,還能夠提供類似 Windows 裡面那個 Server-U 的檔案上傳/下載比例,真的是很不錯,尤其要製作 upload 的目錄真的是太簡易了!加上他的安全性又比 Wu FTP 來的好,實在是一個不錯的 FTP 伺服器軟體啊!如果您對於 Windows 的系統不太滿意,又喜歡 Server-U 的設定內容,那麼建議您可以轉換 Linux 的 proftpd 來嘗試看看,真的是挺好玩的喔! ^_^

Client 端的設定
Client 端並沒有什麼好設定的地方,主要就是 ftp 的使用了,請參考 wu FTP 主機設定一節!

參考資源
課後練習
  • 如何建立一個使用者,他可以使用 FTP 的功能,但是無法以 telnet 或 ssh 登入系統?!請使用 proftpd 的設定項目來設定!
  • 我明明在台灣,我的主機時區 (/etc/sysconfig/clock) 明明在台灣,為何登入 proftpd 之後,顯示的系統時間就是慢了 8 小時?請問為什麼?如何解決?
  • 如果發生了無法登入,或者是與 proftpd 的 FTP 功能相關的錯誤時,要如何 debug 呢?

  • 前往參考用解答
Logo

更多推荐