vsftp 詳解鳥哥版

FTP (File Transfer Protocol) 可說是最古老的協議之一了,主要是用來進行檔案的傳輸,尤爲是大型檔案的傳輸使用 FTP 更是方便!不過,值得注意的是,使用 FTP 來傳輸時,實際上是具備必定程度的『危險性』, 由於數據在因特網上面是徹底沒有受到保護的『明碼』傳輸方式!可是單純的 FTP 服務仍是有其必要性的,例如不少學校就有 FTP 服務器的架設需求啊!php


 

FTP 的數據鏈路原理
1.1  FTP 功能簡介
1.2  FTP 的運做流程與使用到的端口
1.3  客戶端選擇被動式聯機模式
1.4  FTP 的安全性問題與替代方案
1.5  開放什麼身份的使用者登入
vsftpd 服務器基礎設定
2.1  爲什麼使用 vsftpd
2.2  所須要的軟件以及軟件結構
2.3  vsftpd.conf 設定值說明 
2.4  vsftpd 啓動的模式
2.5  CentOS 的 vsftpd 默認值:  使用本地端時間
2.6  針對實體帳號的設定:  SELinuxchroot限制帶寬最大上線人數可用帳號列表
2.7  僅有匿名登陸的相關設定:  匿名的根可上傳下載僅可上傳被動式聯機埠口
2.8  防火牆設定
2.9  常見問題與解決之道
客戶端的圖形接口 FTP 聯機軟件
3.1  Filezilla
3.2  透過瀏覽器取得 FTP 聯機
讓 vsftpd 增長 SSL 的加密功能
重點回顧
本章習題
參考數據與延伸閱讀

1 FTP 的數據鏈路原理html

FTP (File transfer protocol) 是至關古老的傳輸協議之一,他最主要的功能是在服務器與客戶端之間進行檔案的傳輸。 這個古老的協議使用的是明碼傳輸方式,且過去有至關多的安全危機歷史。爲了更安全的使用 FTP 協議,咱們主要介紹較爲安全但功能較少的 vsftpd 這個軟件吶。linux


2.1.1 FTP 功能簡介shell

FTP 服務器的功能除了單純的進行檔案的傳輸與管理以外,依據服務器軟件的設定架構,它還能夠提供幾個主要的功能。 底下咱們約略的來談一談:apache


  • 不一樣等級的用戶身份:user, guest, anonymousvim

FTP 服務器在預設的狀況下,依據使用者登入的狀況而分爲三種不一樣的身份,分別是: (1)實體帳號,real user;(2)訪客, guest;(3)匿名登陸者, anonymous 這三種。這三種身份的用戶在系統上面的權限差別很大喔!例如實體用戶取得系統的權限比較完整, 因此能夠進行比較多的動做;至於匿名登陸者,大概咱們就僅提供他下載資源的能力而已,並不準匿名者使用太多主機的資源啊! 固然,這三種人物可以使用的『在線指令』天然也就不相同囉! ^_^後端


  • 命令記錄與登陸文件記錄:centos

FTP 能夠利用系統的 syslogd 來進行數據的紀錄, 而記錄的數據報括了用戶曾經下達過的命令與用戶傳輸數據(傳輸時間、檔案大小等等)的紀錄呢! 因此你能夠很輕鬆的在 /var/log/ 裏面找到各項登陸信息喔!瀏覽器


  • 限制用戶活動的目錄: (change root, 簡稱 chroot)安全

爲了不用戶在你的 Linux 系統當中隨意逛大街 (意指離開用戶本身的家目錄而進入到 Linux 系統的其餘目錄去), 因此將使用者的工做範圍『侷限』在用戶的家目錄底下,嗯!實在是個不錯的好主意!FTP 能夠限制用戶僅能在本身的家目錄當中活動喔!如此一來,因爲使用者沒法離開本身的家目錄,並且登入 FTP 後,顯示的『根目錄』就是本身家目錄的內容,這種環境稱之爲 change root ,簡稱 chroot ,改變根目錄的意思啦!

這有什麼好處呢?當一個惡意的使用者以 FTP 登入你的系統當中,若是沒有 chroot 的環境下,他能夠到 /etc, /usr/local, /home 等其餘重要目錄底下去察看檔案數據,尤爲是很重要的 /etc/ 底下的配置文件,如 /etc/passwd 等等。若是你沒有作好一些檔案權限的管理與保護,那他就有辦法取得系統的某些重要信息, 用來『入侵』你的系統呢!因此在 chroot 的環境下,固然就比較安全一些咯!


1.2 FTP 的運做流程與使用到的端口

FTP 的傳輸使用的是 TCP 封包協議,在第二章網絡基礎中咱們談過, TCP 在創建聯機前會先進行三向交握。不過 FTP 服務器是比較麻煩一些,由於 FTP 服務器使用了兩個聯機,分別是命令信道與數據流通道 (ftp-data) 。這兩個聯機都須要通過三向交握, 由於是 TCP 封包嘛!那麼這兩個聯機通道的關係是如何呢?底下咱們先以 FTP 預設的主動式 (active) 聯機來做個簡略的說明囉:

connect_active
圖 1-一、FTP 服務器的主動式聯機示意圖
簡單的聯機流程就如上圖所示,至於聯機的步驟是這樣的:
  1. 創建命令通道的聯機
    如上圖所示,客戶端會隨機取一個大於 1024 以上的埠口 (port AA) 來與 FTP 服務器端的 port 21 達成聯機, 這個過程固然須要三向交握了!達成聯機後客戶端即可以透過這個聯機來對 FTP 服務器下達指令, 包括查詢檔名、下載、上傳等等指令都是利用這個通道來下達的;
  2. 通知 FTP 服務器端使用 active 且告知鏈接的埠號
    FTP 服務器的 21 埠號主要用在命令的下達,可是當牽涉到數據流時,就不是使用這個聯機了。 客戶端在須要數據的狀況下,會告知服務器端要用什麼方式來聯機,若是是主動式 (active) 聯機時, 客戶端會先隨機啓用一個埠口 (圖 1-1 當中的 port BB) ,且透過命令通道告知 FTP 服務器這兩個信息,並等待 FTP 服務器的聯機;
  3. FTP 服務器『主動』向客戶端聯機
    FTP 服務器由命令通道瞭解客戶端的需求後,會主動的由 20 這個埠號向客戶端的 port BB 聯機, 這個聯機固然也會通過三向交握啦!此時 FTP 的客戶端與服務器端共會創建兩條聯機,分別用在命令的下達與數據的傳遞。 而預設 FTP 服務器端使用的主動聯機埠號就是 port 20 囉!

如此一來則成功的創建起『命令』與『數據傳輸』兩個信道!不過,要注意的是, 『數據傳輸信道』是在有數據傳輸的行爲時纔會創建的通道喔!並非一開始鏈接到 FTP 服務器就馬上創建的通道呢!留意一下囉!


  • 主動式聯機使用到的埠號

利用上述的說明來整理一下 FTP 服務器端會使用到的埠號主要有:

  • 命令通道的 ftp (默認爲 port 21) 與
  • 數據傳輸的 ftp-data (默認爲port 20)。

再強調一次,這兩個埠口的工做是不同的,並且,重要的是二者的聯機發起端是不同的!首先 port 21 主要接受來自客戶端的主動聯機,至於 port 20 則爲 FTP 服務器主動聯機至客戶端呢!這樣的狀況在服務器與客戶端二者同時爲公共 IP (Public IP) 的因特網上面一般沒有太大的問題,不過,萬一你的客戶端是在防火牆後端,或者是 NAT 服務器後端呢?會有什麼問題發生呢?底下咱們來談一談這個嚴重的問題!


  • 在主動聯機的 FTP 服務器與客戶端之間具備防火牆的聯機問題

回想一下咱們的第九章防火牆! 通常來講,不少的局域網絡都會使用防火牆 (iptables) 的 NAT 功能,那麼在 NAT 後端的 FTP 用戶如何鏈接到 FTP 服務器呢? 咱們能夠簡單的如下圖來講明:

connect_active_nat
圖 1-二、 FTP 客戶端與服務器端聯機中間具備防火牆的聯機狀態
  1. 用戶與服務器間命令信道的創建:
    由於 NAT 會主動的記錄由內部送往外部的聯機信息,而因爲命令信道的創建是由客戶端向服務器端聯機的, 所以這一條聯機能夠順利的創建起來的;
  2. 用戶與服務器間數據信道創建時的通知:
    一樣的,客戶端主機會先啓用 port BB ,並透過命令通道告知 FTP 服務器,且等待服務器端的主動聯機;
  3. 服務器主動連到 NAT 等待轉遞至客戶端的聯機問題:
    可是因爲透過 NAT 的轉換後,FTP 服務器只能得知 NAT 的 IP 而不是客戶端的 IP , 所以 FTP 服務器會以 port 20 主動的向 NAT 的 port BB 發送主動聯機的要求。 但你的 NAT 並無啓動 port BB 來監聽 FTP 服務器的聯機啊!

瞭解問題的所在了嗎?在 FTP 的主動式聯機當中,NAT 將會被視爲客戶端,但 NAT 其實並不是客戶端啊, 這就形成問題了。若是你曾經在 IP 分享器後面鏈接某些 FTP 服務器時,可能偶爾會發現明明就鏈接上 FTP 服務器了 (命令通道已創建),可是就是沒法取得文件名的列表,而是在超過一段時間後顯示『 Can’t build data connection: Connection refused,沒法進行數據傳輸』之類的訊息, 那確定就是這個緣由所形成的困擾了。

那有沒有辦法能夠克服這個問題呢?難道真的在 Linux NAT 後面就必定沒法使用 FTP 嗎?固然不是! 目前有兩個簡易的方法能夠克服這個問題:

  • 使用 iptables 所提供的 FTP 偵測模塊:其實 iptables 早就提供了許多好用的模塊了,這個 FTP 固然不會被錯過! 你能夠使用 modprobe 這個指令來加載 ip_conntrack_ftp 及 ip_nat_ftp 等模塊,這幾個模塊會主動的分析『目標是 port 21 的聯機』信息, 因此能夠獲得 port BB 的資料,此時若接受到 FTP 服務器的主動聯機,就可以將該封包導向正確的後端主機了! ^_^

    不過,若是你連接的目標 FTP 服務器他的命令通道默認端口號並不是標準的 21 埠號時 (例如某些地下 FTP 服務器), 那麼這兩個模塊就沒法順利解析出來了,這樣說,理解嗎?

  • 客戶端選擇被動式 (Passive) 聯機模式:除了主動式聯機以外,FTP 還提供一種稱爲被動式聯機的模式,什麼是被動式呢? 既然主動式是由服務器向客戶端聯機,反過來說,被動式就是由客戶端向服務器端發起聯機的囉! 既然是由客戶端發起聯機的,那天然就不須要考慮來自 port 20 的聯機啦!關於被動式聯機模式將在下一小節介紹喔!

1.3 客戶端選擇被動式聯機模式

那麼什麼是被動式聯機呢?咱們能夠使用底下的圖示來做個簡略的介紹喔:

connect_passive
圖 1-三、FTP 的被動式數據流聯機流程
  1. 用戶與服務器創建命令信道:
    一樣的須要創建命令通道,透過三向交握就能夠創建起這個通道了。
  2. 客戶端發出 PASV 的聯機要求:
    當有使用數據信道的指令時,客戶端可透過命令通道發出 PASV 的被動式聯機要求 (Passive 的縮寫), 並等待服務器的迴應;
  3. FTP 服務器啓動數據端口,並通知客戶端聯機:
    若是你的 FTP 服務器是可以處理被動式聯機的,此時 FTP 服務器會先啓動一個埠口在監聽。 這個端口號碼多是隨機的,也能夠自定義某一範圍的埠口,端看你的 FTP 服務器軟件而定。 而後你的 FTP 服務器會透過命令通道告知客戶端該已經啓動的埠口 (圖中的 port PASV), 並等待客戶端的聯機。
  4. 客戶端隨機取用大於 1024 的埠口進行鏈接:
    而後你的客戶端會隨機取用一個大於 1024 的端口號來對主機的 port PASV 聯機。 若是一切都順利的話,那麼你的 FTP 數據就能夠透過 port BB 及 port PASV 來傳送了。

發現上面的不一樣點了嗎?被動式 FTP 數據信道的聯機方向是由客戶端向服務器端聯機的喔! 如此一來,在 NAT 內部的客戶端主機就能夠順利的鏈接上 FTP Server 了!可是,萬一 FTP 主機也是在 NAT 後端那怎麼辦…呵呵!那可就糗了吧~ @_@這裏就牽涉到更深刻的 DMZ 技巧了,咱們這裏暫不介紹這些深刻的技巧,先理解一下這些特殊的聯機方向, 這將有助於你將來服務器架設時候的考慮因素喔!

此外,不曉得你有無發現,透過 PASV 模式,服務器在沒有特別設定的狀況下,會隨機選取大於 1024 的埠口來提供客戶端鏈接之用。那麼萬一服務器啓用的埠口被搞鬼怎麼辦?並且, 如此一來也很難追蹤來自入侵者攻擊的登陸信息啊!因此,這個時候咱們能夠透過 passive ports 的功能來『限定』服務器啓用的 port number 喔!


1.4 FTP 的安全性問題與替代方案

其實,在 FTP 上面傳送的數據極可能被竊取,由於 FTP 是明碼傳輸的嘛!並且某些 FTP 服務器軟件的資安歷史問題也是很嚴重的。 所以,通常來講,除非是學校或者是一些社團單位要開放沒有機密或受權問題的資料以外,FTP 是少用爲妙的。

拜 SSH 所賜,目前咱們已經有較爲安全的 FTP 了,那就是 ssh 提供的 sftp 這個 server 啊!這個 sftp-server 最大的優勢就是:『在上面傳輸的數據是通過加密的』!因此在因特網上面流竄的時候, 嘿嘿!畢竟是比較安全一些啦!因此建議你,除非必要,不然的話使用 SSH 提供的 sftp-server 功能便可~

然而這個功能對於一些習慣了圖形接口,或者是有中文檔名的使用者來講,實在是不怎麼方便, 雖然說目前有個圖形接口的 filezilla 客戶端軟件,不過不少時候仍是會發生一些莫名的問題說! 因此,有的時候 FTP 網站仍是有其存在的須要的。若是真的要架設 FTP 網站,那麼仍是得須要注意幾個事項喔:

  1. 隨時更新到最新版本的 FTP 軟件,並隨時注意漏洞訊息;
  2. 善用 iptables 來規定能夠使用 FTP 的網域;
  3. 善用 TCP_Wrappers 來規範能夠登入的網域;
  4. 善用 FTP 軟件的設定來限制使用你 FTP 服務器的使用者的不一樣權限啊;
  5. 使用 Super daemon 來進階管理你的 FTP 服務器;
  6. 隨時注意用戶的家目錄、以及匿名用戶登入的目錄的『檔案權限』;
  7. 若不對外公開的話,或許也能夠修改 FTP 的 port 。
  8. 也能夠使用 FTPs 這種加密的 FTP 功能!

不管如何,在網絡上聽過太多人都是因爲開放 FTP 這個服務器而致使整個主機被入侵的事件,因此, 這裏真的要給他一直不斷的強調,要注意安全啊!


1.5 開放什麼身份的使用者登入

既然 FTP 是以明碼傳輸,而且某些早期的 FTP 服務器軟件也有很多的安全漏洞,那又爲什麼須要架設 FTP 服務器啊? 沒辦法啊,老是有人有須要這個玩意兒的,譬如說各大專院校不就有提供 FTP 網站的服務嗎? 這樣可讓校內的同窗共同分享校內的網絡資源嘛!不過,因爲 FTP 登入者的身份能夠分爲三種, 你到底要開放哪種身份登入呢?這個時候你能夠這樣簡單的思考一下囉:


  • 開放實體用戶的狀況 (Real user):

不少的 FTP 服務器默認就已經容許實體用戶的登入了。不過,須要瞭解的是,以實體用戶作爲 FTP 登入者身份時, 系統默認並無針對實體用戶來進行『限制』的,因此他能夠針對整個文件系統進行任何他所具備權限的工做。 所以,若是你的 FTP 使用者沒能好好的保護本身的密碼而致使被入侵,那麼你的整個 Linux 系統數據將頗有可能被竊取啊! 開放實體用戶時的建議以下:

  • 使用替代的 FTP 方案較佳: 因爲實體用戶原本就能夠透過網絡鏈接到主機來進行工做 (例如 SSH),所以實在沒有須要特別的開放 FTP 的服務啊!由於例如 sftp 原本就能達到傳輸檔案的功能囉!
  • 限制用戶能力,如 chroot 與 /sbin/nologin 等: 若是肯定要讓實體用戶利用 FTP 服務器的話,那麼你可能須要讓某些系統帳號沒法登入 FTP 才行,例如 bin, apache 等等。 最簡單經常使用的做法是透過 PAM 模塊來處理,譬如 vsftpd 這個軟件默承認以透過 /etc/vsftpd/ftpusers 這個檔案來設定不想讓他具備登入 FTP 的帳號。另外,將使用者身份 chroot 是至關須要的!

  • 訪客身份 (Guest)

一般會創建 guest 身份的案例當中,多半是因爲服務器提供了相似『我的 Web 首頁』的功能給通常身份用戶, 那麼這些使用者老是須要管理本身的網頁空間吧?這個時候將使用者的身份壓縮成爲 guest ,而且將他的可用目錄設定好,便可提供使用者一個方便的使用環境了!且不須要提供他 real user 的權限喔! 常見的建議以下:

  • 僅提供須要登入的帳號便可,不須要提供系統上面全部人都可登入的環境啊!
  • 固然,咱們在服務器的設定當中,須要針對不一樣的訪客給他們不同的『家目錄』, 而這個家目錄與用戶的權限設定須要相符合喔!例如要提供 dmtsai 這我的管理他的網頁空間,而他的網頁空間放置在 /home/dmtsai/www 底下,那我就將 dmtsai 在 FTP 提供的目錄僅有 /home/dmtsai/www 而已,比較安全啦!並且也方便使用者啊!
  • 針對這樣的身份者,須要設定較多的限制,包括:上下傳檔案數目與硬盤容量的限制、 聯機登入的時間限制、許可以使用的指令要減小不少不少,例如 chmod 就不要容許他使用等等!

  • 匿名登陸使用者 (anonymous)

雖然提供匿名登陸給因特網的使用者進入實在不是個好主意,由於每一個人均可以去下載你的數據, 萬一帶寬被吃光光怎麼辦?但如同前面講過的,學校單位須要分享全校同窗一些軟件資源時, FTP 服務器也是一個很不錯的解決方案啊!你說是吧。若是要開放匿名用戶的話,要注意:

  • 不管如何,提供匿名登陸都是一件至關危險的事情,由於只要你一不當心, 將重要的資料放置到匿名者能夠讀取的目錄中時,那麼就頗有可能會泄密!與其戰戰兢兢,不如就不要設定啊~
  • 果然要開放匿名登陸時,不少限制都要進行的,這包括:(1)容許的工做指令要減低不少, 幾乎就不準匿名者使用指令啦、(2)限制文件傳輸的數量,儘可能不要容許『上傳』數據的設定、 (3)限制匿名者同時登入的最大聯機數量,能夠控制盜連喔!

通常來講,若是你是要放置一些公開的、沒有版權糾紛的數據在網絡上供人下載的話, 那麼一個僅提供匿名登陸的 FTP 服務器,而且對整個因特網開放是 OK 的啦! 不過,若是你預計要提供的的軟件或數據是具備版權的,可是該版權容許你在貴單位內傳輸的狀況下, 那麼架設一個『僅針對內部開放的匿名 FTP 服務器 (利用防火牆處理) 』也是 OK 的啦!

若是你還想要讓使用者反饋的話,那是否要架設一個匿名者可上傳的區域呢?鳥哥對這件事情的見解是…. 『萬萬不可』啊!若是要讓使用者反饋的話,除非該使用者是你信任的,不然不要容許對方上傳! 因此此時一個文件系統權限管理嚴格的 FTP 服務器,並提供實體用戶的登入就有點需求啦! 總之,要依照你的需求來思考是否有須要喔!


2 vsftpd 服務器基礎設定

終於要來聊一聊這個簡單的 vsftpd 囉!vsftpd 的全名是『Very Secure FTP Daemon 』的意思, 換句話說,vsftpd 最初發展的理念就是在建構一個以安全爲重的 FTP 服務器呢!咱們先來聊一聊爲何 vsftpd 號稱『很是安全』呢?而後再來談設定吧!


2.1 爲什麼使用 vsftpd

爲了建構一個安全爲主的 FTP 服務器, vsftpd 針對操做系統的『程序的權限 (privilege)』概念來設計, 若是你讀過基礎篇的十七章程序與資源管理的話, 應該會曉得系統上面所執行的程序都會引起一個程序,咱們稱他爲 PID (Process ID), 這個 PID 在系統上面能進行的任務與他擁有的權限有關。也就是說, PID 擁有的權限等級越高, 他可以進行的任務就越多。舉例來講,使用 root 身份所觸發的 PID 一般擁有能夠進行任何工做的權限等級。

不過,萬一觸發這個 PID 的程序 (program) 有漏洞而致使被網絡怪客 (cracker) 所攻擊而取得此 PID 使用權時, 那麼網絡怪客將會取得這個 PID 擁有的權限吶!因此,近來發展的軟件都會盡可能的將服務取得的 PID 權限下降,使得該服務即便不當心被入侵了,入侵者也沒法獲得有效的系統管理權限,這樣會讓咱們的系統較爲安全的啦。 vsftpd 就是基於這種想法而設計的。

除了 PID 方面的權限以外, vsftpd 也支持 chroot 這個函式的功能,chroot 顧名思義就是『 change root directory 』的意思,那個 root 指的是『根目錄』而非系統管理員。 他能夠將某個特定的目錄變成根目錄,因此與該目錄沒有關係的其餘目錄就不會被誤用了。

舉例來講,若是你以匿名身份登入咱們的 ftp 服務的話,一般你會被限定在 /var/ftp 目錄下工做, 而你看到的根目錄其實就只是 /var/ftp ,至於系統其餘如 /etc, /home, /usr… 等其餘目錄你就看不到了! 這樣一來即便這個 ftp 服務被攻破了,沒有關係,入侵者仍是僅能在 /var/ftp 裏面跑來跑去而已,而沒法使用 Linux 的完整功能。天然咱們的系統也就會比較安全啦!

vsftpd 是基於上面的說明來設計的一個較爲安全的 FTP 服務器軟件,他具備底下的特色喔:

  • vsftpd 這個服務的啓動者身份爲通常用戶,因此對於 Linux 系統的權限較低,對於 Linux 系統的危害就相對的減低了。此外, vsftpd 亦利用 chroot() 這個函式進行改換根目錄的動做,使得系統工具不會被 vsftpd 這支服務所誤用;
  • 任何須要具備較高執行權限的 vsftpd 指令均以一支特殊的上層程序所控制, 該上層程序享有的較高執行權限功能已經被限制的至關的低,並以不影響 Linux 自己的系統爲準;
  • 絕大部分 ftp 會使用到的額外指令功能 (dir, ls, cd …) 都已經被整合到 vsftpd 主程序當中了,所以理論上 vsftpd 不須要使用到額外的系統提供的指令,因此在 chroot 的狀況下,vsftpd 不但能夠順利運做,且不須要額外功能對於系統來講也比較安全。
  • 全部來自客戶端且想要使用這支上層程序所提供的較高執行權限之 vsftpd 指令的需求, 均被視爲『不可信任的要求』來處理,必須要通過至關程度的身份確認後,方可利用該上層程序的功能。 例如 chown(), Login 的要求等等動做;
  • 此外,上面提到的上層程序中,依然使用 chroot() 的功能來限制用戶的執行權限。

因爲具備這樣的特色,因此 vsftpd 會變的比較安全一些咯!底下就開始來談如何設定吧!


2.2 所須要的軟件以及軟件結構

vsftpd 所須要的軟件只有一個,那就是 vsftpd 啊!^_^!若是你的 CentOS 沒有安裝,請利用 yum install vsftpd 來安裝他吧!軟件很小,下載連同安裝不須要幾秒鐘就搞定了!而事實上整個軟件提供的配置文件也少的使人高興!簡單易用就是 vsftpd 的特點啊!這些設定數據比較重要的有:

  • /etc/vsftpd/vsftpd.conf
    嚴格來講,整個 vsftpd 的配置文件就只有這個檔案!這個檔案的設定是以 bash 的變量設定相同的方式來處理的, 也就是『參數=設定值』來設定的,注意, 等號兩邊不能有空白喔!至於詳細的 vsftpd.conf 能夠使用 『 man 5 vsftpd.conf 』來詳查。
  • /etc/pam.d/vsftpd
    這個是 vsftpd 使用 PAM 模塊時的相關配置文件。主要用來做爲身份認證之用,還有一些用戶身份的抵擋功能, 也是透過這個檔案來達成的。你能夠察看一下該檔案:
    [root@www ~]# cat /etc/pam.d/vsftpd
    #%PAM-1.0
    session optional pam_keyinit.so    force revoke
    auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth    required pam_shells.so
    auth    include  password-auth
    account include  password-auth
    session required pam_loginuid.so
    session include  password-auth

    上面那個 file 後面接的檔案是『限制使用者沒法使用 vsftpd 』之意, 也就是說,其實你的限制檔案不見得要使用系統默認值,也能夠在這個檔案裏面進行修改啦! ^_^

  • /etc/vsftpd/ftpusers
    與上一個檔案有關係,也就是 PAM 模塊 (/etc/pam.d/vsftpd) 所指定的那個沒法登入的用戶配置文件啊! 這個檔案的設定很簡單,你只要將『不想讓他登入 FTP 的帳號』寫入這個檔案便可。一行一個帳號,看起來像這樣:
    [root@www ~]# cat /etc/vsftpd/ftpusers
    # Users that are not allowed to login via ftp
    root
    bin
    daemon
    ....(底下省略)....

    瞧見沒有?絕大部分的系統帳號都在這個檔案內喔,也就是說,系統帳號默認是沒有辦法使用 vsftpd 的啦! 若是你還想要讓某些使用者沒法登入,寫在這裏是最快的!

  • /etc/vsftpd/user_list
    這個檔案是否可以生效與 vsftpd.conf 內的兩個參數有關,分別是『 userlist_enable, userlist_deny 』。 若是說 /etc/vsftpd/ftpusers 是 PAM 模塊的抵擋設定項目,那麼這個 /etc/vsftpd/user_list 則是 vsftpd 自定義的抵擋項目。事實上這個檔案與 /etc/vsftpd/ftpusers 幾乎如出一轍, 在預設的狀況下,你能夠將不但願可登入 vsftpd 的帳號寫入這裏。不過這個檔案的功能會依據 vsftpd.conf 配置文件內的 userlist_deny={YES/NO} 而不一樣,這得要特別留意喔!
  • /etc/vsftpd/chroot_list
    這個檔案預設是不存在的,因此你必需要手動自行創建。這個檔案的主要功能是能夠將某些帳號的使用者 chroot 在他們的家目錄下!但這個檔案要生效與 vsftpd.conf 內的『 chroot_list_enable, chroot_list_file 』兩個參數有關。 若是你想要將某些實體用戶限制在他們的家目錄下而不準到其餘目錄去,能夠啓動這個設定項目喔!
  • /usr/sbin/vsftpd
    這就是 vsftpd 的主要執行檔咯!不要懷疑, vsftpd 只有這一個執行檔而已啊!
  • /var/ftp/
    這個是 vsftpd 的預設匿名者登入的根目錄喔!其實與 ftp 這個帳號的家目錄有關啦!

大體上就只有這幾個檔案須要注意而已,並且每一個檔案的設定又都很簡單!真是不錯啊!


2.3 vsftpd.conf 設定值說明

事實上,/etc/vsftpd/vsftpd.conf 自己就是一個挺詳細的配置文件,且使用『 man 5 vsftpd.conf 』則能夠獲得完整的參數說明。 不過咱們這裏依舊先將 vsftpd.conf 內的經常使用參數給他寫出來,但願對你有幫助:


  • 與服務器環境較相關的設定值

  • connect_from_port_20=YES (NO)
    記得在前一小節提到的主動式聯機使用的 FTP 服務器的 port 嗎?這就是 ftp-data 的埠號;
  • listen_port=21
    vsftpd 使用的命令通道 port,若是你想要使用非正規的埠號,在這個設定項目修改吧! 不過你必需要知道,這個設定值僅適合以 stand alone 的方式來啓動喔!(對於 super daemon 無效)
  • dirmessage_enable=YES (NO)
    當用戶進入某個目錄時,會顯示該目錄須要注意的內容,顯示的檔案默認是 .message ,你能夠使用底下的設定項目來修訂!
  • message_file=.message
    當 dirmessage_enable=YES 時,能夠設定這個項目來讓 vsftpd 尋找該檔案來顯示訊息!
  • listen=YES (NO)
    若設定爲 YES 表示 vsftpd 是以 standalone 的方式來啓動的!預設是 NO 呦!因此咱們的 CentOS 將它改成 YES 哩!這樣才能使用 stand alone 的方式來喚醒。
  • pasv_enable=YES (NO)
    支持數據流的被動式聯機模式(passive mode),必定要設定爲 YES 的啦!
  • use_localtime=YES (NO)
    是否使用本地時間?vsftpd 預設使用 GMT 時間(格林威治),因此預設的 FTP 內的檔案日期會比臺灣晚 8 小時,建議修改設定爲 YES 吧!
  • write_enable=YES (NO)
    若是你容許用戶上傳數據時,就要啓動這個設定值;
  • connect_timeout=60
    單位是秒,在數據鏈接的主動式聯機模式下,咱們發出的鏈接訊號在 60 秒內得不到客戶端的響應,則不等待並強制斷線咯。
  • accept_timeout=60
    當用戶以被動式 PASV 來進行數據傳輸時,若是服務器啓用 passive port 並等待 client 超過 60 秒而無迴應, 那麼就給他強制斷線!這個設定值與 connect_timeout 相似,不過一個是管理主動聯機,一個管理被動聯機。
  • data_connection_timeout=300
    若是服務器與客戶端的數據聯機已經成功創建 (不論主動仍是被動聯機),可是可能因爲線路問題致使 300 秒內仍是沒法順利的完成數據的傳送,那客戶端的聯機就會被咱們的 vsftpd 強制剔除!
  • idle_session_timeout=300
    若是使用者在 300 秒內都沒有命令動做,強制脫機!避免佔着茅坑不拉屎~
  • max_clients=0
    若是 vsftpd 是以 stand alone 方式啓動的,那麼這個設定項目能夠設定同一時間,最多有多少 client 能夠同時連上 vsftpd 哩!限制使用 FTP 的用量!
  • max_per_ip=0
    與上面 max_clients 相似,這裏是同一個 IP 同一時間可容許多少聯機?
  • pasv_min_port=0, pasv_max_port=0
    上面兩個是與 passive mode 使用的 port number 有關,若是你想要使用 65400 到 65410 這 11 個 port 來進行被動式聯機模式的鏈接,能夠這樣設定 pasv_max_port=65410 以及 pasv_min_port=65400。 若是是 0 的話,表示隨機取用而不限制。
  • ftpd_banner=一些文字說明
    當使用者聯機進入到 vsftpd 時,在 FTP 客戶端軟件上頭會顯示的說明文字。不過,這個設定值數據比較少啦! 建議你能夠使用底下的 banner_file 設定值來取代這個項目;
  • banner_file=/path/file
    這個項目能夠指定某個純文本檔做爲使用者登入 vsftpd 服務器時所顯示的歡迎字眼。同時,也可以放置一些讓使用者知道本 FTP 服務器的目錄架構!

  • 與實體用戶較相關的設定值

  • guest_enable=YES (NO)
    若這個值設定爲 YES 時,那麼任何實體帳號,均會被假設成爲 guest 喔 (因此預設是不開放的)! 至於訪客在 vsftpd 當中,預設會取得 ftp 這個使用者的相關權限。但能夠透過 guest_username 來修改。
  • guest_username=ftp
    在 guest_enable=YES 時纔會生效,指定訪客的身份而已。
  • local_enable=YES (NO)
    這個設定值必需要爲 YES 時,在 /etc/passwd 內的帳號才能以實體用戶的方式登入咱們的 vsftpd 服務器喔!
  • local_max_rate=0
    實體用戶的傳輸速度限制,單位爲 bytes/second, 0 爲不限制。
  • chroot_local_user=YES (NO)
    在預設的狀況下,是否要將使用者限制在本身的家目錄以內(chroot)?若是是 YES 表明用戶默認就會被 chroot,若是是 NO, 則預設是沒有 chroot。不過,實際仍是須要底下的兩個參數互相參考才行。爲了安全性,這裏應該要設定成 YES 纔好。
  • chroot_list_enable=YES (NO)
    是否啓用 chroot 寫入列表的功能?與底下的 chroot_list_flie 有關!這個項目得要開啓,不然底下的列表檔案會無效。
  • chroot_list_file=/etc/vsftpd.chroot_list
    若是 chroot_list_enable=YES 那麼就能夠設定這個項目了!這個項目與 chroot_local_user 有關,詳細的設定狀態請參考 2.6 chroot 的說明。
  • userlist_enable=YES (NO)
    是否藉助 vsftpd 的抵擋機制來處理某些不受歡迎的帳號,與底下的參數設定有關;
  • userlist_deny=YES (NO)
    當 userlist_enable=YES 時纔會生效的設定,若此設定值爲 YES 時,則當使用者帳號被列入到某個檔案時, 在該檔案內的使用者將沒法登入 vsftpd 服務器!該檔案文件名與下列設定項目有關。
  • userlist_file=/etc/vsftpd/user_list
    若上面 userlist_deny=YES 時,則這個檔案就有用處了!在這個檔案內的帳號都沒法使用 vsftpd 喔!

  • 匿名者登入的設定值

  • anonymous_enable=YES (NO)
    設定爲容許 anonymous 登入咱們的 vsftpd 主機!預設是 YES ,底下的全部相關設定都須要將這個設定爲 anonymous_enable=YES 以後纔會生效!
  • anon_world_readable_only=YES (NO)
    僅容許 anonymous 具備下載可讀檔案的權限,預設是 YES。
  • anon_other_write_enable=YES (NO)
    是否容許 anonymous 具備除了寫入以外的權限?包括刪除與改寫服務器上的檔案及檔名等權限。預設固然是 NO!若是要設定爲 YES,那麼開放給 anonymous 寫入的目錄亦須要調整權限,讓 vsftpd 的 PID 擁有者能夠寫入才行!
  • anon_mkdir_write_enable=YES (NO)
    是否讓 anonymous 具備創建目錄的權限?默認值是 NO!若是要設定爲 YES, 那麼 anony_other_write_enable 必須設定爲 YES !
  • anon_upload_enable=YES (NO)
    是否讓 anonymous 具備上傳數據的功能,默認是 NO,若是要設定爲 YES ,則 anon_other_write_enable=YES 必須設定。
  • deny_email_enable=YES (NO)
    將某些特殊的 email address 抵擋住,不讓那些 anonymous 登入!若是以 anonymous 登入服務器時,不是會要求輸入密碼嗎?密碼不是要你輸入你的 email address 嗎?若是你很討厭某些 email address, 就能夠使用這個設定來將他取消登入的權限!需與下個設定項目配合:
  • banned_email_file=/etc/vsftpd/banned_emails
    若是 deny_email_enable=YES 時,能夠利用這個設定項目來規定哪一個 email address 不可登入咱們的 vsftpd 喔!在上面設定的檔案內,一行輸入一個 email address 便可!
  • no_anon_password=YES (NO)
    當設定爲 YES 時,表示 anonymous 將會略過密碼檢驗步驟,而直接進入 vsftpd 服務器內喔!因此通常預設都是 NO 的!(登入時會檢查輸入的 emai)
  • anon_max_rate=0
    這個設定值後面接的數值單位爲 bytes/秒 ,限制 anonymous 的傳輸速度,若是是 0 則不限制(由最大帶寬所限制),若是你想讓 anonymous 僅有 30 KB/s 的速度,能夠設定『anon_max_rate=30000』
  • anon_umask=077
    限制 anonymous 上傳檔案的權限!若是是 077 則 anonymous 傳送過來的檔案權限會是 -rw——- 喔!

  • 關於系統安全方面的一些設定值

  • ascii_download_enable=YES (NO)
    若是設定爲 YES ,那麼 client 就優先 (預設) 使用 ASCII 格式下載文件。
  • ascii_upload_enable=YES (NO)
    與上一個設定相似的,只是這個設定針對上傳而言!預設是 NO
  • one_process_model=YES (NO)
    這個設定項目比較危險一點~當設定爲 YES 時,表示每一個創建的聯機都會擁有一支 process 在負責,能夠增長 vsftpd 的效能。不過, 除非你的系統比較安全,並且硬件配備比較高,不然容易耗盡系統資源喔!通常建議設定爲 NO 的啦!
  • tcp_wrappers=YES (NO)
    固然咱們都習慣支持 TCP Wrappers 的啦!因此設定爲 YES 吧!
  • xferlog_enable=YES (NO)
    當設定爲 YES 時,使用者上傳與下載文件都會被紀錄起來。記錄的檔案與下一個設定項目有關:
  • xferlog_file=/var/log/xferlog
    若是上一個 xferlog_enable=YES 的話,這裏就能夠設定了!這個是登陸檔的檔名啦!
  • xferlog_std_format=YES (NO)
    是否設定爲 wu ftp 相同的登陸檔格式?預設爲 NO ,由於登陸檔會比較容易讀! 不過,若是你有使用 wu ftp 登陸文件的分析軟件,這裏才須要設定爲 YES
  • dual_log_enable=YES, vsftpd_log_file=/var/log/vsftpd.log
    除了 /var/log/xferlog 的 wu-ftp 格式登陸檔以外,還能夠具備 vsftpd 的獨特登陸檔格式喔!若是你的 FTP 服務器並非很忙碌, 或許訂出兩個登陸檔的撰寫 (/var/log/{vsftpd.log,xferlog) 是不錯的。
  • nopriv_user=nobody
    咱們的 vsftpd 預設以 nobody 做爲此一服務執行者的權限。由於 nobody 的權限至關的低,所以即便被入侵,入侵者僅能取得 nobody 的權限喔!
  • pam_service_name=vsftpd
    這個是 pam 模塊的名稱,咱們放置在 /etc/pam.d/vsftpd 便是這個咚咚!

上面這些是常見的 vsftpd 的設定參數,還有不少參數我沒有列出來,你能夠使用 man 5 vsftpd.conf 查閱喔!不過,基本上上面這些參數已經夠咱們設定 vsftpd 囉。


2.4 vsftpd 啓動的模式

vsftpd 能夠使用 stand alone 或 super daemon 的方式來啓動,咱們 CentOS 預設是以 stand alone 來啓動的。 那何時應該選擇 stand alone 或者是 super daemon 呢?若是你的 ftp 服務器是提供給整個因特網來進行大量下載的任務,例如各大專院校的 FTP 服務器,那建議你使用 stand alone 的方式, 服務的速度上會比較好。若是僅是提供給內部人員使用的 FTP 服務器,那使用 super daemon 來管理便可啊。


  • 利用 CentOS 提供的 script 來啓動 vsftpd (stand alone)

其實 CentOS 不用做任何設定就可以啓動 vsftpd 囉!是這樣啓動的啦:

[root@www ~]# /etc/init.d/vsftpd start
[root@www ~]# netstat -tulnp| grep 21
tcp  0  0 0.0.0.0:21  0.0.0.0:*   LISTEN   11689/vsftpd
# 看到囉,是由 vsftpd 所啓動的呢!

  • 自行設定以 super daemon 來啓動 (有必要再進行,不用實做)

若是你的 FTP 是不多被使用的,那麼利用 super daemon 來管理不失爲一個好主意。 不過若你想要使用 super daemon 管理的話,那就得要自行修改一下配置文件了。其實也不難啦,你應該要這樣處理的:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 找到 listen=YES 這一行:大約在 109 行左右啦,並將它改爲:
listen=NO

接下來修改一下 super daemon 的配置文件,底下這個檔案你必需要自行創建的,本來是不存在的喔:

[root@www ~]# yum install xinetd   <==假設 xinetd 沒有安裝時
[root@www ~]# vim /etc/xinetd.d/vsftpd
service ftp
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        log_on_success          += DURATION USERID
        log_on_failure          += USERID
        nice                    = 10
        disable                 = no
}

而後嘗試啓動看看呢:

[root@www ~]# /etc/init.d/vsftpd stop
[root@www ~]# /etc/init.d/xinetd restart
[root@www ~]# netstat -tulnp| grep 21
tcp  0  0 0.0.0.0:21  0.0.0.0:*   LISTEN   32274/xinetd

有趣吧!二者啓動的方式可不同啊!管理的方式就會差不少的呦!無論你要使用哪一種啓動的方式,切記不要二者同時啓動,不然會發生錯誤的!你應該使用 chkconfig –list 檢查一下這兩種啓動的方式,而後依據你的需求來決定用哪種方式啓動。鳥哥底下的設定都會以 stand alone 這個 CentOS 默認的啓動模式來處理,因此趕忙將剛剛的動做給他改回來喔!


2.5 CentOS 的 vsftpd 默認值

在 CentOS 的默認值當中,vsftpd 是同時開放實體用戶與匿名用戶的,CentOS 的默認值以下:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 1. 與匿名者有關的信息:
anonymous_enable=YES        <==支持匿名者的登入使用 FTP 功能

# 2. 與實體用戶有關的設定
local_enable=YES            <==支持本地端的實體用戶登入
write_enable=YES            <==容許用戶上傳數據 (包括檔案與目錄)
local_umask=022             <==創建新目錄 (755) 與檔案 (644) 的權限

# 3. 與服務器環境有關的設定
dirmessage_enable=YES       <==若目錄下有 .message 則會顯示該檔案的內容
xferlog_enable=YES          <==啓動登陸文件記錄,記錄於 /var/log/xferlog
connect_from_port_20=YES    <==支持主動式聯機功能
xferlog_std_format=YES      <==支持 WuFTP 的登陸檔格式
listen=YES                  <==使用 stand alone 方式啓動 vsftpd
pam_service_name=vsftpd     <==支持 PAM 模塊的管理
userlist_enable=YES         <==支持 /etc/vsftpd/user_list 檔案內的帳號登入管控!
tcp_wrappers=YES            <==支持 TCP Wrappers 的防火牆機制

上面各項設定值請自行參考 2.3 的詳細說明吧。而經過這樣的設定值我們的 vsftpd 能夠達到以下的功能:

  • 你能夠使用 anonymous 這個匿名帳號或其餘實體帳號 (/etc/passwd) 登入;
  • anonymous 的家目錄在 /var/ftp ,且無上傳權限,亦已經被 chroot 了;
  • 實體用戶的家目錄參考 /etc/passwd,並無被 chroot,可前往任何有權限可進入的目錄中;
  • 任何於 /etc/vsftpd/ftpusers 內存在的帳號均沒法使用 vsftpd (PAM);
  • 可利用 /etc/hosts.{allow|deny} 來做爲基礎防火牆;
  • 當客戶端有任何上傳/下載信息時,該信息會被紀錄到 /var/log/xferlog 中;
  • 主動式聯機的埠口爲 port 20;
  • 使用格林威治時間 (GMT)。

因此當你啓動 vsftpd 後,你的實體用戶就可以直接利用 vsftpd 這個服務來傳輸他本身的數據了。 不過比較大的問題是,由於 vsftpd 預設使用 GMT 時間,由於你在客戶端使用 ftp 軟件鏈接到 FTP 服務器時,會發現每一個檔案的時間都慢了八小時了!真是討厭啊! 因此建議你加設一個參數值,就是『 use_localtime=YES 』囉!

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 在這個檔案當中的最後一行加入這一句便可
use_localtime=YES

[root@www ~]# /etc/init.d/vsftpd restart
[root@www ~]# chkconfig vsftpd on

如此一來你的 FTP 服務器不但能夠提供匿名帳號來下載 /var/ftp 的數據,若是使用實體帳號來登入的話, 就可以進入到該用戶的家目錄底下去了!真是很簡單方便的一個設定啊!且使用本地端時間呢! ^_^

另外,若是你預計要將 FTP 開放給 Internet 使用時,請注意得要開放防火牆喔!關於防火牆的建置狀況, 因爲牽涉到數據流的主動、被動聯機方式,所以,還得要加入防火牆模塊。這部份咱們在後續的 2.8 小節再加以介紹,反正,最終記得要開放 FTP 的聯機要求就對了!


2.6 針對實體帳號的設定

雖然在 CentOS 的默認狀況當中實體用戶已經能夠使用 FTP 的服務了,不過咱們可能還須要一些額外的功能來限制實體用戶。 舉例來講,限制用戶沒法離開家目錄 (chroot)、限制下載速率、限制用戶上傳檔案時的權限 (mask) 等等。 底下咱們先列出一些但願達到的功能,而後再繼續進行額外功能的處理:

  • 但願使用臺灣本地時間取代 GMT 時間;
  • 用戶登入時顯示一些歡迎訊息的信息;
  • 系統帳號不可登入主機 (亦即 UID 小於 500 如下的帳號);
  • 通常實體用戶能夠進行上傳、下載、創建目錄及修改檔案等動做;
  • 用戶新增的檔案、目錄之 umask 但願設定爲 002;
  • 其餘主機設定值保留默認值便可。

你能夠自行處理 vsftpd.conf 這個檔案,如下則是一個範例。注意,若是你的 vsftpd.conf 沒有相關設定值, 請自行補上吧!OK!讓咱們開始一步一步來依序處理先:

  1. 先創建主配置文件 vsftpd.conf,這個配置文件已經包含了主要設定值:
    [root@www ~]# vim /etc/vsftpd/vsftpd.conf
    # 1. 與匿名者相關的信息,在這個案例中將匿名登陸取消:
    anonymous_enable=NO
    
    # 2. 與實體用戶相關的信息:可寫入,且 umask 爲 002 喔!
    local_enable=YES
    write_enable=YES
    local_umask=002
    userlist_enable=YES
    userlist_deny=YES
    userlist_file=/etc/vsftpd/user_list  <==這個檔案必須存在!還好,預設有此檔案!
    
    # 3. 與服務器環境有關的設定
    use_localtime=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    banner_file=/etc/vsftpd/welcome.txt <==這個檔案必須存在!需手動創建!
    
    [root@www ~]# /etc/init.d/xinetd restart  <==取消 super dameon
    [root@www ~]# /etc/init.d/vsftpd restart
  2. 創建歡迎訊息:當咱們想讓登入者可查閱我們系統管理員所下達的『公告』事項時,能夠使用這個設定!那就是 banner_file=/etc/vsftpd/welcome.txt 這個參數的用途了!咱們能夠編輯這個檔案便可。 好了,開始來創建歡迎畫面吧!
    [root@www ~]# vim /etc/vsftpd/welcome.txt
    歡迎光臨本小站,本站提供 FTP 的相關服務!
    主要的服務是針對本機實體用戶提供的,
    如有任何問題,請與鳥哥聯絡!
  3. 創建限制系統帳號登入的檔案再來是針對系統帳號來給予抵擋的機制,其實有兩個檔案啦,一個是 PAM 模塊管的,一個是 vsftpd 主動提供的, 在預設的狀況下這兩個檔案分別是:
    • /etc/vsftpd/ftpusers:就是 /etc/pam.d/vsftpd 這個檔案的設定所影響的;
    • /etc/vsftpd/user_list:由 vsftpd.conf 的 userlist_file 所設定。

    這兩個檔案的內容是同樣的哩~而且這兩個檔案必需要存在才行。請你參考你的 /etc/passwd 配置文件, 而後將 UID 小於 500 的帳號名稱給他同時寫到這兩個檔案內吧!一行一個帳號!

    [root@www ~]# vim /etc/vsftpd/user_list
    root
    bin
    ....(底下省略)....
  4. 測試結果:你能夠使用圖形接口的 FTP 客戶端軟件來處理,也能夠透過 Linux 自己提供的 ftp 客戶端功能哩! 關於 ftp 指令咱們已經在第五章談過了,你能夠自行前往參考。這裏直接測試一下吧:
    # 測試使用已知使用者登入,例如 dmtsai 這個實體用戶:
    [root@www ~]# ftp localhost
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    220-歡迎光臨本小站,本站提供 FTP 的相關服務!   <==剛剛創建的歡迎訊息
    220-主要的服務是針對本機實體用戶提供的,
    220-如有任何問題,請與鳥哥聯絡!
    220
    Name (localhost:root): student
    331 Please specify the password.
    Password:  <==輸入密碼囉在這裏!
    500 OOPS: cannot change directory:/home/student  <==有講登入失敗的緣由喔!
    Login failed.
    ftp> bye
    221 Goodbye.

    因爲默認通常用戶沒法登入 FTP 的!由於 SELinux 的問題啦!請參考下個小節的方式來處理。 而後以上面的方式測試完畢後,你能夠在登入者帳號處分別填寫 (1)root (2)anonymous 來嘗試登入看看! 若是不能登入的話,那就是設定 OK 的啦!(root 不能登入是由於 PAM 模塊以及 user_list 設定值的關係, 而匿名沒法登入,是由於咱們 vsftpd.conf 裏頭就是設定不能用匿名登陸嘛!)

上面是最簡單的實體帳號相關設定。那若是你還想要限制用戶家目錄的 chroot 或其餘如速限等數據,就得要看看底下的特殊設定項目囉。


  • 實體帳號的 SELinux 議題

在預設的狀況下,CentOS 的 FTP 是不容許實體帳號登入取得家目錄數據的,這是由於 SELinux 的問題啦! 若是你在剛剛的 ftp localhost 步驟中,在 bye 離開 FTP 以前下達過『 dir 』的話,那你會發現沒有任何資料跑出來~ 這並非你錯了,而是 SELinux 不太對勁的緣故。那如何解決呢?這樣處理便可:

[root@www ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off            <==就是這玩意兒!要設定 on 才行!
....(底下省略)....

[root@www ~]# setsebool -P ftp_home_dir=1

這樣就搞定囉!若是還有其餘可能發生錯誤的緣由,包括檔案數據使用 mv 而非使用 cp 致使 SELinux 文件類型沒法繼承原有目錄的類型時,那就請自行查閱 /var/log/messages 的內容吧!一般 SELinux 沒有這麼難處理的啦!^_^


  • 對使用者 (包括將來新增用戶) 進行 chroot

在鳥哥接觸的通常 FTP 使用環境中,大多數都是要開放給廠商聯機來使用的,給本身人使用的機會雖然也有, 不過使用者數量一般比較少一些。因此囉,鳥哥如今都是建議默認讓實體用戶統統被 chroot, 而容許沒必要 chroot 的帳號才須要額外設定。這樣的好處是,新建的帳號若是忘記進行 chroot,反正本來就是 chroot, 比較不用擔憂若是該帳號是開給廠商時該怎辦的問題。

如今假設我係統裏面僅有 vbird 與 dmtsai 兩個帳號不要被 chroot,其餘如 student, smb1… 等帳號統統預設是 chroot 的啦,包括將來新增帳號也所有預設 chroot!那該如何設定?很簡單,三個設定值加上一個額外配置文件就搞定了!步驟以下:

# 1. 修改 vsftpd.conf 的參數值:
[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 增長是否設定針對某些使用者來 chroot 的相關設定呦!
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# 2. 創建不被 chroot 的使用者帳號列表,即便沒有任何帳號,此檔案也是要存在!
[root@www ~]# vim /etc/vsftpd/chroot_list
vbird
dmtsai

[root@www ~]# /etc/init.d/vsftpd restart

如此一來,除了 dmtsai 與 vbird 以外的其餘可用 FTP 的帳號者,統統會被 chroot 在他們的家目錄下, 這樣對系統比較好啦!接下來,請你本身分別使用有與沒有被 chroot 的帳號來聯機測試看看。


  • 限制實體用戶的總下載流量 (帶寬)

你可不但願帶寬被使用者上傳/下載所耗盡,而影響我們服務器的其餘正常服務吧?因此限制使用者的傳輸帶寬有時也是須要的! 假設『我要限制全部使用者的總傳輸帶寬最大可達 1 MBytes/秒 』時,你能夠這樣作便可:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 增長底下這一個參數便可:
local_max_rate=1000000  <==記住喔,單位是 bytes/second

[root@www ~]# /etc/init.d/vsftpd restart

上述的單位是 Bytes/秒,因此你能夠依據你本身的網絡環境來限制你的帶寬!這樣就給他限制好囉!有夠容易吧! 那怎麼測試啊?很簡單,用本機測試最準!你能夠用 dd 作出一個 10MB 的檔案放在 student 的家目錄下,而後用 root 下達 ftp localhost,並輸入 student 的賬密,接下來給他 get 這個新的檔案,就可以在最終知道下載的速度啦!


  • 限制最大同時上線人數與同一 IP 的 FTP 聯機數

若是你有限制最大使用帶寬的話,那麼你可能還須要限制最大在線人數才行!舉例來講,你但願最多隻有 10 我的同時使用你的 FTP 的話,而且每一個 IP 來源最多隻能創建一條 FTP 的聯機時,那你能夠這樣作:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 增長底下的這兩個參數:
max_clients=10
max_per_ip=1

[root@www ~]# /etc/init.d/vsftpd restart

這樣就搞定了!讓你的 FTP 不會人滿爲患吶!


  • 創建嚴格的可以使用 FTP 的帳號列表

在預設的環境當中,咱們是將『不準使用 FTP 的帳號寫入 /etc/vsftpd/user_list 檔案』,因此沒有寫入 /etc/vsftpd/user_list 當中的使用者就可以使用 FTP 了!如此一來,將來新增的使用者預設都可以使用 FTP 的服務。 若是換個角度來思考,若我想只讓某些人能夠使用 FTP 而已,亦便是新增的使用者預設不可以使用 FTP 這個服務的話那麼應該如何做呢?你須要修改配置文件成爲這樣:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 這幾個參數必需要修改爲這樣:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

[root@www ~]# /etc/init.d/vsftpd restart

則此時『寫入 /etc/vsftpd/user_list 變成能夠使用 FTP 的帳號』了! 因此將來新增的使用者若是要可以使用 FTP 的話,就必需要寫入 /etc/vsftpd/user_list 才行! 使用這個機制請特別當心,不然容易搞混掉~

透過這幾個簡單的設定值,相信 vsftpd 已經能夠符合大部分合法 FTP 網站的需求囉! 更多詳細的用法則請參考 man 5 vsftpd.conf 吧!

例題:
假設你由於某些特殊需求,因此必需要開放 root 使用 FTP 傳輸檔案,那麼你應該要如何處理?

答:

因爲系統帳號沒法使用 FTP 是由於 PAM 模塊與 vsftpd 的內建功能所致,亦便是 /etc/vsftpd/ftpusers 及 /etc/vsftpd/user_list 這兩個檔案的影響。因此你只要進入這兩個檔案,而且將 root 那一行批註掉,那 root 就能夠使用 vsftpd這個 FTP 服務了。 不過,不建議如此做喔!

2.7 僅有匿名登陸的相關設定

雖然你能夠同時開啓實體用戶與匿名用戶,不過建議你,服務器仍是依據需求,針對單一種身份來設定吧! 底下咱們將針對匿名用戶來設定,且不開放實體用戶。通常來講,這種設定是給相似大專院校的 FTP 服務器來使用的哩!

  • 使用臺灣本地的時間,而非 GMT 時間;
  • 提供歡迎訊息,說明可提供下載的信息;
  • 僅開放 anonymous 的登入,且不須要輸入密碼;
  • 文件傳輸的速限爲 1 Mbytes/second;
  • 數據鏈接的過程 (不是命令通道!) 只要超過 60 秒沒有響應,就強制 Client 斷線!
  • 只要 anonymous 超過十分鐘沒有動做,就予以斷線;
  • 最大同時上線人數限制爲 50 人,且同一 IP 來源最大聯機數量爲 5 人;


  • 預設的 FTP 匿名者的根目錄所在: ftp 帳號的家目錄

OK!那如何設定呢?首先咱們必需要知道的是匿名用戶的目錄在哪裏? 事實上匿名者默認登入的根目錄是以 ftp 這個用戶的家目錄爲主,因此你能夠使用『 finger ftp 』來查閱。 我們的 CentOS 默認的匿名者根目錄在 /var/ftp/ 中。且匿名登陸者在使用 FTP 服務時,他預設能夠使用『 ftp 』 這個使用者身份的權限喔,只是被 chroot 到 /var/ftp/ 目錄中就是了。

由於匿名者只會在 /var/ftp/ 當中瀏覽,因此你必須將要提供給用戶下載的數據統統給放置到 /var/ftp/ 去。 假設你已經放置了 linux 的相關目錄以及 gnu 的相關軟件到該目錄中了,那咱們能夠這樣作個假設:

[root@www ~]# mkdir /var/ftp/linux
[root@www ~]# mkdir /var/ftp/gnu

而後將 vsftpd.conf 的數據清空,從新這樣處理他吧:

  1. 創建 vsftpd.conf 的設定數據
    [root@www ~]# vim /etc/vsftpd/vsftpd.conf
    # 將這個檔案的所有內容改爲這樣:
    # 1. 與匿名者相關的信息:
    anonymous_enable=YES
    no_anon_password=YES        <==匿名登陸時,系統不會檢驗密碼 (一般是email)
    anon_max_rate=1000000       <==最大帶寬使用爲 1MB/s 左右
    data_connection_timeout=60  <==數據流聯機的 timeout 爲 60 秒
    idle_session_timeout=600    <==若匿名者發呆超過 10 分鐘就斷線
    max_clients=50              <==最大聯機與每一個 IP 的可用聯機
    max_per_ip=5
    
    # 2. 與實體用戶相關的信息,本案例中爲關閉他的狀況!
    local_enable=NO
    
    # 3. 與服務器環境有關的設定
    use_localtime=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    banner_file=/etc/vsftpd/anon_welcome.txt <==檔名有改喔!
    
    [root@www ~]# /etc/init.d/vsftpd restart
  2. 創建歡迎畫面與下載提示訊息各位親愛的觀衆朋友!要注意~在這個案例當中,咱們將歡迎訊息設定在 /etc/vsftpd/anon_welcome.txt 這個檔案中, 至於這個檔案的內容你能夠這樣寫 (這個檔案必定要存在!不然會形成客戶端沒法聯機成功喔!):
    [root@www ~]# vim /etc/vsftpd/anon_welcome.txt
    歡迎光臨本站所提供的 FTP 服務!
    本站主要提供 Linux 操做系統相關檔案以及 GNU 自由軟件喔!
    有問題請與站長聯絡!謝謝你們!
    主要的目錄爲:
    
    linux   提供 Linux 操做系統相關軟件
    gnu     提供 GNU 的自由軟件
    uploads 提供匿名的您上傳數據

    看到囉!主要寫的數據都是針對一些公告事項就是了!

  3. 客戶端的測試:密碼與歡迎訊息是重點!一樣的,咱們使用 ftp 這個軟件來給他測試一下吧!
    [root@www ~]# ftp localhost
    Connected to localhost (127.0.0.1).
    220-歡迎光臨本站所提供的 FTP 服務!   <==底下這幾行中文就是歡迎與提示訊息!
    220-本站主要提供 Linux 操做系統相關檔案以及 GNU 自由軟件喔!
    220-有問題請與站長聯絡!謝謝你們!
    220-主要的目錄爲:
    220-
    220-linux   提供 Linux 操做系統相關軟件
    220-gnu     提供 GNU 的自由軟件
    220-uploads 提供匿名的您上傳數據
    220
    Name (localhost:root): anonymous  <==匿名帳號名稱是要背的!
    230 Login successful.               <==沒有輸入密碼便可登入呢!
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> dir
    227 Entering Passive Mode (127,0,0,1,196,17).
    150 Here comes the directory listing.
    drwxr-xr-x 2 0 0 4096 Aug 08 16:37 gnu
    -rw-r--r--    1 0        0              17 Aug 08 14:18 index.html
    drwxr-xr-x 2 0 0 4096 Aug 08 16:37 linux
    drwxr-xr-x    2 0        0            4096 Jun 25 17:44 pub
    226 Directory send OK.
    ftp> bye
    221 Goodbye.

    看到否?此次可就不須要輸入任何密碼了,由於是匿名登陸嘛!並且,若是你以其餘的帳號來嘗試登入時, 那麼 vsftpd 會馬上響應僅開放匿名的訊息喔!(530 This FTP server is anonymous only.)


  • 讓匿名者可上傳/下載本身的資料 (權限開放最大)

在上列的數據當中,實際上匿名用戶僅可進行下載的動做而已。若是你還想讓匿名者能夠上傳檔案或者是創建目錄的話, 那你還須要額外增長一些設定才行:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 新增底下這幾行啊!
write_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES

[root@www ~]# /etc/init.d/vsftpd restart

若是你設定上面四項參數,則會容許匿名者擁有完整的創建、刪除、修改檔案與目錄的權限。 不過,實際要生效還須要 Linux 的文件系統權限正確才行! 咱們知道匿名者取得的身份是 ftp ,因此若是想讓匿名者上傳數據到 /var/ftp/uploads/ 中,則須要這樣作:

[root@www ~]# mkdir /var/ftp/uploads
[root@www ~]# chown ftp /var/ftp/uploads

而後你以匿名者身份登入後,就會發現匿名者的根目錄多了一個 /upload 的目錄存在了,而且你能夠在該目錄中上傳檔案/目錄喔! 如此一來系統的權限大開!很要命喔!因此,請仔細的控制好你的上傳目錄才行!

不過,在實際測試當中,卻發現仍是沒辦法上傳呢!怎麼回事啊?若是你有去看一下 /var/log/messages 的話,那就會發現啦! 又是 SELinux 這傢伙呢!怎麼辦?就透過『 sealert -l … 』在 /var/log/messages 裏面觀察到的指令丟進去, 馬上就知道解決方案啦!解決方案就是放行 SELinux 的匿名 FTP 規則以下:

[root@www ~]# setsebool -P allow_ftpd_anon_write=1
[root@www ~]# setsebool -P allow_ftpd_full_access=1

而後你再測試一下用 anonymous 登入,到 /uploads 去上傳個檔案吧!就會知道能不能成功哩!


  • 讓匿名者僅具備上傳權限,不可下載匿名者上傳的東西

通常來講,用戶上傳的數據在管理員還沒有查閱過是否合乎版權等相關事宜前,是不該該讓其餘人下載的! 然而前一小節的設定當中,用戶上傳的資料是能夠被其餘人所瀏覽與下載的!如此一來實在是很危險!因此若是你要設定 /var/ftp/uploads/ 內透過匿名者上傳的數據中,僅能上傳不能被下載時,那麼被上傳的數據的權限就得要修改一下才行! 請將前一小節所設定的四個參數簡化成爲:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 將這幾行給他改一改先!記得要拿掉 anon_other_write_enable=YES
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
chown_uploads=YES        <==新增的設定值在此!
chown_username=daemon

[root@www ~]# /etc/init.d/vsftpd restart

固然啦,那個 /var/ftp/uploads/ 仍是須要能夠被 ftp 這個使用者寫入才行!如此一來被上傳的檔案將會被修改檔案擁有者成爲 daemon 這個使用者,而 ftp (匿名者取得的身份) 是沒法讀取 daemon 的數據的,因此也就沒法被下載囉! ^_^

例題:
在上述的設定後,我嘗試以 anonymous 登入而且上傳一個大檔案到 /uploads/ 目錄下。因爲網絡的問題,這個檔案傳到一半就斷線。 下在我從新上傳時,卻告知這個檔案沒法覆寫!該如何是好?

答:

爲何會沒法覆寫呢?由於這個檔案在你脫機後,檔案的擁有者就被改成 daemon 了!由於這個檔案不屬於 ftp 這個用戶了, 所以咱們沒法進行覆寫或刪除的動做。此時,你只能更改本地端檔案的檔名再次的上傳,從新從頭一直上傳囉!


  • 被動式聯機埠口的限制

FTP 的聯機分爲主動式與被動式,主動式聯機比較好處理,由於都是透過服務器的 port 20 對外主動聯機, 因此防火牆的處理比較簡單。被動式聯機就比較麻煩~由於預設 FTP 服務器會隨機取幾個沒有在使用當中的埠口來創建被動式聯機,那防火牆的設定就麻煩啦!

不要緊,咱們能夠透過指定幾個固定範圍內的埠口來做爲 FTP 的被動式數據鏈接之用便可, 這樣咱們就可以預先知道 FTP 數據鏈路的埠口啦!舉例來講,咱們假設被動式鏈接的埠口爲 65400 到 65410 這幾個埠口時,能夠這樣設定:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 增長底下這幾行便可啊!
pasv_min_port=65400
pasv_max_port=65410

[root@www ~]# /etc/init.d/vsftpd restart

匿名用戶的設定大體上這樣就能符合你的需求囉!其餘的設定就本身看着辦吧! ^_^


2.8 防火牆設定

防火牆設定有什麼難的?將第九章裏面的 script 拿出來修改便可啊!不過,如同前言談到的,FTP 使用兩個埠口,加上常有隨機啓用的數據流埠口,以及被動式聯機的服務器埠口等, 因此,你可能得要進行:

  • 加入 iptables 的 ip_nat_ftp, ip_conntrack_ftp 兩個模塊
  • 開放 port 21 給因特網使用
  • 開放前一小節提到的 port 65400~65410 埠口給 Internet 聯機用

要修改的地方很多,那就讓咱們來一步一腳印吧!

# 1. 加入模塊:雖然 iptables.rule 已加入模塊,不過系統檔案仍是修改一下好了:
[root@www ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
# 加入模塊便可!兩個模塊中間有空格鍵隔開!而後從新啓動 iptables 服務囉!

[root@www ~]# /etc/init.d/iptables restart

# 2. 修改 iptables.rule 的腳本以下:
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
iptables -A INPUT -p TCP -i $EXTIF --dport  21  --sport 1024:65534 -j ACCEPT
# 找到上面這一行,並將前面的批註拿掉便可!而且新增底下這一行喔!
iptables -A INPUT -p TCP -i $EXTIF --dport 65400:65410 --sport 1024:65534 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule

這樣就行了!同時兼顧主動式與被動式的聯機!而且加入所須要的 FTP 模塊囉!


2.9 常見問題與解決之道

底下說明幾個常見的問題與解決之道吧!

  • 若是在 Client 端上面發現沒法聯機成功,請檢查:
    1. iptables 防火牆的規則當中,是否開放了 client 端的 port 21 登入?
    2. 在 /etc/hosts.deny 當中,是否將 client 的登入權限擋住了?
    3. 在 /etc/xinetd.d/vsftpd 當中,是否設定錯誤,致使 client 的登入權限被取消了?
  • 若是 Client 已經連上 vsftpd 服務器,可是卻顯示『 XXX file can’t be opend 』的字樣,請檢查:
    1. 最主要的緣由仍是在於在 vsftpd.conf 當中設定了檢查某個檔案,可是你卻沒有將該檔案設定起來, 因此,請檢查 vsftpd.conf 裏面全部設定的檔案檔名,使用 touch 這個指令將該檔案創建起來便可!
  • 若是 Client 已經連上 vsftpd 服務器,卻沒法使用某個帳號登入,請檢查:
    1. 在 vsftpd.conf 裏面是否設定了使用 pam 模塊來檢驗帳號,以及利用 userlist_file 來管理帳號?
    2. 請檢查 /etc/vsftpd/ftpusers 以及 /etc/vsftpd/user_list 檔案內是否將該帳號寫入了?
  • 若是 Client 沒法上傳檔案,該如何是好?
    1. 最可能發生的緣由就是在 vsftpd.conf 裏面忘記加上這個設定『write_enable=YES』這個設定,請加入;
    2. 是否所要上傳的目錄『權限』不對,請以 chmod 或 chown 來修訂;
    3. 是否 anonymous 的設定裏面忘記加上了底下三個參數:
      • anon_other_write_enable=YES
      • anon_mkdir_write_enable=YES
      • anon_upload_enable=YES
    4. 是否由於設定了 email 抵擋機制,又將 email address 寫入該檔案中了!?請檢查!
    5. 是否設定了不準 ASCII 格式傳送,但 Client 端卻以 ASCII 傳送呢?請在 client 端以 binary 格式來傳送檔案!
    6. 檢查一下 /var/log/messages ,是否被 SELinux 所抵擋住了呢?

上面是蠻常發現的錯誤,若是仍是沒法解決你的問題,請你務必分析一下這兩個檔案:/var/log/vsftpd.log 與 /var/log/messages ,裏面有至關多的重要資料,能夠提供給你進行除錯喔!不過 /var/log/vsftpd.log 卻預設不會出現! 只有 /var/log/xferlog 而已。若是你想要加入 /var/log/vsftpd.log 的支持,能夠這樣作:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
# 加入這兩個設定值便可呦!

[root@www ~]# /etc/init.d/vsftpd restart

這樣將來有新聯機或者是錯誤時,就會額外寫一份 /var/log/vsftpd.log 去喔!


93 客戶端的圖形接口 FTP 聯機軟件

客戶端的聯機軟件主要有文字接口的 ftp 及 lftp 這兩支指令,詳細的使用方式請參考第五章經常使用網絡指令的說明。至於 Linux 底下的圖形接口軟件,能夠參考 gftp 這支程序喔!圖形接口的啦!很簡單啊!那 Windows 底下有沒有相對應的 FTP 客戶端軟件?


03.1 Filezilla

上述的軟件都是自由軟件啊,那麼 Windows 操做系統有沒有自由軟件啊?有的,你能夠使用 filezilla 這個好東西!這個玩意兒的詳細說明與下載點能夠在底下的連結找到:

目前 (2011/06) 最新的穩定版本是 3.5.x 版,因此底下鳥哥就以這個版原本跟你們說明。爲何要選擇 Filezilla 呢?除了他是自由軟件以外,這傢伙居然能夠連結到 SSH 的 sftp 呢!真是很不錯的一個傢伙啊!^_^!另外要注意的是,底下鳥哥是以 Windows 版原本說明的,不要拿來在 X window 上面安裝喔!^_^ (請下載 Filezilla client 不是 server 喔!)

由於這個程序是給 Windows 安裝用的,因此安裝的過程就是…(下一步)^n 就行了!而且這個程序支持多國語系, 因此你能夠選擇繁體中文呢!實在是很棒!安裝完畢以後,請你執行他,就會出現以下的畫面了:

filezilla_3_002
圖 3-一、Filezilla 的操做接口示意圖
上圖的 第1、二到五區的內容所表明的資料是:
  1. 第一區:表明 FTP 服務器的輸出信息,例如歡迎訊息等信息;
  2. 第二區:表明本機的文件系統目錄,與第三區有關;
  3. 第三區:表明第二區所選擇的磁盤內容爲什麼;
  4. 第四區:表明遠程 FTP 服務器的目錄與檔案;
  5. 第五區:表明傳輸時的隊列信息 (等待傳送的數據)

而另外圖中的 a, b, c 則表明的是:

  1. 站臺管理員,你能夠將一些經常使用的 FTP 服務器的 IP 與用戶信息記錄在此;
  2. 更新,若是你的資料有更新,可以使用這個按鈕來同步 filezilla 的屏幕顯示;
  3. 主機地址、用戶、密碼與端口這四個玩意兒能夠實時聯機,不記錄信息。

好,接下來咱們鏈接到 FTP 服務器上面去,因此你可按下圖 3-1 的 a 部分,會出現以下畫面:

filezilla_3_003
圖 3-二、Filezilla 的 FTP 站臺管理員使用示意圖
上圖的箭頭與相關的內容是這樣的:
  1. 先按下『新增站臺』的按鈕,而後在箭頭 2 的地方就會出現可輸入名稱的方框;
  2. 在該方框當中隨便填寫一個你容易記錄的名字,只要與真正的網站有點關連便可;
  3. 接下來看到右邊有通常設定,在通常設定裏面幾個項目很重要的:
    • 主機:在這個方框中填寫主機的 IP,端口若是不是標準的 port 21 才填寫其餘埠口。
    • 協定:主要有 (1)FTP 及 (2)SFTP (SSHD 所提供),咱們這裏選 FTP
    • 加密:是否有網絡加密,新的協議中,FTP 能夠加上 TLS 的 FTPS 喔!預設爲明碼
    • 登入型式:由於須要帳號密碼,選擇『通常』便可,而後底下就是輸入使用者、帳號便可。

基本上這樣設定完就可以連上主機了,不過,若是你還想要更詳細的規範數據鏈接的方式 (主動式與被動式) 以及其餘數據時, 能夠按下的『傳輸設定』按鈕,就會出現以下畫面了:

filezilla_3
圖 3-三、Filezilla 站臺管理員內的傳輸設定
在這個畫面當中你能夠選擇是否使用被動式傳輸機制,還能夠調整最大聯機數呢!爲何要自我限制呢? 由於 Filezilla 會主動的重複創建多條聯機來快速下載,但若是 vsftpd.conf 有限制 max_per_ip 的話, 某些下載會被拒絕的!所以,這個時候在此設定爲 1 就顯的很重要~隨時只有一支聯機創建,就不會有重複登入的問題! 最後請按下圖 3-2 畫面中的『聯機』吧!
filezilla_3_004
圖 3-四、Filezilla 聯機成功示意圖
更多的用法就請你自行研究囉!

3.2 透過瀏覽器取得 FTP 聯機

咱們在 第二十章 WWW 服務器當中曾經談過瀏覽器所支持的協議,其中一個就是 ftp 這個協定囉!這個協議的處理方式能夠在網址列的地方這樣輸入的:

  • ftp://username@your_ip

要記得,若是你沒有輸入那個 username@ 的字樣時,系統默認會以匿名登陸來處理此次的聯機。所以若是你想要使用實體用戶聯機時, 就在在 IP 或主機名以前填寫你的帳號。舉例來講,鳥哥的 FTP 服務器 (192.168.100.254) 如有 dmtsai 這個使用者, 那我啓動瀏覽器後,能夠這樣作:

  • ftp://dmtsai@192.168.100.254

而後在出現的對話窗口當中輸入 dmtsai 的密碼,就可以使用瀏覽器來管理我在 FTP 服務器內的文件系統囉!是否很容易啊 甚至,你連密碼都想要寫上網址列,那就更厲害啦!

  • ftp://dmtsai:yourpassword@192.168.100.254

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::264 讓 vsftpd 增長 SSL 的加密功能

既然 http 都有 https 了,那麼使用明碼傳輸的 ftp 有沒有加密的 ftps 呢?嘿嘿!說的好!有的啦~既然都有 openssl 這個加密函式庫, 咱們固然可以使用相似的機制來處理 FTP 囉!但前提之下是你的 vsftpd 有支持 SSL 函式庫才行!此外,咱們也必需要創建 SSL 的憑證檔給 vsftpd 使用,這樣纔可以進行加密嘛!瞭解乎!接下來,就讓咱們一步一步的進行 ftps 的服務器建置吧!


  • 1. 檢查 vsftpd 有無支持 ssl 模塊:

若是你的 vsftpd 當初編譯的時候沒有支持 SSL 模塊,那麼你就得只好本身從新編譯一個 vsftpd 的軟件了!咱們的 CentOS 有支持嗎? 趕忙來瞧瞧:

[root@www ~]# ldd $(which vsftpd) | grep ssl
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f0587879000)

若是有出現 libssl.so 的字樣,就是有支持!這樣纔可以繼續下一步呦!


  • 2. 創建專門給 vsftpd 使用的憑證數據:

CentOS 給咱們一個創建憑證的地方,那就是 /etc/pki/tls/certs/ 這個目錄!詳細的說明咱們在 20.5.2 裏面談過咯,因此這裏只介紹怎麼作:

[root@www ~]# cd /etc/pki/tls/certs
[root@www certs]# make vsftpd.pem
----- ....(前面省略)....
Country Name (2 letter code) [XX]:TW
State or Province Name (full name) []:Taiwan
Locality Name (eg, city) [Default City]:Tainan
Organization Name (eg, company) [Default Company Ltd]:KSU
Organizational Unit Name (eg, section) []:DIC
Common Name (eg, your name or your server's hostname) []:www.centos.vbird
Email Address []:root@www.centos.vbird

[root@www certs]# cp -a vsftpd.pem /etc/vsftpd/
[root@www certs]# ll /etc/vsftpd/vsftpd.pem
-rw-------. 1 root root 3116 2011-08-08 16:52 /etc/vsftpd/vsftpd.pem
# 要注意一下權限喔!

  • 3. 修改 vsftpd.conf 的配置文件,假定有實體、匿名帳號:

在前面 2 裏面大可能是單純匿名或單純實體賬戶,這裏咱們將實體帳號透過 SSL 聯機,但匿名者使用明碼傳輸! 二者同時提供給客戶端使用啦!FTP 的設定項目主要是這樣:

  • 提供實體帳號登入,實體帳號可上傳數據,且 umask 爲 002
  • 實體帳號默認爲 chroot 的狀況,且所有實體帳號可用帶寬爲 1Mbytes/second
  • 實體帳號的登入與數據傳輸均需透過 SSL 加密功能傳送;
  • 提供匿名登陸,匿名者僅能下載,不能上傳,且使用明碼傳輸 (不透過 SSL)

此時,總體的設定值會有點像這樣:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
# 實體帳號的通常設定項目:
local_enable=YES
write_enable=YES
local_umask=002
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_max_rate=10000000

# 匿名者的通常設定:
anonymous_enable=YES
no_anon_password=YES
anon_max_rate=1000000
data_connection_timeout=60
idle_session_timeout=600

# 針對 SSL 所加入的特別參數!每一個項目都很重要!
ssl_enable=YES              <==啓動 SSL 的支持
allow_anon_ssl=NO           <==可是不容許匿名者使用 SSL 喔!
force_local_data_ssl=YES    <==強制實體用戶數據傳輸加密
force_local_logins_ssl=YES  <==同上,但連登入時的賬密也加密
ssl_tlsv1=YES               <==支持 TLS 方式便可,底下不用啓動
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem <==預設 RSA 加密的憑證檔案所在

# 通常服務器系統設定的項目:
max_clients=50
max_per_ip=5
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
pasv_min_port=65400
pasv_max_port=65410

[root@www ~]# /etc/init.d/vsftpd restart

  • 4. 聯機測試看看!使用 Filezilla 聯機測試:

接下來咱們利用 filezilla 來講明一下,如何透過 SSL/TLS 功能來進行聯機加密。很簡單,只要在站臺管理員的地方選擇:

server_ssl_1
圖 4-一、透過 Filezilla 聯機到 SSL/TLS 支持的 FTP 方式
如上圖所示,重點在箭頭所指的地方,須要透過 TLS 的加密方式才行!而後,鳥哥嘗試使用 student 這個通常帳號登入系統, 聯機的時候,應該會出現以下的圖示纔對:
server_ssl_2
圖 4-二、透過 Filezilla 是否接受憑證呢?
若是一切都沒有問題,那麼你能夠點選上圖那個『老是信任』的項目,如此一來,將來聯機到這個地方就不會再次要你確認憑證啦! 很簡單的解決了 FTP 聯機加密的問題囉!^_^
例題:
想想,既然有了 SFTP 能夠進行加密的 FTP 傳輸,那爲什麼須要 ftps 呢?

答:

由於既然要開放 SFTP 的話,就得要同時放行 sshd 亦便是 ssh 的聯機,如此一來,你的 port 22 極可能會經常被偵測~如果 openssl, openssh 出問題,恐怕你的系統就會被綁架。若是你的 FTP 真的有必要存在,那麼透過 ftps 以及利用 vsftpd 這個較爲安全的服務器軟件來架設, 理論上,是要比 sftp 來的安全些~至少對 Internet 放行 ftps 還不會以爲很可怕…

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::295 重點回顧

  • FTP 是文件傳輸協議 (File Transfer Protocol) 的簡寫,主要的功能是進行服務器與客戶端的檔案管理、傳輸等事項;
  • FTP 的服務器軟件很是多,例如 Wu FTP, Proftpd, vsftpd 等等,各類 FTP 服務器軟件的發展理念並不相同, 因此選擇時請依照你的需求來決定所須要的軟件;
  • FTP 使用的是明碼傳輸,而過去一些 FTP 服務器軟件也曾被發現安全漏洞,所以設定前請肯定該軟件已經是最新版本,避免安全議題的衍生;
  • 因爲 FTP 是明碼傳輸,其實能夠使用 SSH 提供的 sftp 來取代 FTP ;
  • 大多數的 FTP 服務器軟件都提供 chroot 的功能,將實體用戶限制在他的家目錄內;
  • FTP 這個 daemon 所開啓的正規埠口爲 20 與 21 ,其中 21 爲命令通道, 20 爲主動聯機的數據傳輸信道;
  • FTP 的數據傳輸方式主要分爲主動與被動(Passive, PASV),若是是主動的話,則 ftp-data 在服務器端主動以 port 20 鏈接到客戶端,不然需開放被動式監聽的埠口等待客戶端來鏈接;
  • 在 NAT 主機內的客戶端 FTP 軟件聯機時可能發生困擾,這能夠透過 iptables 的 nat 模塊或利用被動式聯機來克服;
  • 通常來講, FTP 上面共有三個羣組,分別是實體用戶、訪客與匿名登陸者(real, guest, anonymous);
  • 能夠藉由修改 /etc/passwd 裏面的 Shell 字段,來讓使用者僅能使用 FTP 而沒法登入主機;
  • FTP 的指令、與用戶活動所形成的登陸檔是放置在 /var/log/xferlog 裏面;
  • vsftpd 爲專一在安全議題上而發展的一套 FTP 服務器軟件,他的配置文件在 /etc/vsftpd/vsftpd.conf

6 本章習題

  • FTP 在創建聯機以及數據傳輸時,會創建哪些聯機?
    需創建兩種聯機,分別是命令信道與數據傳輸信道。在主動式聯機上爲 port 21(ftp) 與 port 20(ftp-data)。
  • FTP 主動式與被動式聯機有何不一樣?
    主動式聯機的時候,命令聯機是由 client 端主動鏈接到服務器端,可是 ftp-data 則是由服務器端主動的聯機到 client 端。至於被動式聯機的時候,則不論 command 仍是 ftp-data 的聯機,服務器端都是監聽客戶端的要求的!
  • 有哪些動做可讓你的 FTP 主機更爲安全 (secure) ?
    • 隨時更新服務器軟件到最新版本;
    • 讓 guest 與 anonymous 的家目錄限制在固定的目錄中(chroot 或是 restricted);
    • 拒絕 root 的登入或者其餘系統帳號的登入;
    • 拒絕大部分的 upload 行爲!
  • 咱們知道 ftp 會啓用兩個 ports ,請問這兩個 port 在哪裏規範的 (以 vsftpd 爲例)?並且,通常正規的 port 是幾號?
    若爲 stand alone 時,都是由 vsftpd.conf 規範,命令通道爲 listen_port=21 規範,數據鏈接爲 connect_from_port_20=YES 及pasv_max_port=0, pasv_max_port=0 所規範。
    如果 super daemon 所管理時,命令信道則由 /etc/services 所規範了。
  • 那幾個檔案能夠用來抵擋相似 root 這種系統帳號的登入 FTP?
    /etc/vsftpd/ftpusers
    /etc/vsftpd/user_list
  • 在 FTP 的 server 與 client 端進行數據傳輸時,有哪兩種模式?爲什麼這兩種模式影響數據的傳輸很重要?
    數據的傳輸有 ASCII 與 Binary 兩種方式,在進行 ascii 傳送方式時,被傳送的檔案將會以文本模式來進行傳送的行爲, 所以,檔案的屬性會被修改過,可能形成執行檔最後卻沒法執行等的問題!通常來講,ASCII 一般僅用在文本文件與一些原始碼檔案的傳送。
  • 個人主機明明時區設定沒有問題,但爲什麼登入 vsftpd 這個 FTP 服務時,時間就是少八小時?該如何解決?
    確定是時區方面出了問題,應該就是 vsftpd.conf 裏面少了『 use_localtime=YES 』這個參數了。

connect_active17 參考數據與延伸閱讀

相關文章
相關標籤/搜索