Passive

主動到被動的ftp解決方案

  • March 5, 2011

我有一個 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 &lt;sys/capability.h&gt;
@@ -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) &lt; 0)
+                        syslog_error("Could not set permitted capabilities;
errno = %d", errno);
+                if (cap_set_flag(caps, CAP_EFFECTIVE, numcaps, capv, CAP_SET) &lt; 0)
+                        syslog_error("Could not set effective capabilities;
errno = %d", errno);
+                if (cap_set_proc(caps) &lt; 0)
+                        syslog_error("Could not apply capability set; errno =
%d", errno);
+                cap_free(caps);
+        }
+

引用自:https://serverfault.com/questions/166098