-
vsftp的安裝
分爲本地用戶、虛擬用戶兩種模式,今天就不在此過多介紹怎麼分別啓用不同的模式,以後再單獨一篇安裝的文章。
yum install -y vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
啓動:systemctl start vsftpd -
vsftp客戶端
服務啓動後,使用客戶端連接,常用的方式有windows地址欄中輸入ftp://x.x.x.x 或者下載安裝FileZilla輸入服務端IP,端口默認21測試連接。 -
主動模式、被動模式介紹
從FileZilla中我們可以發現,ftp連接有3種模式:默認、主動、被動。在服務端其實只有兩種主動和被動,經過實測,客戶端(含windows地址欄連接)默認連接方式是被動模式。下面來說說主動模式跟被動模式的區別吧。
我們重溫一下FTP的工作過程。客戶端連接服務端TCP 21端口建立命令通道後,輸入用戶名密碼完成登錄;隨後的每一次數據傳輸都需要另外建立數據通道進行; 如果數據通道由客戶端發起,服務端接受,我們稱之爲被動模式;反之,如果數據通道由服務端發起,客戶端接受,則稱之爲主動模式。
主動模式:
被動模式: -
AWS遇到的問題,其實是NAT的問題。
鋪墊了這麼久,以下進入正題。除了ftp有NAT的問題,還有其他一些服務也存在,如VOIP服務。
我們在共有云購買的機器現在網卡上都是隻有一塊內網網卡,然後通過NAT綁定公網IP對外提供公網服務。(PS:老早前公網地址是可以啓動在雲主機的網卡上的,這樣就沒有NAT問題),這時主動模式的連接不會受影響,原因請自行領悟。這裏只介紹會出現問題的被動模式。
以被動模式內網訪問時,完美!順利!
以被動模式公網訪問時,糟糕!
這裏連接超時,顯而易見,FTP服務端發送給客戶端的IP地址是服務端的私有地址。位於Internet上的客戶端無法建立與位於VPC內部的私有地址10.0.0.10直接通訊。 - 解決這個問題有多種方法,我們由簡單到複雜分別敘述
①增強協議適配NAT
FTP協議針對NAT和其他因素,對協議進行了增強,提供了增強版的被動模式EPSV命令。服務端不再顯式指定IP地址,只提供數據通道的端口號。客戶端默認與控制通道相同的IP地址建立數據通道。
可以看到,解決方案很優雅。當然這需要客戶端和服務端都支持增強的協議才能達成;如果我們不修改協議,能否解決這個問題呢。
②服務端適配
有些時候,修改協議和實現需要多方協調和很長的時間才能完成。在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