2, 設置vsftp開機自啓動:chkconfig --level 35 vsftpd on
3, 啓動vsftpd守護進程:Service vsftpd start
4, 開啓iptables防火牆21端口-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT ,然後重啓service iptables restart
5, 截止到現在:
- a. Vsftpd配置文件:/etc/vsftpd/vsftpd.conf
- b. 系統用戶ftp(默認無密碼)已經可以作爲vsftp的匿名用戶來使用。
- c. 從/etc/passwd中的值ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin可以看出:根目錄 /var/ftp/, 禁止控制檯登陸,也就是該用戶只能進行ftp訪問。
- d. anon_upload_enable=YES,anon_mkdir_write_enable=YES被註釋掉,即默認匿名用戶不可上傳文件,也不可以在服務器上創建目錄。
- e. port_enable=YES,即默認情況下,FTP PORT主動模式被啓用
- f. connect_from_port_20=YES,即默認情況下,FTP PORT主動模式進行數據傳輸時使用20端口(ftp-data)。YES使用,NO不使用。
- g. ftp_data_port=port number,設定ftp數據傳輸端口(ftp-data)值。默認值爲20。此參數用於PORT FTP模式。
- h. pasv_enable=YES,即默認情況下,FTP PASV被動模式被啓用。但是由於防火牆設置的原因,默認情況下,FTP PASV被動模式使用FTP會失敗。
- i. listen=YES,即默認情況下,vsftpd以單例模式監聽IPv4 socket端口。該命令不能和listen_ipv6同時使用。因此如果要同時啓用對IPv4和IPv6的支持的話,必須同時運行2份vsftpd,每份vsftpd包含自己的配置文件(一個監聽IPv4,一個監聽IPv6)
- j. windows cmd下使用命令 ftp serverip,然後在彈出的提示畫面中輸入用戶名“ftp”就能正常登錄到ftp服務器。執行命令ls,從服務器端返回的如下信息:“200 PORT command successful. Consider using PASV.150 Here comes the directory listing.”中我們就可以看出,這個ftp連接執行在PORT主動模式下
- k. 使用Winscp、FileZilla連接時,會發現ftp用戶能正常登錄,但是list命令執行超時。這是因爲默認情況下,這些客戶端的FTP都運行在PASV被動模式下,而vsftp服務器由於沒有對PASV端口範圍及相應的iptables防火牆做設置,數據傳輸的連接被阻塞導致命令執行超時。當客戶端強制啓用PORT主動模式連接後,就能正常使用ftp功能。
- l. FileZilla強制啓用FTP PORT主動訪問方式:Edit->Setting->Connection->Ftp->Transfer Mode->Select “Active” and uncheck “Allow fall back to other transfer mode on failure”
- m. Winscp強制啓用FTP PORT主動訪問方式:在Winscp的login登錄界面中,選擇ftp,然後勾上“Advanced options”,選中左邊導航中的Connection欄目,然後在彈出畫面上不選中“Passive Mode”。
6, 匿名用戶上傳下載
- a. anonymous_enable=YES
- b. anon_upload_enable=YES
- c. anon_mkdir_write_enable=YES
- d. 目錄權限設置:修改/var/ftp/pub的目錄權限爲744,並把目錄的owner和group都改成ftp(ftp用戶必須有可執行x權限,否則在執行ftp命令CWD pub時,會報錯誤:Response: 550 Failed to change directory. Error: Failed to retrieve directory listing。匿名用戶下載是使用的是nobody這個用戶,所以權限相應的other這個位置要有R權限才能被下載。)
- e. chown ftp.ftp /var/ftp/pub
- f. chmod 744 /var/ftp/pub
- g. /var/ftp使用默認的權限755以及默認的owner、group:root
- h. 如下關閉selinux,否則上傳文件時報錯誤553 Could not create file. Error: Critical file transfer error。也可以不關閉selinux,在selinux中設置ftp例外,參考:
- i. /etc/selinux/config文件中的SELINUX=enforcing,改成SELINUX=permissive,機器reboot(如果不想重啓機器,也可以執行命令setenforce 0;setenforce 1 設置SELinux 成爲enforcing模式;setenforce 0 設置SELinux 成爲permissive模式。)
- j. 上傳後的文件不能被直接下載,如果需要可以直接被下載,要設置匿名用戶上傳文件時的掩碼anon_umask=073
- k. 匿名用戶重命名,刪除權限設置anon_other_write_enable=YES
- l. no_anon_password=YES #匿名用戶登錄時不詢問口令
7, 由於默認情況下,匿名ftp用戶的PASV模式訪問被防火牆阻塞,啓用PASV模式訪問
- a. pasv_enable=YES,即默認情況下,FTP PASV被動模式被啓用。
- b. pasv_min_port=30000 ,設定在PASV模式下,建立數據傳輸所可以使用port範圍的下界和上界,0 表示任意(1024 – 65535端口)。默認值爲0。把端口範圍設在比較高的一段範圍內,比如30000-31000。
- c. pasv_max_port=31000
- d. 防火牆設置:-A INPUT -m state --state NEW -m tcp -p tcp --dport 30000:31000 -j ACCEPT ######同時可以用參數-s 192.168.0.0/16來限制客戶端IP範圍,以這種方式增加安全性。
- e. netstat -ap | grep ftp 查看服務器端ftp數據傳輸時使用的端口:tcp 1455572 0 192.168.0.1:30661 192.168.0.2:63731 ESTABLISHED 1746/vsftpd(下載)
tcp 0 57032 192.168.0.1:30886 192.168.0.2:63750 ESTABLISHED 1785/vsftpd(上傳)
8,禁用匿名用戶,啓用系統本地用戶
- a. anonymous_enable=NO 禁止匿名用戶登錄 local_enable=YES 允許本地用戶登錄
- b. write_enable=YES #本地用戶可以上傳(全局控制) 刪除,重命名
- c. local_umask=022 #本地用戶上傳文件的umask,上傳文件默認權限644(666-022),上傳文件夾默認權限755(777-022)
- d. 關閉selinux,否則上傳文件時報錯誤553 Could not create file. Error: Critical file transfer error。也可以不關閉selinux,在selinux中設置ftp例外,參考:
- e. userlist_enable=yes 啓用/etc/vsftpd/user_list列表
- f. userlist_deny=no 只允許/etc/vsftpd/user_list列表中的用戶登錄(ftpusers限制仍然起作用)
- g. chroot_list_enable=NO,chroot_local_user=YES,所有的用戶均不能切換到其他目錄。
- h. useradd –d /ftp –s /bin/false prj 添加本地系統的ftp用戶prj,並設置用戶home目錄,禁止shell登錄,設置密碼passwd prj。默認創建的/ftp目錄owner是prj,權限700。
- i. 把用戶prj加到user_list列表文件中
- j. user_config_dir=/etc/vsftpd/userconf #設置用戶的單獨配置文件,用哪個帳戶登陸就用哪個帳戶命名,實現不同用戶不同權限(1,文件格式、屬性和主配置文件一致 2,文件名沒有.conf後綴 3,這裏的屬性會覆蓋主配置文件相應的屬性 4,並不是所有屬性放這裏都會起作用)
- k. 建立目錄/etc/vsftpd/userconf,並創建ftp用戶名想對應的文件prj,在文件中用local_root屬性指定prj用戶登錄後進入的目錄。還可以設置屬性:cmds_allowed,local_umask=022, local_max_rate限速等
- l. 編輯/etc/pam.d/vsftp文件,註釋掉auth required pam_shells.so(這個語句的意思是隻有包含shell的用戶才能登錄)
- m. ftpd_banner定製ftp登錄時的歡迎信息
- n. max_clients=100 #FTP的最大連接數
- o. max_per_ip=5 #每IP的最大連接數
- p. vsftpd服務器重啓
9,禁用匿名用戶,啓用虛擬FTP用戶
- a. anonymous_enable=NO 禁止匿名用戶登錄
- b. local_enable=YES 允許本地用戶登錄,雖然虛擬用戶不是操作系統用戶,但是最終還是關聯到虛擬宿主用戶身上,因此,這裏屬性還是要設置爲yes
- c. pam_service_name=vsftpd #設置PAM使用的名稱,默認值爲/etc/pam.d/vsftpd。
- d. guest_enable=YES 啓用虛擬用戶登錄
- e. guest_username=ftp #這裏設置虛擬用戶的宿主用戶。默認值爲ftp。
- f. virtual_use_local_privs=YES/NO #當該參數激活(YES)時,虛擬用戶與其宿主用戶有相同的權限。 當此參數關閉(NO)時,虛擬用戶與匿名用戶有相同的權限。默認情況下此參數是關閉的(NO)。
- g. 用db_load生成虛擬用戶數據庫
- h. 修改pam.d下的vsftpd文件,修改用戶認證方式
- i. …
10,ssl加密的vsftp(vsftp with OpenSSL)參考:加密ssl vsftp、ftp隱式加密&顯式加密
11,vsftp配置用戶磁盤配額(磁盤限額參考:Virtualbox下爲CentOS增加新硬盤、Linux添加新硬盤、vsftp配置用戶磁盤配額(磁盤限額)
- // 匿名用戶設置
- anonymous_enable=YES
- no_anon_password=YES
- anon_root=/var/ftp
- anon_umask=073
- anon_max_rate=
- anon_upload_enable=YES
- anon_mkdir_write_enable=YES
- anon_other_write_enable
- chown_uploads
- chown_username
- // 本地用戶設置
- anonymous_enable=NO
- write_enable=YES
- userlist_enable=yes
- userlist_deny=no
- chroot_list_enable=NO
- chroot_local_user=YES
- user_config_dir=/etc/vsftpd/userconf
- // 本地用戶設置 - 各用戶獨立設置屬性
- local_root
- local_umask=022
- local_max_rate
vsftpd日誌:默認情況下,vsftp在/var/log/xferlog文件中記錄Wu-ftpd格式的日誌(它會記錄上傳和下載的動作)。通過設置dual_log_enable和log_ftp_protocol,可以啓用vsftp自己的日志,默認日誌文件/var/log/vsftpd.log,其中會記錄所有的ftp命令日誌,看到的內容和FTP客戶端FileZilla中顯示的內容一致!所以調試錯誤的時候,貌似也沒有開啓的必要。ftp登錄或者操作出問題的時候,主要看返回的錯誤代碼是多少,然後找可能的原因。如553 Could not create file.
- xferlog_enable=yes/no //是否啓用 xferlog 日誌格式
- xferlog_std_format=yes/no //是否採用標準格式記錄日誌
- xferlog_file=/path/to/logfile //xferlog 日誌文件所在位置,默認爲/var/log/xferlog
- dual_log_enable=yes/no //是否採用VSFTPd自己的日誌記錄方式
- log_ftp_protocol=yes/no //是否記錄所有的ftp命令日誌
- syslog_enable=yes/no //是否將日誌信息寫入系統日誌/var/log/messages中
常見ftp錯誤代碼:
- Connect 連接被拒絕: 可能原因是vsftpd服務沒被啓動
- 530 Permission denied: 可能原因是userlist_enable=YES並且/etc/vsftpd/user_list中包含要登錄的ftp用戶名 即user_list禁止了該用戶的登錄、或者可能是沒有指定userlist_file=/etc/vsftpd/user_list
- 530 Login incorrect: 可能原因是登錄的ftp用戶名被包含在禁止登錄列表/etc/vsftpdftpusers中 | 同時要確保用戶名、密碼是正確的 | 也可能是配置文件中少了一行pam_service_name=vsftpd | 檢查/etc/pam.d/vsftpd 文件裏面lib的路徑 | 編輯/etc/pam.d/vsftp文件,註釋掉auth required pam_shells.so(這個語句的意思是隻有包含shell的用戶才能登錄)
- 530 Non-anonymous sessions must use encryption.:服務器的強制,非匿名用戶必須使用加密連接
- 500 OOPS: cannot open user list file:可能原因是不存在文件“/etc/vsftpd/user_list”或文件中不存在該帳戶,解決:解決: cho username >> /etc/vsftpd/user_list
- 500 OOPS: cannot open chroot() user list file | 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list:可能原因是不存在文件“/etc/vsftpd/chroot_list”
- 500 OOPS: missing value in config file: 可能原因是配置文件“=”等號前值有問題,或只有一個空格
- 500 OOPS: bad bool value in config file: 可能原因是配置文件=”等號後值有問題
- 500 OOPS: unrecognised variable in config file: 可能原因是參數前有空格
- 500 OOPS: chdir, 500 OOPS: child died, 500 OOPS: chroot:可能原因是用戶主目錄沒有權限或沒有主目錄,或者還是selinux影響的
- 500 OOPS: vsftpd: both local and anonymous access disabled!匿名用戶和本地用戶登錄都被禁用
- GnuTLS error -12: A TLS fatal alert has been received.:received.:Filezilla最新版本認爲vsftpd默認的加密算法"DES-CBC3-SHA"不夠安全而拒絕連接導致的。有兩種辦法解決該問題,一是降級你的Filezilla客戶端版本到3.5.3以下,二是更改服務器端vsftpd的配置。增加屬性:ssl_ciphers=HIGH
- ECONNREFUSED - Connection refused by server: 當啓用隱式ssl連接,用filezilla、winscp客戶端連接時報錯,因爲vsftpd此時服務器端的端口還是21,但是客戶端確以990來連接。修改客戶端連接時使用的參數或者服務器的通過參數listen_port設置端口爲990,問題解決