JAVA版本的FTP和SFTP代理程序

背景

之前公司某個需求,需要使用FTP傳輸文件,由於服務器間網絡不通,需要使用一臺跳板機才能訪問,所以我們需要一個FTP代理軟件,讓我們客戶端可以通過它訪問外網的FTP服務器。

辛酸淚

最先想到的是nginx,但是作爲一個SFTP的代理也許可行,畢竟只需要一個SSH端口,作爲一個靜態文件服務器也行,但是作爲一個FTP代理,需要考慮到控制端口和數據端口,nginx並不能滿足FTP代理的需求。

然後調用squid, 看文檔表示它是支持FTP協議的。下載了各種版本,參考網上各種配置進行嘗試,結果都是error error error ! 谷歌了各種資料,一個是當時的squid版本有bug,一個是squid並不支持主動模式的FTP代理,而公司的防火牆策略要求所有FTP必須是主動模式,GG。

然後只能各種搜索,google啊翻了個遍,看看別人怎麼做FTP代理的,結果都是說建議拋棄主動模式,採用被動模式,沒辦法了,就跑去github搜。

曙光

在github上搜到了某位外國友人的項目ftpproxy,看了他的說明和代碼,第一感覺是這個還比較靠譜,代碼量也少。

於是拉下來試用,結果發現,這東東雖然支持主動模式(可以在配置文件中配置),但是隻支持代理到FTP服務端的主動模式,客戶端到代理端還是使用的被動模式。沒法子了,自己改造吧。

終章

爲了滿足公司內網絡情況要求,對ftpproxy進行了改造。

  1. 改造了socket創建方式,使之支持客戶端與代理之間的主動模式
  2. 增加了socket5代理的代碼,使之支持SFTP代理

改造之後,經過調試測試,也應用在生產環境差不多兩年了,目前來看運行良好,沒有發生過故障。

今天突然想起這事,覺得也應該記錄和分享一下。

項目代碼在這裏https://github.com/DevotedTangLiu/ftpproxy,請有需要的同志自行取閱吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章