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.
Bonjour,
tu as aussi proxy-ftp qui peut répondre à ce problème :
http://manpages.ubuntu.com/manpages/intrepid/man5/ftp-proxy.conf.5.html
Dans ton fichier de conf tu peux définir suivant l’utilisateur le backend ftp :
[dev*]
DestinationAddress 192.168.12.13
[prod*]
DestinationAddress 192.168.12.12
derrière en backend j’utilises pure-ftpd.
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 🙂