主動到被動的ftp解決方案
我有一個 ftp 客戶端(我沒有來源的 .NET 應用程序),它只執行主動模式,需要將數據推送到只說被動的設備 ftp 伺服器。
我無法修改任何一端的軟體;但介於兩者之間的一切都是公平的遊戲。(路由、windows 或 linux 軟體、防火牆技巧……)
是否有某種 ftp 代理軟體?或者我可以嘗試某種解決方案?
有(或者,也許是?)一個非常好的守護程序,叫做SuSE Proxy Suite。它攔截了 FTP 流量,並允許將 ftp-client 重定向到某個特定的後端伺服器,如果我沒記錯的話,它也允許主動<->被動轉換。我多年來在相當繁重的環境中使用該程序,沒有遇到任何麻煩。
不幸的是,我的舊書籤 ( http://proxy-suite.suse.de ) 似乎將自己重定向到 Novell 的頁面。幾個軟體包儲存庫(FreeBSD,快速Google搜尋後的 Debian)似乎仍然包含該軟體,因此您可能會有一些希望。
FreshPorts 似乎對該軟體有一個很好的描述:
http://www.freshports.org/net/proxy-suite/
**編輯:**還有一件事。我不知道這個小問題後來是否被修補(它不是在 2004 年我最後一次使用這個東西),但預設情況下代理套件以 root 身份執行,因為它需要綁定到低埠。它作為真正的根執行,因為它沒有利用 Linux功能。
今天應該可以通過setcap命令設置文件功能,如下所示:
sudo setcap 'cap_net_bind_service=+ep' /path/to/file
但是如果這不起作用(即使功能確實存在,當我修補代理套件時 setcap 命令並不常見),這是另一種解決方法。
早在 2004 年左右,我寫了一個小更新檔,它在啟動後立即刪除了除CAP_NET_BIND_SERVICE之外的所有功能,因此即使是一些潛在的安全漏洞也不會那麼危險。您通常可能不需要此更新檔,但如果您患有這種稱為安全偏執狂的疾病,並且您的文件傳輸發生在 Internet 的一些黑暗角落而不是您舒適的辦公室 LAN 之間,那麼該更新檔可能是一個好主意。
要查看 ftp-proxy 是否以完全 root 權限執行,請檢查getpcaps是否返回如下內容:
yourserver root# getpcaps `pidof ftp-proxy` Capabilities for `16982': =eip cap_setpcap-eip
修補後的版本應該像這樣返回:
yourserver root# getpcaps `pidof ftp-proxy` Capabilities for `9522': = cap_net_bind_service+ep
最後,這是我在數百萬個月前寫的更新檔,我希望它仍然可以應用。
--- common/com-misc.c.orig 2006-11-20 13:54:59.000000000 +0200 +++ common/com-misc.c 2006-11-20 14:40:47.000000000 +0200 @@ -36,0 +37 @@ +#include <sys/capability.h> @@ -748,0 +750,18 @@ + /* + * If running as root, drop all the privileges except CAP_NET_BIND + */ + if (geteuid() == 0) { + cap_t caps = cap_init(); + static cap_value_t capv[] = {CAP_NET_BIND_SERVICE}; + const int numcaps = sizeof(capv) / sizeof(capv[0]); + if (caps == NULL) + syslog_error("cap_init() failed; errno = %d", errno); + if (cap_set_flag(caps, CAP_PERMITTED, numcaps, capv, CAP_SET) < 0) + syslog_error("Could not set permitted capabilities; errno = %d", errno); + if (cap_set_flag(caps, CAP_EFFECTIVE, numcaps, capv, CAP_SET) < 0) + syslog_error("Could not set effective capabilities; errno = %d", errno); + if (cap_set_proc(caps) < 0) + syslog_error("Could not apply capability set; errno = %d", errno); + cap_free(caps); + } +