前言:
什麼是FTP,可以閱讀"百度百科"http://baike.baidu.com/view/369.htm,在這我引用其中的覺的重要一的點:
FTP的工作方式
FTP支持兩種模式,一種方式叫做Standard (也就是 PORT方式,主動方式),一種是 Passive (也就是PASV,被動方式)。 Standard模式 FTP的客戶端發送 PORT 命令到FTP服務器。Passive模式FTP的客戶端發送 PASV命令到 FTP Server。
下面介紹一個這兩種方式的工作原理:
Port模式FTP 客戶端首先和FTP服務器的TCP 21端口建立連接,通過這個通道發送命令,客戶端需要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什麼端口接收數據。在傳送數據的時候,服務器端通過自己的TCP 20端口連接至客戶端的指定端口發送數據。 FTP server必須和客戶端建立一個新的連接用來傳送數據。
Passive模式在建立控制通道的時候和Standard模式類似,但建立連接後發送的不是 Port命令,而是Pasv命令。FTP服務器收到Pasv命令後,隨機打開一個臨時端口(也叫自由端口,端口號大於1023小於65535)並且通知客戶端在這個端口上傳送數據的請求,客戶端連接FTP服務器此端口,然後FTP服務器將通過這個端口進行數據的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連接。
很多防火牆在設置的時候都是不允許接受外部發起的連接的,所以許多位於防火牆後或內網的FTP 服務器不支持PASV模式,因爲客戶端無法穿過防火牆打開FTP服務器的高端端口;而許多內網的客戶端不能用PORT模式登陸FTP服務器,因爲從服務器的TCP 20無法和內部網絡的客戶端建立一個新的連接,造成無法工作。
在ubuntu中pure-ftpd是什麼樣
子可以參考:http://wiki.ubuntu.org.cn/Pure-ftpd,引用其中的一段:
Ubuntu/Debian 提供了三個不同的 Pure-FTPd 的 deb 安裝包,分別是 pure-ftpd、pure-ftpd-ldap 和 pure- ftpd-mysql,其中 ldap 和 mysql 分別表示 Pure-FTPd 跟 ldap 和 mysql 集成,另外這三個包都依賴於 pure-ftpd-common。如果我們不需要 ldap 和 mysql 的話,選擇 pure-ftpd 就可以了。
配置方式
不同於其他的多數守護進程(daemon),Pure-FTPd 的配置比較特別:它不讀取任何的配置文件,配置選項都是通過命令行參數來實現的。例如:參數 '-H' 被設計爲通過避免 DNS 查詢來加快服務器的速度。要啓用該特性,我們只需要將其加到命令行中: pure-ftpd -H 。備選的長參數也被支持的,下面是一個等價的命令 pure-ftpd --dontresolve
針對喜歡配置文件的用戶,Pure-FTPd 官方給出了一種方案:通過一個封裝(wrapper)工具,將配置文件解析並將其轉換成命令行參數。首先根據自己的需要編輯配置文件 pure-ftpd.conf,而後通過下面的命令啓動 pure-config.pl /etc/pure-ftpd.conf。pure-config.pl 是一個 perl 腳本,它根據配置文件採用合適的命令行選項來調用 pure-ftpd。
在 Ubuntu/Debian 中,開發人員採用了另外的一種 wrapper 方式:它沒有采用單一的配置文件,而是在/etc下建立一個pure-ftpd的目錄,其下又有 conf、auth、db 這三個目錄和一個名爲 pureftpd-alias-dir 的文件。每一個配置選項都以一個文件的形式存在於 /etc/pure-ftpd/conf 目錄中,而且是以選項爲文件名,選項值爲文件內容。例如如果想配置AnonymousOnly=yes(只允許匿名用戶),則在 /etc/pure-ftpd/conf 中創建一個名爲 AnonymousOnly 的文件,裏面只有一行內容:yes。
在 Ubuntu 中,我們只關注最後一種配置方式。
環境:
1,在一臺ubuntu server 10.4 服務器上安裝pure-ftpd配置成FTP服務器
2,在客戶端上用FileZilla Client登錄測試
操作:
1,安裝pure-ftpd
#sudo apt-get install pure-ftpd
#sudo netstat –nl
查看21端口是否已開啓。
2,在FileZilla Client用本地一賬號登錄,會 出現如下錯誤
解決:在/etc/pure-ftpd/conf下創建DontResolve文件內容爲yes,即可解決。這時本地賬戶已經可以使用FTP服務了。
3,利用虛擬賬戶的方式管理用戶。
(1)手動創建主目錄
#sudo mkdir /var/ftp
#sudo mkdir /var/ftp/js
(2)創建組及用戶
#sudo groupadd ftpadmins
#sudo groupadd ftpusers
#sudo useradd –g ftpadmins –d /dev/null –s /bin/false ftpadmin
#sudo useradd –g ftpusers –d /dev/null –s /bin/false js
(3)改變相應的訪問權限
#sudo chown –R ftpadmin /var/ftp/
#sudo chmod -R 775 /var/ftp/js
*:爲了防止同組中的一個用戶刪除另一個用戶的文件作以下設置
在/etc/pure-ftpd/conf下建KeepAllFiles文件內容爲yes #禁止用戶刪除文件,TrustedGID組中的除外
在/etc/pure-ftpd/conf下建TrustedGID文件內容爲2002 #管理員組ftpadmins的GID,允許管理員刪除文件,此處的2002是ftpadmins的GID
(4)增加虛擬用戶
#sudo pure-pw useradd admin –u ftpadmin –d /var/ftp
#sudo pure-pw useradd js001 –u js –d /var/ftp/js
這時會在/etc/pure-ftpd/下新增pureftpd.passwd及pureftpd.pdb兩個文件
#sudo pure-pw list
#sudo pure-pw show js001
用以上兩個命令查看相應用戶信息,更多的pure-pw用法可以 man pure-pw查看
(5)使虛擬用戶生效
#sudo pure-pw mkdb
(6)使用pureDB驗證方式,如果沒有以下步驟,虛擬用戶是無法登錄的,會出現530的錯誤信息。
#cd /etc/pure-ftpd/auth
#sudo ln –s ../conf/PureDB 60puredb
(7)重啓pure-ftpd服務
#sudo /etc/init.d/pure-ftpd restart
總結:pure-ftpd配置完成了,簡單的一個FTP搭建起來了。詳細配置可以參考http://wiki.ubuntu.org.cn/Pure-ftpd。也可以參考http://www.ubuntu-howto.info/howto/how-to-install-and-configure-pure-ftpd。
可是權限問題來了,在pure-ftpd的配置中沒有看到嚴格的權限設置,相關的有:
1,如果你的 pure-ftpd 編譯時加入了 pure-uploadscript 支持,這個指令將會使 pure-ftpd
發送關於新上傳的情況信息到 /var/run/pure-ftpd.upload.pipe,這樣 pure-uploadscript
就能讀然後調用一個腳本去處理新的上傳。
在/etc/pure-ftpd/conf下建CallUploadScript內容爲 yes 就會在/var/run下產生pure-ftpd.upload.pipe,pure-ftpd.upload.lock
這個方法我還沒試用。
http://linux.die.net/man/8/pure-uploadscript
http://blog.derjohn.de/space/start/2006-11-14/1
2,KeepAllFiles=yes #禁止用戶刪除文件,TrustedGID組中的除外
TrustedGID=1001 #管理員組ftpadmins的GID,允許管理員刪除文件
ChrootEveryone=yes #把所有用戶限制在其homedir下
3,把虛擬用戶映射到不同的本地用戶上,這樣就可控制權限了。缺點是要建不同本地組和用戶。