在眾多網路應用中,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 University FTP)和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伺服器,單擊「更新」即可。
如果無法確認是否安裝了該軟體,可以使用以下命令查看:
CODE: #rpm -qa|grep vsftpd vsftpd-1.1.3-8 |
2.啟動FTP伺服器
套用Red Hat 9.0的預設範例直接啟動VSFTP。
CODE: # /sbin/service vsftpd start |
為vsftpd啟動vsftpd: [確定]
3.在/var/ftp/pub目錄下創建一個名為test.txt的文件
文件內容為「This is a test file」。
4.測試
使用FTP客戶端登錄到本地伺服器,然後以匿名身份(anonymous)登錄:
CODE: # 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. Have fun. Remote system type is UNIX. Using binary mode to transfer files. |
這樣就成功地登錄到FTP伺服器。可以顯示伺服器目錄列表如下:
CODE: 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:
CODE: 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文件:
CODE: 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已成功下載到本機。
CODE: 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的文件,可以看到請求被拒絕了。
CODE: 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
在文件最後增加如下一行內容:
3.取消anonymous登錄的功能
在vsftpd.conf文件中找到如下一行,並將其值改為「NO」:anonymous_enable=YES
4.設定使用者不得更改目錄
這樣做的目的也是基於安全性的考慮。一般情況下,使用者的預設目錄為/home/username。若是不希望使用者在登錄后能夠切換至上一層目錄/home,則可通過以下設置來實現。在/etc/vsftpd/vsftpd.conf文件中找到以下三行內容:
CODE: #chroot_list_enable=YES # (default follows) #chroot_list_file=/etc/vsftpd.chroot_list |
將其改為:
CODE: 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文件尾部新增以下一行:
CODE: user_config_dir=/etc/vsftpd/userconf |
增加一個名為/etc/vsftpd/userconf的目錄:
CODE: #mkdir /etc/vsftpd/userconf |
在/etc/vsftpd/userconf下新增一個名為ylg的文件,其內容如下所示:
CODE: local_max_rate=500000 |
在/etc/vsftpd/userconf目錄下新增一個名為user1的文件,其內容如下所示:
CODE: local_max_rate=250000 |
VSFTP對於速度的限制範圍大概在80%到120%之間,也就是限制最高速度為100Kb/s,但實際的速度可能在80Kb/s到120Kb/s之間。如果頻寬不足,數值會低於此限制。6.對於每一個聯機用戶,都以獨立的進程來運行。一般情況下,在啟動VSFTP時,只會看到一個名為vsftpd的進程在運行。但若是讀者希望每一個聯機用戶都能以獨立的進程來呈現,則可通過在/etc/vsftpd/vsftpd.conf文件中增加以下一行來實現:
CODE: setproctitle_enable=YES |
7.保存/etc/vsftpd/vsftpd.conf文件,然後重新啟動vsftpd:
CODE: #service vsftpd restart |
8.測試剛創建的FTP伺服器
以預設方式登錄會被拒絕,因為此時的默認埠號已經更改為2121,所以登錄時需指定埠。
CODE: # ftp 127.0.0.1 ftp: connect: Connection refused |
此時也不能再使用匿名方式登錄:
CODE: # 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),並顯示歡迎信息:
CODE: # 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. Have fun. Remote system type is UNIX. Using binary mode to transfer files. |
因為在設置中設定了不能切換目錄,所以下列命令無法正確執行:
CODE: ftp> cd /home 550 Failed to change directory. |
再來測試一下上傳和下載。首先下載伺服器目錄中的test.txt文件:
CODE: 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文件到伺服器:
CODE: 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指令,顯示如下所示:
CODE: # 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埠打開,其餘埠關閉:用Linux構建最好的FTP伺服器
CODE: #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文件,在文本最後添加以下兩行:
CODE: listen_port=2121 ftp_data_port=2020 |
重新啟動vsftpd:
CODE: #service vsftpd restart |
有時希望直接在/etc/hosts.allow中定義允許或拒絕某一源地址,可以通過以下配置來實現。先確保/etc/vsftpd/vsftpd.conf中tcp_wrappers=YES,Red Hat 9.0中,這是默認值。重新啟動vsftpd:
CODE: #service vsftpd restart |
假設提供168.192.2.1和210.31.8.1到210.31.8.254的連接,則可對/etc/hosts.allow進行如下設定:
CODE: vsftpd : 168.192.2.1 210.31.8. : allow |