FTP
-
FTP概述
-
FTP原理和模式
-
vsftpd
-
vsftpd基礎服務搭建
-
vsftpd基于數據庫的實現虛擬用戶
-
vsftpd基于mysql實現虛擬用戶
-
常見問題
FTP概述
什么是FTP?
FTP是File Transfer Protocol 文件傳輸協議的縮寫,基于網絡來傳輸文件的應用層通信協議。
FTP的功能是什么?
FTP能夠通過網絡來傳輸文件,因為工作在應用層所以不會受到平臺的限制。
FTP原理和模式
原理與工作流程
-
FTP的數據傳輸分為命令數據與文件數據,命令傳輸就是客戶端要執行的命令,服務端收到后返回給客戶端執行結果,如ls等。文件傳輸就是客戶端要傳輸的數據,服務端與客戶端數據連接來傳輸。
-
FTP的服務端與客戶端建立連接大體三個步驟,建立連接,傳輸數據,斷開連接。
-
FTP是基于tcp來傳輸可靠的數據,使用21號端口來建立認證通道,20號端口來建立數據通道。
-
FTP是明文傳輸的。
-
FTP的用戶可分為實體用戶(real user),匿名用戶(anonymous user),訪客用戶(guest user)。
主動模式與被動模式
由于現在的網絡架構中,都會有防火墻來阻止端口與高位端口被主動連接,特別是一般來說20端口是被禁止主動連接的,因為20端口是FTP的數據端口,所以為了解決客戶端或者服務端的防火墻問題,FTP就有了主動和被動兩種模式,通過墻內的一段來主動連接外端的一方,這樣子就不會被防火墻阻擋。
主動模式:一般用于服務端存在防火墻的情況,客戶端無法主動連接至服務端的20數據端口,需要由服務端主動連接至客戶端的高位數據端口。
1. 兩端在建立TCP通信通道后,客戶端會發送port請求與服務端的21號端口認證連接并發送開放用來建立數據連接的高位端口號。 2. 服務端在收到后,會通過20號端口發送ACK響應請求 3. 服務端會通過20端口與客戶端發送的高位端口建立數據連接通道。
被動模式:一般用于客戶端存在防火墻的情況,服務端在收到連接請求后因為客戶端防火墻而無法達到客戶端高位端口,需要客戶端主動連接服務端的數據傳輸端口。
1. 兩端在建立TCP通信通道連接后,客戶端會發送PASV請求給服務端。 2. 服務端在受到PASV端口后就會打開一個高位端口作為數據傳輸端口來響應給客戶端等待客戶端連接。 3. 客戶端在收到響應后,就會去連接響應的端口建立數據連接通道。
我們可以看到以上兩種方式,都是由墻內的一方來發出連接并允許另一端來連接指定端口,墻內的一方就類似是一間房子的主人,而另外一方是客人,客人去訪問主要要實現得到主人的同意,并來給你”開門”你才可以進到這個屋子。
VSFTPD
vsftpD是什么?
vsftpd是基于ftp協議來對網絡數據交換的一種實現,是一個開源的解決方案。
vsftp的功能是什么?
能夠通過配置,搭建ftp服務器,完成基于網絡的數據傳輸功能。
VSFTP的文件
/etc/pam.d/vsftpd pam認證文件。 /etc/vsftpd/ftpusers 限制登陸用戶文件。 /etc/vsftpd/user_list 限制登陸用戶文件。 /etc/vsftpd/vsftpd.conf vsftp的主配置文件。 /usr/sbin/vsftpd 主進程文件
vsftpd.conf的基本屬性
local_root=/var/ftp 指定實體FTP用戶所使用的目錄,如不指定,實體用戶的默認目錄為自己的家目錄。 ftpd_banner=Welcome?。?nbsp; 登陸后的注釋信息。 xferlog_file=/var/log/xferlog 日志存放位置。 ----------------------------------------------------------------------------- listen_port=21 監聽的端口。 local_root=/var/ftp 使用的ftp目錄,全局。 write_enable=YES (NO) 是否允許寫入,全局。 -------------------- local_enable=YES|NO 是否允許實體用戶登陸。 local_max_rate=# 限制real user的傳輸速度,單位為Byte/s,如果為0則表示不限制。 allow_writeable_chroot=YES|NO 是否限制ftp文件夾對實體用戶的W權限,如果為NO,則設置W權限時,會報錯。 ---------------------------------------------------------------------------- anonymous_enable=YES|NO 是否允許匿名用戶登錄,預設為YES,如果關閉則所有的匿名設置屬性都將無效。 anon_root=/path/filename 指定匿名用戶ftp目錄 anon_world_readable_only=YES|NO 是否允許匿名用戶具有下載的權限,預設為YES。 anon_other_write_enable=YES|NO 是否允許匿名用戶具有寫入(W)的權限,如刪除與更改伺服器上的檔案與檔名等權限,預設為NO。 anon_mkdir_write_enable=YES|NO 是否允許匿名用戶具有創建目錄的權限 預設為NO。 anon_upload_enable=YES|NO 是否允許匿名用戶上傳文件,預設為NO ---------------------------------------------------------------------------- guest_enable=YES|NO 所有的實體賬號登陸都視為以guest的身份登陸。 guest_username=username 指定訪客使用哪個用戶的身份。
vsftpd基礎服務搭建
[root@host1 ~]# yum install vsftpd -y 下載安裝vsftpd。 [root@host1 ~]# service vsftpd start 啟動vsftpd進程。 [root@host1 ~]# ss -tnl | grep -e '20' -e '21' 查看端口號20與21. LISTEN 0 32 *:21 *:* 由于20端口是數據傳輸端口,所以并不會啟動監聽,20端口在收到請求后才會打開。 [root@host1 ~]# lftp 192.168.1.1 本地使用lftp來嘗試登陸 lftp 192.168.1.1:~> ls 已匿名用戶登錄成功并嘗試list drwxr-xr-x 2 0 0 4096 Mar 22 18:26 pub 可以看到默認的pub目錄。 lftp 192.168.1.1:/> cd pub cd到pub目錄。 lftp 192.168.1.1:/pub> ls 沒有東西。。。 lftp 192.168.1.1:/pub> bye 退出。
vsftpd基于數據庫文件來實現虛擬用戶
搭建服務:
[root@aliyun ~]# yum install vsftpd -y 下載安裝vsftpd。 [root@aliyun ~]# vim /etc/vsftpd/vsftpd.conf 編輯vsftpd的主配置文件。 local_enable=YES 實體用戶允許登陸。 guest_enable=YES 允許來賓賬號。 guest_username=virtual 來賓賬號使用virtual這個賬號。 pam_service_name=vsftp.db 指定認證文件。 user_config_dir=/etc/vsftpd/vuftp 指定虛擬用戶的配置文件目錄。 virtual_use_local_privs=YES 虛擬用戶擁有實體用戶一樣的權限。 [root@aliyun ~]# vim /etc/vsftpd/vftpuser.txt upload redhat [root@aliyun ~]# rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm 安裝db4-until [root@aliyun ~]# db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db 使用db_load命令生成虛擬用戶口令認證文件。 [root@host1 ~]# vim /etc/pam.d/vsftp.db 創建并寫入認證文件。 auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser 類型為認證 設置為required 傳遞pam_userdb.so參數 數據庫文件在/etc/vsftpd/vftpuser 無需加.db,默認的! account required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser 其他都一樣,類型為信息驗證。 [root@aliyun ~]# useradd -s /sbin/nologin virtual 創建虛擬映射的實體賬號,并不允許登陸。 [root@aliyun ~]# mkdir /etc/vsftpd/vuftp 創建虛擬用戶設定存放目錄。 [root@aliyun ~]# vim /etc/vsftpd/vuftp/upload 設定虛擬用戶的設定文件。 local_root=/tmp/upload upload的目錄為/tmp/upload write_enable=YES 允許寫入。 [root@aliyun ~]# chown virtual:virtual /tmp/upload 更改屬主屬組為virtual。 [root@aliyun ~]# service vsftpd start 啟動vsftpd
測試:
[root@host2 ~]# lftp upload@@172.16.0.1 以xiao的身份訪問ftp服務器。 Password: lftp upload@@172.16.0.1:/> ls -rw-r--r-- 1 1001 1001 73 Apr 21 12:32 alias.sh -rw-r--r-- 1 1001 1001 75528192 Apr 02 23:14 boot.iso -rw-r--r-- 1 0 0 1048576000 Mar 11 21:23 checkfile -rw-r--r-- 1 1001 1001 1597 Apr 02 22:50 myos.cfg lftp upload@172.16.0.1:/> get named.src 1050 bytes transferred lftp upload@@172.16.0.1:~> put /root/install.log 上傳一個文件。 49565 bytes transferred
vsftpd基于mysql實現虛擬用戶
######搭建服務: [root@host1 ~]# yum install vsftpd -y 下載安裝vsftpd。 [root@host1 ~]# vim /etc/vsftpd/vsftpd.conf 編輯vsftpd的主配置文件。 local_enable=YES 實體用戶允許登陸。 guest_enable=YES 允許來賓賬號。 guest_username=virtual 來賓賬號使用virtual這個賬號。 pam_service_name=vsftp.mysql 指定認證文件。 user_config_dir=/etc/vsftpd/vuftp 指定虛擬用戶的配置文件目錄。 virtual_use_local_privs=YES 虛擬用戶擁有實體用戶一樣的權限。 [root@host1 pam_mysql-0.7RC1]# ./configure --with-openssl 編譯安裝mysql的認證模塊,遇到的錯誤請查看最后的總結。 [root@host1 pam_mysql-0.7RC1]# make && make install [root@host2 ~]# yum install mysql host2安裝mysql,因為采用的是遠程數據庫存儲。 [root@host2 ~]# service mysqld start [root@host2 ~]# mysql 設定數據庫。 mysql> create database vsftp; 創建數據庫。 mysql> use vsftp; mysql> create table user(name char(20) not null primary key,password char(48) not null); 創建用戶數據表。 mysql> insert into user values('xiao',password('redhat')); 寫入信息。 mysql> grant select on vsftp.* to xiao@'%' identified by 'redhat'; 授權并創建用戶。 mysql> flush privileges 重載用戶信息。 mysql> exit 退出。 [root@host1 ~]# vim /etc/pam.d/vsftp.mysql 創建并寫入認證文件。 auth required /lib64/security/pam_mysql.so user=xiao passwd=redhat host=192.168.1.2 db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2 設置類型為認證,并如果不通過就整個認證都不通過,但是還是要檢查后續認證屬性,指定認證文件庫文件并賦予參數,DB賬號是xiao 密碼是redhat mysql服務器地址是192.168.1.2 數據庫是vsftp 表是table 賬號字段是name 密碼字段是password 加密類型為mysql。 account required /lib64/security/pam_mysql.so user=xiao passwd=redhat host=192.168.1.2 db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2 其他都相同,只是設置類型為除了密碼等認證以外的認證,如過期時間等。 [root@host1 ~]# useradd -s /sbin/nologin virtual 創建虛擬映射的實體賬號,并不允許登陸。 [root@host1 ~]# mkdir /etc/vsftpd/vuftp 創建虛擬用戶設定存放目錄。 [root@host1 ~]# vim /etc/vsftpd/vuftp/xiao 設定虛擬用戶的設定文件。 local_root=/tmp/xiao xiao的目錄為/tmp/xiao write_enable=YES 允許寫入。 [root@host1 ~]# chown virtual:virtual /tmp/xiao 更改屬主屬組為virtual。 [root@host1 ~]# service vsftpd start 啟動vsftpd
測試:
[root@host2 ~]# lftp xiao@192.168.1.1 以xiao的身份訪問ftp服務器。 Password: lftp xiao@192.168.1.1:~> ls list,然而并沒有文件。 lftp xiao@192.168.1.1:~> put /root/install.log 上傳一個文件。 49565 bytes transferred lftp xiao@192.168.1.1:~> ls list,就有文件了。說明可以正常登陸與寫入。 -rw-r--r-- 1 502 503 49565 Apr 27 19:31 install.log lftp xiao@192.168.1.1:~> bye
vsftpd.conf常用配置詳解
vsftp.conf屬性詳解,作為查詢使用。 [env] local_root=/var/ftp 指定ftp目錄。 write_enable=YES|NO 是否允許使用者上傳,全局。 use_locatime=YES|NO 是否啟用本地時間。 listen_port=# 指定vsftp所使用的端口。 ftpd_banner=text 顯示的文字說明。 banner_file=/path/file 指定某個純文字檔案座位登陸時的vsftp歡迎字眼。 [env] [mode] listen=YES|NO 是否以 standalone(主動) 方式啟動,預設為NO。 connect_from_port=21 主動式連線使用的FTP端口。 ftp_data_port=20 主動式連線使用的FTP數據端口 connect_timeout=60 主動模式下,在#秒后得不到回應就強制中斷。 pasv_enable=YES|NO 是否開啟被動(passive)連線模式。 accept_timeout=120 被動模式下,服務器等待客戶端超過#秒就強制斷線。 pasv_min_port=0,pasv_max_port=0 被動模式時,使用的port范圍,0表示1-65535隨機采用不限制。 data_connection_timeout=30 如果已經建立連接,但是因為線路問題導致在#秒被沒有完成資料的傳輸,就強制踢除客戶端。 idle_session_timeout=60 如果使用者在#秒內都沒有命令動作就強制斷線。 max_clients=10 同一時間最大的連接數。 max_per_ip=5 同一IP同一時間可以允許多少連線。 [env] [message] dirmessage_enable=YES|NO 當進入特定目錄時會顯示提示,顯示內容為每一個目錄下面的隱藏文件.message。 message_file=.message 顯示的是.message就是這個選項來指定的。 [anonymous] [mod] anonymous_enable=YES|NO 是否允許匿名用戶登錄,預設為YES,如果關閉則所有的匿名設置屬性都將無效。 anon_root=/path/filename 指定匿名用戶ftp目錄 anon_world_readable_only=YES|NO 是否允許匿名用戶具有下載的權限,預設為YES。 anon_other_write_enable=YES|NO 是否允許匿名用戶具有寫入(W)的權限,如刪除與更改伺服器上的檔案與檔名等權限,預設為NO。 如果要設置為YES,則需要調整開放給anonymous寫入目錄的權限,即開放對應PID(anonymous賬戶)的W權限。 anon_mkdir_write_enable=YES|NO 是否允許匿名用戶具有創建目錄的權限 預設為NO。 如果anon_other_write_enable=NO 此屬性則不能生效,必須更改為YES。 anon_upload_enable=YES|NO 是否允許匿名用戶上傳文件,預設為NO 如果anon_other_write_enable=NO 此屬性不能生效。 [anonymous] [password check] deny_email_enable=YES|NO 是否抵擋不允許的email登陸。 banned_email_file=/etc/vsftpd/banned_emails 拒絕登陸的email的list,需要deny_mail_enable設置為YES。 no_anon_passwd=YES|NO 是否要略過密碼check環節。 [anonymous] [other] anon_max_rate=# 限制anonymous的傳輸速度,單位為Byte/s,如果為0則表示不限制。 anon_umask=077 設置上傳文件的默認掩碼。 [real user] local_enable=YES|NO 是否允許實體用戶登陸。 local_max_rate=# 限制real user的傳輸速度,單位為Byte/s,如果為0則表示不限制。 allow_writeable_chroot=YES|NO 是否限制ftp文件夾對實體用戶的W權限,如果為NO,則設置W權限時,會報錯。 [real user] [change root] chroot_local_enable=YES|NO 開啟目錄鎖定功能。 chroot_list_enable=YES|NO 開機目錄鎖定的list限制。 chroot_list_enable result YES 所有用戶都鎖定目錄,list中的用戶不鎖定。 NO 所有用戶都不鎖定目錄,list中的用戶鎖定。 chroot_list_file=/etc/vsftpd/chroot_list : 指定chroot list。 [real user] [userlist_deny] userlist_enable=YES|NO 是否開啟訪問限制功能。 userlist_deny=YES|NO 是否開啟list訪問限制。 userlist_deny result YES 所有用戶都可以訪問,list中的用戶無法訪問。 NO 所有用戶都無法訪問,list中的用戶可以訪問。 userlist_file=/etc/vsftpd/user_list : 指定userlist。 [safe] acsii_download_enable=YES|NO 是否指定用戶使用acsii格式下載檔案。 acsii_upload_enable=YES|NO 是否指定用戶使用acsii格式上傳檔案。 one_process_model=YES|NO 設定為YES時,每一個連線都會擁有一個單獨的precess負責,都夠提升vsftp的性能,但是會占用系統資源,建議設置為NO tcp_wrappers=YES|NO 是否支援TCP Wrappers。 pam_service_name=vsftpd pam模組的名稱。 [safe] [log] xferlog_enable=YES|NO 是否在上傳與下載檔案時將信息記錄在日志文件中。 xferlog_file=/var/log/xferlog 生成的日志文件存放的位置。 xferlog_std_format=YES|NO 日志文件通過標準的xferlog格式書寫,難讀。 dual_log_enable=YES|NO 是否生成額外的一個log文檔。 vsftpd_log_file=/var/log/vsftpd.log 額外log文檔的存放位置。 [safe] [process user] nopriv_user=username 以指定的user作為process的user,防止被入侵時,僅僅只會獲得指定user的低權限,不會對系統造成太大的傷害。 [guest] guest_enable=YES|NO 所有的實體賬號登陸都視為以guest的身份登陸。 guest_username=username 指定訪客使用哪個用戶的身份。 virtual_use_local_privs=YES 為YES時,虛擬用戶權限與實體用戶一樣。
常見問題:
-
ftp無法登陸,請檢查你的文件夾權限并檢查主配置文件中的屬性是否打開了,如anonymous_enable,local_enable等。
-
無法切換目錄或者個別用戶無法登陸,請檢查chroot_list,ftpusers,user_list文件內容或者主配置文件中的配置是否正確。
-
mysql存儲無法登陸,請查看日志文件/var/log/secure,/var/log/message,/var/log/xferlog,并確認認證文件沒有寫錯,仔細檢查配置文件與目錄和被映射的實體用戶的權限。
-
如果遇到密碼錯誤,檢查密碼文件,如mysql表中字段長度類型是否正確,數據庫用戶是否能遠程登陸訪問數據庫user表。
-
如果遇到在編譯安裝pam_mysql模塊中遇到configure: error: Your system doesn’t appear to be configured to use PAM. Perhaps you need to specify the correct location where the PAM modules reside. 情況,可以嘗試添加一個選項 –with-pam-mods-dir=/lib/security/ 自己手動指明pam庫的存放位置。
-
無法正常工作時,請檢查端口是否開啟,或檢查防火墻和selinux是否有配置正確。
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/15668