Introduction

Vous avez sans doute eu le souci lors de l’utilisation d’un reverse proxy pour desservir des machines web type Apache. Dans les logs des backend, l’adresse IP retourné est celle du reverse proxy; logique puisque c’est lui qui effectue les requêtes. Cela peut être gênant si vous voulez lever des statistiques sur vos visiteurs.

Pour que le backend traite les trames les frontend ajoute dans les headers l’occurrence X-Forwarded-For. Voici comment cela se présente :

X-Forwarded-For: client, proxy1, proxy2

En premier lieu on l’adresse ip d’origine (celle du client) puis le ou les proxy par lesquels la demande est passée.

Nginx

Pour configurer cela sous NGINX, il faut d’abord vérifier que votre version de NGINX a été compilé avec. Pour cela :

nginx -V

piuis vérifier que l’occurrence suivante apparait bien dans la ligne des compilations :

--with-http_realip_module

si cela est présent vous n’avez simplement qu’a rajouter dans votre virtualhost ces deux lignes :

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Coté backend il faut maintenant prendre en compte ces headers pour cela sur

CentOS

On installe le module mod_extract_forwarded disponible dans les repository EPEL puis :

yum install mod_extract_forwarded

Une fois le module installé, il faut le configurer pour accepter les headers de la part de certains proxy (un peu de sécurité que diable !).

Pour cela éditer le fichier /etc/httpd/conf.d/mod_extract_forwarded.conf et ajouter la ligne suivante :

MEFaccept reverse_proxy_IP
MEFaccept reverse_proxy_IP2

Puis on redémarre apache

service httpd restart

On vérifie que le module est bien chargé :

apachectl -M | grep frowarded

et normalement dans vos logs ça roulera.

Debian

Même topo que pour CentOS, a la différence que c’est le module rpaf que l’on installe :

apt-get install libapache2-mod-rpaf

Puis on modifie le fichier /etc/apache2/mods-enabled/rpaf.conf pour ajouter l’IP du reverse proxy

J’ai eu un petit souci lors de mes installations de Debian sur ESXi, la machine invité (ici un Debian 6) rempli les logs de ce message d’avertissement :

mpt-statusd: detected non-optimal RAID status

En effet, lorsque Debian s’installe sur un ESXi, il considère que les disques en dessous sont en RAID et installe les modules de vérification du RAID

Afin que cela cesse, il faut simplement désinstaller le paquet suivant :

apt-get remove mpt-status

C’est un mémo pour moi même afin de ne pas rechercher en permanence comment faire pour installer les VMware tools sur une machine virtuelle debian 6.

Pré-Requis :

apt-get install gcc build-essential linux-headers-`uname -r` libglib2.0-dev

Monter les VMware tools dans le lecteur de la machine virtuelle puis :

mount /dev/cdrom /mnt
tar xzvf /mnt/VMwareTools-8.6.0-425873.tar.gz -C /root
perl /root/vmware-tools-distrib/vmware-install.pl

puis valider jusqu’au bout !

Si vous êtes comme moi et que vous passez énormément de temps sur votre ordinateur à lire des lignes de codes et articles divers, vous aurez sans doute remarqué une fatigue visuelle au bout de quelque heures.
Pour éviter cela (et aussi me rendre compte de l’heure) j’utilise un petit logiciel qui change la luminosité ainsi que les couleurs de votre écran en fonction de l’heure. Flux est multiplateforme et fonctionnera donc sur votre OS favori.
Afin de le lancer il vous suffi simplement de lui rentrer en paramètre les coordonnes de votre situation géographique. Pour cela rendez vous sur ce site (par exemple) et chercher votre position, cela vous donnera votre position. Une fois ces données acquise on a plus qu’à lancer le logiciel comme suit :
[code language= »bash »]
./flux -l suivit de vos coordonnes.
[/code]
En espérant que cet article épargnera vos yeux 🙂

Update : Nouvelle version !

Ayant un serveur de messagerie personnel sous Zimbra, je voulais le synchroniser avec mon téléphone. Pour cela j’ai d’abord utilisé Funambol mais le logiciel tournant sous Java, il me prenait trop de ressources sur mon petit serveur Kimsufi. De plus il faut installer un logiciel supplémentaire sur le téléphone alors que j’ai déjà un logiciel qui permet de synchroniser via activesync.

J’ai donc fait le tour des solutions existantes qui dispose d’un connecteur pour Zimbra et malheureusement il n’y a pas grand chose de disponible à l’heure actuelle. Le projet le plus intéressant et c’est celui que j’ai mis en place est z-push qui fait partie de la solution Zarafa. Via un plug-in développé par la communauté cela me permet de synchroniser mes mails/calendrier/contacts/tâches grâce au logiciel déjà disponible sur mon téléphone.

Ce logiciel tournant sous php il n’était pas difficile de l’ajouter à mon serveur existant sans consommer de ressources supplémentaire. Le plus compliqué c’est que celui-ci tourne sous nginx et qu’il n’y a aucune documentation existante pour faire fonctionner z-push avec nginx. J’ai du pas mal tâtonner avant de réussir à le faire fonctionner correctement.  J’espère que ce tutoriel vous conviendra et qu’il sera fonctionnel pour tout le monde (les mystères de l’informatique sont parfois impénétrables 🙂 )

Votre serveur nginx doit être paramétré pour tourner avec PHP (par ex.  fastcgi php-fmp ). Il est indispensable de faire tourner PHP avec nginx car z-push s’articule entièrement autour de scripts en PHP.

Une fois que tout fonctionne correctement, rendez-vous dans votre répertoire de site web pour installer z-push

[code lang= »bash »]
cd /var/www/
wget http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
wget http://downloads.sourceforge.net/project/zimbrabackend/Release47/zimbra47.tgz
tar xzvf http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
tar xzvf zimbra47.tgz -C z-push/backend/
chmod 740 z-push/state
chown www-data:www-data z-push/state
[/code]

ok une fois que tous est installé on va configurer z-push pour attaquer Zimbra en backend. Pour cela modifiez le fichier le fichier config.php comme suit :

[code]
$BACKEND_PROVIDER = "BackendZimbra";
define(‘MAPI_SERVER’, ‘file:///var/run/zarafa’);
define(‘ZIMBRA_URL’, ‘http://zimbra.domain.com’);
define(‘ZIMBRA_USER_DIR’, ‘zimbra’);
define(‘ZIMBRA_SYNC_CONTACT_PICTURES’, true);
define(‘ZIMBRA_VIRTUAL_CONTACTS’,true);
define(‘ZIMBRA_VIRTUAL_APPOINTMENTS’,true);
define(‘ZIMBRA_VIRTUAL_TASKS’,true);
define(‘ZIMBRA_IGNORE_EMAILED_CONTACTS’,true);
define(‘ZIMBRA_HTML’,false);
define(‘ZIMBRA_ENFORCE_VALID_EMAIL’,true);
define(‘ZIMBRA_NOKIA_MFE_FIX’,true);
define(‘ZIMBRA_NOKIA_MFE_ALWAYS_OVERWRITE’,true);
#Si jamais vous voulez debuger passer l’option suivante a true
define(‘ZIMBRA_DEBUG’,false);
#Et enfin si vous voulez gérer vos appareils mobile depuis une interface web passer l’option suivante
#a true et suivez les instruction que vous trouverez ici :
#http://downloads.sourceforge.net/project/zimbrabackend/Release47/Release%20Notes%20-%20Revision%2047.txt
define(‘PROVISIONING’, false);
[/code]

Comme on utilise nginx avec fastcgi il faut faire quelques modifications afin que les requêtes web soient traité correctement par z-push

Il faut ajouter ces lignes à la fin du fichier compat.php juste avant « ?> »

[code lang= »bash »]
if (!function_exists(‘apache_request_headers’)) {
function apache_request_headers() {
$header = array();
$header[‘Ms-Asprotocolversion’] = $_SERVER[‘HTTP_MS_ASPROTOCOLVERSION’];
$header[‘X-Ms-Policykey’] = $_SERVER[‘HTTP_X_MS_POLICYKEY’];
$header[‘User-Agent’] = $_SERVER[‘HTTP_USER_AGENT’];

return $header;
}

list($_SERVER[‘PHP_AUTH_USER’], $_SERVER[‘PHP_AUTH_PW’]) = explode(‘:’ , base64_decode(substr($_SERVER[‘HTTP_AUTHORIZATION’], 6)));
}
[/code]

et commenter la ligne suivante dans le fichier index.php

[code lang= »bash »]
//header("Content-Length: $len");
[/code]

enfin configurez votre virtualhost

[code language= »bash »]server {
listen 80;
server_name push.domain.com;
access_log  /var/log/nginx/z-push.access.log  combined;
error_log /var/log/nginx/z-push.error.log;

location / {
root   /var/www/z-push;
index  index.php index.html;

if (!-f $request_filename) {
rewrite  ^(.*)$  /index.php?q=$1  last;
break;
}
}

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
proxy_read_timeout 120;
proxy_connect_timeout 120;
fastcgi_pass  127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/z-push/$fastcgi_script_name;
}
}[/code]

Si comme moi vous avez un autre serveur qui fait office de reverse proxy en frontal, n’oubliez pas d’ajouter ces lignes dans votre nginx.conf  sinon votre serveur n’arrivera pas à communiquer avec votre téléphone :

[code lang= »bash »]
##Sert a recuperer l’adresse ip d’origine dans les headers
##Ref : http://wiki.nginx.org/HttpRealIpModule
set_real_ip_from        XX.XX.XX.XX; <= IP du Frontal
real_ip_header          X-Real-IP;[/code]

Et voila il ne reste plus qu’a configurer votre téléphone et le tour est joué.

Références :

http://z-push.sourceforge.net/phpbb/viewtopic.php?f=4&t=1245&p=4762&hilit=apache_request_headers#p4762
http://www.jopa.fr/index.php/2009/08/05/push-mail-sur-serveur-imap-gmail/

22 bis Rue de Trey