二、wu-Ftpd的安裝
當前,Linux環境下有許多ftp服務器軟件可供選擇,但是目前最常見的仍然是wu-Ftpd服務器。這裡主要討論該軟件的安裝和配置。
一般來說,在安裝了linux時,缺省都會自動安裝wu-ftpd服務器,但是有時候為了某種需要也需要自己親自重新安裝該服務器軟件。安裝wu-Ftpd有兩方式,一種是安裝rpm形式的發布包;一種是自己動手去編譯生成Ftp服務器。
rpm包可以在http://rpmfind.net/linux/RPM/WByName.html處下載得到,以rpm包方式安裝非常簡單,只需要在按下面的簡單的幾個步驟就可以完成,假設下載得到的rpm包存放在/tmp目錄下:
#cd /tmp
#rpm -ivh wu-ftpd-2.6.0-9.i386.rpm 壓縮的源代碼可以在ftp://ftp.wu-ftpd.org/pub/wu-ftpd/出得到。這裡我們以最新的2.6.0為例說明如何編譯安裝wu-ftpd。
1、解開源代碼
1) 將壓縮的源代碼拷貝到/usr/src下 #cp wu-ftpd.2.6.0.tar.gz /usr/src
2) 對壓縮文檔進行解壓縮: #tar xvfz wu-ftpd.2.6.0.tar.gz
#cd wu-ftpd-2.6.0
2、敲入命令 "./build xxx" ,可以在這裡指定一個C語言編譯器:"./build CC=yyy xxx" yyy 指用來替代 "cc" 的其他的編譯器。對於linux環境下的gcc編譯器,命令應該為:"./build CC=gcc xxx"
#build CC=gcc lnx
xxx可以取下面的值:
gen : 通用make(當移植到心得系統時需要拷貝它)
aix : IBM AIX
aux : AU/X
bdi : BSD/OS
bsd : BSD
dec : DEC Unix 3.X
du4 : DEC Unix 4.X or later
dyn : Dynix
fbs : FreeBSD 2.0 or later
hiu : Hitachi Unix
hpx : HP-UX
lnx : Linux (tested on 2.0.30)
nbs : NetBSD 1.X
nx2 : NeXTstep 2.x
nx3 : NeXTstep 3.x
osf : OSF/1
osx : Mac OS X
ptx : ???
sco : SCO Unix 3.2v4.2/SCO OpenServer 5
sgi : SGI Irix 4.0.5a
sny : Sony NewsOS
sol : SunOS 5.x / Solaris 2.x
s41 : SunOS 4.1.x
ult : Ultrix 4.x
uxw : UnixWare 1.1 or later
clean : Clean up object files and such to reduce disk space after building.
install: Install ftpd
Copying Makefiles.
Linking src/config.h
Making support library.
gcc -O3 -fomit-frame-pointer -fno-strength-reduce -pipe -c strcasestr.c
gcc -O3 -fomit-frame-pointer -fno-strength-reduce -pipe -c authuser.c
gcc -O3 -fomit-frame-pointer -fno-strength-reduce -pipe -c snprintf.c
rm -f libsupport.a
ar cq libsupport.a strcasestr.o authuser.o snprintf.o
ranlib libsupport.a
: : :
: : :
: : :
編譯成功以後將生成如下幾個可執行文件:
ftpd FTP服務器程序
ftpshut 用於關閉FTP守護進程的程序
ftpcount 記數程序,顯示目前ftp登錄的人數
ftpwho 查看當前FTP服務器的連線情況,類似與系統的who命令,只不過是查看ftp登錄的用戶
ckconfig 檢查FTP的設置是否正確
ftprestart 重新啟動ftp服務器
privatepw 改變wu_ftpd組訪問文件信息
3、若只是升級到一個新的版本,應該首先備份系統所有的舊的配置文件。否則這些配置文件將被覆蓋。為了適應自己的需求,應當編輯樣本配置文件來滿足自己的要求,具體配置文件的需求參見後面的內容。
4、以超級用戶身份敲入命令"./build install"
#build install
installing binaries.
install -c -o bin -g bin -m 110 bin/ftpd /usr/sbin/in.ftpd
install -c -o bin -g bin -m 111 bin/ftpshut /usr/bin/ftpshut
install -c -o bin -g bin -m 111 bin/ftprestart /usr/bin/ftprestart
install -c -o bin -g bin -m 111 bin/ftpcount /usr/bin/ftpcount
install -c -o bin -g bin -m 111 bin/ftpwho /usr/bin/ftpwho
install -c -o bin -g bin -m 111 bin/privatepw /usr/bin/privatepw
installing manpages.
install -c -o bin -g bin -m 444 doc/ftpcount.1 /usr/man/man1/ftpcount.1
install -c -o bin -g bin -m 444 doc/ftpwho.1 /usr/man/man1/ftpwho.1
install -c -o bin -g bin -m 444 doc/ftpaccess.5 /usr/man/man5/ftpaccess.5
install -c -o bin -g bin -m 444 doc/ftpconversions.5 /usr/man/man5/ftpconversio5
install -c -o bin -g bin -m 444 doc/ftphosts.5 /usr/man/man5/ftphosts.5
install -c -o bin -g bin -m 444 doc/xferlog.5 /usr/man/man5/xferlog.5
install -c -o bin -g bin -m 444 doc/ftpd.8 /usr/man/man8/ftpd.8
5、編輯 "/etc/inetd.conf" 文件,指向新的ftpd守護進程,大多數情況下,這一步是不必的,因為在build install時,會將新的守護進程拷貝覆蓋老的守護進程。若希望使用ftpd的增強的擴展功能,應該在這行最後加上"-a"選項。
ftpd守護進程一般可以攜帶如下參數,也可以不帶任何參數:
-d debug參數,當ftpd守護進程出現錯誤時,會將錯誤信息寫入到系統記錄文件/usr/adm/syslog中
-l 記錄每次ftp會話信息到/usr/adm/messages中
-t 設置當FTP客戶端多久無操作就自動斷線,這個參數後面指定等待的時間,如 -t 600 表示若客戶
端若連續10分鐘沒有動作就自動斷線,缺省值是15分鐘
-a 使用ftpaccess配置文件內容對ftpd進行更詳細復雜的設置
-A 不使用ftpaccess配置文件的設置,缺省值是-A
-i 當客戶端有上載文件的動作時,就記錄在文件xferlog中
-L 使用戶連接ftp服務器期間使用的所有命令都被記錄到/usr/adm/messages中
6、拷貝tar、gzip、gunzip、compress、uncompress等文件到 "~ftp/bin"中,拷貝"ls"為"~ftp/bin/ls"。
7、若是第一次安裝,使用"ckconfig"程序查找ftpd的各種配置文件存放目錄:ftpconversions、ftpusers、 和ftpgroups。在"doc/examples"目錄下有樣本文件。"ckconfig"是一個可執行程序,確保修復該程序檢測到的任何問題。
三、讓FTP服務器運轉起來
一般來說,只要正確地編譯安裝了wu-ftpd,該服務器就可以正常運行。用戶可以通過FTP命令從各種系統上連接該服務器。
四、配置文件的設置
1./etc/ftpaccess的設置這個配置文件是FTP服務器最重要的配置文件,這個文件的設置決定了FTP是否可以正常工作及許多訪問權限的設置。如下面的例子所示:
class all real,guest,anonymous *
limit all 10 Any /etc/msgs/msg.dead
readme README* login
readme README* cwd=*
message /welcome.msg login
message .message cwd=*
compress yes all
tar yes all
log commands real
log transfers anonymous,real inbound,outbound
shutdown /etc/shutmsg
email user@hostname
下面是設置文件各個指示(directive)的詳細說明:
指示: loginfails n 密碼輸入n次就自動斷開連接
指示:autogroup 組名 類別 [<類別> ...] 若一個匿名用戶屬於任何一個參數類別的類,則FTP服務器將實施setegid()調用使其屬於這個組名定義的組,這樣做是為了實現某些特定類別的匿名用戶可以訪問一些只允許本組及擁有者可以訪問的文件。組名必須是/etc/group內定義的有效組。
指示: class 類名 類別(real、guest、anonumous) IP地址 這個指示是設定FTP服務器用戶的類別。
FTP服務器的用戶可以分為以下三種類別:
real 在該FTP服務器上擁有合法帳戶的用戶;
guest 另外定義某些特定組的用戶;
anonymous 匿名用戶;
舉例說明:
class outworld real,guest,anonymous * 定義一個名為outworld的類,該類包含三種類型的用戶:real,guest,anonymous。該類在後面的指示中使用。其中"*"是類定義中的IP地址部分,表示網絡上的所用主機。也就是說明允許任何主機連接FTP服務器。若希望對訪問FTP的主機進行一定的權限設置,可以這樣做: class friend real,guest,anonymous *.linuxaid.com.cn 202.102.13.* 指定義一個friend類,該類從*.linuxaid.com.cn 及202.102.13.*訪問FTP服務器時有特定的權限設定。
指示: limit 類別 人數 時間 文件名 該指示設定在某個類在某個時間內允許連接FTP服務器的人數的限制,並指定當連接人數超過限制,後面的用戶連接時顯示給用戶的消息信息。
舉例說明:
limit local 20 Any /tmp/message/msg.toomany 上面的例子限定local這個類中的擁護同一時間只能有20人同時上網連接這台FTP服務器,若超過20人則顯示/tmp/message/msg.toomany的文件的內容 limit outworld 100 MoTu|Any 2200-0800 /tmp/message/msg.limit 這個例子限制outworld這個類的用戶只能在周一周二或每天的晚上10點到第二天早上的8點之間訪問該FTP服務器,而且同時連線的人數不可以超過100人,若超過100人,則顯示/tmp/message/msg.limit的文件的內容
/tmp/message/msg.limit的內容為:
對不起!本服務器只允許匿名用戶在周一周二全天及其他每天晚上10點到第二天早上的8點之間訪問,當前時間為%T;而且只允許同時有%M個匿名用戶訪問,當前有%N個用戶在訪問該服務器。請在合適的時間訪問本FTP服務器,謝謝!
這裡的%M是一個變量,代表同時允許連接的人數的上限,FTP服務器可以用前面設置的值自動替代該變量,其他允許的變量包括:
%T 本地當前時間;
%F CWD所在分區剩余空間,以KB為單位。但該變量不是所有系統都支持。
%C 當前工作目錄;
%E 定義在/etc/ftpaccess文件中的系統管理員的E-mail地址;
%R 遠端主機名;
%L 本地主機名;
%U 登錄時所給的用戶名;
%N 這個類別當前連接的用戶數目;
利用這些參數,可以編輯一個詳細的說明文件,這樣可以讓用戶清楚當前服務器資源使用情況。
指示: readme 說明文件 指令當用戶執行指定的"指令"時,系統就會自動顯示所設置的說明文件;
舉例說明: readme README* login 當用戶執行登錄動作時,只要以README開頭的文件內容就會顯示給用戶。
readme README* cwd=* 表示用戶切換目錄時(cwd),只要以README開頭的文件內容就會顯示給用戶。
通常README*應該是該目錄下文件的說明,讓登錄的用戶可以清楚地知道目錄中存放了那些文件;
指示: message 文件名 指令使當用戶執行特定的"指令"時,系統就將指定的文件內容顯示給用戶;
舉例說明: message /msg.welcome login 指定當用戶登錄時,將自動顯示/tmp/message/msg.welcome的內容給用戶,注意這裡的/msg.welcome指ftp根目錄下的msg.welcome文件,即/home/ftp/msg.welcome。
message /welcome cwd=*
指定當用戶切換另一個目錄時,只要目錄中有msg.welcome文件,就顯示給用戶
{#page}
指示: compress (yes/no) 類別 設置哪個類別的用戶可以使用壓縮功能;
舉例: compress yes local outworld
允許local 和outworld兩個類別的 用戶使用壓縮功能
指示: tar (yes/no) 類別 指定哪個類別的用戶可以使用tar功能;
指示: passwd-check (none/trivial/rfc822) (enforce/warn) 設定當用戶以匿名方式登錄服務器時密碼的方式:
none 表示不對密碼進行驗證,任何密碼都可以登錄;
trival 表示只要密碼中包含@就可以登錄;
rfc822 表示密碼一定要符合rfc822中規定的E-mail格式才能登錄。如:[email protected]
指示: log commands 類別(read/guest/anonumous) 設定那些用戶登錄時,所使用的操作會被記錄在文件/usr/adm/xferlog中。
指示: log transfer 類別(read/guest/anonumous) (inbound/outbound) 設定指定的用戶類別在上載還是下載時的相關信息被記錄到/usr/adm/xferlog中。
舉例說明: log transfer anonymous,real inbound,outbound 當anonymous或real用戶登錄後,上載和下載的操作會被記錄在文件/usr/adm/xferlog中。
指示: shutdown 文件名 FTP服務器關閉的時間可以後面的文件名中指定的文件中指定,設定的時間一到,便無法登錄FTP服務器了,只有將這個文件刪除才能恢復FTP服務器。文件的格式可以由命令ftpshut來建立。
指示: delete (yes/no) 類別(real/anonymous/guest) 設定是否允許指定用戶使用delete命令。
舉例說明: delete no guest,anonymous 設定大概內登錄的用戶為guest或anonymous上不允許執行delete命令。
指示: overwrite (yes/no) 類別(real/anonymous/guest) 設定是否允許指定用戶使用overwrite指令。
指示: reame (yes/no) 類別(real/anonymous/guest) 設定是否允許指定用戶使用readme指令。
指示: chmod (yes/no) 類別(real/anonymous/guest) 設定是否允許指定用戶使用chmod指令。
指示: umask (yes/no) 類別(real/anonymous/guest) 設定是否允許指定用戶使用umask指令。
指示: upload [absolute|relative] [class=<classname>]... [-]
<root-dir> <dirglob> <yes|no> <owner> <group>
<mode> ["dirs"|"nodirs"] [<d_mode>]
定義允許用來上載的目錄。若允許上載,所有新上載的文件的所有者及組由<owner>和<group>定義 ,訪問權限將為<mode>。對於覆蓋老文件的上載文件將保持原來的所有者及訪問權限信息。文件上載的權限信息由最大匹配目錄項定義,如:
upload /var/ftp * no
upload /var/ftp /incoming yes ftp daemon 0666
upload /var/ftp /incoming/gifs yes jlc guest 0600 nodirs
would only allow uploads into /incoming and /incom-
:
將只允許/incoming和/incom-ing/gifs目錄上載。上載到/incoming目錄下的文件將屬於ftp/daemon,訪問權限為0666;而上載到/incoming/gifs下的文件將屬於jlc/guest,訪問權限為0600。應該注意的是<root-dir> 必須匹配"ftp"用戶的passwd文件中的主目錄。
"dirs"和"nodirs"選項用來設定是否允許在該目錄下創建新的子目錄。但是缺省是允許創建子目錄的。
<d_mode>設定新創建的目錄的訪問權限,缺省為0777。
上載指示只能施用於用戶主目錄(chroot()的參數)等同於<root-dir>的用戶,<root-dir>可以為*來表示匹配任何主目錄。
<owner>和<group>也可能指定為*,在這種情況下,任何上載的文件或創建的目錄的所有者都等於起父目錄的所有者。
選項[absolute|relative]指定是<root-dir>是絕對路徑還是相對於chroot()參數指定的目錄的相對路徑。缺省是絕對路徑。也可以指定任意多個class=<classname>'來進行進一步限定。若指定了任何目錄,則該上載指示只影響這些組的用戶。
指示: alias 目錄別名 目錄路徑 給指定目錄設置一個別名,當切換目錄時可以使用別名。
舉例說明: alias xwin /pub/linux/xwindows 為/pub/linux/xwindows設置別名xwin,登錄以後只要輸入命令cd xwin就可以進入該目錄。
指示: cdpath 目錄該功能和系統的PATH環境變量設置類似,當cd /etc時,FTP首先查看當前目錄下是否有etc子目錄,無則看是否有別名,若沒有則根據該指示設定的路徑查詢。
舉例說明:
cdpath /pub/linux
cdpath /pub
cdpath /
搜索順序為:/pub/linux /pub /
指示: path-filter 類別(real/anonymous/guest) 目錄 設定上載文件名限制。
舉例說明:
path-filter anonymous /etc/pathmsg^[-A-Za-z0-9_.]*$^.^-
path-filter guest /etc/pathmsg^[-A-Za-z0-9_.]*$^.^-
設置限制anonymous和guest用戶上載的文件名只能包含A-Z、a-z、0-9和._-,名字以"."和"-"開頭的文件不能上載到服務器上。
指示: guestgroup <groupname> [<groupname> ...]
guestuser <username> [<username> ...]
realgroup <groupname> [<groupname> ...]
realuser <username> [<username> ...]
對於guestgroup指示,若一個真實(real)用戶屬於任何一個<groupname>所指定的組,則其FTP會話都被FTP服務器以匿名的方式進行處理。也就是說,chroot()被調用,用戶不再允許發出USER和 PASS 命令。<groupname>必須是有效的組。
這裡用戶的home目錄必須被爭取的設置,要確實和匿名用戶一致,/etc/passwd中的相關項的home目錄被分割為兩個部分,第一部分是chroot()調用的根目錄參數,第二個是用戶相對於根目錄的主目錄,兩部分之間以"/./分隔",如: guest1:<passwd>:100:92:Guest Account:/ftp/./incoming:/etc/ftponly 當guest1成功登錄進入,FTP服務器將調用chroot("/ftp")然後調用chdir("/incoming")。則guest1就如同匿名用戶一樣只能訪問/ftp下面的容(對於guest1來說,它就是"/")。
<groupname>可以是組名或數字ID。若使用數字ID,需要在數字前面加上一個"%"。使用*表示所有組。
guestuser和guestgroup指示類似,只不過是限定一個單一用戶罷了。
realuser和realgroup有同樣的語法,但是和guestuser及guestgroup起相反的作用,其是允許某個組的用戶或某個用戶以真實身份訪問FTP服務器。如:
指示: guestgroup 功能 設定guest組的功能。
舉例說明:
guestgroup ftponly
指示: nice <nice-delta> [<class>] 設定FTP服務器守護進程的調度優先級。
指示: defumask <umask> [<class>] 若遠程用戶屬於class,則守護進程創建的文件的umask為umask。若沒有指定class則將umask作為缺省的umask.
指示: tcpwindow <size> [<class>] 設置數據連接的TCP窗口大小,若不明白含義,一般不要去設置它。
指示:keepalive <yes|no> 設置TCP socket的SO_KEEPALIVE參數選項。
指示:timeout accept <seconds>
timeout connect <seconds>
timeout data <seconds>
timeout idle <seconds>
timeout maxidle <seconds>
timeout RFC931 <seconds>
設置各種超時時鐘,這些參數必須在對TCP協議非常熟悉的情況下才應該去設定,一般不要改動這些值,具體含義參見man ftpaccess。
指示: file-limit [<raw>] <in|out|total> <count> [<class>] 限制某個組的任何一個用戶允許上載的文件的數量,若沒有指定class,則該限制施用於所有沒有限定的組。raw指示這個限制包括所有的傳輸,而不僅僅是數據文件。
指示:byte-limit [<raw>] <in|out|total> <count> [<class>] 限制某個類的任何一個用戶允許傳輸的數據總量。
指示: limit-time {*|anonymous|guest} <minutes> 限定一個對話允許的持續時間,缺省無限制。真實用戶沒有該限制。
指示:guestserver [<hostname>] 控制哪個站點允許進行匿名連接,若沒有指定hostname,則拒絕所有匿名連接。
指示: noretrieve [absolute|relative] [class=<classname>] ... [-] <file- name> <filename> ... 設定拒絕那些類訪問哪些特定文件。例如: noretrieve /etc/passwd core 指定任何訪問者都不可以訪問文件/etc目錄下的passwd文件和所有的名為"core"的文件。
指示:allow-retrieve [absolute|relative] [class=<classname>]... [-] <filename> ... 允許訪問這些文件。
指示:private <yes|no> 當一個用戶登錄進入,,指示SITE GROUP和 and SITE GPASS用來指定一個增強的訪問組和相應的密碼。若輸入的組名和密碼有效的話,該用戶將變為該組的成員,具有該組的訪問權限。
指示:greeting full|brief|terse
greeting text <message> 允許控制在遠程用戶登陸進來以後,給用戶多少greet信息及信息內容。
指示:banner <path> 和message類似,不過banner消息是在用戶輸入用戶名和密碼以前顯示給用戶的。
指示: hostname <some.host.name> 定義FTP服務器缺省的主機名。
指示: email <name> 定義FTP維護者的emai地址。
指示: log security (anonymous|guest|real) 使記錄違背安全規則如:(noretrieve, .notar, ...)的命令。
指示:log syslog
log syslog+xferlog 重定向記錄消息到系統記錄文件syslog,缺省只記錄到xferlog。
指示:daemonaddress <address> 若該值沒有被設置,則服務器則監聽所有的接入請求,否則,服務器只接受來自<address>定義的連接請求。這個設置一般不要設置,設置以後會阻止使用虛擬主機或其他一些以後擴展的功能。
指示: virtual <address> <root|banner|logfile> <path> 打開虛擬FTP服務器的支持。<address>是虛擬服務器的IP地址。第二個參數指定如root目錄,bannner文件,log文件等的路徑。
指示:virtual <address> <hostname|email> <string> 設置在greeting消息中顯示的主機名字或電子郵件。
指示:virtual <address> allow <username> [<username> ...] virtual <address> deny <username> [<username> ...] 一般真實和guest用戶不允許登陸進入虛擬主機,該兩個指示用來重新對允許和拒絕訪問的虛擬主機的用戶進行細化定義。
指示:virtual <address> private 通常,拒絕匿名用戶登陸進入虛擬主機。
指示: defaultserver deny <username> [<username> ...]
defaultserver allow <username> [<username> ...] 對允許訪問缺省(非虛擬)FTP服務器的用戶進行定義。
指示:defaultserver private 拒絕匿名用戶訪問缺省FTP服務器。
指示: deny ip地址/域名 說明文件 設定限制哪個IP地址或域名的用戶不允許登錄到服務器。
舉例說明: deny 202.102.15* *.hacker,com /tmp/message/deny.msg 限制IP地址為202.102.15*及域名為*.hacker,com的機器不允許登錄服務器