2008年1月4日 星期五

檔案傳輸伺服器(FTP Server for vsftpd)

在網路上除了網頁(http)之外,再來就是FTP(File Transfer Protocol)這種傳輸機制,因為網路的發展快速,現在連個國中生(甚至更小)都有能力可以架設FTP的伺服器了。(以下皆以伺服器代稱)

不過在架設伺服器之前,請先瞭解一下網路環境是否真的適合?

因為台灣絕大多數的網路使用者都是採用非對稱的流量機制(無論是ADSL、CABLE,甚至FTTB皆為此種方式),也就是說上傳的速率遠小於下載的速率,一但架設伺服器後,它所需要的頻寬是使用你的上傳流量,就拿現在最多人使用的2M/256K~512Kbps來看,上傳的速率也才不過20KB~50KB/s而已。

如果有人全速從你的伺服器下載一個1~200MB的檔案,你就會發現你連開個入口網站可能都有問題(YAHOO、PcHOME...等),因為我們所使用的網路機制是你的上傳頻寬如果被佔滿,連帶會影響你下載的速率(並非能夠同時下載2Mbps及上傳512Kbps!),所以你有可能就要限制上傳的速率,以免影響在家使用的網路的流暢性。如此一來能夠用來上傳資料的頻寬更小,是不是還有架設FTP Server的必要呢?
(剩下10~30KB/s),說不定燒張DVD或用隨身碟COPY還比較快。

解釋完網路頻寬對於伺服器架設的影響之後,就可以知道為什麼FTP伺服器大多是公司行號或是學術團體才有,因為它們有較大的上傳頻寬,才會提供FTP這種服務,一般來說都是用來讓使用者或客戶下載書面資料、驅動程式、使用手冊...等。

聽我說了一大堆有的沒的介紹之後,就直接進入伺服器架設的部份吧!我這邊採用的是現在LINUX系統中可用的vsftpd(文字版的FTP伺服器),如果你在安裝LINUX時,有勾選檔案伺服器的選項的話,應該也會同時安裝上去,目前最新的版本是vsftpd-2.0.5(Jul 2006 released)

我這邊是採用FEDORA 6的LINUX系統(目前已經出到8,我還沒去載來用...),所以我使用的版本是vsftpd-2.0.5-10.fc6,硬體的規格老實說不太重要,只要能夠讓LINUX穩定的運行即可,因為有辦法先突破頻寬限制,再來考慮硬體規格是否足以支援吧!

以下是我做的相關設定檔:(路徑:/etc/vsftpd/vsftpd.conf)

#伺服器設定
anonymous_enable=NO(禁止使用匿名)
local_enable=YES(允許一般使用者登入)
write_enable=YES(允許寫入)
local_umask=022(檔案或目錄使用的遮罩
dirmessage_enable=YES(進入該目錄時的注意事項)
xferlog_enable=YES(上傳或下載的動作記錄)
xferlog_file=/var/log/vsftpd.log(動作記錄檔的位置)
connect_from_port_20=YES(主動連線的使用PORT)
pasv_min_port=65000(被動連線的起始PORT)
pasv_max_port=65010(被動連線的結束PORT)
pam_service_name=vsftpd(pam的模組名稱)
use_localtime=YES(使用本地時間,否則時間會差8小時)
listen=YES(以 standalone 的方式啟動)

#與使用者有關的設定
banner_file=/etc/vsftpd/welcome.txt(登入時顯示的文件檔)
idle_session_timeout=600(發呆10分鐘後斷線)
chroot_local_user=YES(鎖定本機使用者於家目錄中)
chroot_list_enable=YES(啟動限制目錄的列表)
chroot_list_file=/etc/vsftpd/chroot_list(限制目錄的設定檔)

#安全性:
userlist_enable=YES(被列入user_list檔內的使用者皆無法使用)
tcp_wrappers=YES(使用tcp_wrappers來管理連線限制)

#其它:
user_config_dir=/etc/vsftpd/user_config_dir(各別使用者參數)

說明:

1.手動新增的部份有:其餘內建,只需把#註解拿掉即可。
use_localtime=YES
banner_file=/etc/vsftpd/welcome.txt
user_config_dir=/etc/vsftpd/user_config_dir

2.同時啟動chroot_local_user和chroot_list_enable:
代表一般使用者都會被限制在自己家目錄中,列入/etc/vsftpd/chroot_list內的使用者反而不會被限制。

3.同時允許主動或被動連線:
不過還是被動連線能夠接受的機制較多,因為有使用防火牆的使用者才能有效並清楚的知道應該開啟那些PORT,但是不是所有FTP軟體都支援被動連線,所以我都都採用。

4.各別設定檔的設定方式:(不可更動伺服器部份的設定)
例:使用者為test,在/etc/vsftpd/user_config_dir資料夾內建立一個名為test的檔案,並把相關設定檔寫入即可。
test的內容:
local_max_rate=30000(test的傳輸速率上限為30KB/s)
5.安全性的延伸:tcp_wrappers效能高,iptables功能強,視狀況使用。
(1)透過iptables:(僅對被動連線有用)
  iptables -A INPUT -p TCP -i eth0 --dport 21 -j ACCEPT
  iptables -A INPUT -p TCP -i eth0 --dport 65000:65010 -j ACCEPT
(2)透過tcp_wrappers:(設定檔路徑:/etc/hosts.allow)
  vsftpd:192.168.99.0/255.255.255.0(允許區網內存取)

後記:其實我原本最想做的方式是,在不開啟匿名登入的狀況下,讓使用者只能上傳列出內容,但是無法刪除讀取。試驗了很久,測試過很多奇怪的手段跟方法,還是無法達成...,如果有那位高手有辦法使用vsftpd達到此訴求的話,還請指教。