vsftpd的三種實現方法

suzhouclark發表於2008-10-21

1、匿名使用者形式實現

2、本地使用者形式實現

3、虛擬使用者形式實現(db及mysql形式)

[@more@]程式碼:
# cd /home/xuchen
# tar xzvf vsftpd-2.0.3.tar.gz //解壓縮程式
# cd vsftpd-2.0.3

三、三種方式的實現
1、匿名使用者形式實現
# vi builddefs.h 編輯builddefs.h 檔案,檔案內容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H
#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#undef VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */
將以上undef的都改為define,支援tcp_wrappers,支援PAM認證方式,支援SSL

# make //直接在vsftpd-2.0.3裡用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 86088 Jun 6 12:29 vsftpd //可執行程式已被編譯成功

建立必要的帳號,目錄:
# useradd nobody //可能你的系統已經存在此帳號,那就不用建立
# mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統已經存在此帳號,那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin

安裝vsftp配置檔案,可執行程式,man等:
# install -m 755 vsftpd /usr/local/sbin/vsftpd-ano
# install -m 644 vsftpd.8 /usr/share/man/man8
# install -m 644 vsftpd.conf.5 /usr/share/man/man5
# install -m 644 vsftpd.conf /etc/vsftpd-ano.conf
這樣就安裝完成了,那麼我們開始進行簡單的配置

# vi /etc/vsftpd-ano.conf ,將如下三行加入檔案
listen=YES
listen_port=21
tcp_wrappers=YES
anon_root=/var/ftp //設定匿名使用者本地目錄,和ftp使用者目錄必須相同
listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式)
# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & //以後臺方式啟動vsftpd
注意:每行的值都不要有空格,否則啟動時會出現錯誤,舉個例子,假如我在listen=YES後多了個空格,那我啟動時就出現如下錯誤:
500 OOPS: bad bool value in config file for: listen

測試搭建好的匿名使用者方式
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.3)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> quit
221 Goodbye.
#
OK,已經完成了,very nice.

高階配置
細心的朋友可能已經看出來我們只在預設配置檔案增加了四行,就實現了FTP連線(也證明了vsftpd的易用性),那麼讓我們傳個檔案吧,呀!!傳輸失敗了(見圖1)
為什麼呢?因為 vsftpd 是為了安全需要,/var/ftp目錄不能把所有的許可權開啟,所以我們這時要建一個目錄pub,當然也還是需要繼續修改配置檔案的。
# mkdir /var/ftp/pub
# chmod -R 777 /var/ftp/pub

為了測試方便,我們先建立一個名為kill-ano的指令碼,是為了殺掉FTP程式的
#!/bin/bash
a=`/bin/ps -A | grep vsftpd-ano | awk '{print    $1}'`
kill -9    $a

那麼現在大家看看我的匿名伺服器配置檔案吧
anonymous_enable=YES //允許匿名訪問,這是匿名伺服器必須的
write_enable=YES //全域性配置可寫
no_anon_password=YES //匿名使用者login時不詢問口令
anon_umask=077 //匿名使用者上傳的檔案許可權是-rw----
anon_upload_enable=YES //允許匿名使用者上傳檔案
anon_mkdir_write_enable=YES //允許匿名使用者建立目錄
anon_other_write_enable=YES //允許匿名使用者具有建立目錄,上傳之外的許可權,如重新命名,刪除
dirmessage_enable=YES //當使用者轉換目錄,則會顯示該目錄下的.message資訊
xferlog_enable=YES //記錄使用者所有上傳下載資訊
xferlog_file=/var/log/vsftpd.log //將上傳下載資訊記錄到/var/log/vsftpd.log中
xferlog_std_format=YES //日誌使用標準xferlog格式
idle_session_timeout=600 //客戶端超過600S沒有動作就自動被伺服器踢出
data_connection_timeout=120 //資料傳輸時超過120S沒有動作被伺服器踢出
chown_uploads=YES
chown_username=daemon //上傳檔案的屬主
ftpd_banner=Welcome to d-1701.com FTP service. //FTP歡迎資訊
anon_max_rate=80000 //這是匿名使用者的下載速度為80KBytes/s
check_shell=NO //不檢測SHELL

現在再測試,先kill掉再啟動FTP程式
# ./kill-ano
# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf &
上傳一個檔案測試一下,怎麼樣?OK了吧,下載剛上傳的那個檔案,恩?不行,提示
550 Failed to open file.
傳輸已失敗!
傳輸佇列已完成
1 個檔案傳輸失敗

沒有關係,你記得我們們設定了anon_umask=077了嗎?所以你下載不了,如果你到伺服器上touch 一個檔案(644),測試一下,是可以被下載下來的,好了,匿名伺服器就說到這裡了。


2、本地使用者形式實現
# cd /home/xuchen/vsftpd-2.0.3 //進入vsftpd-2.0.3的原始碼目錄
# make clean //清除編譯環境
# vi builddefs.h 繼續編輯builddefs.h 檔案,檔案內容如下:
#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H
#define VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */
將以上define VSF_BUILD_PAM行的define改為undef,支援tcp_wrappers,不支援PAM認證方式,支援SSL,記住啊,如果支援了PAM認證方式,你本地使用者是不能登陸的。

# make //直接在vsftpd-2.0.3裡用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 84712 Jun 6 18:56 vsftpd //可執行程式已被編譯成功

建立必要的帳號,目錄:
# useradd nobody //可能你的系統已經存在此帳號,那就不用建立
# mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統已經存在此帳號,那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin

安裝vsftp配置檔案,可執行程式,man等:
# install -m 755 vsftpd /usr/local/sbin/vsftpd-loc
# install -m 644 vsftpd.8 /usr/share/man/man8
# install -m 644 vsftpd.conf.5 /usr/share/man/man5
# install -m 644 vsftpd.conf /etc/vsftpd-loc.conf
這樣就安裝完成了,那麼我們開始進行簡單的配置

# vi /etc/vsftpd-loc.conf ,將如下三行加入檔案
listen=YES
listen_port=21
tcp_wrappers=YES //支援tcp_wrappers,限制訪問(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式),注意事項請參看匿名使用者的配置。
anonymous_enable=NO
local_enable=YES //這兩項配置說不允許匿名使用者登陸,允許本地使用者登陸
# /usr/local/sbin/vsftpd-loc /etc/vsftpd-loc.conf & //以後臺方式啟動vsftpd

測試搭建好的匿名使用者方式,先測試root使用者吧 :)
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.3)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/root"
ftp> quit
221 Goodbye.
我們看到root使用者可以登陸到ftp,他的登陸目錄就是自己的主目錄。
再測試一個系統使用者,那我們先建立一個使用者名稱叫xuchen的
# useradd xuchen
# passwd xuchen
Changing password for user xuchen.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
建立好了,讓我們開始測試吧!!
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.3)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): xuchen
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/xuchen"
ftp> quit
221 Goodbye.
我們看到xuchen使用者可以登陸到ftp,他的登陸目錄也是自己的主目錄。哈哈,又完成了!
高階配置
細心的朋友可能已經看出來如果我們不支援PAM認證方式,那麼本地使用者就可以登陸,而預設編譯的vsftpd支援PAM認證方式,所以是不支援本地使用者登陸的。恩,從這點說,這也是vsftp安全的一個表現----禁止本地使用者登陸。
我們登陸後進行測試,傳一個檔案上去,得,失敗了,那下載個檔案下來吧,恩,這是成功的(見圖2),而且我們發現我們可以進入到系統根目錄(見圖3),這樣很危險。



那麼改配置檔案吧,為了測試方便,我們先建立一個名為kill-loc的指令碼,也是為了殺掉FTP程式的
#!/bin/bash
a=`/bin/ps -A | grep vsftpd-loc | awk '{print    $1}'`
kill -9    $a

現在提供我的本地使用者驗證伺服器配置檔案吧(在匿名裡寫過的註釋我就不在這裡寫了)
listen=YES
listen_port=21
tcp_wrappers=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022 //本地使用者檔案上傳後的許可權是-rw-r-r
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
connect_from_port_20=YES
chroot_local_user=YES //限制使用者在自己的主目錄
#local_root=/ftp //你可以指定所有本地使用者登陸後的目錄,如果不設定此項,使用者都會登陸於自己的主目錄,就跟我們們前面測試的結果是一樣的
local_max_rate=500000 //本地使用者的下載速度為500KBytes/s
idle_session_timeout=600
data_connection_timeout=120
nopriv_user= nobody //設定服務執行者為nobody,vsftpd推薦使用一個許可權很低的使用者,最好是沒有家目錄(/dev/null),沒有登陸shell(/sbin/nologin),系統會更安全
ftpd_banner=Welcome to d-1701.com FTP service.
check_shell=NO

userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.denyuser
以上三條設定不允許登陸的使用者,使用者列表存放在/etc/vsftpd.denyuser中,一行一個帳號如果我把xuchen這個使用者加到vsftpd.denyuser裡,那麼登陸時會出現如下錯誤:
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 Welcome to d-1701.com FTP service.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): xuchen
530 Permission denied.
Login failed.
呵呵,有意思吧,自己測試吧,本地使用者登陸方式就介紹到這裡吧!

3、虛擬使用者形式實現(db及mysql形式)
# cd /home/xuchen/vsftpd-2.0.3 //進入vsftpd-2.0.3的原始碼目錄
# make clean //清除編譯環境
# vi builddefs.h 繼續編輯builddefs.h 檔案,檔案內容如下:
#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H
#define VSF_BUILD_TCPWRAPPERS
#undef VSF_BUILD_PAM
#define VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */
將以上define VSF_BUILD_PAM行的undef改為define,支援tcp_wrappers,支援PAM認證方式,支援SSL,和匿名使用者形式是一樣的。

# make //直接在vsftpd-2.0.3裡用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可執行程式已被編譯成功

建立必要的帳號,目錄:
# useradd nobody //可能你的系統已經存在此帳號,那就不用建立
# mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統已經存在此帳號,那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin

安裝vsftp配置檔案,可執行程式,man等:
# install -m 755 vsftpd /usr/local/sbin/vsftpd-pam
# install -m 644 vsftpd.8 /usr/share/man/man8
# install -m 644 vsftpd.conf.5 /usr/share/man/man5
# install -m 644 vsftpd.conf /etc/vsftpd-pam.conf
這樣就安裝完成了,那麼我們開始進行簡單的配置

對於用DB庫儲存使用者名稱及密碼的方式來說:
(1)檢視系統是否有相應軟體包

# rpm –qa | grep db4
db4-devel-4.2.52-7.1
db4-4.2.52-7.1
db4-utils-4.2.52-7.1
(2)建立一個logins.txt的檔案,單行為使用者名稱,雙行為密碼,例如
# vi /home/logins.txt

xuchen
12345

(3)建立資料庫檔案並設定檔案屬性
# db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db
# chmod 600 /etc/vsftpd_login.db
(4)建立認證檔案
# vi /etc/pam.d/ftp 插入如下兩行
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
(5)建立一個虛擬使用者
useradd -d /home/vsftpd -s /sbin/nologin vsftpd
ls -ld /home/vsftpd
drwx------ 3 vsftpd vsftpd 1024 Jun 6 22:55 /home/vsftpd/
(6)編寫配置檔案(注意事項請參看匿名使用者的配置,這裡不再贅述)
# vi /etc/vsftpd-pam.conf
listen=YES
listen_port=21
tcp_wrappers=YES //支援tcp_wrappers,限制訪問(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式)
anonymous_enable=NO
local_enable=YES //PAM方式此處必須為YES,如果不是將出現如下錯誤:
500 OOPS: vsftpd: both local and anonymous access disabled!
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=vsftpd //這兩行的意思是採用虛擬使用者形式
virtual_use_local_privs=YES //虛擬使用者和本地使用者許可權相同

pasv_enable=YES //建立資料聯機採用被動方式
pasv_min_port=30000 //建立資料聯機所可以使用port 範圍的上界,0表示任意。預設值為0。
pasv_max_port=30999 //建立資料聯機所可以使用port 範圍的下界,0表示任意。預設值為0。
(7)啟動程式
# /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam.conf &
(8)測試連通及功能
# vi /home/vsftpd/test //建立一個檔案,內容如下
1234567890
# chown vsftpd.vsftpd /home/vsftpd/test

# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.3)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): xuchen
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> size test
213 11
ftp> quit
221 Goodbye.
OK,使用者名稱為xuchen,密碼為12345可以連線到FTP伺服器,看不到檔案列表,但可以下載已知檔名的檔案,不能上傳檔案,非常安全吧!!

如果我們需要使用者看到檔案,怎麼辦?也好辦,在配置檔案中加入如下語句:
anon_world_readable_only=NO //匿名登入者不能下載可閱讀的檔案,預設值為YES

如果需要讓使用者上傳檔案和下載檔案分開,建議如下這麼做
# vi /home/logins.txt
xuchen
12345
upload
45678
//首先建立虛擬使用者upload,密碼為45678
# db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db //更新資料檔案

# mkdir /home/vsftpd/upload
# vi /etc/vsftpd-pam.conf 加入如下語句
user_config_dir=/etc/vsftpd_user_conf
# mkdir /etc/vsftpd_user_conf
# vi /etc/vsftpd_user_conf/upload 檔案內容如下
local_root=/home/vsftpd/upload
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# chmod 700 /home/vsftpd/upload
# chown vsftpd.vsftpd /home/vsftpd/upload/

這樣,xuchen使用者可以下載/home/vsftpd裡的檔案及upload裡的檔案,而upload使用者可以上傳和下載/home/vsftpd/upload資料夾的東西,但不能到/home/vsftpd裡下載檔案,很簡單得實現了分使用者上傳和下載

對於用Mysql庫儲存使用者名稱及密碼的方式來說:
就是把使用者名稱和密碼放在mysql庫裡,實現起來也相當簡單
(1)建立一個庫並設定相應許可權
# mysql –p
mysql>create database ftpd;
mysql>use ftpd;
mysql>create table user(name char(20) binary,passwd char(20) binary);
mysql>insert into user (name,passwd) values ('test1','12345');
mysql>insert into user (name,passwd) values ('test2','54321');
mysql>grant select on ftpd.user to ftpd@localhost identified by '123456';
mysql>flush privileges; 重新整理許可權設定
mysql>quit
(2)下載libpam-mysql進行安裝編譯
下載地址如下:
... am_mysql-0.5.tar.gz
假設我們把它放在了/home/xuchen目錄下
# cd /home/xuchen
# tar xzvf pam_mysql-0.5.tar.gz
# cd pam_mysql
# make
# cp pam_mysql.so /lib/security
(3)建立PAM認證資訊
# vi /etc/pam.d/ftp ,內容如下
auth required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=0

account required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=0

注意:
crypt= n
crypt=0: 明文密碼
crypt=1: 使用crpyt()函式(對應SQL資料裡的encrypt(),encrypt()隨機產生salt)
crypt=2: 使用MYSQL中的password()函式加密
crypt=3:表示使用md5的雜湊方式
(4)建立本地虛擬使用者
# useradd -d /home/ftpd -s /sbin/nologin ftpd

(5)下面就差修改vsftpd.conf檔案了,我把我的提供給大家參考吧:)
# vi /etc/vsftpd-pam1.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=ftpd
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
anon_world_readable_only=NO
virtual_use_local_privs=YES

#user_config_dir=/etc/vsftpd_user_conf
可以看出,和前面的用db庫來驗證沒有多大區別,其實就是一個東西,一個用mysql來驗證,一個用db庫,我個人比較傾向於用db庫來驗證,在這個環境下,相對於Mysql來說,安全係數更高一點。

(6)# /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam1.conf & //以後臺方式啟動

(7)測試連通
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.3)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> quit
221 Goodbye.
看,成功了!!這樣就實現了mysql的認證方式,很簡單吧??

4、為FTP增加磁碟配額,從而避免惡意使用者用垃圾資料塞滿你的硬碟
我首先要說的是這個功能是系統自帶的,而不是vsftp 的功能之一,千萬別搞混了。好了,我們先假設我們的系統使用者ftpd的主目錄是 /home/ftpd,它是建立在/home分割槽中,那麼如果我們要對 ftpd使用者進行磁碟限額,那我們需要修改/etc/fstab中根分割槽的記錄,將/home分割槽的第4個欄位改成defaults,usrquota,如下:
LABEL=/home /home ext3 defaults,usrquota 1 2
# reboot //重新啟動系統使設定生效
也可以用
# mount -o remount /dev/sda6 ///dev/sda6的掛接點就是/home,這樣可以不用啟動系統。
這裡我還要說明一下,如果我們對一個組進行磁配額,那我們需要增加引數grpquota,例如
LABEL=/home /home ext3 defaults,grpquota 1 2
也可以
LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2
你想怎麼限制都可以,自己組合引數吧。
# quotacheck -avu
說明:a-自動開啟掛載檔案系統的配額,v-顯示資訊,u-啟用使用者配額or g-啟用組配額
# edquota ftpd //為使用者ftpd設定磁碟配額
OR
# edquota -g grp //為組grp設定磁碟配額
系統會自動開啟配額檔案,如下:
Disk quotas for user ftpd (uid 502):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 424 0 0 13 0 0
第一列是啟用了配額的檔案系統的名稱。第二列顯示了使用者當前使用的塊數,單位為KB。隨後的兩列用來設定使用者在該檔案系統上的軟硬塊限度。 inodes 列顯示了使用者當前使用的i節點數量。最後兩列用來設定使用者在該檔案系統上的軟硬i節點限度.硬限是使用者或組群可以使用的磁碟空間的絕對最大值。達到了該限度後,磁碟空間就不能再被使用者或組群使用了。軟限定義可被使用的最大磁碟空間量。和硬限不同的是,軟限可以在一段時期內被超過。這段時期被稱為過渡期(grace period),預設七天的超越。過渡期可以用秒鐘、分鐘、小時、天數、週數、或月數表示。如果以上值中的任何一個被設定為 0,那個限度 就不會被設定。我設定了硬塊限度為1KB,是為了測試方便。
# quotaon -avu //開啟磁碟配額監控程式,u是使用者g是組,這裡我沒設定g引數
要校驗使用者的配額是否被設定,我們可以使用以下命令:
# quota ftpd
Disk quotas for user ftpd (uid 502):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 424* 0 1 13 0 0
# edquota –t(-g)來設定過渡期(grace period) //當然只針對軟限制而言
和另一個 edquota 命令相似,這個命令也會在文字編輯器中開啟當前的檔案系統配額:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sda6 7days 7days
按你的需要修改後存檔退出
用以下命令顯示磁碟配額使用狀態
# repquota -a 或 repquota /dev/sda6(使用者配額)
# repquota -g -a 或 repquota -a /dev/sda6 (組的配額)
如果一切按照你的意思實施了,那麼我們就進行測試了!如下圖4

我們傳了一個>1k的檔案,沒有成功,這樣我們就成功的為使用者ftpd增添了磁碟配額,要是哪一天你不想加磁碟配額了,怎麼辦?參看如下命令:
取消某個檔案系統的配額限制
#quotaoff -vug /dev/sda6 //刪除home分割槽的磁碟限額
#刪除/etc/fstab中設定配額的部分
修改軟配額的最大超越時間
注意:
/,/boot/,/proc,/mnt/cdrom等不要使用配額,沒用。而且磁碟配額不適合FAT和FAT32系統。
以後當新設定了某個使用者的配額,可以使用如下命令,馬上生效。
# quotacheck -auvgm --是不嘗試重新掛載檔案系統

備註:
1、vsftpd配置引數詳細整理
#接受匿名使用者
anonymous_enable=YES
#匿名使用者login時不詢問口令
no_anon_password=YES
#匿名使用者主目錄
anon_root=(none)
#接受本地使用者
local_enable=YES
#本地使用者主目錄
local_root=(none)
#如果匿名使用者需要密碼,那麼使用banned_email_file裡面的電子郵件地址的使用者不能登入
deny_email_enable=YES
#僅在沒有pam驗證版本時有用,是否檢查使用者有一個有效的shell來登入
check_shell=YES
#若啟用此選項,userlist_deny選項才被啟動
userlist_enable=YES
#若為YES,則userlist_file中的使用者將不能登入,為NO則只有userlist_file的使用者可以登入
userlist_deny=NO
#如果和chroot_local_user一起開啟,那麼使用者鎖定的目錄來自/etc/passwd每個使用者指定的目錄(這個不是很清楚,很哪位熟悉的指點一下)
passwd_chroot_enable=NO
#定義匿名登入的使用者名稱。預設值為ftp。
ftp_username=FTP

#################使用者許可權控制###############
#可以上傳(全域性控制).
write_enable=YES
#本地使用者上傳檔案的umask
local_umask=022
#上傳檔案的許可權配合umask使用
#file_open_mode=0666
#匿名使用者可以上傳
anon_upload_enable=NO
#匿名使用者可以建目錄
anon_mkdir_write_enable=NO
匿名使用者其它的寫權利(更改許可權?)
anon_other_write_enable=NO
如果設為YES,匿名登入者會被允許下載可閱讀的檔案。預設值為YES。
anon_world_readable_only=YES
#如果開啟,那麼所有非匿名登陸的使用者名稱都會被切換成guest_username指定的使用者名稱
#guest_enable=NO
所有匿名上傳的檔案的所屬使用者將會被更改成chown_username
chown_uploads=YES
匿名上傳檔案所屬使用者名稱
chown_username=lightwiter
#如果啟動這項功能,則所有列在chroot_list_file之中的使用者不能更改根目錄
chroot_list_enable=YES
#允許使用"async ABOR"命令,一般不用,容易出問題
async_abor_enable=YES
管控是否可用ASCII 模式上傳。預設值為NO。
ascii_upload_enable=YES
#管控是否可用ASCII 模式下載。預設值為NO。
ascii_download_enable=YES
#這個選項必須指定一個空的資料夾且任何登入者都不能有寫入的許可權,當vsftpd 不需要file system 的許可權時,就會將使用者限制在此資料夾中。預設值為/usr/share/empty
secure_chroot_dir=/usr/share/empty

###################超時設定##################
#空閒連線超時
idle_session_timeout=600
#資料傳輸超時
data_connection_timeout=120
#PAVS請求超時
ACCEPT_TIMEOUT=60
#PROT模式連線超時
connect_timeout=60

################伺服器功能選項###############
#開啟日記功能
xferlog_enable=YES
#使用標準格式
xferlog_std_format=YES
#當xferlog_std_format關閉且本選項開啟時,記錄所有ftp請求和回覆,當除錯比較有用.
#log_ftp_protocol=NO
#允許使用pasv模式
pasv_enable=YES
#關閉安全檢查,小心呀.
#pasv_promiscuous+NO
#允許使用port模式
#port_enable=YES
#關閉安全檢查
#prot_promiscuous
#開啟tcp_wrappers支援
tcp_wrappers=YES
#定義PAM 所使用的名稱,預設為vsftpd。
pam_service_name=vsftpd
#當伺服器執行於最底層時使用的使用者名稱
nopriv_user=nobody
#使vsftpd在pasv命令回覆時跳轉到指定的IP地址.(伺服器聯接跳轉?)
pasv_address=(none)

#################伺服器效能選項##############
#是否能使用ls -R命令以防止浪費大量的伺服器資源
#ls_recurse_enable=YES
#是否使用單程式模式
#one_process_model
#繫結到listen_port指定的埠,既然都繫結了也就是每時都開著的,就是那個什麼standalone模式
listen=YES
#當使用者登入後使用ls -al 之類的指令查詢該檔案的管理權時,預設會出現擁有者的UID,而不是該檔案擁有者的名稱。若是希望出現擁有者的名稱,則將此功能開啟。
text_userdb_names=NO
#顯示目錄清單時是用本地時間還是GMT時間,可以透過mdtm命令來達到一樣的效果
use_localtime=NO
#測試平臺最佳化
#use_sendfile=YES

################資訊類設定################
#login時顯示歡迎資訊.如果設定了banner_file則此設定無效
ftpd_banner=歡迎來到湖南三辰Fake-Ta FTP 網站.
#允許為目錄配置顯示資訊,顯示每個目錄下面的message_file檔案的內容
dirmessage_enable=YES
#顯示會話狀態資訊,關!
#setproctitle_enable=YES

############## 檔案定義 ##################
#定義不能更改使用者主目錄的檔案
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#定義限制/允許使用者登入的檔案
userlist_file=/etc/vsftpd/vsftpd.user_list
#定義登入資訊檔案的位置
banner_file=/etc/vsftpd/banner
#禁止使用的匿名使用者登陸時作為密碼的電子郵件地址
banned_email_file=/etc/vsftpd.banned_emails
#日誌檔案位置
xferlog_file=/var/log/vsftpd.log
#目錄資訊檔案
message_file=.message

############## 目錄定義 #################
#定義使用者配置檔案的目錄
user_config_dir=/etc/vsftpd/userconf
#定義本地使用者登陸的根目錄,注意定義根目錄可以是相對路徑也可以是絕對路徑.相對路徑是針對使用者家目錄來說的.
local_root=webdisk #此項設定每個使用者登陸後其根目錄為/home/username/webdisk
#匿名使用者登陸後的根目錄
anon_root=/var/ftp

#############使用者連線選項#################
#可接受的最大client數目
max_clients=100
#每個ip的最大client數目
max_per_ip=5
#使用標準的20埠來連線ftp
connect_from_port_20=YES
#繫結到某個IP,其它IP不能訪問
listen_address=192.168.0.2
#繫結到某個埠
#listen_port=2121
#資料傳輸埠
#ftp_data_port=2020
#pasv連線模式時可以使用port 範圍的上界,0 表示任意。預設值為0。
pasv_max_port=0
#pasv連線模式時可以使用port 範圍的下界,0 表示任意。預設值為0。
pasv_min_port=0

##############資料傳輸選項#################
#匿名使用者的傳輸比率(b/s)
anon_max_rate=51200
#本地使用者的傳輸比率(b/s)
local_max_rate=5120000

########################################
別外,如果要對每個使用者進行單獨的控制,只需要在user_config_dir中建立username檔案,內容為資料傳輸和使用者權利裡面設定個人的合適的選項,使用者自定義檔案同樣適合用pam支援的虛擬使用者
附: FTP 數字程式碼的意義
110 重新啟動標記應答。
120 服務在多久時間內ready。
125 資料鏈路埠開啟,準備傳送。
150 檔案狀態正常,開啟資料連線埠。
200 命令執行成功。
202 命令執行失敗。
211 系統狀態或是系統求助響應。
212 目錄的狀態。
213 檔案的狀態。
214 求助的訊息。
215 名稱系統型別。
220 新的聯機服務ready。
221 服務的控制連線埠關閉,可以登出。
225 資料連結開啟,但無傳輸動作。
226 關閉資料連線埠,請求的檔案操作成功。
227 進入passive mode。
230 使用者登入。
250 請求的檔案操作完成。
257 顯示目前的路徑名稱。
331 使用者名稱稱正確,需要密碼。
332 登入時需要賬號資訊。
350 請求的操作需要進一部的命令。
421 無法提供服務,關閉控制連結。
425 無法開啟資料鏈路。
426 關閉聯機,終止傳輸。
450 請求的操作未執行。
451 命令終止:有本地的錯誤。
452 未執行命令:磁碟空間不足。
500 格式錯誤,無法識別命令。
501 引數語法錯誤。
502 命令執行失敗。
503 命令順序錯誤。
504 命令所接的引數不正確。
530 未登入。
532 儲存檔案需要賬戶登入。
550 未執行請求的操作。
551 請求的命令終止,型別未知。
552 請求的檔案終止,儲存位溢位。
553 未執行請求的的命令,名稱不正確。

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

相關文章