web-dev-qa-db-ja.com

アクティブからパッシブへのftpソリューション

パッシブのみを話すアプライアンスのftpサーバーにデータをプッシュする必要があるアクティブモードのみを実行するftpクライアント(ソースがない.NETアプリ)があります。

どちらの側でもソフトウェアを変更するために私にできることは何もありません。しかし、その間のすべては公正なゲームです。 (ルーティング、WindowsまたはLinuxソフトウェア、ファイアウォールのトリック、...)

ある種のftpプロキシソフトウェアはありますか?または私が試すことができるある種の解決策?

2
Joris

SuSE Proxy Suiteと呼ばれる非常に素晴らしいデーモンがあります(または、おそらくそうでしたか?)。 FTPトラフィックを傍受し、ftpクライアントを特定のバックエンドサーバーにリダイレクトできるようにしました。メモリが機能する場合は、アクティブ<->パッシブ変換も許可しました。私はこのプログラムをかなり重い環境で何年も問題なく使用しました。

残念ながら、私の古いブックマーク(http://proxy-suite.suse.de)は、Novellのページにリダイレクトされているようです。いくつかのパッケージリポジトリ(FreeBSD、クイックグーグル後のDebian)にはまだソフトウェアが含まれているようですので、希望があるかもしれません。

FreshPortsには、ソフトウェアに関する優れた説明があるようです。

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

編集:もう1つ。この小さな問題が後でパッチされたかどうかはわかりませんが(2004年に戻っていないので、最後にこの問題を使用しました)、デフォルトでは、プロキシスイートは低いポートにバインドする必要があるためrootとして実行されます。そして、Linuxを利用していなかったため、Really Rootとして実行されていました capabilities

今日では、次のようにsetcapコマンドを使用してファイル機能を設定できるはずです。

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

ただし、これが機能しない場合(機能が存在していても、プロキシスイートにパッチを適用したときにsetcapコマンドはあまり一般的ではありませんでした)、別の回避策があります。

2004年頃に、起動直後にCAP_NET_BIND_SERVICEを除くすべての機能を削除する小さなパッチを作成したので、潜在的なセキュリティホールでさえ危険性が低くなります。通常、このパッチは必要ないかもしれませんが、セキュリティパラノイアと呼ばれるこの病気があり、ファイル転送が快適なオフィス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);
+        }
+
2