1 需求
近期,需要通過Nginx代理內網FTP服務,以便外網用戶進行訪問,故針對此展開技術調研,
軟體版本:
- Nginx: 1.18.0;
- vsftpd: 3.0.2;
- CentOS: CentOS Linux release 7.9.2009 (Core).
2 FTP模式
FTP具有兩個埠,分別為控制埠(完成諸如登錄,目錄查詢/切換等命令),資料埠(負責具體資料傳輸).
CentOS上安裝vsftpd后,啟動服務可發現vsftpd在21埠上監聽命令(此時無客戶端接入),具體如下圖所示:

FTP連接模式具有兩種,分別為主動模式(PORT)以及被動模式(PASV),
主動模式:
(1)當FTP客戶端以主動模式連接服務端時,客戶端以動態選擇的埠號向服務器的命令埠發起連接;
(2)連接建立后,用戶在發出列目錄或傳輸檔案的命令后,會要求建立資料連接;
(3)FTP客戶端在控制連接上發出主動模式指令,告知服務器客戶端的資料連接埠號;
(4)服務端收到指令后,會使用20號埠連接客戶端指定的資料連接埠號,從而建立資料連接,
被動模式:
被動模式的連接程序與主動模式類似,區別點在于客戶端發出列目錄或傳輸檔案的命令后,客戶端會發送PASV指令至服務端;
服務端收到PASV指令后,告知客戶端服務端的資料連接IP地址和埠號;
客戶端根據回傳的服務端資料連接IP和埠號,發起資料連接,
3 問題 & 解決思路
當前,客戶端需要通過Nginx代理方能訪問FTP服務端,通過Nginx stream可以實作控制命令的轉發,但是對于客戶端和服務端協商的資料連接,較難實作代理,
不過查閱相關檔案,vsftpd支持設定資料連接的埠范圍,亦支持設定資料連接的IP,
因此,我們可以指定vsftpd模式為被動模式(默認即為被動模式),設定資料連接IP地址為Nginx代理地址,合理設定資料連接埠范圍(Nginx監聽本地此埠范圍內資料),當ftp客戶端與vsftpd服務端協商資料連接后,ftp客戶端根據資料連接IP(已設定為Nginx代理地址)以及埠號發起連接(實際連接至Nginx服務器),Nginx將此埠上監聽的資料轉發至vsftpd對應的資料埠,
4 方案示例
機器資訊:
- Nginx代理機: 192.168.56.101;
- vsftpd服務端: 192.168.56.102;
- 測驗機: 192.168.56.106,
此處,利用開發機上安裝的虛擬機完成驗證,未具體限制網段,
vsftpd服務端配置:
# cat /etc/vsftpd/vsftpd.conf
listen=YES
listen_ipv6=NO # 修改listen配置,只允許監聽在IPv4地址,這是因為在被動模式下,設定pasv_address存在bug(具體可搜索stackoverflow)
pasv_enable=YES # 開啟pasv模式
pasv_min_port=50000 # pasv模式下,資料連接最小埠號
pasv_max_port=50002 # pasv模式下,資料連接最大埠號
pasv_address=192.168.56.101 # pasv模式下,告知客戶端的資料連接IP
pasv_promiscuous=YES # 關閉pasv模式下,關閉對IP地址的檢查,此檢查確保控制連接和資料連接來自同一IP
pasv_promiscuous關閉存在安全隱患;
在實際組網情況下,Nginx轉發時可設定保留源IP資訊,但是客戶端與服務端無法直接訪問,因此只能放棄保留源IP資訊,
Nginx配置:
stream {
upstream ftp { # FTP控制面轉發
server 192.168.56.102:21 max_fails=2 fail_timeout=3s weight=1;
}
server { # 轉發FTP控制面請求
listen 11000; #監聽埠
#失敗重試
proxy_next_upstream on;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
#超時配置
proxy_connect_timeout 1s;
proxy_timeout 10m;
#限速配置
proxy_upload_rate 1024k;
proxy_download_rate 2048k;
#上游服務器
proxy_pass ftp;
}
upstream ftp_pasv1 {
server 192.168.56.102:50000 max_fails=2 fail_timeout=3s weight=1;
}
upstream ftp_pasv2 {
server 192.168.56.102:50001 max_fails=2 fail_timeout=3s weight=1;
}
upstream ftp_pasv3 {
server 192.168.56.102:50002 max_fails=2 fail_timeout=3s weight=1;
}
server { # 轉發客戶端發送到Nginx代理機的資料連接
listen 50000;
proxy_pass ftp_pasv1;
}
server { # 轉發客戶端發送到Nginx代理機的資料連接
listen 50001;
proxy_pass ftp_pasv2;
}
server { # 轉發客戶端發送到Nginx代理機的資料連接
listen 50002;
proxy_pass ftp_pasv3;
}
}
此處省略對FTP資料連接的具體控制(諸如限速),
5 驗證
重啟vsftpd以及Nginx,從測驗機:192.168.56.103發起連接,具體如下所示:

tcpdump抓包分析:

6 弊端
使用Nginx代理FTP服務,存在以下缺點:
- 控制連接和資料連接是否來自同一連接無法驗證,存在安全隱患;
- FTP被動模式下,資料埠范圍較寬時,Nginx添加配置比較麻煩;
- Nginx代理機需要開放較多埠,諸如iptables等安全設定復雜,
使用SFTP,簡單又可靠,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/253762.html
標籤:Linux
上一篇:Linux目錄以及常用命令整理
