Proxy : Créer un proxy avec Apache

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Avec le mod_proxy d'Apache, il y a plusieurs cas d'utilisation. Je vais donc proposer ici 2 scénarios.

1.1 Scénario 1

Alors voila ! je suis dans une école d'informatique où (comme dans beaucoup d'écoles) seul le port 80 est ouvert et le cours n'est pas toujours intéressant.
Que faire donc pour pouvoir accéder a son serveur en SSH, jouer a world of warcraft ou encore télécharger comme un porc sur la mule.
Et bein Uncle Tom l'a un super patern pour toi qui veux breaker les laws : le APACHE MOD_PROXY PLATINUM EDITION !
Ici nous travaillons sur Debian (ouais mdame) mais la configuration est sensiblement la même sur les autres system tant que vous utilisez le mod_proxy de Apache2

1.2 Scénario 2

Je souhaites ici rediriger un flux entrant sur mon port standard (80) vers une application (sur la même machine ou non) en faisant de la réécriture d'URL. L'avantage c'est qu'avec le mod_proxy, point besoin d'utiliser RewriteEngine & Co ! Le module proxy est capable de se charger d'une bonne partie de la réécriture et notamment de cacher le numéro du port (pratique pour les applications tournant sur tomcat).

2 Installation

Command aptitude
aptitude install apache2 apache2-utils apache2.2-common libapache2-mod-proxy-html

Then activate modules :

Command a2enmod
a2enmod proxy_connect
a2enmod proxy_http
a2enmod proxy_html

And restart Apache.

3 Configuration

3.1 Scénario 1

3.1.1 Debian

Tout d'abord nous allons configurer mod proxy en question. Voici mon fichier "/etc/apache2/mods-available/proxy.conf" détaillé :

Configuration File /etc/apache2/mods-available/proxy.conf
<IfModule mod_proxy.c>   
#On autorise les requêtes de type proxy
        ProxyRequests On               
#On autorise le serveur à répondre à ces requêtes
        ProxyVia On
#On autorise les requêtes proxy en destination du port 22, 80 et 443                 
        AllowCONNECT 22                   
        AllowCONNECT 80                   
        AllowCONNECT 443
#On autorise le proxy à destination de n'importe quelle adresse
# (Pour restreindre qu'a une seule adresse il faut mettre quelque chose comme 
#"<Proxy google.fr>" ou encore "<Proxy 88.191.31.151>")
        <Proxy *>                         
# Nous allons restreindre l'accès par mot de passe
                AllowOverride AuthConfig             
                AuthName "Proxy Auth"
                AuthType Basic
# Le fichier htpasswd à utiliser
                AuthUserFile /etc/apache2/.htpasswd-proxy
# seuls les utilisateurs authentifiés ont accès          
                Require valid-user                   
                AddDefaultCharset off
                Order deny,allow
                Allow from all
        </Proxy>
</IfModule>

Nous créons ensuite le fichier "htpasswd" (e.g. pour l'utilisateur toto)

Command htaccess
htaccess -c /etc/apache2/.htpasswd-proxy toto

Il ne reste plus qu'a charger les modules

Command
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/proxy.load .
ln -s ../mods-available/proxy.conf .
ln -s ../mods-available/proxy_connect.load .
ln -s ../mods-available/proxy_http.load .

Puis redémarrer apache2

Command
/etc/init.d/apache2 restart

3.1.2 OpenBSD

Sous OpenBSD, pas d'installation particulière à faire puisqu'Apache est installé de base. Il suffit juste d'ajouter ceci dans la conf :

Configuration File /var/www/conf/httpd.conf
<VirtualHost _default_:3128>
 
#  General setup for the virtual host
DocumentRoot /var/www/htdocs
ServerName mufasa.deimos.fr
ServerAdmin deimos@deimos.fr
ErrorLog logs/error_log
TransferLog logs/access_log
 
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine off
 
<IfModule mod_proxy.c>
      ProxyRequests On
      ProxyVia On
      <Directory proxy:*>
              Order deny,allow
              Allow from all
      </Directory>
</IfModule>
 
</VirtualHost>

Puis redémarrez le service :

Command
apachectl stop
apachectl start

Là clairement, tout le monde y a accès, veillez à rajouter un peu de sécurité tout de même.

Personnellement, mon Apache est bindé sur un port que seul le réseau local et les personnes connectées en VPN peuvent accéder.

3.1.3 PuTTY : Tunneling SSH

Bon c'est super on a un beau proxy mais comment en tirer pleinement profit.
Nous allons utiliser PuTTy afin de nous simplifier la vie, car c'est un des rare client SSH multiplateforme qui offre toutes les fonctions dont nous avons besoin : Tunneling + Proxy HTTP

Le principe est le suivant :

  1. Etablir une connexion SSH sur le port 22
  2. Passer par se serveur proxy qui autorise la connexion sur le port 22
  3. Grace a SSH nous établissons des tunnels cryptés locaux qui redirigent vers différents services
  4. Nous accédons aux services sur le localhost grâce aux tunnels

Voici comment je configure mon client putty pour pouvoir jouer a World Of Warcraft.

{Menu "Session"}

  • Host Name : <serveur SSH de destination>
  • Port : 22

{Menu "Proxy"}

  • Proxy type : HTTP
  • Proxy hostname : <adresse du serveur proxy>
  • Port : 80
  • Username : <nom d'utilisateur créé dans le htpasswd>
  • Password : <password de ce user>

{Menu "SSH / Tunnels"}

  • Local Ports accept connections from other hosts : ON
  • Source port : <port local a ouvrir> (ex. 3724)
  • Destination : <ip : port du service que l'on veut forwarder> (ex. eu.logon.worldofwarcraft.com:3724)

cliquer sur "add" pour en ajouter d'autres ex. 5900:vnc ; 143:imap ; 25:smtp (pour WoW, il ne faut pas oublier celui ci)

Source port : "6112"
Destination : "80.239.185.41:6112"

That's good ! ca veut dire "c'est bon" en anglais ... pour World Of Warcraft, il ne reste plus qu'a modifier le fichier "realmlist.wtf" et mettre

set realmlist localhost

Comme dirait une célèbre philosophe : "Et c'est parti pour le show !"

3.2 Scénario 2

Je vais prendre le cas ici un outil "myapp" tournant sur Tomcat, port 8080. J'ai donc besoin dans un premier temps de dire à Tomcat qu'il va se faire "proxifier", puis je vais avoir a mettre en place la partie proxy sur Apache.

3.2.1 Tomcat

Sur la partie serveur, il va falloir aller modifier le connecteur de l'application en question pour lui ajouter les paramètres proxy :

Configuration File /etc/tomcat6/server.xml
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               URIEncoding="UTF-8"
               redirectPort="8443"
               proxyName="myapp.mycompany.lan" proxyPort="80"/>

On indique à Tomcat que notre site sera accessible depuis myapp.mycompany.lan sur le port 80.
Vous pouvez redémarrez votre tomcat maintenant.

3.2.2 Apache

On va activer le module proxy :

Configuration File /etc/apache2/mods-enabled/proxy.conf
<IfModule mod_proxy.c>
 
# If you want to use apache2 as a forward proxy, uncomment the
# 'ProxyRequests On' line and the <Proxy *> block below.
# WARNING: Be careful to restrict access inside the <Proxy *> block.
# Open proxy servers are dangerous both to your network and to the
# Internet at large.
#
# If you only want to use apache2 as a reverse proxy/gateway in
# front of some web application server, you DON'T need
# 'ProxyRequests On'.
 
ProxyRequests Off 
ProxyPreserveHost On
<Proxy *>
        AddDefaultCharset off 
        Order deny,allow
        Allow from all
        #Allow from .example.com
</Proxy>
 
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
ProxyVia On
 
</IfModule>

Puis le configurer pour notre site en question. Nous utiliserons ici un VirtualHost pour notre applicatif :

Configuration File /etc/apache2/sites-enabled/my_app
<VirtualHost myapp.mycompany.lan:80>
    ServerName http://myapp.mycompany.lan
    ServerAlias myapp.mycompany.lan
    ServerAdmin deimos@deimos.fr
    DocumentRoot /mnt/myapp/datas/www
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    LogLevel warn
    ServerSignature On
 
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
 
    <Location />
        Order allow,deny
        Allow from all
    </Location>
</VirtualHost>

La partie ProxyPass permet de dire ou doit rediriger le proxy. Ici le proxy apache et tomcat tournent sur la même machine, c'est pourquoi les URL pointent sur le localhost.

Il ne reste plus qu'a redémarrer Apache et votre service initialement disponible à cette adresse :
http://myapp.mycompany.lan:8080/
sera disponible à :
http://myapp.mycompany.lan/

4 Ressources

http://httpd.apache.org/docs/2.0/mod/mod_proxy.html