Linux下FTP環境部署梳理(vsftpd和proftpd)

散盡浮華發表於2017-03-29

 

在日常運維工作中,常部署到的FTP是vsftpd和proftd。之前寫了Linux下FTP虛擬賬號環境部署總結,下面簡單說下本地使用者下的FTP環境部署過程:

簡單梳理下FTP主動和被動兩種工作模式:

FTP協議有兩種工作方式:
1)port方式:主動模式
port(主動)方式的連線過程是:客戶端向伺服器的FTP埠(預設是21)傳送連線請求,伺服器接受連線,建立一條命令鏈路。當需要傳送資料時,伺服器從20埠向客戶端的空閒埠傳送連線請求,建立一條資料鏈路來傳送資料。
2)pasv方式:被動模式
pasv(被動)方式的連線過程是:客戶端向伺服器的FTP埠(預設是21)傳送連線請求,伺服器接受連線,建立一條命令鏈路。當需要傳送資料時,客戶端向伺服器的空閒埠傳送連線請求,建立一條資料鏈路來傳送資料

FTP是僅基於tcp的服務,不支援udp。FTP使用2個埠,一個資料埠和一個命令埠(也可叫做控制埠)。通常來說這兩個埠是21(命令埠)和20(資料埠)。但FTP工作方式的不同,資料埠並不總是20。這就是主動與被動FTP的最大不同之處。
一)主動FTP模式
主動方式的FTP工作流程:客戶端從一個任意的非特權埠N(N>1024)連線到FTP伺服器的命令埠,也就是21埠。然後客戶端開始監聽埠N+1,併傳送FTP命令“portN+1”到FTP伺服器。接著伺服器會從它自己的資料埠(20)連線到客戶端指定的資料埠(N+1)。
針對FTP伺服器前面的防火牆來說,必須允許以下通訊才能支援主動方式FTP:
1)任何大於1024的埠到FTP伺服器的21埠。(客戶端初始化的連線)
2)FTP伺服器的21埠到大於1024的埠。(伺服器響應客戶端的控制埠)
3)FTP伺服器的20埠到大於1024的埠。(伺服器端初始化資料連線到客戶端的資料埠)
4)大於1024埠到FTP伺服器的20埠(客戶端傳送ACK響應到伺服器的資料埠)

二)被動FTP模式
FTP被動模式的連線方式有效解決了伺服器發起到客戶的連線問題,這種方式由叫做PASV,當客戶端通知伺服器它處於被動模式時才啟用。在被動方式FTP中,命令連線和資料連線都由客戶端發起,這樣就可以解決從伺服器到客戶端的資料埠的入方向連線被防火牆過濾掉的問題。當開啟一個FTP連線時,客戶端開啟兩個任意的非特權本地埠(N>1024和N+1)。第一個埠連線伺服器的21埠,但與主動方式的FTP不同,客戶端不會提交PORT命令並允許伺服器來回連它的資料埠,而是提交PASV命令。這樣做的結果是伺服器會開啟一個任意的非特權埠(P>1024),併傳送PORTP命令給客戶端。然後客戶端發起從本地埠N+1到伺服器的埠P的連線用來傳送資料。
對於伺服器端的防火牆來說,必須允許下面的通訊才能支援被動方式的FTP:
1)從任何大於1024的埠到伺服器的21埠(客戶端初始化的連線)
2)伺服器的21埠到任何大於1024的埠(伺服器響應到客戶端的控制埠的連線)
3)從任何大於1024埠到伺服器的大於1024埠(客戶端初始化資料連線到伺服器指定的任意埠)
4)伺服器的大於1024埠到遠端的大於1024的埠(伺服器傳送ACK響應和資料到客戶端的資料埠)

主動FTP:
   命令連線:客戶端>1023埠 ------> 伺服器 21埠
   資料連線:客戶端>1023埠 <------ 伺服器 20埠 

被動FTP:
   命令連線:客戶端>1023埠 ------> 伺服器 21埠
   資料連線:客戶端>1023埠 ------> 伺服器>1023埠 

三)主動與被動FTP優缺點:
主動FTP對FTP伺服器的管理有利,但對客戶端的管理不利。因為FTP伺服器企圖與客戶端的高位隨機埠建立連線,而這個埠很有可能被客戶端的防火牆阻塞掉。
被動FTP對FTP客戶端的管理有利,但對伺服器端的管理不利。因為客戶端要與伺服器端建立兩個連線,其中一個連到一個高位隨機埠,而這個埠很有可能被伺服器端的防火牆阻塞掉。

隨著WWW的廣泛流行,許多人習慣用web瀏覽器作為FTP客戶端。大多數瀏覽器只在訪問ftp://這樣的URL時才支援被動模式。這到底是好還是壞取決於伺服器和防火牆的配置。
通常我會選用被動模式的FTP。

下面簡單記錄下vsftpd和proftd部署過程:
1)vsftpd部署(本地使用者登陸環境)

[root@bastion-IDC ~]# yum install -y vsftpd
[root@bastion-IDC ~]# cat /etc/vsftpd/vsftpd.conf|grep -v "^#"
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
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list      
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
local_max_rate=500000   //設定本地使用者最大的傳輸速率
max_clients=200
max_per_ip=10
pasv_enable=YES    //這三行配置,開啟FTP被動模式
pasv_min_port=22222
pasv_max_port=22225

[root@bastion-IDC ~]# touch /etc/vsftpd/chroot_list
[root@bastion-IDC ~]# useradd smsb-ftp -s /sbin/nologin       
[root@bastion-IDC ~]# passwd smsb-ftp 
[root@bastion-IDC ~]# echo "smsb-ftp" >> /etc/vsftpd/chroot_list       //ftp賬號需要放到這個列表檔案裡,登陸ftp後鎖定到其家目錄下!

[root@bastion-IDC ~]# chown -R smsb-ftp.smsb-ftp /home/smsb-ftp
[root@bastion-IDC ~]# ll -d /home/smsb-ftp
drwx------ 4 smsb-ftp smsb-ftp 4096 May 26 14:07 /home/smsb-ftp

[root@bastion-IDC ~]# /etc/init.d/vsftpd start

[root@bastion-IDC ~]# vim /etc/sysconfig/iptables
.......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22222:22225 -j ACCEPT

最後就可以通過ftp://ip在瀏覽器裡訪問上面的ftp(只有被動模式的ftp才能再瀏覽器裡訪問);
也可使用Filezilla等工具連線ftp,不過要在客戶端裡手動修改成被動模式。ftp登陸後的路徑鎖定到賬號家目錄下。

---------------------------------------------------------------------------------------------
連線ftp的時候如果報錯如下:
500 OOPS: cannot change directory:/home/smsb-ftp

這種一般是由於selinux沒有關閉造成的,解決辦法:
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# setsebool ftp_home_dir on
--------------------------------------------------------------------------------------------

vsftpd.conf配置檔案中的主要引數介紹

2)proftpd部署(本地使用者登陸環境)

1)安裝proftpd
下載proftpd-1.3.4b.tar.gz,解壓安裝,安裝到/usr/local/proftpd 目錄下 
[root@bastion-IDC ~]# tar -zvxf proftpd-1.3.4b.tar.gz
[root@bastion-IDC ~]# cd proftpd-1.3.4b
[root@bastion-IDC proftpd-1.3.4b]# ./configure --prefix=/usr/local/proftpd 
[root@bastion-IDC proftpd-1.3.4b]# make && make install

2)配置proftpd
[root@bastion-IDC proftpd]# pwd
/usr/local/proftpd
[root@bastion-IDC proftpd]# cat etc/proftpd.conf
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
Port 21
UseIPv6 off
Umask 022
MaxInstances 30    //程式數,即限制連線數,或最大併發數
MaxClients 10     //最大允許10個使用者同時訪問
MaxClientsPerHost 5  //同一個客戶端只能最多5個帳號可以登陸
MaxHostsPerUser 5    //每個帳戶最多允許來源ip為5個, 對防止ftp帳號還是比較有用的。
MaxClientsPerUser 5   //每個帳戶在每個客戶端最多可以同時登陸5次,可以防止多執行緒軟體下載對伺服器的破壞。
User nobody        //啟動伺服器的帳號
Group nobody       //啟動伺服器的組帳號
AllowOverwrite on     //允許檔案覆蓋許可權.即支援續傳功能
AllowRetrieveRestart on    //允許下載續傳,預設即開啟
AllowStoreRestart on       //允許上載續傳
UseReverseDNS off     //是否開啟DNS反向查詢
IdentLookups off      //是否開啟反向查詢客戶端的使用者名稱的操作。
ServerIdent off    //遮蔽伺服器版本資訊
RootLogin off        //是否允許root使用者登入,預設是不允許的,安全起見不推薦將此選項設定為on
PassivePorts 20000 20200         //開啟被動模式
DefaultRoot ~          //限制使用者或組登入到FTP伺服器後所在的目錄,在預設情況下每個使用者登入到ProFTPd後,會被引導到該使用者的家目錄
TransferRate STOR 300 user wangshibo    //限制wangshibo使用者上傳的速率限制在300Kbytes/s
TransferRate RETR 200 user wangshibo    //限制wangshibo使用者下載的速率限制在200Kbytes/s

3)建立使用者
[root@bastion-IDC proftpd]# useradd wangshibo -d /home/web/wangshibo -s /sbin/nologin    //確保目錄/home/web/wangshibo存在
[root@bastion-IDC proftpd]# passwd wangshibo

4)修改proftpd賬號目錄許可權
[root@bastion-IDC proftpd]# chown -R nobody.nobody /home/web/wangshibo
[root@bastion-IDC proftpd]# chmod -R 777 /home/web/wangshibo

5)啟動proftpd服務
[root@bastion-IDC proftpd]# /usr/local/proftpd/sbin/proftpd

6)新增 iptables 設定
[root@bastion-IDC proftpd]# cat /etc/sysconfig/iptables
.............
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20000:20200 -j ACCEPT 

[root@bastion-IDC proftpd]# /etc/init.d/iptables restart

最後,就可以正常連線以上部署的proftpd服務了

-----------------------------------Proftpd配置說明--------------------------------------

1)Proftpd如何限速和設定發呆退出?
可以使用下面兩引數來限制下載和上載速度:
RateReadBPS 500000
RateWriteBPS 500000
其中:
RateReadBPS和RateWriteBPS限制下載和上載的速率
500000限制當使用者現在這麼多資料量以後再進行限速,這樣可以實現對於小檔案不限速,而大檔案限速。

TimeoutIdle -->設定空閒連線超時時鐘
TimeoutLogin --> 設定空閒登陸超時時鐘
TimeoutNoTransfer --> 設定當沒有資料傳輸時的超時時鐘
TimeoutStalled --> 設定被阻塞的下載的超時時鐘

2)proftpd如何實現磁碟限額 
首先編譯的時候指定--with-modules的時候要包含mod_quota。
然後在配置檔案中使用:
Quotas on
QuotaCalc on
DefaultQuota 8000
QuotaBlockSize 1024
QuotaBlockName kb
就可以實現磁碟限額。其中DefaultQuota說明使用者只能用8000個block,而QuotaBlockSize則指明每個block大小是1024byte也就是1k。
QuotaBlockName只在提示中出現,告訴使用者block的單位。

3)如何設定proftpd的服務程式數
如果機器硬體配置不是非常好,或者為了防止DoS攻擊,有時候需要限制proftpd所能提供的同時連線數。在standalone情況下,可以設定:
MaxInstances 100
這樣就能限制當外界的所有連線數到100的時候,proftpd將禁止新連線。

4)Proftpd如何限制每個客戶端機器的同時連線 
只要在配置檔案裡面使用:
MaxClientsPerHost 10
這樣限制客戶端機器最多隻能10個連線。用在匿名使用者的配置中特別有用,有效地防止了某個客戶端大量佔用了其他人的連線數。

5)Proftpd如何限制某個使用者的同時連線數 
Proftpd 1.2.7rc1以後提供了一個新引數-MaxClientsPerUser。在配置檔案中新增下列引數:
MaxClientsPerUser 5
這樣就能限制每個使用者只能同時有5個連線,使用例如flashget等下載工具的時候就最多隻能分成5塊下載。

6)Proftpd如何提供續傳功能 
如果要支援下載續傳,那麼必須指定:
AllowRetrieveRestart on
如果要支援上傳續傳,那麼必須指定:
AllowOverwrite on
AllowStoreRestart on
必須同時指定AllowOverwrite和AllowStoreRestart的原因是由於重新上傳或者續傳也是屬於覆蓋檔案。
同時記得不要同時使用HiddenStor和AllowStoreRestart。

7)proftpd如何允許以root身份登入 
在配置檔案中使用下面的配置:
RootLogin on    

8)如何縮短連線到proftpd服務的時間
在proftpd.conf裡面加入兩行:
UseReverseDNS off
IdentLookups off
防止proftpd進行DNS反查以及對使用者端進行ident確認。

9)限制每個FTP使用者在自己的目錄下,不可檢視上一級目錄
DefaultRoot ~ 

10)遮蔽伺服器版本資訊
ServerIdent off 

11)其他
WtmpLog on       是否要把ftp記錄在日誌中,如果不想可以設定成off遮蔽掉log日誌。
TimeoutIdle 600    客戶端idle時間設定,預設就是600秒
DisplayLogin welcome.msg    設定ftp登陸歡迎資訊檔案

相關文章