如何使用Linux構建高效FTP伺服器

太陽是我啃圓的發表於2021-01-25
在網路應用中FTP有著非常重要的地位,是十分重要的軟體資源,那麼你知道在linux字型中如何構建高效FTP伺服器嗎?接下來的內容中小編將介紹Linux構建高效FTP伺服器的方法。
  在眾多網路應用中,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伺服器,單擊“更新”即可。
  如果無法確認是否安裝了該軟體,可以使用以下命令檢視:
  #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. Have 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)
  150 Here comes the directory listing.
  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. Have 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
  >
  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. Have 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來登入,就已經沒有上傳的許可權
  上文就是關於Linux構建高效FTP伺服器的方法介紹,希望能對您有所幫助


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69993754/viewspace-2752796/,如需轉載,請註明出處,否則將追究法律責任。

相關文章