Reverse Proxy FTP

J’ai mis en place un système de Reverse Proxy / WAF en frontal de multiples serveurs Webs.

 

Pour la partie HTTP, pas de souci, les tutos abondent sur le net, avec Apache, Nginx, Varnish…et la solution propriétaire que j’utilise.

Côté Backend, il a juste fallu que je configure mon X-Forwarded-For, notamment pour permettre aux devs d’accéder à leur phpmyadmin préféré

Dans apache.conf :

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\"" forwarded

Dans conf.d/phpmyadmin.conf :

 

SetEnvIF X-Forwarded-For "10.0.0.2" AllowIP
Allow from 10.0.0.2

Pour la partie HTTPS, pas de souci, SNI included pour les OS et navigateurs  ayant moins de 5 ans.

 

Pour le FTP,c’est devenu plus compliqué. Les solutions de ReverseProxy, se contentent en général de faire suivre les requêtes au niveau 4 vers un seul serveur. Il me fallait pouvoir répartir mes requêtes FTP aussi facilement qu’en HTTP vers le bon serveur.

La seule solution que j’ai trouvée sort de là :

http://linuxfr.org/news/gerer-plusieurs-services-de-facon-transparente.

 

D’abord il m’a fallu installer CentOS.

Ensuite activer le dépôt rpmforce


wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

wget http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

rpm --import RPM-GPG-KEY.dag.txt

 

Ensuite on peut installer ftp.proxy

yum --enablerepo=rpmforge install ftpproxy

Ftpproxy s’installe comme service lancé par  xinet.

 

cat /etc/xinetd.d/ftpproxy

# default: off
# description: ftpproxy is an FTP proxy server.
service ftpproxy
{
disable         = yes
socket_type     = stream
protocol        = tcp
port            = 2121
type        = UNLISTED
wait            = no
user            = ftp
server          = /usr/sbin/ftp.proxy
server_args     = -b -B
}

J’ai finalement configuré le service de la façon suivante :

cat /etc/xinetd.d/ftp

service ftp
{
socket_type = stream
wait        = no
user        = root
server      = /usr/sbin/ftp.proxy
server_args = -e -m -b -x /usr/local/bin/routage_ftp.pl
log_type = FILE /var/log/ftpproxy.log
log_on_success  = PID USERID HOST DURATION
log_on_failures = HOST USERID
}

 

Lorsqu’une requête arrive sur le port 21, le binaire ftp.proxy est lancé avec le script routage_ftp.pl.

Ce script va nous permettre de différencier les serveurs de destination en fonction du login entré par le client.

 

C’est là qu’on peut réaliser notre configuration personnalisée :

#!/usr/bin/perl -w
#
## on recupere l'utilisateur ftp
my $login = $ENV{'PROXY_SERVERLOGIN'};
#
## par defaut le serveur ftp est le webmut
my $serveur = 'csi-webmut';
#

# toto.com
if ($login eq 'ftp-toto') { $serveur = 'www.toto.com'; }
elsif ($login eq 'ftp-toto-dev') { $serveur = 'dev.toto.com'; }

# machin.fr
elsif ($login eq 'ftp-machin') { $serveur = 'machin.fr' }
elsif ($login eq 'ftp-machin-recette') { $serveur = 'recette-machin.fr'; }

# on envoie la reponse au proxy ftp
print "LOGIN $login\nSERVER $serveur\n";

 

Il faut que les serveurs soient résolus avec l’IP réelle du serveur.

 

2 thoughts

    1. Je suis entrain de réfléchir à la mise en place d’un Reverse Proxy FTP, tu peux m’en dire plus sur la mise en place de ta solution ? Tu as des exemples de mise en place ?

      Ca me permettra de voir laquelle répond le mieux a mon besoin 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload the CAPTCHA.