主动到被动的ftp解决scheme

我有一个FTP客户端(.NET应用程序,我没有来源),只有活动模式,需要将数据推到一个只能说被动的设备FTP服务器。

在任何一端我都无法修改软件。 但是之间的一切都是公平的游戏。 (路由,Windows或Linux软件,防火墙技巧,…)

有没有某种ftp代理软件? 或者我可以尝试某种解决scheme?

有(或者也许是)一个叫做SuSE Proxy Suite的非常好的守护进程。 它拦截FTPstream量,并允许将ftp-clientredirect到某个特定的后端服务器,如果我的内存服务于我,它也允许主动的< – >被动转换。 我在相当繁重的环境中使用这个程序多年没有麻烦。

不幸的是,我的旧书签( http://proxy-suite.suse.de )似乎将自己redirect到Novell的页面。 几个软件包仓库(FreeBSD,Debian之后,谷歌search)似乎仍然包括软件,所以你可能有一些希望。

FreshPorts似乎对这个软件有很好的描述:

http://www.freshports.org/net/proxy-suite/

编辑:还有一件事。 我不知道这个小问题后来是否被修补过了(2004年我还没有用过这个东西),但是默认情况下proxy-suite是以root身份运行的,因为它需要绑定到低端口。 它是作为真正的根,因为它没有利用Linux的能力 。

今天应该可以通过setcap命令设置文件function,如下所示:

sudo setcap 'cap_net_bind_service=+ep' /path/to/file 

但是,如果这不起作用(尽pipefunction确实存在,setcap命令在修补代理套件时不是很常见),但这是另一种解决方法。

在2004年左右,我写了一个小补丁,在启动后立即删除了除CAP_NET_BIND_SERVICE之外的所有function,所以即使是一些潜在的安全漏洞也不会那么危险。 你通常可能不需要这个补丁,但是如果你有这种称为安全偏执狂的疾病,并且你的文件传输发生在互联网的一些黑暗angular落之间,而不是你办公室的局域网,补丁可能是一个好主意。

要查看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); + } +