aws上的vsftp服務的坎坷經歷

  1. vsftp的安裝
    分爲本地用戶、虛擬用戶兩種模式,今天就不在此過多介紹怎麼分別啓用不一樣的模式,之後再單獨一篇安裝的文章。
    yum install -y vsftpd
    配置文件:/etc/vsftpd/vsftpd.conf
    啓動:systemctl start vsftpdwindows

  2. vsftp客戶端
    服務啓動後,使用客戶端鏈接,經常使用的方式有windows地址欄中輸入ftp://x.x.x.x 或者下載安裝FileZilla輸入服務端IP,端口默認21測試鏈接。安全

  3. 主動模式、被動模式介紹
    從FileZilla中咱們能夠發現,ftp鏈接有3種模式:默認、主動、被動。在服務端其實只有兩種主動和被動,通過實測,客戶端(含windows地址欄鏈接)默認鏈接方式是被動模式。下面來講說主動模式跟被動模式的區別吧。
    咱們重溫一下FTP的工做過程。客戶端鏈接服務端TCP 21端口創建命令通道後,輸入用戶名密碼完成登陸;隨後的每一次數據傳輸都須要另外創建數據通道進行; 若是數據通道由客戶端發起,服務端接受,咱們稱之爲被動模式;反之,若是數據通道由服務端發起,客戶端接受,則稱之爲主動模式。
    主動模式:
    aws上的vsftp服務的坎坷經歷
    被動模式:
    aws上的vsftp服務的坎坷經歷網絡

  4. AWS遇到的問題,實際上是NAT的問題。
    鋪墊了這麼久,如下進入正題。除了ftp有NAT的問題,還有其餘一些服務也存在,如VOIP服務。
    咱們在共有云購買的機器如今網卡上都是隻有一塊內網網卡,而後經過NAT綁定公網IP對外提供公網服務。(PS:老早前公網地址是能夠啓動在雲主機的網卡上的,這樣就沒有NAT問題),這時主動模式的鏈接不會受影響,緣由請自行領悟。這裏只介紹會出現問題的被動模式。
    以被動模式內網訪問時,完美!順利!
    aws上的vsftp服務的坎坷經歷
    以被動模式公網訪問時,糟糕!
    aws上的vsftp服務的坎坷經歷
    這裏鏈接超時,顯而易見,FTP服務端發送給客戶端的IP地址是服務端的私有地址。位於Internet上的客戶端沒法創建與位於VPC內部的私有地址10.0.0.10直接通信。session

  5. 解決這個問題有多種方法,咱們由簡單到複雜分別敘述
    ①加強協議適配NAT
    FTP協議針對NAT和其餘因素,對協議進行了加強,提供了加強版的被動模式EPSV命令。服務端再也不顯式指定IP地址,只提供數據通道的端口號。客戶端默認與控制通道相同的IP地址創建數據通道。
    aws上的vsftp服務的坎坷經歷
    能夠看到,解決方案很優雅。固然這須要客戶端和服務端都支持加強的協議才能達成;若是咱們不修改協議,可否解決這個問題呢。

②服務端適配
有些時候,修改協議和實現須要多方協調和很長的時間才能完成。在RFC2428標準化以前,一些FTP實現就已經經過修改實現來適配基本NAT,而非修改協議。
以vsftpd爲例,它容許經過配置文件vsftpd.conf中的配置項 pasv_address=x.x.x.x 告知服務端,在PASV被動模式下,應當指示客戶端鏈接到配置項指定的IP(而不是服務端的私有IP)來適配基本NAT。
題外話:其餘的一些常見應用例如VoIP類應用,也有相似的機制去適配基本NAT;例如引入STUN/TURN/ICE等方式適配各類更加複雜的NAT穿越場景(多年前搞過VOIP)app

③啥都不改(此法慎用)適用於精通網絡的高手
#從EC2 實例元數據服務獲取本實例的公網IP(若有)、私網IPcurl

public_ipv4=`curl -s http://169.254.169.254/latest/meta-data/public-ipv4`

      local_ipv4=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`

#配置私網地址段,這裏應爲EC2實例所在VPC的地址範圍tcp

local_net=10.0.0.0/16

      if [ 「x${public_ipv4}」 == 「x」 ]

      then

      echo 「No public IPv4 address available for this instance, abort.」

      exit 1

      else

#若是EC2實例的公網IP不爲空,則將該公網地址添加到eth0上ide

ip address add ${public_ipv4}/32 dev eth0

#本地接受的鏈接,若是來源不是本VPC,那麼將IP包的目的地址改寫爲公網IP測試

iptables -t nat -A PREROUTING ! -s ${local_net} -d ${local_ipv4} -i eth0 -j DNAT --to ${public_ipv4}

#本地發起的鏈接,若是出方向流量的源IP地址是公網地址,那麼須要改寫爲私網IPthis

iptables -t nat -A POSTROUTING -s ${public_ipv4} -o eth0 -j SNAT --to ${local_ipv4}

      fi

驗證腳本執行結果:
首先檢查本實例的公網IP是否已經正確配置到eth0上。

~ # ip addr show dev eth0

而後檢查iptables的NAT規則是否正確配置

~ # iptables -t nat -nvL
最後分別從VPC內部和Internet鏈接到服務,驗證結果

~ $ ss -nt

此法不建議生產使用,維護門檻比較高。

最後:附上清測可使用的vsftpd.conf,注意須要把20、2一、pasv_min~pasv_max這些端口在安全組中配置開放訪問策略anonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESidle_session_timeout=300pam_service_name=vsftpduserlist_enable=YEStcp_wrappers=YESmax_clients=65530max_per_ip=65530reverse_lookup_enable=NOpasv_address=x.x.x.xpasv_enable=YESpasv_max_port=65535pasv_min_port=64000

相關文章
相關標籤/搜索