1、基礎介紹html
1.vsftpd運行模式分爲standalone和xinetd模式,如今生產環境中,絕大多數均採用standalone模式。git
vsftpd一啓動,standalone模式中進程會一直駐留在內存中,當接收到21端口的請求時vsftpd進程會fork出一個子進程去處理鏈接,而原進程繼續監聽21端口。另更加便於PAM驗證的應用(可經過pam_ihosts.so實現單一IP、單一用戶的限制)。github
xinetd模式的話默認是xinetd進程監聽21端口,當網卡收到外部鏈接請求時,xinetd進程會去調用ftp進程,並將21端口收到數據轉交給vsftpd進程處理(鏈接處理完畢後,vsftpd進程會自動退出),而xinetd則繼續監聽21端口(另支持單一IP限制)數據庫
既然vstandlone的模式這麼好,那麼該怎麼配置呢windows
1)首先禁用xinetd進程中的vsftpd,並重啓xinetd服務centos
# grep 'disable' /etc/xinetd.d/vsftpd disable = yes
2)把vsftpd配置文件中的 listen 參數置爲 YES bash
# grep '^listen' /etc/vsftpd/vsftpd.conf listen=YES
2.vsftpd工做模式分主動(PORT)及被動(PASV)2 種,centos及windows等常見系統默認通常採用被動模式鏈接ftp server,因此搭建vsftpd時,推薦使用被動模式。若是需啓用防火牆,能夠在FTP SERVER上限制被動模式數據端口範圍並放行便可。下面咱們來看看這兩種模式的區別。服務器
PORT模式(FTP服務器主動去鏈接客戶端的數據端口): 服務器端口固定,命令端口21,數據端口20。客戶端從任意特權限端口N(N>1024)發起請求鏈接服務器命令端口21,並監聽本機的 N+1端口,併發送FTP命令(port N+1)到服務器,FTP服務器會從本身的數據端口(默認20)主動鏈接客戶端的N+1端口,這樣就完成了數據傳輸通道創建了。併發
PASV模式(FTP服務器數據端口被動的等待客戶來鏈接):客戶端打開2個任意特權端口(N>1024,N+1),並從端口N發起一個鏈接,PASV模式執行PASV命令,並受權服務器鏈接它的數據端口,即N+1。FTP服務器會開啓一個任意的非特權端口P(若是vsftpd.conf沒有限制端口範圍),並向客戶端發送PORT P 命令。而後等待客戶經過 N+1 來鏈接端口P創建數據傳輸通道。app
參考文檔:http://www.javashuo.com/article/p-grdlqeeu-ca.html
2、vsftpd安裝配置
1.安裝
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm # rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm
2.參數以下,具體配置根據業務需求定義
經常使用參數: local_umask=022 本地用戶上傳文件後的默認權限(umask是unix系統的概念,新建的目錄權限爲755,文件644) anon_umask=077 匿名用戶的umask值,默認爲077,及目錄權限是700,文件是 600 anonymous_enable=NO 禁止匿名訪問 listen=YES 運行於standalone mode local_enable=YES 任何非匿名用戶(包含本地及虛擬用戶)都需啓用此參數 max_clients=100 #FTP服務器最大承載用戶數 max_per_ip=4 # 限制一個用戶最多鏈接數爲4 local_max_rate=512000 # 限制本地下載帶寬不能超過500KB anon_max_rate 限制匿名用戶的下載帶寬,單位是bytes/s accept_timeout=60 #超時,以秒計,用於遠程客戶端以PASV模式創建數據鏈接 connect_timeout=60 #超時,以秒計,用於遠程客戶端以PORT模式創建數據鏈接 connect_from_port_20=YES # 控制端口數據走端口20,若是是被動模式,需把此參數改成NO listen_port=8080 #更改監聽端口8080, 默認是21 #anon_upload_enable=YES 容許匿名用戶上傳文件,默認禁止 #anon_mkdir_write_enable=YES 容許匿名用戶建立目錄,默認禁止 user_config_dir=/etc/vsftpd/vsftpd_user_conf 建立虛擬用戶存儲文件 virtual_use_local_privs=NO 虛擬用戶權限與匿名用戶權限相同,虛擬用戶權限單獨設定 chroot_local_user=YES 將全部用戶鎖定在主目錄(vsftpd若是啓用chroot,默認必須保證ftp根目錄不可寫,chmod a-w /vsftp/chenss/) chroot_list_enable=YES 啓動鎖定用戶的名單(NO或註釋爲禁用),若是爲NO,只鎖定chroot_list中限制用戶,YES則代表將全部用戶鎖定在主目錄,而chroot_list中的用戶不鎖定 chroot_list_file=/etc/vsftpd/chroot_list 鎖定用戶名單列表 allow_writeable_chroot=YES 默認爲NO,當啓用chroot並配置些參數爲YES後,虛擬用戶將具有對其根目錄寫權限 dirmessage_enable=YES #用戶切換進入目錄時顯示.message(若是存在)文件的內容 權限參數 userlist_deny 若是userlist_enable爲YES則檢查此項(默認YES) userlist_enable 當值爲YES時,若是userlist_deny爲YES則禁用/etc/vsftpd/user_list文件中帳號,在輸入密碼以前就提示權限拒絕。若是userlist_deny=NO,則表明僅容許此文件中的帳號登錄 虛擬帳號參數: pam_service_name=vsftpd PAM認證文件名。PAM將根據/etc/pam.d/vsftpd進行認證 guest_enable=YES 啓用虛擬用戶功能 guest_username=vsftpd 指定虛擬用戶(無需是系統用戶)的宿主用戶,虛擬用戶今後帳號繼承權限 user_config_dir=/etc/vsftpd/vsftpd_user_conf 設定虛擬用戶我的vsftp的文件存放路徑(配置文件名=虛擬用戶名) anon_upload_enable 若是設置爲YES,匿名用戶將能夠在特定條件下上傳文件,此參數必須激活write_enable,並且ftp用戶必須具有對上傳目錄的寫權限,虛擬用戶默認爲被匿名處理,所以也需啓用此參數 anon_mkdir_write_enable 若是設置爲YES,匿名用戶將能夠建立目錄,條件同anon_upload_enable write_enable 建議主配置文件中不啓用此參數,在虛擬用戶配置中開啓。容許或禁止任意形式的FTP命令寫入
詳細配置參數請參考:https://security.appspot.com/vsftpd/vsftpd_conf.html
被動模式參考配置:
anonymous_enable=NO local_enable=YES write_enable=NO local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=NO xferlog_std_format=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES userlist_deny=YES tcp_wrappers=YES guest_enable=YES guest_username=ftp user_config_dir=/etc/vsftpd/vsftpd_user_conf vsftpd_log_file=/var/log/vsftpd.log pasv_enable=YES pasv_min_port=30000 pasv_max_port=30010
3.虛擬帳號建立
1)建立用戶密碼文本
# cat /etc/vsftpd/logins.txt # 奇數行是帳號,偶數行是密碼 chenss abcdefg test 123456
2)生成虛擬用戶認證文件
# db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
備註:
-T 容許應用程序將文本轉譯載入數據庫
-t 指定載入的數據庫類型,使用hash碼加密
-f 指定帳號密碼文本文件
3)配置認證文件(註釋vsftpd原所有內容,再加如下2行)
# cat /etc/pam.d/vsftpd auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
備註:
auth是指對用戶的用戶名口令進行驗證。
accout是指對用戶的賬戶有哪些權限哪些限制進行驗證。
再後面的/lib64/security/pam_userdb.so表示該條審覈將調用pam_userdb.so這個庫函數進行。
若是是32bit系統,該文件所在位置是/lib/security/pam_userdb.so
若是是64bit系統,該文件所在位置是/lib64/security/pam_userdb.so
最後db=/etc/vsftpd/login則指定了驗證庫函數將到這個指定的數據庫中調用數據進行驗證。其實該文件指的是/etc/vsftpd/login.db文件。注意:db=/etc/vsftpd/login格式是這樣的,去掉.db後綴。
4)建立虛擬用戶配置目錄和文件(虛擬用戶配置文件必須與用戶名一致)
# cat /etc/vsftpd/vsftpd_user_conf/chenss local_root=/vsftp/chenss # 虛擬用戶根目錄 guest_username=vsftp #虛擬用戶的宿主用戶 file_open_mode=0400 # 文件權限 write_enable=YES # 寫權限 anon_upload_enable=YES # 上傳權限 anon_mkdir_write_enable=YES # 建立文件夾權限 virtual_use_local_privs=YES #虛擬用戶和本地用戶有相同的權限(即vsftpd用戶) cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,SIZE,STOR,TYPE,USER,HELP,STAT #受權讀寫,禁止刪除
備註:cmds_allowed詳細信息請參考:http://dreamway.blog.51cto.com/1281816/1045610
5)建立虛擬用戶根目錄(test帳號同chenss)
[root@test2 ~]# mkdir -p /vsftp/chenss [root@test2 ~]# chmod 500 /vsftp/chenss [root@test2 ~]# chown -R vsftpd.vsftpd /vsftp/chenss
其實到了這裏,啓用vsftpd服務便可使用了
3、編譯pam_ihosts.so並加載入PAM認證
1.編譯
# git clone git@github.com:ColumPaget/pam_ihosts.git # ./configure # make # make instal
2.受權chenss用戶只能能過192.168.1.10來訪問ftp:
# cat /etc/pam.d/vsftpd account required /lib/security/pam_ihosts.so user=chenss syslog allow-ip=192.168.1.10 auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
pam_ihosts用法:https://github.com/ColumPaget/pam_ihosts
4、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 未執行請求的的命令,名稱不正確。