1.卸載系統已經存在的ftp服務器
因為是源碼安裝,所以不能通過rpm -qa的方式查看是否已經安裝ftp服務器,可以通過find / | grep vsftp*方式查看系統中存在哪些與vsftpd相關的文件,找出來通過rm刪除。
以下刪除代碼為參考:
rm /usr/local/sbin/vsftpd rm /usr/local/man/man5/vsftpd.conf.5 rm /usr/local/man/man8/vsftpd.8 rm /etc/xinetd.d/vsftpd rm -rf /etc/vsftpd
2.解壓源碼包
tar -zxvf vsftpd-3.0.0.tar.gz
編碼解決:
vi opts.c
將if (str_equal_text(&p_sess->ftp_arg_str,"UTF8 ON"))
更改成if (str_equal_text(&p_sess->ftp_arg_str,"DISABLE UTF8 ON"))
注意:安裝之前,先查看系統是否為64位(用getconf LONG_BIT命令),需要更改vsf_findlibs.sh文件庫中lib 路徑,命令如下:
sed -i 's/lib\//lib64\//g' vsf_findlibs.sh
3.安裝
完成以上步驟,到解壓目錄
3.1 查看系統版本,確定合適版本的ftp壓縮包
cat /etc/issue
cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
tar -zxvf vsftpd-3.0.0.tar.gz
3.2 查看系統是32位還是64位的
getconf LONG_BIT
“o hash.o tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o seccompsandbox.o -Wl,-s -fPIE -pie -Wl,-z,relro -Wl,-z,now `./vsf_findlibs.sh`/usr/bin/ld: cannot find -lcapcollect2: ld 返回 1make: *** [vsftpd] 錯誤 1”
3.3 編譯與安裝
cp vsftpd.conf /etc/vsftpd
cp Redhat/vsftpd.pam /etc/pam.d/
mv /etc/pam.d/vsftpd.pam /etc/pam.d/vsftpd
3.4 添加用戶並指定目錄
添加用戶ftp123,並指定用戶家目錄/data/ftp_dir
useradd -d /data/ftp_dir/ ftp123
passwd ftp123
3.5 修改目錄權限
chmod 775 /data/ftp_dir/
ll
3.6 修改配置文件/etc/vsftpd/vsftpd.conf
3.7 修改防火牆,並重啟
vi /etc/sysconfig/iptables/
-A OUTPUT -p tcp --sport 20 -j ACCEPT -A OUTPUT -p tcp --sport 21 -j ACCEPT -A OUTPUT -p tcp --sport 2100 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 2100 -j ACCEPT
再重啟
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf
4.驗證
yum install ftp
4.2.2 登陸
ftp ip地址
出現以上提示表示登陸成功了
ftp> put (local-file) index.html (remote-file) index.html local: index.html remote: index.html 227 Entering Passive Mode (172,16,4,166,8,52). 150 Ok to send data. 226 Transfer complete. 2381 bytes sent in 0.00856 secs (278.25 Kbytes/sec)
下面看一個完整操作

5.安裝常見問題
5.1 530 Login incorrect
解決思路:修改vsftpd.conf配置文件,添加pam_service_name=vsftpd配置,注意這里的配置文件值為:vsftpd,對應的是/etc/pam.d/vsftpd文件,所以復制到pam.d目錄的vsftpd.pam需要進行改名;重啟ftp驗證。
如果還不能解決,可以考慮編輯vi /etc/pam.d/vsftpd,將文件中的所以lib替換為lib64,再重啟ftp即可。
5.2 500 illegal port command
解決思路:出現這個問題時,可以考慮vsftpd連接模式問題,vsftpd存在兩種連接模式,一個是主動連接,一個是被動連接。首先將ftp客戶端的連接方式改為“被動連接”模式再進行ftp的連接。
如果還不行,可以考慮是不是服務器端口問題,比如服務器限制了只能訪問幾個端口,這是需要在配置文件中進行如下配置:
pasv_enable=YES //表示啟動被動模式
pasv_min_port=9090 //被動模式最小端口
pasv_max_port=9091 //被動模式最大端口
pasv_address=172.16.4.160 //被動模式連接IP
注意pasv_address這個配置,這個配置默認為none,不進行設置,則客戶端在連接的時候會先連接當前服務器內網IP地址,之后才連接外網IP地址,所以進行配置的時候,要指定地址,這樣再連接的時候才會直接連接外網地址。
5.3 500 OOPS: cannot change directory:/home/xxxx
解決思路:遇到這個問題可以考慮是否是服務器的selinux防火牆開啟了,可以通過一下命令進行防火牆關閉:setsebool -P ftpd_disable_trans 1,需要重啟ftp,service vsftpd restart
還可以通過命令:sestatus -b | grep ftp查看ftp的狀態,最主要查看ftp_home_dir的值是on 還是off,如果是off,通過命令setsebool -P ftp_home_dir on設置為on
5.4 530 Permission denied
解決思路:遇到這個問題可以考慮是否配置userlist_enable選項,查看/etc/vsftpd.user_list或者/etc/vsftpd/vsftpd.user_list是否限制了當前用戶,將該用戶從文件中刪除或者設置userlist_deny=NO
5.5 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解決思路:這是因為從2.3.5之后,vsftpd增強了安全檢查,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權限了!如果檢查發現還有寫權限,就會報該錯誤。
要修復這個錯誤,可以在vsftpd的配置文件/etc/vsftpd/vsftpd.conf添加一行“ allow_writeable_chroot=YES”
5.6 500 Illegal PORT command.
狀態: 正在連接 218.65.241.60:12021...狀態: 連接建立,等待歡迎消息...狀態: 不安全的服務器,不支持 FTP over TLS。狀態: 已登錄狀態: 讀取目錄列表...命令: PWD響應: 257 "/lutong/tomcat_admin_9090/webapps/boss_sync_user_data"命令: TYPE I響應: 200 Switching to Binary mode.命令: PORT 172,16,4,200,201,1響應: 500 Illegal PORT command.命令: PASV響應: 227 Entering Passive Mode (90,114,3,18,8,52).命令: LIST錯誤: 無法建立數據連接: ETIMEDOUT - 連接嘗試超時錯誤: 50 秒后無活動,連接超時
用FileZilla工具連接時,發現,報如上錯誤,這是因為沒有指定被動模式,在/etc/vsftpd/vsftpd.conf最后添加如下幾行,
#是否允許被動模式 pasv_enable=YES #下面兩行設置被動模式連接時的端口范圍,建議配置大一點的,安全性高 pasv_max_port=60000 pasv_min_port=60010 pasv_address=ftp服務器ip #vsftp服務器指定IP地址
然后在/etc/sysconfig/iptables添加開放端端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 60000:60010 -j ACCEPT
即可
5.7 421 Timeout.
修改/etc/vsftpd/vsftpd.comf的data_connection_timeout的值更大即可
6.配置文件
/etc/vsftpd/vsftpd.conf

#禁止匿名訪問 anonymous_enable=NO #開放本地用戶的寫權限 write_enable=YES #設置本地用戶的文件生成掩碼為022,默認值為077 local_umask=022 #當切換到目錄時,顯示該目錄下的.message隱含文件的內容 #這是由於默認情況下有message_file=.message的 設置 dirmessage_enable=YES #激活上傳和下載日志 xferlog_enable=YES #啟用FTP數據端口的連接請求 connect_from_port_20=YES #xferlog日志文件 xferlog_file=/var/log/xferlog #使用標准的ftpd xferlog日志格式 xferlog_std_format=YES #設置空閑的數據連接的的中斷時間 data_connection_timeout=120 #設置連接服務器后的歡迎信息 ftpd_banner=Welcome to KJGG FTP service. #下面四句配置保證只有/etc/vsftpd/user_list 的用戶可以登陸 local_enable=YES #允許本地用戶登錄 userlist_file=/etc/vsftpd/user_list userlist_deny=NO userlist_enable=YES #下面兩句配置保證只有/etc/vsftpd/chroot_list的用戶切換目錄 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list_file #設置PAM認證服務的配置文件名稱,該文件存放 在/etc/pam.d/目錄下 #pam_service_name=vsftpd #tcp_wrappers=YES #開啟監聽 listen=YES #命令通道端口,默認21 listen_port=21 #是否允許被動模式 pasv_enable=YES #下面兩行設置被動模式連接時的端口范圍,建議配置大一點的,安全性高 pasv_max_port=60000 pasv_min_port=60010 #vsftp服務器指定IP地址 pasv_address=ftp服務器ip #這是因為從2.3.5之后,vsftpd增強了安全檢查,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權限了! #如果檢查發現還有寫權限,就會報該錯誤。要修復這個錯誤,需要添加下面一行 allow_writeable_chroot=YES
/etc/vsftpd/chroot_list_file
ftp123
/etc/vsftpd/chroot_list_file
ftp123
/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
7.其他
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &