vsftpd 是一個 UNIX 類操做系統上運行的服務器的名字,它能夠運行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持不少其餘的 FTP 服務器不支持的特徵。
vsftpd 的名字表明"very secure FTP daemon", 安全是它的開發者 Chris Evans 考慮的首要問題之一。
好比:linux
FTP會話時包含了兩個通道,一個叫控制通道,一個叫數據通道。shell
FTP協議中,控制鏈接均有客戶端發起,而數據鏈接有兩種工做方式:PORT方式和PASV方式數據庫
FTP 客戶端首先和FTP Server的TCP 21端口創建鏈接,經過這個通道發送命令,客戶端須要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什麼端口(一個大於1024的端口)接收數據。在傳送數據的時候,服務器端經過本身的TCP 20端口發送數據。 FTP server必須和客戶端創建一個新的鏈接用來傳送數據。centos
在創建控制通道的時候和PORT模式相似,當客戶端經過這個通道發送PASV 命令的時候,FTP server打開一個位於1024和5000之間的隨機端口而且通知客戶端在這個端口上傳送數據的請求,而後FTP server 將經過這個端口進行數據的傳送,這個時候FTP server再也不須要創建一個新的和客戶端之間的鏈接傳送數據。
若是從C/S模型這個角度來講,PORT對於服務器來講是OUTBOUND,而PASV模式對於服務器是INBOUND,這一點請特別注意,尤爲是在使用防火牆的企業裏,這一點很是關鍵,若是設置錯了,那麼客戶將沒法鏈接。安全
vsftpd運行有兩種模式,在RPM包管理的系重審統,大可能是由Fedora/Redhat 開發而來,對於這樣的系統有xinted服務器一說;對於非RPM包管理的系統,通常沒有xinted這一說。爲了保證本文檔的統一,咱們都不要用xinetd模式,而用initd運行模式來啓動和管理服務器,也就是獨立運行模式。
像其它守護程序同樣,vsftpd提供了standalone和inetd(inetd或xinetd)兩種運行模式。簡單解釋一下, standalone一次性啓動,運行期間一直駐留在內存中,優勢是對接入信號反應快,缺點是損耗了必定的系統資源,所以常常應用於對實時反應要求較高的專業FTP服務器。inetd偏偏相反,因爲只在外部鏈接發送請求時才調用FTP進程,所以不適合應用在同時鏈接數量較多的系統。此外,inetd模式不佔用系統資源。除了反應速度和佔用資源兩方面的影響外,vsftpd還提供了一些額外的高級功能,如inetd模式支持per_IP(單一IP)限制,而 standalone模式則更有利於PAM驗證功能的應用。服務器
文件 | 說明 |
---|---|
/etc/vsftpd/vsftpd.conf | 主配置文件 |
/usr/sbin/vsftpd | Vsftpd的主程序 |
/etc/pam.d/vsftpd | PAM認證文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止訪問的用戶來自/etc/vsftpd/ftpusers文件中的用戶) |
/etc/vsftpd/ftpusers | 禁止使用vsftpd的用戶列表文件。記錄不容許訪問FTP服務器的用戶名單,管理員能夠把一些對系統安全有威脅的用戶帳號記錄在此文件中,以避免用戶從FTP登陸後得到大於上傳下載操做的權利,而對系統形成損壞。(注意:linux-4中此文件在/etc/目錄下) |
/etc/vsftpd/user_list | 禁止或容許使用vsftpd的用戶列表文件。這個文件中指定的用戶缺省狀況(即在/etc/vsftpd/vsftpd.conf中設置userlist_deny=YES)下也不能訪問FTP服務器,在設置了userlist_deny=NO時,僅容許user_list中指定的用戶訪問FTP服務器。(注意:linux-4中此文件在/etc/目錄下) |
/var/ftp | 匿名用戶主目錄;本地用戶主目錄爲:/home/用戶主目錄,即登陸後進入本身家目錄 |
/var/ftp/pub | 匿名用戶的下載目錄,此目錄需賦權根chmod 1777 pub(1爲特殊權限,使上載後沒法刪除) |
首先來簡化一下主配置文件:session
[root@centos7 ~]# cp /etc/vsftpd/vsftpd.conf{,.bak} #備份主配置文件 [root@centos7 ~]# egrep "^[a-z]|^#[a-z]" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
說明app
[root@centos7 ~]# cat /etc/vsftpd/vsftpd.conf anonymous_enable=YES 說明:是否容許匿名登陸FTP服務器,默認設置爲YES容許 local_enable=YES 說明:是否容許本地用戶(即linux系統中的用戶賬號)登陸FTP服務器,默認設置爲YES容許本地用戶登陸後會進入用戶主目錄,而匿名用戶登陸後進入匿名用戶的下載目錄/var/ftp/pub write_enable=YES 說明:是否容許本地用戶對FTP服務器文件具備寫權限,默認設置爲YES容許 local_umask=022 說明:缺省掩碼,本地用戶默認掩碼爲077 #anon_upload_enable=YES 說明:是否容許匿名用戶上傳文件,須將全局的write_enable=YES。默認爲YES #anon_mkdir_write_enable=YES 說明:是否容許匿名用戶建立新文件夾 dirmessage_enable=YES 說明:是否激活目錄歡迎信息功能;當用戶用CMD模式首次訪問服務器上某個目錄時,FTP服務器將顯示歡迎信息默認狀況下,歡迎信息是經過該目錄下的.message文件得到的 xferlog_enable=YES 說明:是否讓系統自動維護上傳和下載的日誌文件;默認狀況該日誌文件爲/var/log/vsftpd.log,也能夠經過下面的xferlog_file選項對其進行設定 connect_from_port_20=YES 說明:是否設定FTP服務器將啓用FTP數據端口的鏈接請求;ftp-data數據傳輸,21爲鏈接控制端口 #chown_uploads=YES 說明:設定是否容許改變上傳文件的屬主,與下面一個設定項配合使用 #chown_username=whoever 說明:設置想要改變的上傳文件的屬主 #xferlog_file=/var/log/xferlog 說明:設定系統維護記錄FTP服務器上傳和下載狀況的日誌文件 xferlog_std_format=YES 說明:是否以標準xferlog的格式書寫傳輸日誌文件 #idle_session_timeout=600 說明:設置數據傳輸中斷間隔時間,此語句表示空閒的用戶會話中斷時間爲600秒 #data_connection_timeout=120 說明:設置數據鏈接超時時間 #nopriv_user=ftpsecure 說明:運行vsftpd須要的非特權系統用戶,缺省是nobody #async_abor_enable=YES 說明:是否識別異步ABOR請求。 #ascii_upload_enable=YES #ascii_download_enable=YES 說明:是否以ASCII方式傳輸數據。默認狀況下,服務器會忽略ASCII方式的請求。 #ftpd_banner=Welcome to blah FTP service. 說明:登陸FTP服務器時顯示的歡迎信息 #deny_email_enable=YES 說明:黑名單設置 #banned_email_file=/etc/vsftpd/banned_emails 說明:當上面的deny_email_enable=YES時,能夠利用這個設定項來規定哪些郵件地址不可登陸vsftpd服務器 #chroot_local_user=YES #chroot_list_enable=YES 說明:用戶登陸FTP服務器後是否具備訪問本身目錄之外的其餘文件的權限;設置爲YES時,用戶被鎖定在本身的home目錄中 #chroot_list_file=/etc/vsftpd/chroot_list 說明:被列入此文件的用戶,在登陸後將不能切換到本身目錄之外的其餘目錄 #ls_recurse_enable=YES 說明:是否容許遞歸查詢。默認爲關閉,以防止遠程用戶形成過量的I/O listen=NO 說明:是否容許監聽IPv4 listen_ipv6=YES 說明:設定是否支持IPV6 pam_service_name=vsftpd 說明:設置PAM外掛模塊提供的認證服務所使用的配置文件名,即/etc/pam.d/vsftpd文件 userlist_enable=YES 說明: 是否容許ftpusers文件中的用戶登陸FTP服務器;若此項設爲YES,則user_list文件中的用戶容許登陸FTP服務器 tcp_wrappers=YES 說明:是否使用tcp_wrappers做爲主機訪問控制方式。
在FTP服務器的管理中,不管對本地用戶仍是匿名用戶,對於FTP服務器資源的使用都須要進行控控制,避免因爲負擔過大形成FTP服務器運行異常,能夠添加如下配置項對FTP客戶機使用FTP服務器資源進行控制:異步
max_client 說明:設置項 用於設置FTP服務器所容許的最大客戶端鏈接數,值爲0時表示不限制。例如max_client=100表示FTP服務器的全部客戶端最大鏈接數不超過100個。 max_per_ip 說明:設置項 用於設置對於同一IP地址容許的最大客戶端鏈接數,值爲0時表示不限制。例如max_per_ip=5表示同一IP地址的FTP客戶機與FTP服務器創建的最大鏈接數不超過5個。 local_max_rate 說明:設置項 用於設置本地用戶的最大傳輸速率,單位爲B/s,值爲0時表示不限制。例如local_max_rate=500000表示FTP服務器的本地用戶最大傳輸速率設置爲500KB/s. anon_max_rate 說明:設置項 用於設置匿名用戶的最大傳輸速率,單位爲B/s,值爲0表示不限制。例如ano_max_rate=200000,表示FTP服務器的匿名用戶最大傳輸速率設置爲200KB/s.
數字 | 含義 |
---|---|
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 | 未執行請求的的命令,名稱不正確 |
虛擬用戶是指在FTP服務器上擁有帳號,而且該帳號只能用於文件傳輸服務的用戶,也稱做Guest用戶。該類用戶能夠經過輸入帳號以及口令來進行受權登陸。登陸入系統後,其登陸目錄爲指定的目錄。通常狀況下,該類用戶既能夠下載也能夠上傳文件。
vsftpd的虛擬用戶採用單獨的用戶名/口令保存方式,與系統帳號(passwd/shadow)分離,這大大加強了系統的安全性。vsftpd能夠採用數據庫文件來保存用戶/口令,如hash;也能夠將用戶/口令保存在數據庫服務器中,如MySQL等。vsftpd驗證虛擬用戶,則採用PAM方式。因爲虛擬用戶的用戶名/口令被單獨保存,所以在驗證時,vsftpd需要用一個系統用戶的身份來讀取數據庫文件或數據庫服務器以完成驗證,這就是guest用戶,這正如同匿名用戶也須要有一個系統用戶ftp同樣。固然,guest用戶也能夠被認爲是用於映射虛擬用戶。async
[root@centos7 ~]# yum -y install vsftpd
[root@centos7 ~]# rpm -qa | grep vsftpd vsftpd-3.0.2-22.el7.x86_64
[root@centos7 ~]# systemctl start vsftpd [root@centos7 ~]# systemctl status vsftpd ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2017-11-13 04:13:02 CST; 9min ago Process: 1633 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS) Main PID: 1634 (vsftpd) CGroup: /system.slice/vsftpd.service └─1634 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Nov 13 04:13:02 centos7 systemd[1]: Starting Vsftpd ftp daemon... Nov 13 04:13:02 centos7 systemd[1]: Started Vsftpd ftp daemon.
[root@centos7 ~]# mkdir -p /data/user1 /data/user2 [root@centos7 ~]# ls /data/ user1 user2
[root@centos7 ~]# useradd vsftpd -s /sbin/nologin
[root@centos7 ~]# cat > /etc/vsftpd/user_passwd <<EOF user1 123456 user2 123456 EOF
[root@centos7 ~]# db_load -T -t hash -f /etc/vsftpd/user_passwd /etc/vsftpd/login.db 在/etc/pam.d/vsftpd文件中註釋原有條目並添加如下兩行: auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
[root@centos7 ~]# echo "vsftpd" > /etc/vsftpd/chroot_list
[root@centos7 ~]# grep -v "#" /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES 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 tcp_wrappers=YES guest_enable=YES guest_username=vsftpd user_config_dir=/etc/vsftpd/user_conf
[root@centos7 ~]# mkdir -p /etc/vsftpd/user_conf
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user1 local_root=/data/user1 write_enable=YES anon_umask=022 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@centos7 ~]# cat /etc/vsftpd/user_conf/user2 local_root=/data/user2 write_enable=YES anon_umask=022 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
[root@centos7 ~]# systemctl restart vsftpd