aws上的vsftp服務的坎坷經歷

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

  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服務的坎坷經歷
    aws上的vsftp服務的坎坷經歷
    這裏連接超時,顯而易見,FTP服務端發送給客戶端的IP地址是服務端的私有地址。位於Internet上的客戶端無法建立與位於VPC內部的私有地址10.0.0.10直接通訊。

  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)

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

      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的地址範圍

      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上

      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地址是公網地址,那麼需要改寫爲私網IP

      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、21、pasv_min~pasv_max這些端口在安全組中配置開放訪問策略
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
idle_session_timeout=300
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
max_clients=65530
max_per_ip=65530
reverse_lookup_enable=NO
pasv_address=x.x.x.x
pasv_enable=YES
pasv_max_port=65535
pasv_min_port=64000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章