我們知道在 Internet 上面有個很快速的檔案傳輸協定,就是 FTP !而且也知道最古老的 FTP 伺服器軟體之一就是那個很出名的 Wu FTP 囉!但是,雖然 Wu FTP 的速度快、架設方便,不過由於招牌老且大,所以『深受怪客 ( Cracker ) 的喜好』啊!導致 Wu FTP 的安全性堪慮∼此外, Wu FTP 受限於他的架構問題,所以一些在 Win32 上面執行的 FTP 功能 ( 例如很出名的 Server-U ) 在 Wu FTP 上面都沒有辦法很簡易的就達成這樣的功用!為了改善安全上面的疑慮以及增強 FTP 軟體的設定便利性,所以就有這個 Professional FTP daemon (proftpd) 的產生啦!這個 proftpd 並非用來與 Wu FTP 打對台的,但是由於他的設定彈性太高了!所以漸漸的大家都傾向於使用這個 FTP 軟體來架設自己的 Linux 伺服器呢!呵呵!如果你是使用 Wu FTP 的使用者,也可以嘗試以這個 proftpd 來取代 Wu FTP 喔!應該會更安全的啦!而,如果您習慣使用 Server-U 來設定特殊帳號的上傳/下載資料的話,呵呵!那麼 proftpd 就是您轉換跑道的首選了! |
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 |
[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 這個檔案的內容才行喔! |
[root@test
root]# proftpd -c 設定檔檔名
[root@test root]# proftpd -c /usr/local/proftpd/etc/proftpd.conf |
[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" |
[root@test
root]# ftpwho
standalone FTP daemon [8451]: 10194 badbird [ 0m11s] 0m6s (idle) Service class - 1 user # 如上所示,目前有一個使用者,名為 badbird 的帳號,在使用 proftpd 喔! |
# 關於主機相關的設定
設定項目一 參數內容 設定參數二 參數內容 # 關於某些目錄的權限設定 <Directory "完整目錄名稱"> ... ... ... </Directory> # 關於 Anonymous 的目錄與權限設定 <Anonymous "匿名登入時候的匿名者根目錄"> ... ... <Limit 一些動作> ... ... </Limit> </Anonymous> |
%T 目前的時間
%F 所在硬碟剩下的容量 %C 目前所在的目錄 %R Client 端的主機名稱 %L Server 端的主機名稱 %U 使用者帳號名稱 %M 最大允許連線人數 %N 目前的主機連線人數 %E FTP 主機管理員的 email %i 本次上傳的檔案數目 %o 本次下載的檔案數量 %t 本次上傳+下載的檔案數量 |
[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> |
[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 |
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 |
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. 建立基本的設定檔案:
<Directory
/var/ftp2/upload/*>
|
[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 |
[root@test
ftp2]# vi /var/ftp2/work/ratio.dat
ftpuser1|0|0|0|0 # 這個檔案的格式為:(註:以符號『|』隔開各個欄位) # 帳號|上傳檔案數|上傳檔案總量(KBytes)|下載檔案數|下載檔案總量(KBytes) |
Client 端並沒有什麼好設定的地方,主要就是 ftp 的使用了,請參考 wu FTP 主機設定一節!