以 Proftpd 架設 FTP 伺服器

author:Yung-Yu Chen (yungyuc) http://blog.seety.org/everydaywork/ <yyc@seety.org>
copyright:© 2006, all rights reserved

目錄

1   FTP 的功能與歷史

FTP (File Transfer Protocol) 也是一種很長壽的網際網路服務。最初要在 Unix 系統間跨主機傳檔,通常是依靠一個叫作 uucp (Unix-to-Unix copy) 的程式;不過 uucp 只能作單檔傳輸,而且只有 Unix 能用。所以在網際網路的早期發展階段,FTP 就已經被設計了出來,並且成為檔案主要傳輸方式。

FTP 這種應用採取主從式的架構。通常是有一個 FTP 伺服器,其中存放了要伺服的檔案,而使用者以 FTP 客戶端軟體連接上 FTP 伺服器來要求檔案,進行傳送。FTP 本身的設計就以「傳輸」檔案為主,所以基本上它與後來的 NFS 或 Samba 等檔案伺服系統不同,並不允許使用者對伺服器上的檔案進行隨機存取1

[1]但某些軟體仍然提供編輯 FTP 上檔案的功能,這些軟體通常是文字編輯器。

今日全球資訊網的風行,多少影響了 FTP 的使用率;有些以前用 FTP 提供下載的檔案,為了方便和網頁作整合,都改成了 HTTP。不過 FTP 仍然是一套適合網際網路檔案傳輸的協定,遇到有大量檔案要提供的時候,常常還是得使用 FTP 伺服器。

本章我們要探討如何使用 ProFTPd 這一套 FTP 伺服器軟體。過去 FTP 伺服器一直是網路服務主機的一大安全性漏洞,原因在於舊式的 FTP 伺服軟體使用作業系統內的系統工具來實作 FTP 的功能;譬如直接用主機系統內的 /bin/ls 列出檔案系統的內容。等到 ProFTPd 和 vsFTPd 此類強調安全性的 FTP 伺服軟體出現後,情況才較為改觀。

ProFTPd 的 "Pro" 代表 "Professional"。這套軟體系統的組態設定師法 Apache,所有的設定指令都標籤化,也設計有與 .htaccess 對等的目錄設定檔 .ftpaccess。另外,ProFTPd 支援匿名 FTP、虛擬主機,以及多種認證方式。ProFTPd 也和 Apache 一樣有許多額外的模組,提供了多樣化的延伸功能。

2   為使用者開啟 FTP 支援

首先我們要在 Debian 上安裝 ProFTPd:

$ apt-get install proftpd

安裝時 dpkg 會詢問要以 Inetd 或 Standalone 方式啟動;Inetd 是比較耗費系統資源,反應也比較慢的方式,所以一般會選用 Standalone 模式,讓 ProFTPd 自行管理連線。

預設的 proftpd.conf 如下 (被註解掉的部分未列出)2

[2]和 Apache 一樣,ProFTPd 組態檔的註解符號是 #;所有在 # 這個符號之後的設定均不作用。
ServerName                      "Debian"
ServerType                      standalone
DeferWelcome                    off
MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on
TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200
DisplayLogin                    welcome.msg
DisplayFirstChdir               .message
ListOptions                     "-l"
DenyFilter                      \*.*/
Port                            21
MaxInstances                    30
User                            nobody
Group                           nogroup
Umask                           022  022
AllowOverwrite                  on

這樣子的組態只允許在系統上有帳號的使用者登入,也就是說,將 ProFTPd 當作提供使用者的檔案窗口來使用。當使用者以自己的帳號登入後,一般會被直接送進家目錄。

讓我們來看看其中的一些基本設定 (一般來說設為 on 表示開啟設定;設為 off 表示關閉設定):

其它沒有提到的指令此時並不是那麼重要,若有必要,我們之後會再討論。

3   命令列 FTP 客戶端

為了測試剛剛建立的 ProFTPd 伺服器,先來安裝 Debian 下的命令列客戶端程式。

我們使用 ncftp (niceftp):

$ apt-get install ncftp

ncftp 用自己的帳號登入伺服器,要加上 -u 參數:

$ ncftp -u username localhost

我們登入本機伺服器,故拿 localhost 當主機名稱即可。輸入指令後,伺服器會詢問我們密碼:

NcFTP 3.1.8 (Jul 27, 2004) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 127.0.0.1...
ProFTPD 1.2.10 Server (Debian) [127.0.0.1]
Logging in...
Password requested by 127.0.0.1 for user "username".

    Password required for username.

Password:

密碼的輸入會以 * 回應在螢幕上;如果密碼輸入正確,即可登入系統:

User username logged in.
Logged in to localhost.
ncftp /home/username >

在瀏覽 FTP 伺服器的時候,最常用的就是 ls 指令:

ncftp /home/username > ls
collect/   etc/       Mail/      OpenFOAM/  var/       work/
Desktop/   GNUstep/   mbox       tmp/       windows/
ncftp /home/username >

我們可以看到自己的家目錄。

除了 ls 之外,還有一些指令是操作 FTP 的時候會用到的:

  1. cd <dirname>:切換伺服器上的目錄,我們用這個指令來巡遊於伺服器端;和 Unix shell 一樣,".." 代表上一層目錄。
  2. get <filename>:從伺服器下載檔案至本地。

3, put <localfilename>:將本地的檔案上載至伺服器

  1. rm <filename>:刪除伺服器上的檔案。
  2. mkdir <dirname>:在伺服器上建立目錄。
  3. rmdir <dirname>:刪除伺服器上的目錄。

ncftp 是比較複雜的 FTP 客戶端程式,有些極簡風格的 FTP 客戶端只允許你直接用 FTP 伺服器的指令來操作,但 ncftp 則提供了比較直覺、shell-like 的指令。``ncftp`` 的指令與 bash 很類似,使用起來相當方便。

要上傳檔案的時候,我們可能會遇到一個問題:如何找到要上傳的檔案?在 ls, cd 等指令前加上 "l" 即可針對本地目錄進行操作,所以我們可以切換到檔案所在的位置,檢視檔名,再用 put 上傳。

如果我們想連線到另外的匿名 FTP 伺服器,把 ncftp 後的 -u 參數拿掉即可。

4   建立匿名的公開 FTP 服務

除了為主機上的使用者提供檔案傳輸服務之外,FTP 也常用於為廣大的外部使用者提供檔案。因為要服務的外部使用者並不會擁有主機上的帳號 (如果是完全公開的伺服器,通常我們也不想要為他們管理額外的帳號),所以會以「匿名 (anonymous)」來登入伺服器。故此,公開的 FTP 服務通常都是匿名的,而匿名伺服器多半就會公開提供檔案。

在 ProFTPd 中是以 <Anonymous> 區塊來設定匿名服務,這個區塊指令的格式為:

<Anonymous rootdir>
...
</Anonymous>

起始標籤中的 rootdir 為匿名服務所使用的根目錄位置;一般系統使用者登入時會進入該使用者的家目錄,而匿名登入時則會進入這裡所指定的目錄,並且textbf{只能}存取在這個目錄之下的檔案系統結構。我們通常會把 rootdir 設為主機系統中,一個代表著匿名帳號的使用者的家目錄;在 Debian 上預設為 ftp 這個使用者,而進行

<Anonymous ~ftp>

這樣的設定,指定以 ftp 的家目錄作為匿名 FTP 的根目錄。

Debian 預設的組態檔並沒有把匿名伺服器打開,但相關的指令都寫成註解了。我們可以把這些註解打開,或是把以下我整理出來的這些設定加回去3

[3]我整理的這些設定完全是從 Debian 的預設組態檔抄出來的,只是經過編排。
<Anonymous ~ftp>
  User  ftp
  Group nogroup
  UserAlias anonymous ftp
  DirFakeUser on ftp
  DirFakeGroup on ftp
  RequireValidShell off
  MaxClients 10
  DisplayLogin welcome.msg
  DisplayFirstChdir .message
  <Directory *>
    <Limit WRITE>
      DenyAll
    </Limit>
  </Directory>
  # <Directory incoming>
  #   Umask 022 022
  #   <Limit READ WRITE>
  #     DenyAll
  #   </Limit>
  #   <Limit STOR>
  #     AllowAll
  #   </Limit>
  # </Directory>
</Anonymous>

這裡面有兩個設定指令已經在前面看過了:``DisplayLogin``, DisplayFirstChdir,故不再贅述。

這些指令可以分成兩組,第一組用於設定匿名伺服器本身的組態:

第二組則設定公開目錄的存取權限:

我把第 16 到 24 行的組態指令註解掉了,因為它是要用來開啟匿名上傳的設定,而且其中的指令已經都說明過了。關於這一段上傳設定,重點在於第 18 到 20 行的 READ, WRITE,和第 21 到 23 行的 STORE 關鍵字。這整段把 incoming 目錄裡匿名的 STORE (儲存,即上傳) 權限打開,而把 READ (讀取) 和 WRITE (寫入,包含覆寫) 都關起來;造成的結果是匿名使用者可以把新檔案 (及目錄) 上傳到伺服器裡的 /incoming 目錄內,但不能讀取,也不能覆寫其中的內容。

如果真的有需要,再把匿名上傳的設定打開即可;匿名上傳常常會造成管理上的問題。而僅作檔案提供之用的 FTP 伺服器,也不必讓匿名使用者上傳檔案。

5   ProFTPd 虛擬主機

ProFTPd 也可以提供虛擬的 FTP 伺服器功能,不過這部分並不像 Apache 那麼有彈性。通常有三種狀況可以用 ProFTPd 虛擬主機來完成:在同一個 IP 上用網域名稱來分隔不同的 FTP 伺服器、在同一台主機上以不同的 IP 配合不同的實體或虛擬網路介面來分隔伺服器4,以及在同一個主機上以相同的 IP 與網域名稱,用不同的通訊埠來分隔伺服器。

[4]可以使用多張網路硬體,或是對同一個網路硬體進行 aliasing。

ProFTPd 的虛擬主機設定指令也相當簡單:把單一虛擬主機相關的指令寫在該虛擬主機的 <VirtualHost> 設定區塊中即可。這三種虛擬主機的設定也可以組合運用。比較需要注意的是有一些全域的指令不能在 <VirtualHost> 區塊裡使用,詳細的資訊請參考 ProFTPd 的指令參考說明。

5.1   以網域名稱分隔 FTP

如果我們希望達到像 Apache 的 name-based 虛擬主機的效果,可以這樣設定:

<VirtualHost domain.name>
  ...
</VirtualHost>

5.2   以 IP 分隔 FTP

和以網域分隔的設法類似,但把 domain.name 換成 IP 位址即可:

<VirtualHost xxx.xxx.xxx.xxx>
  ...
</VirtualHost>

使用者將能以可對應到這個 IP 位址的網域名稱來連上虛擬主機,除非所用的網域名稱另外對應到了其它的虛擬主機。

5.3   用通訊埠區分 FTP

如果我們想在同一個 IP (或網域名稱) 的不同的通訊埠上進行 FTP 服務,可以這樣設定:

<VirtualHost xxx.xxx.xxx.xxx>
  Port 2221
  ...
</VirtualHost>
<VirtualHost xxx.xxx.xxx.xxx>
  Port 2222
  ...
</VirtualHost>

這樣就會把服務分別開在 xxx.xxx.xxx.xxx 這個位址的 2221 與 2222 號埠上。

6   結語

FTP 可以讓系統上的使用者從其它主機存取自己的資料,也可以當作一種公開檔案下載的服務;如果我們希望,還能利用 FTP 來讓匿名使用者貢獻檔案。

不過,雖然 ProFTPd 是一個很有彈性又高效率的伺服軟體,受限於 FTP 本身的設計,它並不適合工作環境下的檔案分享;如果我們希望在團隊中共用檔案,可能要視作業環境來選用 Samba 或 NFS (又或者是兩者的混合)。

我們另外也討論了 ProFTPd 的虛擬主機設定;它可以幫助我們更有彈性地組態我們的 FTP 伺服器。還有更多的應用與設定指令並沒有被討論到,而 ProFTPd 的指令參考手冊可以幫助你進一步了解這個伺服系統的能力與限制。