小白一枚,第一次安裝vsftpd服務器,搞了一下午,各種糾結,各種報錯,網上雖然一大堆教程,也都是各種安裝方式都有,因此,特地寫下博客記錄下,以防止以後用到,希望能幫到有需要的朋友。
vsftpd 全稱是:very secure FTP daemon 非常安全的ftp後臺程序,及ftp 服務端!
一:安裝vsftpd
查看是否已經安裝vsftpd
rpm -qa | grep vsftpd
如果沒有,就安裝:
yum -y install vsftpd
執行完成後,就會看到Complete!表明安裝成功了!
設置開機啓動:
chkconfig vsftpd on
安裝完成後,查看服務啓動狀態:
service vsftpd start 啓動
service vsfptd status 狀態
service vsftpd restart 重啓
service vsftpd stop 停止
在這裏大家注意點:在centos7之後,查看服務啓動就改成了 :
systemctl stop vsftpd.service
systemctl start vsftpd.service
systemctl status vsftpd.service
本人調試的centos爲6.5的版本,請大家自行查看服務器版本!
命令查看後,最後 Started vsftpd ftp daemon 已經啓動成功了
檢查端口:
netstat -anp|grep 21
ftp服務啓動的是21端口,使用如下命令應該觀察到21端口正在處於監聽狀態,這反應了ftp服務器啓動成功了。
二:設置用戶
要連接上 vsftpd 服務器需要爲Linux創建專門的用戶, 接下來創建這個用戶:
1:用戶目錄
在Linux中,不同用戶是有不同目錄訪問權限的,所以首先創建一個目錄,作爲這個ftp用戶所擁有的目錄。
mkdir -p /home/ftproot/ftptest
2:創建用戶
創建用戶ftptest,並且指定其目錄爲用戶目錄中創建的/home/ftproot/ftptest
useradd -d /home/ftproot/ftptest -g ftp -s /sbin/nologin ftptest
-g ftp 表示該用戶屬於ftp分組 (ftp分組是內置的,本來就存在,不需要自己創建)
-s /sbin/nologin 表示這個用戶不能用來登錄secureCRT這樣的客戶端,這種不能登陸的用戶又叫做虛擬用戶
創建過程給出的警告信息是正常的,不用理會
3:設置目錄權限
把目錄/home/ftproot/ftptest的擁有者設置爲ftptest
chown -R ftptest /home/ftproot/ftptest
使ftptest用戶擁有這個目錄的讀寫權限
chmod -R 775 /home/ftproot/ftptest
對設置權限不懂的,請查看:Linux常用命令
4:設置密碼
爲ftptest用戶設置密碼:
passwd ftptest
密碼修改成功後會如圖所示出現成功提示。
三:配置用戶
要在vsftpd服務器中配置該用戶
1:去掉匿名登錄
默認情況下vsftpd服務器是允許匿名登陸的,這樣非常不安全,所以要把這個選項關閉掉。
首先通過vi命令打開ftp服務器配置文件:
vi /etc/vsftpd/vsftpd.conf
然後把本來的
anonymous_enable=YES 修改爲 anonymous_enable=NO
修改完成之後,保存退出。
對使用vi命令不熟悉的請看:Linux中Vi編輯器之簡單常用命令
2:限制用戶訪問
創建的ftptest用戶所擁有的目錄是 /home/ftproot/ftptest,如果不做限制,那麼使用ftptest登陸之後可以切換到其他敏感目錄去,比如切換到/usr目錄去,這樣就存在巨大的安全隱患。 爲了規避這個隱患,需要限制ftptest用戶只能通過ftp訪問到 /home/ftproot/ftptest 目錄以及子目錄。
配置辦法:
首先通過vi命令打開ftp服務器配置文件:
vi /etc/vsftpd/vsftpd.conf
找到:
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list 或 #chroot_list_file=/etc/chroot_list
並修改爲:
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
注:
chroot_list_enable=YES: 表示對用戶訪問進行限制
chroot_list_file=/etc/vsftpd/chroot_list 表示對chroot_list裏面指定的用戶進行限制
修改完成之後,保存退出。
3:用戶列表
在chroot_list中添加ftptest用戶,首先通過vi命令打開chroot_list文件(此文件本來是空的):
vi /etc/vsftpd/chroot_list
然後增加一行:
ftptest
修改完成之後,保存退出。
4:允許寫權限
vsftpd服務器,一旦某個用戶被限制訪問了,那麼默認情況下,該用戶的寫權限也被剝奪了。 這就導致ftp客戶端連接上服務器之後無法上傳文件。這個時候,就需要打開此用戶的寫權限,請按照如下辦法操作:
首先通過vi命令打開ftp服務器配置文件:
vi /etc/vsftpd/vsftpd.conf
在最後面新加一行:allow_writeable_chroot=YES
修改完成之後,保存退出。
在這一塊當時糾結很久,通過百度找到一篇講解,不懂的朋友可以查看這篇博客,講解的通俗易懂!
vsftpd 配置:chroot_local_user與chroot_list_enable詳解
四:配置端口
vsftpd有兩種端口:
一種是21端口,用來監聽客戶端連接請求的。 這個一般說來是固定的,就一直使用21端口。
一種是,一旦獲取到請求之後,再專門用戶服務端和客戶端傳輸數據的端口。 (安裝用的這種)
1:配置端口
打開配置文件:
vi /etc/vsftpd/vsftpd.conf
在最後添加:
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30010
這表示使用被動模式,用於傳輸數據的端口分配從30000-30010之間。
在後續的Linux開放端口教程中也會做相應的配合工作。
五:用戶鑑權
因爲用戶 ftptest 是 nologin的,所以存在鑑權的問題。 如果鑑權問題不解決,就是永不停息的 530錯誤。。。搞死寶寶了
解決辦法有如下兩種:
1:方式一: pam.d/vsftpd 文件
vi /etc/pam.d/vsftpd
註釋掉/etc/pam.d/vsftpd文件裏這一行:#auth required pam_shells.so
這樣不去鑑權,從而允許 ftptest 這種 nologin用戶登錄 ftp 服務器.
2:方式二:shells 文件
vi /etc/shells
在/etc/shells文件裏面增加一行:/sbin/nologin
這樣允許不能登錄系統的用戶通過鑑權
六:重啓服務器
service vsftpd restart
但是centos7之後,改用的命令是如下方式:
systemctl restart vsftpd.service
最後執行查看狀態,以查看重啓成功了
service vsftpd status
systemctl status vsftpd.service
bug解決方案:開啓selinux權限
VSFTPD是一個FTP服務器程序,然後SELinux是CentOS的防火牆組件。由於 vsftpd 默認被 SELinux 攔截,所以會遇到的FTP以下的問題:
1.226 Transfer done (but failed to open directory).(傳輸完成,但是打開路徑失敗)
2.550 Failed to change directory(更改路徑失敗)
3.553 Could not create file.
4.或者乾脆在發送了LIST命令以後,服務器沒響應,超時斷開。
遇到這樣的問題,通常是vsftpd 沒有足夠的權限,很有可能是被SELinux阻止了。
查看命令:getsebool -a | grep ftp
getsebool -a | grep
ftpd
#以下是顯示出來的權限,off是關閉權限,on是打開權限
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
其中,ftp_home_dir和allow_ftpd_full_access必須爲on 才能使vsftpd 具有訪問ftp根目錄,以及文件傳輸等權限。
設置命令:setsebool -p xxxxxx on
setsebool -P allow_ftpd_full_access on
setsebool -P ftp_home_dir on