記錄一次FTP遇到的坑 主動模式與被動模式

2021-10-04 18:23:36 字數 2168 閱讀 6585

ftpclient ftpclient = new ftpclient();

ftpclient.connect(ftp.geturl(), ftp.getport());

ftpclient.setcontrolencoding(ftp.getcharset());

ftpclient.login(ftp.getuser(), ftp.getpassword());

ftpclient.setfiletype(ftpclient.binary_file_type);

ftpfile ftpfiles = ftpclient.listfiles("/");

log.info("檔案個數:{}", ftpfiles.length);

for (ftpfile ftpfile : ftpfiles) ,檔案大小:{}", ftpfile.getname(), ftpfile.getsize());

} file file = new file(ftp.getlocalfilename().substring(0, ftp.getlocalfilename().lastindexof(file.separator)));

if (!file.exists())

fileoutputstream outputstream = new fileoutputstream(new file(ftp.getlocalfilename()));

ftpclient.retrievefile(ftp.gettargetfilename(), outputstream);

這段**在我本機windows執行一切正常,但發布到公司的測試環境後,讀不到ftp伺服器的檔案,公司的測試環境是linux,使用docker部署

ftpclient.enterlocalpassivemode();
ftp連線會建立兩條tcp連線,一條用來發布命令,一條用來傳輸資料,對於ftp服務端而言,命令通道預設是21埠,資料通道預設是20埠,具體分為主動模式和被動模式:

客戶端通過埠n連線到伺服器的21埠,並告訴服務端,我開啟了乙個n+1埠(實際可能不是n+1,但會和n比較接近)用來傳輸資料,然後服務端通過20埠,主動連線客戶端的n+1埠,進行資料傳輸

該模式為ftp的預設模式

客戶端通過埠n連線到伺服器的21埠,並告訴服務端,我採用的是被動模式,請提供乙個埠給我用來傳輸資料,然後伺服器告訴客戶端:「ok,我給你分配的埠是m,可以開始傳輸資料」。然後客戶端通過n+1(同上,可能不是但比較接近)埠主動連線伺服器的m埠,進行資料傳輸

通過比較,可以發現兩種方式的區別,主要在於傳輸資料的連線由誰來建立,如果由伺服器端來建立(主動模式),那麼對於客戶端來說,需要n+1埠對外開放,由於這個埠是隨機的,所以客戶端需要開放一定範圍的埠,這在網路限制比較嚴格的生產環境比較困難,也有風險。當然這種模式對於伺服器端比較方便,因為伺服器端只需要開通21埠的入方向和20埠的出方向;如果由客戶端來建立(被動模式),那麼客戶端通過n+1埠訪問服務端,一般不會有網路問題,因為正常情況下不會限制出方向的訪問,而伺服器端需要開放更多埠,這個可以通過ftp伺服器配置,指定埠的範圍

由於調整為被動模式後,本地連線ftp成功與否具有一定隨機性,所以猜測會不會是伺服器端提供的埠m不通,導致客戶端建立資料通道的時候連線失敗,先到阿里雲上看下安全策略:

之前為了測試方便,把入方向的埠範圍調整為15-30000,正常來講這個範圍的埠已經滿足各種元件的應用了,但是ftp的埠是隨機的,有可能超出了30000,導致客戶端無法正常連線,這裡的解決方案是設定ftp服務端被動模式的埠範圍

開啟vsftp的配置檔案vsftpd.conf,新增以下配置

pasv_enable=yes

pasv_min_port=3000

pasv_max_port=5000

開啟被動模式,配置被動模式的埠範圍為3000到5000,即當客戶端以被動模式連線服務端時,服務端會在3000-5000的範圍內隨機分配乙個埠,供客戶端連線並進行資料傳輸

重啟ftp伺服器:

systemctl restart vsftpd.service

記錄一次MySQL優化過程遇到的坑

相信很多開發都優化sql語句,最近我在優化sql是遇到了乙個坑,在這裡和大家分享一下 通過頁面抓取到耗時超過3秒的介面,找到對應的sql,設定好相應引數,在測試環境通過explain進行分析,檢視執行計畫,通過分析檢視掃瞄是否走了索引,通過發現全都走了索引,在生產環境也都走了索引,想了很多辦法找不到...

記錄一次zookeeper集群搭建遇到的問題

使用vmware centos7,clone了3臺虛機,然後分別裝上zookeeper。zoo.cfg配置檔案如下 the number of milliseconds of each tick ticktime 2000 the number of ticks that the initial s...

記一次paramiko遠端連線遇到的坑

背景 工作中遇到了乙個問題,需要用到windows向windows連線 檔案傳發 以及,linux向windows連線 檔案傳發 的需求。問題1 在網上搜尋方法的時候,發現別人可以直接用paramiko連線windows,並用psutil 獲取cpu 記憶體等資料,和我們連線linux基本一樣的,那...