FTP是個比較復雜的協議,其協議分為控制層和數據層,工作模式分為主動和被動兩種模式。
在默認的Active模式下其工作原理如下:
可以看到,客戶端發起FTP的請求道服務器端,FTP的端口是21。用戶在控制層面通過認證后,會通知服務器其開放的隨機端口號。隨后服務器端將主動發起源端口為TCP 20目標端口為TCP 隨機端口號的連接請求,進行數據連接。
在一般情況下,FTP的服務器和客戶端都是在防火牆之后的,服務器端的防火牆要明確配置此服務器要對外提供哪些服務的端口,客戶端的防火牆要求必須是客戶端主動發起連接的TCP 連接才會通過。
因為數據連接是服務器端首先發起,如果FTP客戶端在防火牆之后,防火牆會中斷此數據連接,導致FTP可以登錄,但不能傳輸數據。
被動模式的工作原理如下:
為解決客戶端在防火牆后,FTP不能正常工作的情況,可以選擇FTP的被動模式。其在控制層面的過程和主動模式相似,但在用戶認證通過,客戶端進入PASV模式后,服務器端會根據事先的配置,隨機選擇特定范圍的TCP端口作為數據傳輸的端口,並開放這個端口等待用戶數據的傳輸,同時並把這個信息發送給客戶端,客戶端會通過這個端口發起數據傳輸的請求。當FTP服務器的數據返回給客戶端時,客戶端前面的防火牆發現此TCP連接是客戶端發起的TCP連接,所以服務器的數據會順利的穿過防火牆,實現數據傳輸。
所以為能讓所有的客戶端能夠訪問FTP服務器,一般情況下,FTP服務器會同時支持主動模式和被動模式。
在Azure環境下,VM的endpoint相當於FTP 服務器前端的防火牆,需要在endpoint上打開所有可能的控制層面和數據層面的端口。所以:TCP 21(控制層面端口)、TCP 20(主動模式數據端口)、多個TCP端口(被動模式的數據端口)都要在endpoint上打開。
另外VM本身的防火牆也要做相應的設置,開放上述端口。
下面將通過安裝vsftp為案例,在Azure上部署FTP服務。
共有三個部分:1. 安裝vsftp, 2. 設置VM的endpoint ,3. 設置VM的防火牆,之后就可以測試了。
1.安裝vsftp
yum install –y vsftpd
更改vsftpd的配置文件:
Vim /etc/vsftpd/vsftpd.conf
添加以下內容:
pasv_enable=YES
pasv_min_port=1120
pasv_max_port=1121
這三行表示:開啟被動模式,其數據傳輸隨機端口為1120-1121。
保存后啟動vsftpd服務。
2.配置VM的endpoint
可以看到開放了FTP的控制層面端口:21,開放了FTP主動模式的數據端口:20,開放了FTP被動模式的數據端口(此端口是配置文件里配置的):1120、1121。
3.配置VM的防火牆
簡化配置,關閉iptables:
iptables –F
service iptables save
至此配置都結束了。測試:
C:\Users\hengz>ftp hwcentos65.chinacloudapp.cn
Connected to hwcentos65.chinacloudapp.cn.
220 (vsFTPd 2.2.2)
200 Always in UTF8 mode.
User (hwcentos65.chinacloudapp.cn:(none)): anonymous
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
pub
226 Directory send OK.
ftp: 8 bytes received in 0.01Seconds 0.67Kbytes/sec.
可以成功顯示內容。