## 21.2 vsftpd 服務器基礎設定
終于要來聊一聊這個簡單的 vsftpd 啰!vsftpd 的全名是『Very Secure FTP Daemon 』的意思, 換句話說,vsftpd 最初發展的理念就是在建構一個以安全為重的 FTP 服務器呢!我們先來聊一聊為什么 vsftpd 號稱『非常安全』呢?然后再來談設定吧!
* * *
### 21.2.1 為何使用 vsftpd
為了建構一個安全為主的 FTP 服務器, vsftpd 針對操作系統的『程序的權限 (privilege)』概念來設計, 如果你讀過基礎篇的[十七章程序與資源管理](http://linux.vbird.org/linux_basic/0440processcontrol.php)的話, 應該會曉得系統上面所執行的程序都會引發一個程序,我們稱他為 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 會變的比較安全一些咯!底下就開始來談如何設定吧!
* * *
### 21.2.2 所需要的軟件以及軟件結構
vsftpd 所需要的軟件只有一個,那就是 vsftpd 啊!^_^!如果你的 CentOS 沒有安裝,請利用 yum install vsftpd 來安裝他吧!軟件很小,下載連同安裝不需要幾秒鐘就搞定了!而事實上整個軟件提供的配置文件也少的令人高興!簡單易用就是 vsftpd 的特色啊!這些設定數據比較重要的有:
* /etc/vsftpd/vsftpd.conf
嚴格來說,整個 vsftpd 的配置文件就只有這個檔案!這個檔案的設定是以 [bash 的變量設定](http://linux.vbird.org/linux_basic/0320bash.php#variable)相同的方式來處理的, 也就是『參數=設定值』來設定的,注意, 等號兩邊不能有空白喔!至于詳細的 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
<u>auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed</u>
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 這個賬號的家目錄有關啦!
大致上就只有這幾個檔案需要注意而已,而且每個檔案的設定又都很簡單!真是不錯啊!
* * *
### 21.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 有關,詳細的設定狀態請參考 [21.2.6 chroot](#server_real_chroot2) 的說明。
* 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](http://linux.vbird.org/linux_server/0250simple_firewall.php#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 啰。
* * *
### 21.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 默認的啟動模式來處理,所以趕緊將剛剛的動作給他改回來喔!
* * *
### 21.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 的防火墻機制
```
上面各項設定值請自行參考 [21.2.3](#server_vsftpd.conf) 的詳細說明吧。而通過這樣的設定值咱們的 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;
* <u>使用格林威治時間 (GMT)。</u>
所以當你啟動 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 使用時,請注意得要開放防火墻喔!關于防火墻的建置情況, 由于牽涉到數據流的主動、被動聯機方式,因此,還得要加入防火墻模塊。這部份我們在后續的 [21.2.8 小節](#other_iptables)再加以介紹,反正,最終記得要開放 FTP 的聯機要求就對了!
* * *
### 21.2.6 針對實體賬號的設定
雖然在 CentOS 的默認情況當中實體用戶已經可以使用 FTP 的服務了,不過我們可能還需要一些額外的功能來限制實體用戶。 舉例來說,限制用戶無法離開家目錄 (chroot)、限制下載速率、限制用戶上傳檔案時的權限 (mask) 等等。 底下我們先列出一些希望達到的功能,然后再繼續進行額外功能的處理:
* 希望使用臺灣本地時間取代 GMT 時間;
* 用戶登入時顯示一些歡迎訊息的信息;
* 系統賬號不可登入主機 (亦即 UID 小于 500 以下的賬號);
* 一般實體用戶可以進行上傳、下載、建立目錄及修改檔案等動作;
* 用戶新增的檔案、目錄之 umask 希望設定為 002;
* 其他主機設定值保留[默認值](#server_basic)即可。
你可以自行處理 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 <==<u>這個檔案必須存在!需手動建立!</u>
[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 指令](http://linux.vbird.org/linux_server/0140networkcommand.php#ftp)我們已經在[第五章](http://linux.vbird.org/linux_server/0140networkcommand.php)談過了,你可以自行前往參考。這里直接測試一下吧:
```
# 測試使用已知使用者登入,例如 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 服務了。 不過,不建議如此作喔!
* * *
### 21.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
```
匿名用戶的設定大致上這樣就能符合你的需求啰!其他的設定就自己看著辦吧! ^_^
* * *
### 21.2.8 防火墻設定
防火墻設定有什么難的?將[第九章](http://linux.vbird.org/linux_server/0250simple_firewall.php)里面的 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 模塊啰!
* * *
### 21.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 去喔!
* * *
- 鳥哥的Linux私房菜:服務器架設篇 第三版
- 第一部份:架站前的進修專區
- 作者序
- 第一章、架設服務器前的準備工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架設服務器流程
- 1.3 自我評估是否已經具有架站的能力
- 1.4 本章習題
- 第二章、基礎網絡概念
- 2.1 網絡是個什么玩意兒
- 2.2 TCP/IP 的鏈結層相關協議
- 2.3 TCP/IP 的網絡層相關封包與數據
- 2.4 TCP/IP 的傳輸層相關封包與數據
- 2.5 連上 Internet 前的準備事項
- 2.6 重點回顧:
- 2.7 本章習題
- 2.8 參考數據與延伸閱讀
- 第三章、局域網絡架構簡介
- 3.1 局域網絡的聯機
- 3.2 本書使用的內部聯機網絡參數與通訊協議
- 第四章、連上 Internet
- 4.1 Linux 連上 Internet 前的注意事項
- 4.2 連上 Internet 的設定方法
- 4.3 無線網絡--以筆記本電腦為例
- 4.4 常見問題說明
- 4.5 重點回顧
- 4.6 本章習題
- 4.7 參考數據與延伸閱讀
- 第五章、 Linux 常用網絡指令
- 5.1 網絡參數設定使用的指令
- 5.2 網絡偵錯與觀察指令
- 5.3 遠程聯機指令與實時通訊軟件
- 5.4 文字接口網頁瀏覽
- 5.5 封包擷取功能
- 5.6 重點回顧
- 5.7 本章習題
- 5.8 參考數據與延伸閱讀
- 第六章、 Linux 網絡偵錯
- 6.1 無法聯機原因分析
- 6.2 處理流程
- 6.3 本章習題
- 6.4 參考數據與延伸閱讀
- 第二部分:主機的簡易資安防護措施
- 第七章、網絡安全與主機基本防護:限制端口, 網絡升級與 SELinux
- 7.1 網絡封包聯機進入主機的流程
- 7.2 網絡自動升級軟件
- 7.3 限制聯機埠口 (port)
- 7.4 SELinux 管理原則
- 7.5 被攻擊后的主機修復工作
- 7.6 重點回顧
- 7.7 課后練習
- 7.8 參考數據與延伸閱讀
- 第八章、路由觀念與路由器設定
- 8.1 路由
- 8.2 路由器架設
- 8.3 動態路由器架設:quagga (zebra + ripd)
- 8.4 特殊狀況:路由器兩邊界面是同一個 IP 網段: ARP Proxy
- 8.5 重點回顧
- 8.6 本章習題
- 8.7 參考數據與延伸閱讀
- 第九章、防火墻與 NAT 服務器
- 9.1 認識防火墻
- 9.2 TCP Wrappers
- 9.3 Linux 的封包過濾軟件:iptables
- 9.4 單機防火墻的一個實例
- 9.5 NAT 服務器的設定
- 9.6 重點回顧
- 9.7 本章習題
- 9.8 參考數據與延伸閱讀
- 第十章、申請合法的主機名
- 10.1 為何需要主機名
- 10.2 注冊一個合法的主機名
- 10.3 重點回顧
- 10.4 本章習題
- 10.5 參考數據與延伸閱讀
- 第三部分:局域網絡內常見的服務器架設
- 第十一章、遠程聯機服務器SSH / XDMCP / VNC / RDP
- 11.1 遠程聯機服務器
- 11.2 文字接口聯機服務器: SSH 服務器
- 11.3 最原始圖形接口: Xdmcp 服務的啟用
- 11.4 華麗的圖形接口: VNC 服務器
- 11.5 仿真的遠程桌面系統: XRDP 服務器
- 11.6 SSH 服務器的進階應用
- 11.7 重點回顧
- 11.8 本章習題
- 11.9 參考數據與延伸閱讀
- 第十二章、網絡參數控管者: DHCP 服務器
- 12.1 DHCP 運作的原理
- 12.2 DHCP 服務器端的設定
- 12.3 DHCP 客戶端的設定
- 12.4 DHCP 服務器端進階觀察與使用
- 12.5 重點回顧
- 12.6 本章習題
- 12.7 參考數據與延伸閱讀
- 第十三章、文件服務器之一:NFS 服務器
- 13.1 NFS 的由來與其功能
- 13.2 NFS Server 端的設定
- 13.3 NFS 客戶端的設定
- 13.4 案例演練
- 13.5 重點回顧
- 13.6 本章習題
- 13.7 參考數據與延伸閱讀
- 第十四章、賬號控管: NIS 服務器
- 14.1 NIS 的由來與功能
- 14.2 NIS Server 端的設定
- 14.3 NIS Client 端的設定
- 14.4 NIS 搭配 NFS 的設定在叢集計算機上的應用
- 14.5 重點回顧
- 14.6 本章習題
- 14.7 參考數據與延伸閱讀
- 第十五章、時間服務器: NTP 服務器
- 15.1 關于時區與網絡校時的通訊協議
- 15.2 NTP 服務器的安裝與設定
- 15.3 客戶端的時間更新方式
- 15.4 重點回顧
- 15.5 本章習題
- 15.6 參考數據與延伸閱讀
- 第十六章、文件服務器之二: SAMBA 服務器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服務器的基礎設定
- 16.3 Samba 客戶端軟件功能
- 16.4 以 PDC 服務器提供賬號管理
- 16.5 服務器簡單維護與管理
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考數據與延伸閱讀
- 第十七章、區網控制者: Proxy 服務器
- 17.1 什么是代理服務器 (Proxy)
- 17.2 Proxy 服務器的基礎設定
- 17.3 客戶端的使用與測試
- 17.4 服務器的其他應用設定
- 17.5 重點回顧
- 17.6 本章習題
- 17.7 參考數據與延伸閱讀
- 第十八章、網絡驅動器裝置: iSCSI 服務器
- 18.1 網絡文件系統還是網絡驅動器
- 18.2 iSCSI target 的設定
- 18.3 iSCSI initiator 的設定
- 18.4 重點回顧
- 18.5 本章習題
- 18.6 參考數據與延伸閱讀
- 第四部分:常見因特網服務器架設
- 第十九章、主機名控制者: DNS 服務器
- 19.1 什么是 DNS
- 19.2 Client 端的設定
- 19.3 DNS 服務器的軟件、種類與 cache only DNS 服務器設定
- 19.4 DNS 服務器的詳細設定
- 19.5 協同工作的 DNS: Slave DNS 及子域授權設定
- 19.6 DNS 服務器的進階設定
- 19.7 重點回顧
- 19.8 本章習題
- 19.9 參考數據與延伸閱讀
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服務器之三: FTP 服務器
- 21.1 FTP 的數據鏈路原理
- 21.2 vsftpd 服務器基礎設定
- 21.3 客戶端的圖形接口 FTP 聯機軟件
- 21.4 讓 vsftpd 增加 SSL 的加密功能
- 21.5 重點回顧
- 21.6 本章習題
- 21.7 參考數據與延伸閱讀
- 第二十二章、郵件服務器: Postfix
- 22.1 郵件服務器的功能與運作原理
- 22.2 MTA 服務器: Postfix 基礎設定
- 22.3 MRA 服務器: dovecot 設定
- 22.4 MUA 軟件:客戶端的收發信軟件
- 22.5 郵件服務器的進階設定
- 22.6 重點回顧
- 22.7 本章習題
- 22.8 參考數據與延伸閱讀