2 votes

Solution ftp actif-passif

J'ai un client FTP (une application .NET pour laquelle je n'ai pas accès au code source) qui ne fonctionne qu'en mode actif et qui doit transférer des données vers un serveur FTP d'appareils qui ne fonctionne qu'en mode passif.

Je ne peux rien faire pour modifier le logiciel des deux côtés; mais tout ce qui se trouve entre les deux est autorisé. (routage, logiciels Windows ou Linux, astuces de pare-feu, ...)

Existe-t-il un logiciel proxy FTP quelconque? Ou une sorte de solution que je pourrais essayer?

2voto

Janne Pikkarainen Points 31244

Il y a (ou peut-être y avait-il?) un très beau démon appelé SuSE Proxy Suite. Il interceptait le trafic FTP et permettait de rediriger un client FTP vers un serveur backend spécifique et, si ma mémoire est bonne, il permettait également les conversions actives<->passives. J'ai utilisé le programme dans un environnement assez lourd pendant des années sans problème.

Malheureusement, mon ancien signet (http://proxy-suite.suse.de) semble se rediriger vers la page de Novell. Plusieurs référentiels de paquets (FreeBSD, Debian après une recherche rapide sur Google) semblent encore inclure le logiciel, donc vous pouvez avoir un espoir.

FreshPorts semble avoir une bonne description du logiciel :

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

EDIT: Une autre chose. Je ne sais pas si ce petit problème a été corrigé plus tard (ce n'était pas le cas en 2004 quand j'ai utilisé ce truc pour la dernière fois), mais par défaut, proxy-suite s'exécute en tant que root car il doit se lier à des ports bas. Et il s'exécutait en tant que Really Root, car il ne tirait pas parti des capabilities de Linux.

Aujourd'hui, il devrait être possible de définir les capacités du fichier via la commande setcap comme ceci :

sudo setcap 'cap_net_bind_service=+ep' /chemin/vers/fichier

Mais si cela ne fonctionne pas (même si les capacités existaient, la commande setcap n'était pas très courante lorsque j'ai patché proxy-suite), voici une autre solution de contournement.

En 2004 environ, j'ai écrit un petit correctif qui abandonnait toutes les capacités sauf CAP_NET_BIND_SERVICE juste après le démarrage, donc même certains trous de sécurité potentiels seraient moins dangereux. Vous n'aurez probablement pas besoin de ce correctif, mais si vous souffrez de cette maladie appelée paranoïa de sécurité et que vos transferts de fichiers se font entre des coins sombres d'Internet au lieu de votre confortable LAN de bureau, le correctif pourrait être une bonne idée.

Pour voir si ftp-proxy s'exécute avec des privilèges complets de root, vérifiez si getpcaps renvoie quelque chose comme ceci :

yourserver root# getpcaps `pidof ftp-proxy`
Capabilities for `16982': =eip cap_setpcap-eip

Une version patchée devrait renvoyer quelque chose comme cela :

yourserver root# getpcaps `pidof ftp-proxy`
Capabilities for `9522': = cap_net_bind_service+ep

Et enfin, voici le correctif que j'ai écrit il y a des millions de lunes, j'espère qu'il peut toujours être appliqué.

--- 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 
@@ -748,0 +750,18 @@
+        /*
+        * Si l'exécution est en tant que root, abandonnez toutes les privilèges sauf 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);
+        }
+

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X