RedHat 9.0下配置FTP伺服器zz

heimuad發表於2007-09-27

RedHat 9.0下配置FTP伺服器

 

                                                                                  此文全部資料來自:http://www.zhcedu.com.cn
----------------------------------
在眾多網路應用中,FTP(檔案傳輸協議)有著非常重要的地位。Internet中一個十分重要的資源就是軟體資源,而各種各樣的軟體資源大多數都放在FTP伺服器中。與大多數Internet服務一樣,FTP也是一個客戶機/伺服器系統。用通過一個支援FTP協議的客戶機程式,連線到主機上的FTP伺服器程式。使用者通過客戶機程式向伺服器程式發出命令,伺服器程式執行使用者發出的命令,並將執行結果返回給客戶機。FTP服務可以根據服務物件的不同分為兩類:系統FTP伺服器只允許系統上的合法使用者使用;匿名FTP伺服器(Anonymous FTP Server)允許任何人登入到FTP伺服器去獲取檔案。

FTP的資料傳輸模式針對FTP資料連線而言,分為主動傳輸模式、被動傳輸模式和單埠傳輸模式三種。

1.主動傳輸模式
當FTP的控制連線建立,客戶提出目錄列表、傳輸檔案時,客戶端發出PORT命令與伺服器進行協商,FTP伺服器使用一個標準埠20作為伺服器端的資料連線埠(ftp-data),與客戶建立資料連線。埠20只用於連線源地址是伺服器端的情況,並且埠20沒有監聽程式來監聽客戶請求。

在主動傳輸模式下,FTP的資料連線和控制連線方向相反,由伺服器向客戶端發起一個用於資料傳輸的連線。客戶端的連線埠由伺服器端和客戶端通過協商確定。

2.被動傳輸模式
當FTP的控制連線建立,客戶提出目錄列表、傳輸檔案時,客戶端傳送PASV命令使伺服器處於被動傳輸模式,FTP伺服器等待客戶與其聯絡。FTP伺服器在非20埠的其它資料傳輸埠上監聽客戶請求。

在被動傳輸模式下,FTP的資料連線和控制連線方向一致,由客戶端向伺服器發起一個用於資料傳輸的連線。客戶端的連線埠是發起該資料連線請求時使用的埠。當FTP客戶在防火牆之外訪問FTP伺服器時,需要使用被動傳輸模式。

3.單埠模式
除上述兩種模式之外,還有一種單埠模式。該模式的資料連線請求由FTP伺服器發起。
使用該傳輸模式時,客戶端的控制連線埠和資料連線埠一致。因為這種模式無法在短時間連續輸入資料、傳輸命令,因此並不常用。

Linux下有很多可用的FTP伺服器,其中比較流行的有WU-FTP(Washington UniversityFTP)和VSFTP。Red Hat 8.0中自帶了WU-FTP和VSFTP兩個軟體。WU-FTP是一個著名的FTP伺服器軟體,它功能強大,能夠很好地執行於眾多Unix作業系統中。不過作為後起之秀的VSFTP越來越流行,在Red Hat 9.0發行版中就只帶有VSFTP。

VSFTP中VS的意思是“Very Secure”。從名稱可以看出,從一開始,軟體的編寫者就非常注重其安全性。除與生俱來的安全性外,VSFTP還具有高速、穩定的效能特點。在穩定性方面,VSFTP可以在單機(非叢集)上支援4000個以上的併發使用者同時連線。據
ftp.redhat.com的資料,VSFTP最多可以支援15000個併發使用者。

快速構建FTP伺服器

FTP伺服器實現的基本功能是上傳下載,下面就分幾個步驟來搭建一個可以實現下載功能的簡易FTP伺服器。

1.安裝FTP伺服器
如果在安裝系統時沒有選擇安裝FTP伺服器,可以通過Red Hat 9.0中的“新增/刪除應用程式”工具進行安裝。具體方法是,選擇“主選單”→“系統設定”→“新增/刪除應用程式”,在彈出的介面中選中FTP伺服器,單擊“更新”即可。

如果無法確認是否安裝了該軟體,可以使用以下命令檢視:

#rpm -qa|grep vsftpd
vsftpd-1.1.3-8

2.啟動FTP伺服器
套用Red Hat 9.0的預設範例直接啟動VSFTP。
# /sbin/service vsftpd start


為vsftpd啟動vsftpd: [確定]

3.在/var/ftp/pub目錄下建立一個名為test.txt的檔案,檔案內容為“This is a test
file”。

4.測試
使用FTP客戶端登入到本地伺服器,然後以匿名身份(anonymous)登入:

# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 1.1.3)
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful. H***e fun.
Remote system type is UNIX.
Using binary mode to transfer files.

這樣就成功地登入到FTP伺服器。可以顯示伺服器目錄列表如下:

ftp> ls
227 Entering Passive Mode (127,0,0,1,63,15)
drwxr-xr-x 2 0 0 4096 Dec 04 01:35 pub
226 Directory send OK.

切換到pub目錄下,並顯示目錄內容,可以找到剛才建立的檔案test.txt:

ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,232,34)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 21 Dec 04 01:35 test.txt
226 Directory send OK.

下載test.txt檔案:

ftp> mget test.txt
mget test.txt? y
227 Entering Passive Mode (127,0,0,1,186,210)
150 Opening BINARY mode data connection for test.txt (21 bytes).
226 File send OK.
21 bytes received in 0.0108 secs (1.9 Kbytes/sec)

檢視本機目錄內容,可以看到test.txt已成功下載到本機。

ftp> !ls
a EIO_Binders initrd mnt proc tftpboot ylg.txt
bin etc lib mymnt root tmp
boot home lost+found myshare sbin usr
dev id_dsas.pub misc opt test.txt var

嘗試上傳名為ylg.txt的檔案,可以看到請求被拒絕了。

ftp> put ylg.txt
local: ylg.txt remote: ylg.txt
227 Entering Passive Mode (127,0,0,1,243,10)
550 Permission denied.

退出登入:

ftp> bye
221 Goodbye.

由測試可以看出,已經可以下載檔案,但不能上傳檔案(也不能在伺服器上建立目錄和文
件)。實際上這是一個專門提供下載服務的匿名FTP伺服器。

從上面的步驟可以看出,並不需要做什麼配置就可以完成一個簡易FTP伺服器的架設。這
是因為Red Hat已經配置好一個預設的FTP伺服器。不過在實際應用中,大部分情況下這個
簡易的伺服器並不能滿足需求。

進一步配置FTP伺服器

下面將建立一個能夠滿足常用需求的FTP伺服器。實際應用中,FTP伺服器一般要同時提供
上傳和下載功能。此外,出於安全考慮,還需要有使用者身份驗證、使用者許可權設定及空間管
理等。下面就來搭建這樣一個FTP伺服器。

1.建立歡迎語。如果希望使用者在進入目錄時,能夠看到歡迎語或對本目錄的介紹,可
以通過以下方法來實現。

確定/etc/vsftpd/vsftpd.conf檔案中dirmessage_enable=YES,預設情況下,Red Hat
9.0有此設定。接著,在目錄中新增名為.message的檔案。本例在/home/ylg目錄下建立一
個.message檔案,其內容為“歡迎來到我的FTP站點”。

2.更換FTP伺服器的預設埠。將預設的21埠改為2121,這樣做是基於安全的考慮。更
改方法為,使用vi開啟/etc/vsftpd/vsftpd.conf:
#vi /etc/vsftpd/vsftpd.conf

在檔案最後增加如下一行內容:
listen_port=2121

3.取消anonymous登入的功能。在vsftpd.conf檔案中找到如下一行,並將其值改為“NO”:
anonymous_enable=YES

4.設定使用者不得更改目錄。這樣做的目的也是基於安全性的考慮。一般情況下,使用
者的預設目錄為/home/username。若是不希望使用者在登入後能夠切換至上一層目錄
/home,則可通過以下設定來實現。在/etc/vsftpd/vsftpd.conf檔案中找到以下三行內容:

#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list

將其改為:

chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list

新增一個檔案/etc/vsftpd/chroot_list,檔案內容為兩個使用者名稱:

ylg
user1

5.針對不同的使用者限制不同的速度。假設使用者ylg所能使用的最高速度為500Kb/s,用
戶user1所能使用的最高速度為250Kb/s,可以通過以下方法設定。在
/etc/vsftpd/vsftpd.conf檔案尾部新增以下一行:
user_config_dir=/etc/vsftpd/userconf
增加一個名為/etc/vsftpd/userconf的目錄:
#mkdir /etc/vsftpd/userconf

在/etc/vsftpd/userconf下新增一個名為ylg的檔案,其內容如下所示:
local_max_rate=500000

在/etc/vsftpd/userconf目錄下新增一個名為user1的檔案,其內容如下所示:
local_max_rate=250000

VSFTP對於速度的限制範圍大概在80%到120%之間,也就是限制最高速度為100Kb/s,但
實際的速度可能在80Kb/s到120Kb/s之間。如果頻寬不足,數值會低於此限制。

6.對於每一個聯機使用者,都以獨立的程式來執行。一般情況下,在啟動VSFTP時,只會看
到一個名為vsftpd的程式在執行。但若是讀者希望每一個聯機使用者都能以獨立的程式來呈
現,則可通過在/etc/vsftpd/vsftpd.conf檔案中增加以下一行來實現:
setproctitle_enable=YES

7.儲存/etc/vsftpd/vsftpd.conf檔案,然後重新啟動vsftpd:
#service vsftpd restart

8.測試剛建立的FTP伺服器。
以預設方式登入會被拒絕,因為此時的預設埠號已經更改為2121,所以登入時需指定端
口。

# ftp 127.0.0.1
ftp: connect: Connection refused

此時也不能再使用匿名方式登入:

# ftp 127.0.0.1 2121
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 1.1.3)
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

如果以使用者ylg則可以成功登入(指定埠2121),並顯示歡迎資訊:

# ftp 127.0.0.1 2121
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 1.1.3)
Name (127.0.0.1:root): ylg
331 Please specify the password.
Password:
230-歡迎來到我的FTP站點
230 Login successful. H***e fun.
Remote system type is UNIX.
Using binary mode to transfer files.

因為在設定中設定了不能切換目錄,所以下列命令無法正確執行:

ftp> cd /home
550 Failed to change directory.

再來測試一下上傳和下載。首先下載伺服器目錄中的test.txt檔案:

ftp> get test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (127,0,0,1,243,215)
150 Opening BINARY mode data connection for test.txt (21 bytes).
226 File send OK.
21 bytes received in 0.00308 secs (6.7 Kbytes/sec)

可以通過!ls命令看到本機目錄中已成功下載該檔案。然後上傳本機目錄中的ylg.txt檔案
到伺服器:

ftp> put ylg.txt
local: ylg.txt remote: ylg.txt
227 Entering Passive Mode (127,0,0,1,133,248)
150 Ok to send data.
226 File receive OK.
19 bytes sent in 0.0401 secs (0.46 Kbytes/sec)

用ls命令檢視伺服器目錄,會發現該檔案已成功上傳。

為了測試不同連機使用者使用的是不同程式,可以使用ps -ef指令,顯示如下所示:

# ps -ef|grep ftp
root 12972 1356 0 13:44 pts/1 00:00:00 ftp 127.0.0.1 2121
nobody 12973 12908 0 13:44 ? 00:00:00 [vsftpd]
ylg 12975 12973 0 13:44 ? 00:00:00 [vsftpd]
user1 13013 13011 0 13:46 ? 00:00:00 [vsftpd]
root 13041 13015 0 13:47 pts/4 00:00:00 grep ftp

到現在為止,一個基本可以滿足普通使用需求的FTP伺服器就已經架設完成。

在實際應用中,有時為了增加安全性,會將FTP伺服器置於防火牆之後。如本文開頭所
述,被動傳輸模式適合於帶有防火牆的情況。下面就來建立一個防火牆後的FTP伺服器,
該伺服器FTP埠為2121,資料傳輸埠為2020。

執行以下兩行指令,只允許2121和2020埠開啟,其餘埠關閉:

#iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT
#iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

修改/etc/vsftpd/vsftpd.conf檔案,在文字最後新增以下兩行:

listen_port=2121
ftp_data_port=2020

重新啟動vsftpd:
#service vsftpd restart

有時希望直接在/etc/hosts.allow中定義允許或拒絕某一源地址,可以通過以下配置來實
現。先確保/etc/vsftpd/vsftpd.conf中tcp_wrappers=YES,Red Hat 9.0中,這是預設
值。重新啟動vsftpd:
#service vsftpd restart

假設提供168.192.2.1和210.31.8.1到210.31.8.254的連線,則可對/etc/hosts.allow進
行如下設定:

vsftpd : 168.192.2.1 210.31.8. : allow
ALL : ALL : DENY

配置虛擬使用者FTP

上面配置的FTP伺服器有一個特點,就是FTP伺服器的使用者本身也是系統使用者。這顯然是一
個安全隱患,因為這些使用者不僅能夠訪問FTP,也能夠訪問其它的系統資源。如何解決這
個問題呢?答案就是建立一個虛擬使用者的FTP伺服器。虛擬使用者的特點是隻能訪問伺服器
為其提供的FTP服務,而不能訪問系統的其它資源。所以,如果想讓使用者對FTP伺服器站內
具有寫許可權,但又不允許訪問系統其它資源,可以使用虛擬使用者來提高系統的安全性。

在VSFTP中,認證這些虛擬使用者使用的是單獨的口令庫檔案(pam_userdb),由可插入認
證模組(PAM)認證。使用這種方式更加安全,並且配置更加靈活。 下面介紹配置過程。

1.生成虛擬使用者口令庫檔案。為了建立此口令庫檔案,先要生成一個文字檔案。該檔案
的格式如下,單數行為使用者名稱,偶數行為口令:

#vi account.txt
ylg
1234
zhanghong
4321
gou
5678

2.生成口令庫檔案,並修改其許可權:

#db_load -T -t hash -f ./account.txt /etc/vsftpd/account.db
#chmod 600 /etc/vsftpd/account.db

3.新建一個虛擬使用者的PAM檔案。加上如下兩行內容:

#vi /etc/pam.d/vsftp.vu
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/account
account required /lib/security/pam_userdb.so db=/etc/vsftpd/account

4.建立虛擬使用者,設定該使用者所要訪問的目錄,並設定虛擬使用者訪問的許可權:

#useradd -d /ftpsite virtual_user
#chmod 700 /ftpsite

經過該步驟的設定,/ftpsite就是virtual_user使用者的主目錄,該使用者也是/ftpsite目錄
的擁有者。除root使用者之外,只有該使用者具有對該目錄的讀、寫和執行的許可權。

5.生成一個測試檔案。先切換至virtual_user使用者身份,然後在/ftpsite目錄下建立一
個檔案:

#su -virtual_user
$vi /ftpsite/mytest
This is a test file.
$su - root

6.編輯/etc/vsftpd/vsftpd.conf檔案,使其整個檔案內容如下所示(去掉了註釋內容):

anonymous_enable=NO
local_enable=YES
local_umask=022
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
one_process_model=NO
chroot_local_user=YES
ftpd_banner=Welcom to my FTP server.
anon_world_readable_only=NO
guest_enable=YES
guest_username=virtual_user
pam_service_name=vsftp.vu

上面程式碼中,guest_enable=YES表示啟用虛擬使用者;guest_username=virtual則是將虛擬
使用者對映為本地使用者,這樣虛擬使用者登入後才能進入本地使用者virtual的目錄/ftpsite;
pam_service_name=vsftp.vu指定PAM的配置檔案為vsftp.vu。

7.重新啟動VSFTP:
#service vsftpd restart

8.以虛擬使用者gou(Linux中並無該賬號)進行測試:

# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 Welcom to my FTP server.
Name (127.0.0.1:root): gou
331 Please specify the password.
Password:
230 Login successful. H***e fun.
Remote system type is UNIX.
Using binary mode to transfer files.

測試下載伺服器目錄中的一個檔案mytest:

ftp> get mytest
local: mytest remote: mytest
227 Entering Passive Mode (127,0,0,1,159,19)
150 Opening BINARY mode data connection for mytest (21 bytes).
226 File send OK.
21 bytes received in 0.00038 secs (54 Kbytes/sec)

測試上傳本機目錄中的檔案vsftpd.conf:

ftp> !ls
account.db chroot_list k mytest userconf vsftpd.conf
ftp> put vsftpd.conf
local: vsftpd.conf remote: vsftpd.conf
227 Entering Passive Mode (127,0,0,1,117,203)
150 Ok to send data.
226 File receive OK.
4229 bytes sent in 0.00195 secs (2.1e+03 Kbytes/sec)

可以看到,使用沒有系統賬號的虛擬使用者可以成功完成上傳、下載的工作。但該FTP虛擬
伺服器只允許虛擬使用者登入,其它系統使用者無法登入,如系統使用者user1不是虛擬使用者,
則不能登入該虛擬伺服器。

# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 Welcom to my FTP server.
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

在虛擬FTP伺服器中,也可以對各個使用者的許可權進行設定。方法是在/etc/vsftpd.conf文
件中新增如下一行:
user_config_dir=使用者配置檔案目錄

然後在使用者配置檔案目錄下建立相應的使用者配置檔案,比如為上述名為gou的使用者建立一
個配置檔案(假設配置檔案目錄為/etc/user_config_dir):

#vi /etc/user_config_dir/gou
write_enable=NO
anono_upload_enable=NO

重啟FTP伺服器,這時再使用賬號gou來登入,就已經沒有上傳的許可權了。

相關文章