vsftpd文件傳輸協(xié)議

系統(tǒng)環(huán)境:CentOS Linux release 7.6.1810 (Core)

一、簡介

FTP(文件傳輸協(xié)議)全稱是:Very Secure FTP Server。 Vsftpd是linux類操作系統(tǒng)上運行的ftp服務器軟件。 vsftp提供三種登陸方式:1.匿名登錄 2.本地用戶登錄 3.虛擬用戶登錄

vsftpd的特點:

1)較高的安全性需求

2)帶寬的限制

3)創(chuàng)建支持虛擬用戶

4)支持IPV6

5)中等偏上的性能

6)可分配虛擬IP

7)高速

Ftp會話時采用了兩種通道(連接方式):

1)控制通道:與Ftp服務器進行溝通的通道,鏈接Ftp發(fā)送ftp指令都是通過控制通道來完成的。端口為21,用于發(fā)送FTP命令信息。

2)數(shù)據(jù)通道:數(shù)據(jù)通道和Ftp服務器進行文件傳輸或則列表的通道 ,端口為20,用于上傳下載數(shù)據(jù)。

二、工作原理

Ftp協(xié)議中控制連接均是由客戶端發(fā)起,而數(shù)據(jù)連接有兩種工作方式:Port和Pasv方式

Port模式(主動模式)--> 默認

Ftp客戶端首先和Ftp server的tcp 21端口建立連接,通過這個通道發(fā)送命令,客戶端要接受數(shù)據(jù)的時候在這個通道上發(fā)送Port命令,Port命令包含了客戶端用什么端口(一個大于1024的端口)接受數(shù)據(jù),在傳送數(shù)據(jù)的時候,服務器端通過自己的TCP 20端口發(fā)送數(shù)據(jù)。這個時候數(shù)據(jù)連接由server向client建立一個連接。

Port交互流程:

client端:client鏈接server的21端口,并發(fā)送用戶名密碼和一個隨機在1024上的端口及port命令給server,表明采用主動模式,并開放那個隨機的端口。

server端:server收到client發(fā)來的Port主動模式命令與端口后,會通過自己的20端口與client那個隨機的端口連接后,進行數(shù)據(jù)傳輸。

簡而言之:就是服務端從20端口主動向客戶端發(fā)起連接

image

Pasv模式(被動方式)

建立控制通道和Port模式類似,當客戶端通過這個通道發(fā)送Pasv命令的時候,F(xiàn)tp server打開了一個位于1024和5000之間的隨機端口并且通知客戶端在這個端口上進行傳輸數(shù)據(jù)請求,然后Ftp server將通過這個端口進行數(shù)據(jù)傳輸。這個時候數(shù)據(jù)連接由client向server建立連接。

Pasv交互流程

Clietn:client連接server的21號端口,發(fā)送用戶名密碼及pasv命令給server,表明采用被動模式。

server:server收到client發(fā)來的pasv被動模式命令之后,把隨機開放在1024上的端口告訴client,client再用自己的20 端口與server的那個隨機端口進行連接后進行數(shù)據(jù)傳輸。

簡而言之:就是服務端在指定范圍內的某個端口被動等待客戶端發(fā)起連接

image

如果從C/S模型這個角度來說,PORT對于服務器來說是OUTBOUND,而PASV模式對于服務器是INBOUND,這一點請?zhí)貏e注意,尤其是在使用防火墻的企業(yè)里,這一點非常關鍵,如果設置錯了,那么客戶將無法連接。

三、安裝vsfpd

1.安裝vsftpd相關組件

rpm -qa | grep vsftpd
yum -y install vsftpd*

2.安裝PAM服務相關組件

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">[root@VM_0_10_centos shellScript]# yum -y install pam*</pre>

安裝pam報錯:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">--> Finished Dependency Resolution
Error: Package: 2:postfix-2.10.1-7.el7.x86_64 (@anaconda)
           Requires: libmysqlclient.so.18(libmysqlclient_18)(64bit)
Error: Package: libmapi-7.1.14-3.el7.x86_64 (epel)
           Requires: libmysqlclient.so.18(libmysqlclient_18)(64bit)
Error: Package: libmapi-7.1.14-3.el7.x86_64 (epel)
           Requires: libmysqlclient.so.18()(64bit)
Error: Package: 2:postfix-2.10.1-7.el7.x86_64 (@anaconda)
           Requires: libmysqlclient.so.18()(64bit)
 You could try using --skip-broken to work around the problem ** Found 2 pre-existing rpmdb problem(s), 'yum check' output follows: 2:postfix-2.10.1-7.el7.x86_64 has missing requires of libmysqlclient.so.18()(64bit) 2:postfix-2.10.1-7.el7.x86_64 has missing requires of libmysqlclient.so.18(libmysqlclient_18)(64bit)</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

解決:

缺少Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm這個包

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/5.5.37-25.10/RPM/rhel6/x86_64
/Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
[root@VM_0_10_centos tmp]# rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
warning: Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: N
OKEYPreparing... ################################# [100%]
Updating / installing... 1:Percona-XtraDB-Cluster-shared-55-################################# [100%]</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

參考網(wǎng)址:https://blog.csdn.net/debimeng/article/details/78143071

最后再運行安裝pam即可

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># yum -y install pam*</pre>

3.安裝DB4部件包

用來支持文件數(shù)據(jù)庫

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# yum -y install db4*</pre>

四、系統(tǒng)賬戶

1.建立Vsftpd服務的宿主用戶

默認的Vsftpd的服務宿主用戶是root,但不符合安全性的需要。這里建立名字為vsftpd的用戶,用他來作為支持Vsftpd的服務宿主用戶。由于該用戶僅用來支持Vsftpd服務用,因此沒有許可他登陸系統(tǒng)的必要,并設定他為不能登陸系統(tǒng)的用戶。

nologin參考網(wǎng)址:https://blog.csdn.net/danson_yang/article/details/65629948

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# useradd vsftpd -s /sbin/nologin</pre>

/sbin/nologin更改用戶是否可以使用ssh登錄

2.建立Vsftpd虛擬宿主用戶

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# useradd vrvsftpd -s /sbin/nologin</pre>

虛擬用戶并不是系統(tǒng)用戶,也就是說這些FTP的用戶在系統(tǒng)中是不存在的。他們的總體權限其實是集中寄托在一個在系統(tǒng)中的某一個用戶身上的,所謂Vsftpd的虛擬宿主用戶,就是這樣一個支持著所有虛擬用戶的宿主用戶。由于他支撐了FTP的所有虛擬的用戶,那么他本身的權限將會影響著這些虛擬的用戶,因此,處于安全性的考慮,也要非分注意對該用戶的權限的控制,該用戶也絕對沒有登陸系統(tǒng)的必要,這里也設定他為不能登陸系統(tǒng)的用戶。

五、修改vsftpd配置文件

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">#
1. 匿名用戶的有關設置

anonymous_enable =YES/NO    # 是否允許匿名用戶登錄FTP服務器,默認值為YES。
no_anon_password =YES/NO     # 控制匿名用戶登入時是否需要密碼,YES不需要,NO需要。默認值為NO。
anon_world_readable_only =YES/NO     # 匿名用戶是否允許下載可閱讀的文檔。默認值為YES。 
anon_upload_enable =YES/NO    # 是否允許匿名用戶上傳文件,默認為NO。
anon_mkdir_write_enable =YES/NO    # 是否允許匿名用戶有創(chuàng)建目錄的寫入權限,默認值為NO
anon_other_write_enable=YES/NO     # 是否允許匿名用戶有其他的寫入權限,如對文件改名、覆蓋及刪除文件。默認值為NO。
ftp_username=           (自添)# 匿名用戶所使用的系統(tǒng)用戶名。默認下,此參數(shù)在配置文件中不出現(xiàn),默認值為ftp。
anon_root=/var/ftp         (自添)# 設置匿名用戶登錄后所在的目錄(默認為/var/ftp)
anon_umask=022            (自添)# 匿名用戶所上傳文件的默認權限掩碼值
anon_max_rate=200000     # 設置匿名用戶的最大傳輸速度,單位為bytes/sec,值為0表示不限制 </pre>

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 2.本地用戶的設置
local_enable=YES|NO # 是否允許本地用戶登錄FTP服務器,默認值為YES。
local_umask=022 # 本地用戶上傳文件的默認權限掩碼值
local_max_rate=500000 # 設置本地用戶的最大傳輸速度,單位為bytes/sec,值為0時表示不限制
local_root=/var/ftp (自添)# 設置本地用戶登錄后所在目錄(缺省為為用戶主目錄)。如:user1用戶為:/home/user1</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 3. 全局設置
write_enable=YES|NO # 允許用戶訪問時,是否允許他們有寫入的權限,默認值為YES。
listen=YES|NO # 設置vsftpd服務器是否以獨立(standalone)模式運行 ,默認值為YES,建議不要更改。很多與服務器運行相關的配置命令,需要此運行模式才有效。若設置為NO,則vsftpd不是以獨立的服務運行,要受xinetd服務的管理控制,功能上會受限制。
listen_port=21 # 設置FTP服務器建立連接所偵聽的端口,默認值為21。
max_clients=0 # 設置FTP服務器所允許的最大客戶端連接數(shù),默認值為0,表示不限制。若設置為150時,則同時允許有150個連接,超出的將拒絕建立連接。只有在以standalone模式運行時才有效。
max_per_ip=5 # 設置每個IP地址允許與FTP服務器同時建立連接的數(shù)目。默認為0,不受限制。通??蓪Υ伺渲眠M行設置,防止同一個用戶建立太多的連接。只有在以standalone模式運行時才有效。
xferlog_enable=YES # 是否啟用日志
xferlog_file=var/log/vsftpd.log # 設置日志文件名及路徑。需啟用xferlog_enable選項
xferlog_std_format=YES # 是否用標準格式存儲日志
pam_service_name=vsftpd # 設置PAM認證服務的配置文件名,該文件位于/etc/pam.d目錄下

3. 全局設置——歡迎信息

ftpd_banner=Welcome blah FTP service # 這邊可定義歡迎話語的字符串,相較于banner_file 是檔案的形式,而ftpd_banner 是字串的格式。預設為無。
banner_file =/etc/vsftpd/banner # 當使用者登入時,會顯示此設定所在的文件的內容,通常為歡迎話語或是說明。默認值為無。
dirmessage_enable =YES # 如果啟動這個選項,使用者第一次進入一個目錄時,會檢查該目錄下是否有.message這個檔案,若是有,則會出現(xiàn)此檔案的內容,通常這個檔案會放置歡迎話語,或是對該目錄的說明。默認值為開啟。
message_file=.message # 設置目錄消息文件。當使用者第一次進入一個目錄時,是否顯示該目錄中的.message文件(需用編輯器手工創(chuàng)建)的內容,該文件通常放置歡迎話語,或是對該目錄的說明信息 </pre>

[
復制代碼

](javascript:void(0); "復制代碼")

image

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 4. 控制用戶是否允許切換到上級目錄

1)配置所有登錄不能改變自己的FTP根目錄(本地用戶是否鎖定在宿主目錄中,要對本地用戶查看效果,需先設置 local_root=/var/ftp )

chroot_local_user=YES|NO # 2)配置部分賬戶不允許改變自己的FTP根目錄 #chroot_list_enable=YES|NO # 是否啟用chroot_list_file配置項指定的用戶列表文件 #chroot_list_file=/etc/vsftpd/chroot_list # 此文件需自己建立,被列入此文件的用戶,在登錄后將不能切換到自己目錄以外的其他目錄

chroot_list中的用戶未鎖定, chroot_list外的用戶鎖定

chroot_list_enable=YES
chroot_local_user=NO # chroot_list中的用戶鎖定, chroot_list外的用戶未鎖定
chroot_list_enable=NO
chroot_local_user=YES # 所有用戶鎖定
chroot_list_enable=NO
chroot_local_user=NO # 所有用戶未鎖定
chroot_list_enable=YES
chroot_local_user=YES</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 5. 設置訪問控制 # 1)設置允許或不允許訪問的主機
tcp_wrappers=YES # 設置vsftpd服務器是否與tcp wrapper相結合,進行主機的訪問控制。默認為YES,vsftpd服務器會檢查/etc/hosts.allow和/etc/hosts.deny中的設置,以決定請求連接的主機是否允許訪問該FTP服務器。這兩個文件可以起到簡易的防火墻功能。 # 如:若僅允許192.168.168.1~192.168.168.254的用戶,可以訪問連接vsftpd服務器,則可在/etc/hosts.allow文件中添加以下內容:
vsftpd:192.168.168.0/255.255.255.0 :allow
all:all:deny # 2)設置允許或不允許訪問的用戶 # 對用戶的訪問控制由/etc/vsftpd/user_list和/etc/vsftpd/ftpusers文件來控制實現(xiàn)。 # 相關配置命令如下:
userlist_enable=YES | NO # 設置/etc/vsftpd/user_list文件是否啟用生效。YES則生效,NO不生效。
userlist_deny=YES | NO #設置/etc/vsftpd/user_list文件中的用戶是允許訪問還是不允許訪問。 # 若設置為YES,則/etc/vsftpd/user_list文件中的用戶將不允許訪問FTP服務器;若設置為NO,則只有vsftpd.user_list文件中的用戶,才能訪問FTP服務器。</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 用戶文件列表
/etc/vsftpd/ftpusers # 指定了不允許訪問FTP服務器的本地用戶賬號(黑名單) ,例如root等。這些賬號不是普通用戶賬號,而是在系統(tǒng)中具有較高權限的賬號,禁止這些賬號進行FTP登錄可提高系統(tǒng)的安全性。
/etc/vsftpd/user_list # 指定允許或不允許登陸的用戶列表,使用起來比ftpusers更加靈活。需要在主配置文件中進行設置,如下圖</pre>

<colgroup style="margin: 0px; padding: 0px;"><col width="241" style="margin: 0px; padding: 0px;"><col width="654" style="margin: 0px; padding: 0px;"></colgroup>
|

userlist_enable=YES

userlist_deny=YES

|

●ftpusers中用戶禁止訪問

● user_list中用戶禁止訪問(登錄時不會出現(xiàn)密碼提示,直接被服務器拒絕 )

●其他的ftp用戶都可以登錄

|
|

userlist_enable=YES

userlist_deny=NO

|

●只允許 user_list中的用戶訪問

●其他的ftp用戶都不可以登錄

|

image

image

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 6.設置用戶配置文件所在的目錄 # 在vsftpd服務器中,不同用戶還可使用不同的配置,這要通過用戶配置文件來實現(xiàn)。
user_config_dir=/etc/vsftpd/userconf # 用于設置用戶配置文件所在的目錄。

設置了該配置項后,當用戶登錄FTP服務器時,系統(tǒng)就會到/etc/vsftpd/userconf目錄下讀取與當前用戶名相同的文件,并根據(jù)文件中的配置命令,對當前用戶進行更進一步的配置。比如,利用用戶配置文件,可實現(xiàn)對不同用戶進行訪問的速度進行控制,在各用戶配置文件中,定義local_max_rate配置,以決定該用戶允許的訪問速度。</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 7.FTP工作方式與服務端口
connect_from_port_20=YES|NO # 指定FTP數(shù)據(jù)傳輸連接是否使用20端口,默認值為YES 。若設置為NO,則進行數(shù)據(jù)連接時,所使用的端口由ftp_data_port指定
ftp_data_port=20 # 設置PORT方式下FTP數(shù)據(jù)連接所使用的端口,默認值為20。
pasv_enable=YES|NO # 若設置為YES,則使用PASV工作模式;若設置為NO,使用PORT模式。默認為YES,即使用PASV模式。
pasv_max_port=0 # 設置在PASV工作方式下,數(shù)據(jù)連接可以使用的端口范圍的上界。默認值為0,表示任意端口。
pasv_mim_port=0 # 設置在PASV工作方式下,數(shù)據(jù)連接可以使用的端口范圍的下界。默認值為0,表示任意端口。 </pre>

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 8.設置傳輸模式 # FTP在傳輸數(shù)據(jù)時,可使用二進制(Binary)方式,也可使用ASCII模式來上傳或下載數(shù)據(jù)。
ascii_download_enable=YES # 設置是否啟用ASCII模式下載數(shù)據(jù)。默認為NO
ascii_upload_enable=YES # 設置是否啟用ASCII模式上傳數(shù)據(jù)。默認為NO</pre>

1.編輯配置文件前先備份

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup</pre>

內容如下:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cat /etc/vsftpd/vsftpd.conf

Allow anonymous FTP? (Beware - allowed by default if you comment this out).

anonymous_enable=YES

# 是否允許匿名用戶訪問,默認為YES,這里設置不允許匿名訪問
anonymous_enable=NO

Uncomment this to allow local users to log in.

When SELinux is enforcing check for SE bool ftp_home_dir

# 設置本地用戶可以訪問。PS:主要為虛擬宿主用戶,如該項目設定為No,那么所有虛擬用戶將無法訪問
local_enable=YES

Uncomment this to enable any form of FTP write command.

# 設置可進行寫操作
write_enable=YES

Default umask for local users is 077. You may wish to change this to 022,

if your users expect that (022 is used by most other ftpd's)

# 設置上傳后文件的權限掩碼
local_umask=022

Uncomment this to allow the anonymous FTP user to upload files. This only

has an effect if the above global write enable is activated. Also, you will

obviously need to create a directory writable by the FTP user.

When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access

anon_upload_enable=YES

# 禁止匿名用戶上傳文件
anonymous_enable=NO

Uncomment this if you want the anonymous FTP user to be able to create

new directories.

anon_mkdir_write_enable=YES

# 禁止匿名用戶建立目錄
anon_mkdir_write_enable=NO

Activate directory messages - messages given to remote users when they

go into a certain directory.

# 設置開啟目錄標語功能
dirmessage_enable=YES

Activate logging of uploads/downloads.

# 開啟日志記錄功能
xferlog_enable=YES

Make sure PORT transfer connections originate from port 20 (ftp-data).

# 設置端口20進行數(shù)據(jù)庫連接
connect_from_port_20=YES

If you want, you can arrange for uploaded anonymous files to be owned by

a different user. Note! Using "root" for uploaded files is not

recommended!

chown_uploads=YES

chown_username=whoever

# 設置禁止上傳文件更改宿主
chown_uploads=NO

You may override where the log file goes if you like. The default is shown

below.

xferlog_file=/var/log/xferlog

**# 設置vsftpd服務日志保存路徑。PS:該文件默認不存在,須手動創(chuàng)建。

由于這里手動更改了vsftpd宿主用戶為vsftpd,須注意給與改用戶對日志的寫入權限**

xferlog_file=/var/log/vsftpd.log

If you want, you can have your log file in standard ftpd xferlog format.

Note that the default log file location is /var/log/xferlog in this case.

# 設置日志使用標準的記錄格式
xferlog_std_format=YES

You may change the default value for timing out an idle session.

**# 設置空閑連接超時時間,這里使用默認。

將具體數(shù)值留給每個具體用戶具體指定,當然如果不指定的話,還是使用這里的默認值600,單位秒**

idle_session_timeout=600

You may change the default value for timing out a data connection.

**# 設定單次最大連續(xù)傳輸時間,這里使用默認。

將具體數(shù)值留給每個具體用戶具體指定,當然如果不指定的話,還是使用這里的默認值120,單位秒。**

data_connection_timeout=120

It is recommended that you define on your system a unique user which the

ftp server can use as a totally isolated and unprivileged user.

nopriv_user=ftpsecure

**# 設定支撐Vsftpd服務的宿主用戶為手動建立的Vsftpd用戶。

PS:一旦做出更改宿主用戶后,必須注意一起與該服務相關的讀寫文件的讀寫賦權問題。比如日志文件就必須給與該用戶寫入權限等。**

nopriv_user=vsftpd

Enable this and the server will recognise asynchronous ABOR requests. Not

recommended for security (the code is non-trivial). Not enabling it,

however, may confuse older FTP clients.

# 設置支持異步傳輸功能
async_abor_enable=YES

ASCII mangling is a horrible feature of the protocol.

# 設置支持ASCII模式上傳和下載功能
ascii_upload_enable=YES
ascii_download_enable=YES

You may fully customise the login banner string:

ftpd_banner=Welcome to blah FTP service.

# 設置vsftpd的登錄標語
ftpd_banner=This Vsftp server supports virtual users _

You may specify a file of disallowed anonymous e-mail addresses. Apparently

useful for combatting certain DoS attacks.

deny_email_enable=YES

(default follows)

banned_email_file=/etc/vsftpd/banned_emails

You may specify an explicit list of local users to chroot() to their home

directory. If chroot_local_user is YES, then this list becomes a list of

users to NOT chroot().

(Warning! chroot'ing can be very dangerous. If using chroot, make sure that

the user does not have write access to the top level directory within the

chroot)

chroot_local_user=YES

chroot_list_enable=YES

# 禁止用戶登出自己的ftp主目錄
chroot_list_enable=NO

(default follows)

chroot_list_file=/etc/vsftpd/chroot_list

You may activate the "-R" option to the builtin ls. This is disabled by

default to avoid remote users being able to cause excessive I/O on large

sites. However, some broken FTP clients such as "ncftp" and "mirror" assume

the presence of the "-R" option, so there is a strong case for enabling it.

ls_recurse_enable=YES

# 禁止用戶登錄ftp后使用"ls -R"命令。該命令會對服務器性能造成巨大開銷。如果該項被允許,那么擋多用戶同時使用該命令時將會對該服務器造成威脅。
ls_recurse_enable=NO

When "listen" directive is enabled, vsftpd runs in standalone mode and

listens on IPv4 sockets. This directive cannot be used in conjunction

with the listen_ipv6 directive.

listen=NO

**# 設定該Vsftpd服務工作在StandAlone模式下。

順便展開說明一下,所謂StandAlone模式就是該服務擁有自己的守護進程支持,

在ps -A命令下我們將可用看到vsftpd的守護進程名。如果不想工作在StandAlone模式下,則可以選擇SuperDaemon模式,

在該模式下 vsftpd將沒有自己的守護進程,而是由超級守護進程Xinetd全權代理,與此同時,Vsftp服務的許多功能將得不到實現(xiàn)**

listen=YES

This directive enables listening on IPv6 sockets. By default, listening

on the IPv6 "any" address (::) will accept connections from both IPv6

and IPv4 clients. It is not necessary to listen on both IPv4 and IPv6

sockets. If you want that (perhaps because you want to listen on specific

addresses) then you must run two copies of vsftpd with two configuration

files.

Make sure, that one of the listen options is commented !!</pre>

# listen_ipv6=YES
 # 設置pam服務下vsftpd的驗證配置文件名。因此,PAM驗證將參考/etc/pam.d/下的vsftpd文件配置
  pam_service_name=vsftpd
 # 設定userlist_file中的用戶將不得使用FTP。
  userlist_enable=YES
 # 設定支持TCP Wrappers。
  tcp_wrappers=YES

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">**# 以下這些是關于Vsftpd虛擬用戶支持的重要配置項目。默認Vsftpd.conf中不包含這些設定項目,需要自己手動添加配置。

設置啟用虛擬用戶功能**

guest_enable=YES

# 指定虛擬用戶宿主用戶
guest_username=vrvsftpd

# 設定虛擬用戶的權限符合他們的宿主用戶。
virtual_use_local_privs=YES

**# 設定虛擬用戶個人Vsftp的配置文件存放路徑。

也就是說,這個被指定的目錄里,將存放每個Vsftp虛擬用戶個性的配置文件,一個需要注意的地方就是這些配置文件名必須和虛擬用戶名相同。**

user_config_dir=/etc/vsftpd/vconf</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

3.建立Vsftpd的日志文件,并更該屬主為Vsftpd的服務宿主用戶

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# touch /var/log/vsftpd.log
[root@VM_0_10_centos tmp]# chown vsftpd.vsftpd /var/log/vsftpd.log</pre>

4.建立虛擬用戶配置文件存放路徑

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# mkdir /etc/vsftpd/vconf</pre>

六、制作虛擬用戶數(shù)據(jù)庫文件

1.先建立虛擬用戶名單文件

建立了一個虛擬用戶名單文件,這個文件就是來記錄vsftpd虛擬用戶的用戶名和口令的數(shù)據(jù)文件,我這里給它命名為virtusers。為了避免文件的混亂,我把這個名單文件就放置在/etc/vsftpd/下。

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# touch /etc/vsftpd/virtusers</pre>

2.編輯虛擬用戶名單文件

格式為:“一行用戶名,一行口令”。

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cat /etc/vsftpd/virtusers
zs
設置的密碼
thy
設置的密碼</pre>

3.生成虛擬用戶數(shù)據(jù)文件

db_load主要用來生成db數(shù)據(jù)庫使用。在Vsftpd的虛擬用戶設置中先新建一個文件users.txt 把用戶名密碼放入其中

接著 db_load -T -t hash -f */users.txt */users.db

PS: * 表示目錄

這樣就生成了一個users.db文件(hash碼型的數(shù)據(jù)庫文件)

參考網(wǎng)址:http://blog.itpub.net/20943428/viewspace-661714/

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db</pre>

參數(shù):

選項-T允許應用程序能夠將文本文件轉譯載入進數(shù)據(jù)庫。由于我們之后是將虛擬用戶的信息以文件方式存儲在文件里的,為了讓Vsftpd這個應用程序能夠通過文本來載入用戶數(shù)據(jù),必須要使用這個選項。

子選項-t,追加在在-T選項后,用來指定轉譯載入的數(shù)據(jù)庫類型。擴展介紹下,-t可以指定的數(shù)據(jù)類型有Btree、Hash、Queue和Recon數(shù)據(jù)庫

** PS:如果指定了選項-T,那么一定要追跟子選項 -t**

4.察看生成的虛擬用戶數(shù)據(jù)文件

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# ll /etc/vsftpd/virtusers.db
-rw-r--r-- 1 root root 12288 Oct 9 11:02 /etc/vsftpd/virtusers.db</pre>

PS:以后再添加虛擬用戶的時候,只需要按照“一行用戶名,一行口令”的格式將新用戶名和口令添加進虛擬用戶名單文件。但是光這樣做還不夠,不會生效的哦!還要再執(zhí)行一遍“ db_load -T -t hash -f 虛擬用戶名單文件 虛擬用戶數(shù)據(jù)庫文件.db ”的命令使其生效才可以!

七、設定PAM驗證文件,并指定虛擬用戶數(shù)據(jù)庫文件進行讀取

1.察看原來的Vsftp的PAM驗證配置文件

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# 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</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

2.在編輯前做好備份

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup
[root@VM_0_10_centos tmp]# vi /etc/pam.d/vsftpd </pre>

內容如下

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# vi /etc/pam.d/vsftpd

%PAM-1.0

session optional pam_keyinit.so force revoke

以下兩條是手動添加的,內容是對虛擬用戶的安全和帳戶權限進行驗證。

這里的auth是指對用戶的用戶名口令進行驗證

auth sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers

這里的accout是指對用戶的帳戶有哪些權限哪些限制進行驗證。

其后的sufficient表示充分條件,也就是說,一旦在這里通過了驗證,那么也就不用經過下面剩下的驗證步驟了。

相反,如果沒有通過的話,也不會被系統(tǒng)立即擋之門外,因為sufficient的失敗不決定整個驗證的失敗,意味著用戶還必須將經歷剩下來>的驗證審核。

account sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers

后面的/lib/security/pam_userdb.so表示該條審核將調用pam_userdb.so這個庫函數(shù)進行。

最后的db=/etc/vsftpd/virtusers則指定了驗證庫函數(shù)將到這個指定的數(shù)據(jù)庫中調用數(shù)據(jù)進行驗證。

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</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

八、虛擬用戶的配置

1.規(guī)劃好虛擬用戶的主路徑

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# mkdir /opt/vsftpd</pre>

2.建立測試用戶的FTP用戶目錄

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# mkdir /opt/vsftpd/{zs,thy}
[root@VM_0_10_centos tmp]# ls /opt/vsftpd/
thy zs</pre>

3.建立虛擬用戶配置文件模版

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cp /etc/vsftpd/vsftpd.conf.backup /etc/vsftpd/vconf/vconf.tmp</pre>

4.定制虛擬用戶模版配置文件

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# vi /etc/vsftpd/vconf/vconf.tmp

指定虛擬用戶的具體主路徑。

local_root=/opt/vsftpd/virtuser

設定不允許匿名用戶訪問。

anonymous_enable=NO

設定允許寫操作。

write_enable=YES

設定上傳文件權限掩碼。

local_umask=022

設定不允許匿名用戶上傳。

anon_upload_enable=NO

設定不允許匿名用戶建立目錄。

anon_mkdir_write_enable=NO

設定空閑連接超時時間。

idle_session_timeout=600

設定單次連續(xù)傳輸最大時間。

data_connection_timeout=120

設定并發(fā)客戶端訪問個數(shù)。

max_clients=10

設定單個客戶端的最大線程數(shù),這個配置主要來照顧Flashget、迅雷等多線程下載軟件。

max_per_ip=5

設定該用戶的最大傳輸速率,單位b/s。

local_max_rate=50000</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

這里將原vsftpd.conf配置文件經過簡化后保存作為虛擬用戶配置文件的模版。將并不需要指定太多的配置內容,主要的框架和限制交由 Vsftpd的主配置文件vsftpd.conf來定義,即虛擬用戶配置文件當中沒有提到的配置項目將參考主配置文件中的設定。而在這里作為虛擬用戶的配置文件模版只需要留一些和用戶流量控制,訪問方式控制的配置項目就可以了。這里的關鍵項是local_root這個配置,用來指定這個虛擬用戶的FTP主路徑。

5.更改虛擬用戶的主目錄的屬主為虛擬宿主用戶:

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# chown -R vrvsftpd.vrvsftpd /opt/vsftpd/
[root@VM_0_10_centos tmp]# ll /opt/vsftpd/
total 8
drwxr-xr-x 2 vrvsftpd vrvsftpd 4096 Oct 9 11:24 thy
drwxr-xr-x 2 vrvsftpd vrvsftpd 4096 Oct 9 11:24 zs</pre>

九、給測試用戶定制

1.從虛擬用戶模版配置文件復制

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/thy</pre>

2.針對具體用戶進行定制

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# vi /etc/vsftpd/vconf/thy

指定虛擬用戶的具體主路徑。

local_root=/opt/vsftpd/thy

設定不允許匿名用戶訪問。

anonymous_enable=NO

設定允許寫操作。

write_enable=YES

設定上傳文件權限掩碼。

local_umask=022

設定不允許匿名用戶上傳。

anon_upload_enable=NO

設定不允許匿名用戶建立目錄。

anon_mkdir_write_enable=NO

設定空閑連接超時時間。

idle_session_timeout=300

設定單次連續(xù)傳輸最大時間。

data_connection_timeout=90

設定并發(fā)客戶端訪問個數(shù)。

max_clients=1

設定單個客戶端的最大線程數(shù),這個配置主要來照顧Flashget、迅雷等多線程下載軟件。

max_per_ip=1

設定該用戶的最大傳輸速率,單位b/s。

local_max_rate=25000</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

十、啟動服務

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# systemctl restart vsftpd
[root@VM_0_10_centos tmp]# systemctl status vsftpd</pre>

十一、測試

1.在虛擬用戶目錄中預先放入文件

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# touch /opt/vsftpd/thy/thy.test</pre>

2.從其他機器作為客戶端登陸FTP

前提這臺機器安裝了ftp服務,能使用ftp命令

image

解決:

可能是pam問題,上面配置vsftpd.conf配置文件時,沒有開啟pam的驗證,將pam驗證開啟即可

image

參考網(wǎng)址:https://blog.csdn.net/junjunjiao/article/details/50738009

測試登錄:

image

3.測試列單操作

image

解決:

將主動改為被動,然后重新登錄ftp

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">ftp> passive
Passive mode on.</pre>

image

參考網(wǎng)址:https://blog.csdn.net/indexman/article/details/42649329

4.測試上傳操作

參數(shù)使用格式參考網(wǎng)址:https://www.jb51.net/article/124033.htm

首先現(xiàn)在客戶端服務器上當前目錄創(chuàng)建hello.txt文件,登錄ftp,測試上傳

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_16_centos ~]# touch hello.txt</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_16_centos ~]# ftp
ftp> ls
227 Entering Passive Mode (106,53,73,200,241,96).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Oct 09 03:51 thy.test
226 Directory send OK.
ftp> put
(local-file) hello.txt
(remote-file) ftp_hello.txt
local: hello.txt remote: ftp_hello.txt
227 Entering Passive Mode (106,53,73,200,91,237).
150 Ok to send data.
226 Transfer complete.
30 bytes sent in 3e-05 secs (1000.00 Kbytes/sec)</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

image

在vsftpd服務端就能看到剛剛上傳的文件了

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@VM_0_10_centos tmp]# ls /opt/vsftpd/thy/
ftp_hello.txt thy.test</pre>

image

5.測試建立目錄操作

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">ftp> mkdir ftp_test
257 "/opt/vsftpd/thy/ftp_test" created</pre>

image

6.測試下載操作

需要下載的文件,vsftpd服務端必須要有這個文件才行

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">ftp> get thy.test
local: thy.test remote: thy.test
227 Entering Passive Mode (106,53,73,200,245,241).
150 Opening BINARY mode data connection for thy.test (0 bytes).
226 Transfer complete.</pre>

在/etc/vsftpd/vsftpd.conf中,local_enable的選項必須打開為Yes,使得虛擬用戶的訪問成為可能,否則會出現(xiàn)以下現(xiàn)象:

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@KcentOS5 ~]# ftp
ftp> open ip地址
Connected to ip地址.
500 OOPS: vsftpd: both local and anonymous access disabled!</pre>

原因:虛擬用戶再豐富,其實也是基于它們的宿主用戶overlord的,如果overlord這個虛擬用戶的宿主被限制住了,那么虛擬用戶也將受到限制。
補充:

500 OOPS:錯誤

有可能是你的vsftpd.con配置文件中有不能被識別的命令,還有一種可能是命令的YES 或 NO 后面有空格。

550 權限錯誤,不能創(chuàng)建目錄和文件

解決方法: 關閉selinux

vi /etc/selinux/config

將 SELINUX=XXX -->XXX 代表級別

改為

SELINUX=disabled

修改配置文件需要重啟

7、通過瀏覽器訪問

ftp://106.53.73.200/

輸入配置的用戶名和密碼即可

[圖片上傳中...(image-df89e1-1598613491561-34)]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容