天天看點

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

概述

作為非常古老的協定(1971年首次提出,1980年首次應用),FTP在目前依然占有一席之地,但是由于目前IT業發展的非常迅猛,它和現在的基礎架構産生了一些水土不服,本文旨在通過日常常見的案例,來介紹如何在阿裡雲上搭建FTP Server和FTP Client。

本文結構

本文先從FTP的協定分析,重點闡述了其中控制通道的兩種連接配接模式,進而說明在阿裡雲上搭建FTP伺服器可能遇到的問題,如被動模式下伺服器公網IP無法擷取、主動模式下無法連接配接等情況。

FTP協定摘選

控制通道與資料通道

在FTP協定中,通常有兩個通道:控制通道和資料通道,前者用來傳輸控制指令,如協定握手、獲得目前目錄等操作,而資料通道顧名思義,就是用來傳輸檔案資料之用,另外ls指令的結果通常也會通過資料通道來傳輸。

被動模式與主動模式

而被動模式和主動模式是針對如何建立資料通道而言的,這裡的主動、被動是站在伺服器的角度上描述的,他們的差别簡單來說就是資料通道的TCP連接配接建立是由誰發起的,主動模式下伺服器主動向用戶端建立資料通道,而被動模式下,伺服器是等待用戶端來連接配接的。

這兩個模式大家聽到比較多的應該是被動模式,通常網上的文章都會建議用戶端使用被動模式來連接配接,下面簡單來說明一下兩者的差别。

主動模式

主動模式的詳細操作可以參考我之前寫的

一篇文章

,這裡節選部分資訊:

以下是一次完整的互動,用戶端為47.x.x.224,服務端為112.x.x.7。

對他的分析可以參考之後的一張互動圖,需要重點說明的是互動圖中标紅的一行,這一行可以了解為資料通道的實際展現(抓包中倒數第4個包,由于我隻過濾了FTP協定的包,TCP的控制包沒有顯示出來,這個包實際上是建立了一個新的TCP流來傳輸的),在這之前PORT指令是由用戶端發出的,這一條封包為

PORT 47,x.x,224,39,16
           

其中前四個數字為十進制的IP位址,在主動模式下為用戶端的IP位址,最後兩個數字為端口,由于端口需要兩個位元組表示,是以在這裡的計算方式為39x256+16=10000,那麼這一條封包的意思就是告訴伺服器,“我計劃使用10000端口作為監聽的端口,我的IP位址是47.x.x.224,你可以來連接配接我了進行資料傳輸了”。

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

被動模式

而被動模式最顯著地差别就是在于如何建立資料通道,主動模式下是服務端去連接配接用戶端傳輸資料,而被動模式下,是用戶端去發起連接配接,向伺服器建立連接配接。

以下是一次被動模式下的互動,用戶端為30.x.x.85,服務端為47.x.x.255。

可以看出最大的差別在于紅框中的指令,這一次從PORT改為PASV,之後伺服器回複一條被動模式的資訊,其中同樣是6個數字:IP位址+端口号(端口号的計算方法和主動模式中一樣),隻是這一次換做伺服器告訴用戶端,“你現在可以連接配接我的47.x.x.255的47185端口了”。

這裡特别提示一下,從下面的抓包截圖中可以看出伺服器回複的PASV響應中IP位址并不是上面提到的47.x.x.255,而是一個私網位址172.x.x.241,原因我們會在# 專有網絡ECS内部署FTP Server #這一節中提到。

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

被動模式出現的原因

為何會同時存在被動模式和主動模式呢?在網際網路的初期,由于各個終端使用的都是标準的公網IP位址,彼此時間可以互相通信,互相可見,是以在發起TCP連接配接時,無所謂是哪一方先發起。但随着網際網路的高速發展,人們發現IP位址已經不夠用了,進而誕生了NAT技術,這就在通信的雙方之間插入了一個中間人,在NAT裝置之後的終端對于對方是不可見的,是以隻能由它來發起連接配接。

是以為了迎合NAT技術,FTP協定裡就出現了被動模式,而且由于目前大部分FTP用戶端都是在NAT裝置之後,是以絕大多數情況下隻能使用被動模式(當然在一些特殊的架構裡主動模式還是有一定的用武之處,本文最後一節将會提及)

專有網絡ECS内部署FTP Server

阿裡雲ECS的網絡

目前阿裡雲ECS的網絡類型有兩種:經典網絡與專有網絡。對于經典網絡的ECS來說,系統内有兩張網卡:eth0和eth1,eth0為内網網卡,eth1為外網網卡。在系統内内網和外網的IP位址是靜态寫在配置檔案裡的,系統内可以直接看到。而專有網絡的ECS系統内隻有一張網卡eth0,所有的流量都由這張網卡出入,系統内部無法看到ECS自身的公網IP/彈性公網IP。

這就直接導緻了一個問題:由于目前的網絡環境下大部分用戶端都會使用被動模式來連接配接,但是被動模式下伺服器需要告訴用戶端連接配接的IP位址,而專有網絡下的ECS無法直接看到外網IP,那麼就導緻FTP Server将自己的私網IP告訴了用戶端,用戶端收到了一個私網IP自然就無法進行連接配接。而list、檔案傳輸都需要走FTP協定的資料通道,是以最終導緻了專有網絡下搭建的FTP Server無法讓用戶端正常的傳輸資料。

解決方案

解決辦法也很簡單:主動告知FTP Server程式系統的外網位址,由于市面上FTP Server衆多,各家的設定方式不盡相同,以下說明幾個常見的FTP伺服器的設定方法:

  • vsftpd

在vsftpd的配置檔案中,加入以下兩行,其中替換為ECS的彈性公網位址:

listen_ipv6=NO
pasv_address=<EIP>
           
  • IIS

打開IIS,選擇伺服器(注意不要選擇“網站”下的ftp站點),打開右側的“防火牆支援”,在“防火牆的外部IP位址”其中填入ECS的彈性公網位址即可。

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
  • Serv-U(最新版本)

打開管理控制台,依次選擇“域”-》[對應的域]-》“域詳細資訊”-》“監聽器”-》21端口的監聽器,點選“編輯”,将ECS的彈性公網位址填入彈出的對話框中

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

One more thing

在撰寫本文時,我發現一些用戶端似乎已經提供了智能化的規避方案,如lftp提供以下參數,當出現類似的問題時會嘗試使用控制通道的伺服器IP位址進行資料通道的連接配接。

ftp:fix-pasv-address (boolean)
       if true, lftp will try to correct address returned by server for PASV command  in  case  when  server
       address  is  in  public network and PASV returns an address from a private network. In this case lftp
       would substitute server address instead of the one returned by PASV command, port number would not be
       changed.  Default is true.           

另外,FileZilla也預設開啟了修正被動模式下資料通道IP位址的功能:

FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

FTP的端口與ECS的安全組

ECS的安全組

阿裡雲上的安全組相當于一個方向牆,類似iptables或Windows防火牆,可以根據協定、源/目的IP、源/目的端口來實作特定流量的放行、攔截。在# 被動模式和主動模式 #一節中我們已經提到了FTP除了21端口以外,根據不同的模式在資料通道下還會使用到特定的端口,是以需要在ECS的安全組中放行。

FTP端口的選擇政策

關于FTP兩種模式下的封包互動,前文已經做了闡述,但還未說明程式是如何選擇端口的,下面簡單說明一下:

- 控制通道 資料通道
用戶端 主動連接配接伺服器,随機選擇本地源端口
服務端 被動接受用戶端連接配接,本地預設監聽21端口 被動接受用戶端連接配接,本地随機監聽端口

注:被動模式下服務端資料通道監聽的端口理論上可以通過FTP程式的配置檔案修改

等待伺服器的連結,本地監聽一個随機的端口(注)
主動連結用戶端,随機選擇本地源端口

注:主動模式下用戶端資料通道監聽的端口理論上可以通過FTP程式的配置檔案修改

那麼可以得出在ECS上部署FTP Server,若對于安全組有嚴格的進出限制,那麼需要放行:

  1. 控制通道監聽的端口,用來接收用戶端的控制指令,預設為21端口
  2. 被動模式下建議指定一個端口範圍,以便在安全組中可以放行;主動模式下由于安全組出方向是預設放行的,是以理論上不需要額外的配置

如何指定被動模式下伺服器資料通道監聽的端口

這裡依然以常見的FTP程式為例:

  • 在配置檔案裡添加以下資訊,其中端口的起止範圍根據實際需求修改,然後重新開機vsftpd
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10020           
  • 同上文提到的類似,在“FTP防火牆支援”中填入資料通道的端口範圍即可
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
  • Serv-U
  1. 打開左側“全局”菜單,選擇“限制與設定”
  2. 選擇右側“設定”頁籤,頁面拉到下方,可以看到“網絡設定”中有一項“PASV端口範圍”
  3. 根據實際情況填寫即可
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

主動模式适用的場景

前文提到在一些特定的場景下,确實隻能使用主動模式,比如說IDC和銀行側相連,銀行出于安全考慮僅允許21端口入方向的流量,其餘的端口都是封禁的,那麼就無法使用被動模式,隻能退而求其次使用主動模式。那麼此時對于用戶端的要求可以總結為下列幾點:

  1. 用戶端必須有自己的公網IP,如ECS 彈性公網IP,或者可以使用阿裡雲NAT網關的DNAT功能,将公網IP的部分端口映射到ECS内部的端口上
  2. 用戶端上強制使用主動模式(目前大部分用戶端會優先使用被動模式)
  3. 由于主動模式下資料通道是由伺服器發起連接配接,需要在ECS安全組中放行對應的端口
  4. 用戶端系統内若無法直接看到公網IP(如專有網絡下的ECS、DNAT模式下,依然需要對FTP用戶端進行配置,告知用戶端可以連接配接的公網IP位址)。

關于第二、三、四點,其實和被動模式下PASV指令的響應類似,都需要在程式中作相應的配置才行,但由于這個場景下這個需求确實比較小衆,我隻收集了少量的用戶端配置方法,其他的用戶端配置方法請和程式的提供商尋求技術支援。

配置主動模式的端口和公網IP位址

  • lftp

    lftp程式非常友好,在man手冊中就已經說明了配置方法,依次是被動模式開關、主動模式下的IP位址、主動模式下資料通道監聽的端口範圍:

ftp:passive-mode (boolean)
       sets passive FTP mode. This can be useful if you are behind a firewall or a dumb masquerading router.
       In passive mode lftp uses PASV command, not the PORT command which is used in active mode. In passive
       mode  lftp itself makes the data connection to the server; in active mode the server connects to lftp
       for data transfer. Passive mode is the default.

ftp:port-ipv4 (ipv4 address)
       specifies an IPv4 address to send with PORT command. Default is empty which means to send the address
       of local end of control connection.

ftp:port-range (from-to)
       allowed  port  range  for  active  mode.  Format is min-max, or `full' or `any' to indicate any port.
       Default is `full'.           
  • FileZilla
  1. 主動模式相關配置可以直接在菜單欄中的“編輯”-》“設定”中配置
  2. 用戶端的連接配接行為可以在每個FTP會話中單獨配置
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考
FTP Server Over 阿裡雲 最佳實踐概述本文結構FTP協定摘選被動模式出現的原因專有網絡ECS内部署FTP ServerFTP的端口與ECS的安全組主動模式适用的場景參考

參考

1、

阿裡雲金融雲下FTP主動模式的讨論

繼續閱讀