談談FTP

一、關於FTP

1.FTP是什麼?

FTP,全稱」文件傳輸協議」。屬於TCP/IP四層模型中的應用層。

2.TCP/IP五層模型有哪些?

如圖所示:
圖一

用文字敘述(從高層到底層):

  • (1)應用層;
  • (2)傳輸層;
  • (3)網絡層;
  • (4)數據鏈路層;
  • (5)物理層。

其中如FTP、HTTP、SNMP等就屬於應用層。

3.為什麼要使用FTP

從我個人職業經歷來談,使用FTP的應用場景如下:

  • (1)數據備份;
  • (2)公司內部文件管理;
  • (3)業務層應用;

(1)數據備份

關於數據備份,結合我之前做運維的一段經歷,主要手段如下:
編寫shell腳本(基於scp命令),配置crontab,進行定時文件傳輸備份(通常傳輸到另外一台備份服務器上)。

除了基於scp之外,還可以有sftp、sz/rz、rsync和本文提到的ftp等。

備份的內容通常如下:
數據庫腳本、應用軟件日誌(tomcat等)、常用腳本備份、重要配置文件和軟件備份等。

(2)公司內部文件管理

關於公司內部文件管理,有的公司會搭建一個內部的FTP,主要用於管理公司重要文件(如公司規章制度文檔、業務文檔、技術文檔、開發環境軟件、重要第三方賬號管理等)。

FTP有嚴格的權限控制,可以控制誰能訪問某個目錄下的文件和下載文件的權限。

(3)業務層應用

業務層應用的話,我之前用FTP作為我的博客系統文件管理工具,主要用於保存用戶的頭像和上傳的如MP3、MP4、Pdf、Word等文件。

因為如果將其以二進制(其實將文件流轉化為二進制)的形式存儲,會影響數據庫的性能。

問:為什麼將文件(這裡指圖片和其它文件格式的文件)以二進制的形式存儲會影響數據庫的性能?
因為存儲圖片或其它文件的二進制需要非常長的字段(如text或longtext等),對於數據庫查找數據的時候,會增加處理時間(處理時間長),在高並發的應用場景下,很多用戶訪問,這會加重數據庫的負擔,從而導致處理時間長(速度慢),導致C端用戶可能看到的景象是,點擊某個功能加載很慢(如電商相關的,商品列表展示非常多的圖片等)。

問:為什麼對於非常長的字段會增加數據庫的查詢時間呢?
因為更長的列會消耗更多的內存,因為MySQL通常會分配固定大小的內存塊來保存內部值。

以我之前寫的博客系統,我會圖片上傳至FTP,然後通過Nginx做代理映射到FTP上傳圖片的目錄,實際上保存在數據表裏面的圖片,僅僅是一個URL。而且nginx對於處理靜態資源(如圖片、css、html、js等)性能非常好。

問:目前公司項目用FTP多嗎?
我的回答是分情況看,比方說對於中小公司或者創業公司來說,一般不會使用FTP,通常會用阿里雲或者騰訊雲、七牛雲的存儲服務。因為性能更好,不需要任何成本。因為自建,不管是FTP或者是分佈式FastDFS都需要對其非常熟悉,不然的話,很容易遇到一些奇怪問題。
對於一些傳統公司來說,用FTP的還是比較多(這裡就不列舉了)。

4.FTP的優缺點

(1)FTP有哪些優點?

  • a.完善的權限管理;
  • b.基於網絡,操作靈活;
  • c.安全性高,數據傳輸可通過SSL、SSH2進行安全加密;
  • d.使用TCP/IP協議,保證數據準確到達;
  • e.傳輸速度快,FTP的傳輸效率比HTTP更快;

(2)FTP有哪些缺點?

  • a.FTP沒有內置加速技術,傳輸巨型文件和海量文件需要很長時間,過程存在無故中斷、傳輸文件內容不一致、傳輸文件丟失等(最近就特別感受到了,傳輸近二十個G文件,一旦中斷,又得重新進行);
  • b.FTP傳輸過程沒有可視化的顯示記錄(使用winscp或xftp才能看到傳輸過程,代碼層面上根本看不到);

5.FTP的替代方案有哪些?

就FTP方面,有如下方案:

  • a.FTPS;
  • b.SFTP;

但除此之外,還有很多第三方的文件存儲方案如前面提到騰訊雲對象存儲、阿里雲對象存儲、七牛雲對象存儲等。

當然了,一切根據公司業務情況和公司背景情況而定,很多公司之所以不使用例如騰訊雲、阿里雲、七牛雲的存儲方案,是因為存儲的東西非常重要,放在第三方不安全,害怕對方可能竊取其中的重要信息。

這也是為什麼微信會有企業微信、阿里會有釘釘、美團會有大象的重要原因。

6.關於FTP的安裝

(1)CentOS7安裝FTP

參考如下流程,一步步執行即可:

#安裝FTP
yum -y install vsftpd

#修改配置文件
vim /etc/vsftpd/vsftpd.conf

修改第12行為: anonymous_enable=NO  禁止匿名登錄

取消第102行chroot_list_enable=YES,104行chroot_list_file=/etc/vsftpd/chroot_list的注釋  

在最後一行新增 allow_writeable_chroot=YES

#新建用戶
useradd test
passwd test

#防火牆放行
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

#ftp命令
#設置開機啟動
systemctl enable vsftpd.service

#啟動
systemctl start vsftpd.service

#停止
systemctl stop vsftpd.service

#查看狀態
systemctl status vsftpd.service

#重啟ftp服務器
systemctl restart vsftpd.service

(2)Ubuntu16.04安裝FTP

//www.cnblogs.com/YangJieCheng/p/8252577.html

(3)FTP配置文件各個配置的含義

ftp配置詳解

二、Java中如何使用FTP

1.Java應用使用FTP

可以參考我之前寫過的一篇談談存儲系統
該篇文章主要針對如何使用阿里雲的對象存儲、FTP、常規存儲等三種方案,有代碼例子。

最近我的同事就使用其中的FTP方案。

2.SpringBoot應用使用FTP

與Java應用使用FTP一樣,只不過將FTP相關的配置放在配置文件里如application.yml或application.properties文件里。

大家感興趣的可以參考springBoot 實現ftp上傳與下載,這裡我就不寫代碼了。

三、和FTP相愛相殺的經歷

1.FTP訪問不了

像FTP搭建好了並啟動,通常是可以通過ftp://ip進行訪問,此時訪問不了,因為是我們自建的服務器,沒有使用阿里雲或者騰訊雲,結果發現是防火牆的限制。

之前做運維的一段時間,接觸CentOS6.5系統,知道有個iptables防火牆,沒想到這次有個firewall。後來查了相關資料,原來CentOS7默認是firewall防火牆。

執行上面的開放ftp就可以訪問了。

之前公司服務器對公網開放過,由於我忘記了沒有設置防火牆開機自啟動導致突然服務就不行了。為此我專門研究了一下服務器安全策略。

搜索了相關資料,總結了如下幾個策略(常規性策略):

  • 漏洞補丁;
  • 防火牆;
  • 殺毒軟件;
  • 關閉不需要的服務和端口;
  • 定期備份;
  • 賬戶和密碼保護(定期更改和密碼設置複雜);
  • 監測系統日誌.

既然提到防火牆,那麼提個問題防火牆有什麼用呢?

答:防火牆主要目的是阻止網絡蠕蟲病毒的攻擊以及網絡中某些不懷好意的人訪問你的電腦(通過這些訪問,可以非法獲取用戶電腦中的文件數據,甚至可以修改用戶電腦系統中的某些設置,遠程控制用戶的電腦),保證用戶上網安全。

2.輸入正確的用戶名和密碼還是彈出需要登錄的界面

這個問題是因為改了一些ftp的配置導致的。無論怎麼設置用戶名和密碼都不行。主要參考一個博客參考的有問題。其實很簡單,按照我前面列舉的步驟就可以了,一舉成功。

3.沒有權限

一般情況下,ftp安裝好後,默認是/var/ftp/pub下的目錄,這個通常是默認的ftp用戶。但這次沒有權限是因為公司的一個程序員小姐姐使用自建的用戶訪問。linux創建用戶的命令,通常有兩個:
一個是useradd username,另外一個是adduser username。

問:useradd和adduser有何區別?

以CentOS為例:
兩者沒有區別,都是創建用戶,並在/home目錄下生成對應的用戶目錄,沒有設置密碼,需要重新設置密碼。

以Ubuntu為例:
useradd在使用該命令創建用戶是不會在/home下自動創建與用戶名同名的用戶目錄,而且不會自動選擇shell版本,也沒有設置密碼,那麼這個用戶是不能登錄的,需要使用passwd命令修改密碼。

adduser在使用該命令創建用戶是會在/home下自動創建與用戶名同名的用戶目錄,系統shell版本,會在創建時會提示輸入密碼,更加友好。

這讓我聯想到,當初使用Ubuntu16.04的useradd創建用戶時,一直不在/home目錄下生成對應的用戶目錄,於是我手動創建,然後通過授權命令進行關聯。

4.下載大的文件,突然中斷,又需要重新執行

使用Java程序下載FTP上的大文件(接近二十個G),出現中斷。
最後通過搜索確定了是連接時間配置,連接不上,超時從而中斷。為此我修改了該配置並重啟,解決了這個問題。
配置如圖所示:
圖二

注意:這裡分主動模式和被動模式。

5.FTP的被動模式設置

核心配置如下:

#被動模式相關配置
pasv_enable=YES
pasv_min_port=10221
pasv_max_port=11221
pasv_promiscuous=YES

問:FTP的被動模式是什麼?

所謂被動模式,指的是FTP服務器「被動」等待客戶端來連接自己的數據端口,其過程具體是:當開啟一個FTP連接時,客戶端打開兩個任意的非特權本地端口(N >1024和N+1)。第一個端口連接服務器的21端口,但與主動方式的FTP不同,客戶端不會提交PORT命令並允許服務器來回連它的數據端口,而是提交PASV命令。這樣做的結果是服務器會開啟一個任意的非特權端口(P > 1024),並發送PORT P命令給客戶端。然後客戶端發起從本地端口N+1到服務器的端口P的連接用來傳送數據。

問:FTP的主動模式是什麼?

所謂主動模式,指的是FTP服務器「主動」去連接客戶端的數據端口來傳輸數據,其過程具體來說就是:客戶端從一個任意的非特權端口N(N>1024)連接到FTP服務器的命令端口(即tcp 21端口),緊接着客戶端開始監聽端口N+1,並發送FTP命令「port N+1」到FTP服務器。然後服務器會從它自己的數據端口(20)「主動」連接到客戶端指定的數據端口(N+1),這樣客戶端就可以和ftp服務器建立數據傳輸通道了。

問:FTP的主動模式和被動模式的區別什麼?

主動模式的FTP是指服務器主動連接客戶端的數據端口,被動模式的FTP是指服務器被動地等待客戶端連接自己的數據端口。
被動模式的FTP通常用在處於防火牆之後的FTP客戶訪問外界FTp服務器的情況,因為在這種情況下,防火牆通常配置為不允許外界訪問防火牆之後主機,而只允許由防火牆之後的主機發起的連接請求通過。因此,在這種情況下不能使用主動模式的FTP傳輸,而被動模式的FTP可以良好的工作。

有一位技術小夥伴幽默的概括:

  • 主動模式:服務器向客戶端敲門,然後客戶端開門;
  • 被動模式:客戶端向服務器敲門,然後服務器開門。

問:為什麼要使用被動模式?

從上面的FTP的主動模式和被動模式的區別,我們就能得知為什麼要使用被動模式不是主動模式。因為主動模式是服務端主動連接客戶端,而被動模式是服務端等待客戶端連接。實際應用中,客戶端的端口是多變的,而服務端的端口則相對統一。所以千萬不要因為是被動模式就理解為是客戶端去連接服務端。

問:被動模式的優缺點有哪些?

被動FTP對FTP客戶端的管理有利,但對服務器端的管理不利。因為客戶端要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火牆阻塞掉。

6.FTP下載過慢如何提高速率?

這裡需要修改配置,增加如下內容:

local_max_rate = 1048576(相當於下載M/S) #單位,默認為位元組

7.FTP太慢了,使用臨時方案寫shell腳本,腳本里處理文件和傳輸文件。

針對FTP下載實在太慢了,我想到了一個臨時的辦法使用scp來進行文件傳輸。但是呢?scp免密登錄處理不太安全,於是我想到了一個辦法使用sshpass。
sshpass和scp相結合

關於scp免密傳輸,可以參考我的這篇博客:
Linux遠程傳輸文件免密碼

8.太過隨意,FTP配置匿名的重大隱患。

之前為了做試驗測試,我不太嚴謹,就直接設置為匿名訪問且可以任意讀寫。但實際中不應該這麼做。

官方的話來說:
匿名開放模式是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登錄到FTP服務器。

這樣一來任何人就可以在服務器上任意上傳或下載文件,安全形同虛設。

問:FTP除了匿名開放模式還有哪些模式?哪個模式更安全一些?

本地用戶模式:
它是通過Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整台服務器。

如果是默認useradd username創建用戶,默認就有ftp和sftp、ssh等權限。但如果是執行這條命令usermod -s /usr/sbin/nologin fujieace那麼只能ftp,不能sftp和ssh。

虛擬用戶模式:
它是這三種模式中最安全的一種認證模式,它需要為FTP服務單獨建立用戶數據庫文件,虛擬出用來進行口令驗證的賬戶信息,而這些賬戶信息在服務器系統中實際上是不存在的,僅供FTP服務程序進行認證使用。這樣,即使黑客破解了賬戶信息也無法登錄服務器,從而有效降低了破壞範圍和影響。

 

Tags: