FTP服務初探

FTP


  • FTP概述

  • FTP原理和模式

  • vsftpd

  • vsftpd基礎服務搭建

  • vsftpd基于數據庫的實現虛擬用戶

  • vsftpd基于mysql實現虛擬用戶

  • 常見問題

FTP概述

什么是FTP?

FTP是File Transfer Protocol 文件傳輸協議的縮寫,基于網絡來傳輸文件的應用層通信協議。

FTP的功能是什么?

FTP能夠通過網絡來傳輸文件,因為工作在應用層所以不會受到平臺的限制。

FTP原理和模式

原理與工作流程

ftp原理1 
ftp原理2

  1. FTP的數據傳輸分為命令數據與文件數據,命令傳輸就是客戶端要執行的命令,服務端收到后返回給客戶端執行結果,如ls等。文件傳輸就是客戶端要傳輸的數據,服務端與客戶端數據連接來傳輸。

  2. FTP的服務端與客戶端建立連接大體三個步驟,建立連接,傳輸數據,斷開連接。

  3. FTP是基于tcp來傳輸可靠的數據,使用21號端口來建立認證通道,20號端口來建立數據通道。

  4. FTP是明文傳輸的。

  5. 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. 客戶端在收到響應后,就會去連接響應的端口建立數據連接通道。
我們可以看到以上兩種方式,都是由墻內的一方來發出連接并允許另一端來連接指定端口,墻內的一方就類似是一間房子的主人,而另外一方是客人,客人去訪問主要要實現得到主人的同意,并來給你”開門”你才可以進到這個屋子。

主動模式與被動模式1 
主動被動1

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時,虛擬用戶權限與實體用戶一樣。

常見問題:

  1. ftp無法登陸,請檢查你的文件夾權限并檢查主配置文件中的屬性是否打開了,如anonymous_enable,local_enable等。

  2. 無法切換目錄或者個別用戶無法登陸,請檢查chroot_list,ftpusers,user_list文件內容或者主配置文件中的配置是否正確。

  3. mysql存儲無法登陸,請查看日志文件/var/log/secure,/var/log/message,/var/log/xferlog,并確認認證文件沒有寫錯,仔細檢查配置文件與目錄和被映射的實體用戶的權限。

  4. 如果遇到密碼錯誤,檢查密碼文件,如mysql表中字段長度類型是否正確,數據庫用戶是否能遠程登陸訪問數據庫user表。

  5. 如果遇到在編譯安裝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庫的存放位置。

  6. 無法正常工作時,請檢查端口是否開啟,或檢查防火墻和selinux是否有配置正確。

原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/15668

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-04-28
下一篇 2016-04-28

相關推薦

  • 馬哥教育網絡班22期+第5周課程練習

    week5: 1、顯示當前系統上root、fedora或user1用戶的默認shell; [root@rs1 ~]# awk -F':' '$1 ~ /^(root|fedora|user1)/{print $1,$NF}' /etc/pa…

    Linux干貨 2016-09-08
  • 學習標準I/O和管道的心得體會

    重定向、標準輸出、標準輸入、標準錯誤、管道的命令整理

    2017-11-20
  • openvpn安裝配置過程

    前言     之前為了方便遠程辦公時訪問公司的內部系統,如:svn、OA、wiki、禪道等等;通通在防火墻上做了端口映射。然后有個內部系統被黑了,各種弱口令沒辦法。果斷關閉端口映射,看來還是得搭建個VPN服務器,vpn設備感覺大材小用。馬上就想到了開源的openvpn,下面就來介紹openvpn的安裝配置過程。 ope…

    Linux干貨 2015-05-11
  • 如何將遷移home到獨立分區中

        背景(centos7中):         由于在剛開始學習linux時磁盤分配追求簡單,只是把一個磁盤簡單的分了3個分區?,F在,因用戶數據增多、磁盤空間變少、當數據撐滿磁盤時,會導致系統崩潰。為防止此種情況的發生我必須把把根下的/home 目錄遷移出 來獨立分…

    2017-08-10
  • 廉價磁盤陣列(RAID)與邏輯卷(lvm)

    RAID的作用介紹與LVM的創建分析   有計算機基礎常識的人們都能了解,現如今生產出來的存儲設備比如機械式磁盤,作為個體它的存儲容量是有上限的,雖然曾經有人開發出大容量磁盤,但是成本太高,無法在社會中普及應用。對于這種大型服務器系統迫切需要的功能,催生出了一個叫做廉價冗余磁盤陣列的技術,歪果仁將它稱為RAID。而后隨著歲月的發展,又產生了邏輯卷l…

    Linux干貨 2016-09-11
  • Linux命令幫助的獲取

    幫助命令 1. 使用幫助命令和幫助選項來獲取幫助 2. 使用man來查看命令使用手冊(manual) 3. 使用info來查看命令的信息頁 4. 程序自身的幫助文檔(README/INSTALL/ChangeLog) 5. 程序官方文檔(官方站點:Documentation) 6. 發行版的官方文檔…

    Linux干貨 2016-06-01
欧美性久久久久