網站首頁 編程語言 正文
FTP 基礎 與 使用 Docker 搭建 Vsftpd 的 FTP 服務
前言
最近的工作中,需要將手機上的文件發送到公司的 FTP 的服務器。按照從前的思路,自然是,先將文件傳到電腦,再由電腦上傳到 FTP 服務器上;經過一份搜索后找到了 質感文件 這個 Android 應用,這樣就可以通過無線網直接連接 FTP 服務器了。
FTP 基礎FTP 需要兩個端口,一個是數據端口,一個是控制端口。在主動模式下,控制端口一般為21,數據端口一般為20(控制端口 - 1);在被動模式下,由服務器端和客戶端協商決定。FTP 地址為:ftp://用戶名:密碼@IP地址或域名:控制端口號FTP 的傳輸方式有兩種:
(1)ASCII傳輸方式,即假定用戶正在拷貝的文件包含簡單的ASCII碼文本,通常傳輸時會自動調整格式
(2)二進制傳輸模式,即逐位傳輸FTP 的工作模式有兩種:
(1)PORT主動模式,意為服務端主動從20端口連接客戶端告知的端口
(2)PASV被動模式,意為服務端 告知 客戶端 地址和端口后,等待客戶端連接
(3)對比:主動模式需要客戶端必須開放端口給服務器,服務器要可以連上客戶端,這就要求客戶端為公網 IP(經過 NAT 后地址就變化了)且防火墻打開。而實際情況下,公網 IP 比較少而且很多客戶端都是在防火墻內,由路由器交換機進行著 NAT,還要協調開放端口。被動模式只需要服務器端開放端口給客戶端連接就行了,而服務器為了便于訪問,一般會放在公網,所以被動模式使用較多。主動被動模式選擇權在客戶端
此處比較奇怪,為什么服務器會告知客戶端地址,直接讓客戶端使用訪問服務器時的地址不可以嗎?我的思考是,機器一般無法取得自己外網的地址,而且 FTP 協議中確有要求,要傳輸地址:
(圖為 FileZilla 中被動模式傳輸文件)
這里可能就會好奇了,前面的地址好理解,后面的兩個數字是什么意思。通過這篇文章得知,端口號為數字1 * 256 + 數字2
,Wireshark 中的截圖也印證了這一點:
(圖為 Wireshark 中捕獲的傳輸接口)
使用 Docker 搭建 Vsftpd 的 FTP 服務
我們使用的 Docker 鏡像為 fauria/vsftpd。
docker run -d -v /root/ftp:/home/vsftpd \ --p 60020:20 -p 60021:21 -p 61100-61105:61100-61105 \ -e FTP_USER=battor -e FTP_PASS=nihaonihao123123 \ -e PASV_ADDRESS=1.2.3.4 -e PASV_MIN_PORT=61100 -e PASV_MAX_PORT=61105 \ --name vsftpd --restart=always fauria/vsftpd
-v 意為將容器中的路徑映射到本地文件系統(“冒號”前為 本地文件系統路徑,“冒號”后為 容器中的文件系統路徑)。
-p 意為將容器的端口號映射到本地,可以看到映射了一個范圍的地址,這些端口是被動模式下開放給客戶端的,要與后面的 PASV_MIN_PORT (被動模式最小端口) 和 PASV_MAX_PORT (被動模式最大端口) 相對應。
--name 用于指定容器名稱。
--restart 意為當 Docker 進程重啟時,立刻啟動該容器。
我們自己部署服務器時,應當盡量避免使用默認端口,以減少被黑客攻擊的風險。故此處使用 60020 和 60021,以及 61100 至 61105 端口
此外需要注意的是,PASV_ADDRESS 需要配置為服務器對應的外網地址。否則無法連接:
(圖為 質感文件 中連接時的情況)
然鵝在 FileZilla 客戶端測試中發現,即使 配置為 127.0.0.1,某些客戶端亦可以正常連接,猜測是因為客戶端中存在類似的設置:
(圖為 FileZilla 客戶端的設置)
后記
由于 FTP 中的文件較為隱私,在這里就不展示配置成功后的效果了,實際使用起來還是很方便滴。
再次推薦下 質感文件 這個 APP 吧,界面 Material Design 風格,好看好用。支持 FTP 服務器,SFTP 服務器, SMB 服務器,還可作為 FTP 服務器使用。
參考
fauria/vsftpd
227 Entering Passive Mode 含義
原文鏈接:https://www.cnblogs.com/battor/p/ftp_essential_and_docker_vsftpd.html
相關推薦
- 2022-11-10 C語言宏定義容易認不清的盲區梳理_C 語言
- 2023-04-03 python中super().__init__()作用詳解_python
- 2022-12-27 Python?PyQt5實現拖放效果的原理詳解_python
- 2022-06-18 C#如何實現dataGridView動態綁定數據_C#教程
- 2022-07-13 關于自定義監聽器 onApplicationEvent方法被執行多次的問題
- 2022-06-02 Python導包模塊報錯的問題解決_python
- 2024-03-15 docker安裝RabbitMq插件
- 2023-03-27 Android?WorkManager實現后臺定時任務流程詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支