Apache2, mod_proxy et RoR: mauvaise experience

Ola tout le monde,

J’explique rapidement ma situation: j’ai une application RoR qui
tournait
sur Internet avec comme configuration un apache + mod_proxy + mongrel.
Tout
allait dans le meilleur des mondes quand pour un raison X, j’ai du tout
reinstaller sur le serveur. J’ai remis exactement les meme fichiers de
conf
et tout relance. Tout s’est bien passe, sauf que 1j plus tard, j’ai
remarque
que l’acces a l’appli etait subitement devenu long, tres long (30s pour
avoir la page, alors que d’hab, c’est 1 a 2s). Un petit netstat a montre
150
connexions en permanence (ESTABLISHED) et 580 connexions TIME_WAIT =>
Serveur a la ramasse (seulement 256 Ram avec en plus Mysql et ruby).

Je me suis appercu que les logs d’apache etaient remplis d’access
complement
bidon. En gros, mon serveur apache etait devenu un “open relay”, je
pense a
cause d’une directive super importante dans mod_proxy: ProxyRequests Off
(que j’avais du mettre a On par megarde). Donc faut faire vachement
gaffe !

Le seul souci, c’est que maintenant, des que j’allume mon apache, je
suis
“floode”, en gros, mon serveur est catalogue comme “pigeon”. J’ai beau
remettre ProxyRequests a Off, rien n’y fait, apache traite toutes les
requetes. Je suis donc reparti d’une config “vierge” d’apache, meme
resultat. Incroyable. J’ai fait un test rapide sur l’apache installe
avec
Mac Os X en faisant un telnet localhost 80 et “GET
http://www.microsoft.com/
et bizarrement mon apache a traite la requete sans aucun pb (preuve dans
access_log avec un code a 200).

Je n’y comprends plus rien. Ce que je trouve fou, c’est qu’un apache
puisse
faire des requetes sur des sites qu’il n’est pas cense gere ET cela avec
une
config de base (sans mod_proxy et cie).
Si qqu’un a deja rencontre ce pb (qui n’en est surement pas un
certainement), je suis preneur de la soluce !
Merci bien et bon debut de semaine a tous.

Did

P.S.: precision, ma distrib est une debian-sarge.

On 11/20/06, didier lafforgue [email protected] wrote:

Le seul souci, c’est que maintenant, des que j’allume mon apache, je suis
“floode”, en gros, mon serveur est catalogue comme “pigeon”. J’ai beau
remettre ProxyRequests a Off, rien n’y fait, apache traite toutes les
requetes. Je suis donc reparti d’une config “vierge” d’apache, meme
resultat. Incroyable. J’ai fait un test rapide sur l’apache installe avec
Mac Os X en faisant un telnet localhost 80 et “GET
http://www.microsoft.com/” et bizarrement mon apache a traite la requete
sans aucun pb (preuve dans access_log avec un code a 200).

Pas de chance, tu as été ou tu es encore en openproxy…

Ca m’est arrivé il y a quelques années -avant la censure chinoise- et
tu risque de voir des requêtes encore longtemps.

Fait des stats sur les ips sources, ça te permettra de filtrer des
ranges par exemple asiapacific (p.ex. 220.0.0.0/24) sauf si tu veux
laisser ouvert. Si ma mémoire est bonne, le filtrage par le referer
peut aussi diminuer les dégâts…

Et poste ton httpd.conf ici, ou ses sections importantes.
Manifestement les requêtes proxy sont encore autorisées sur ta
config…

Tu as du glisser qq part, le proxy n’est pas actif dans un apache sur
sarge.

Au fait, 1.3.x ou 2.x ?

Ciao’

Le Lun 20 novembre 2006 09:38, Mathieu C. a écrit :

Et poste ton httpd.conf ici, ou ses sections importantes.
Manifestement les requêtes proxy sont encore autorisées sur ta
config…

Tu as du glisser qq part, le proxy n’est pas actif dans un apache sur
sarge.

Et si ce n’est pas le cas dans ta config, vérifies que tu n’as pas
simplement un process de ton ancienne configuration qui est resté en route
et qui empêche ton nouveau Apache de prendre la responsabilité du port 80.
Un “ps aux” après avoir (tenté d’) arrêté le service devrait te permettre
d’en savoir plus là dessus.


Eric D.

Bon je me reponds a moi meme.
En fait, evidemment qu’Apache peut traiter toutes les demandes car il ne
sait pas quel le nom du domaine associe au serveur donc il traite tout.
Pour
moi, c’est quand meme un pb de securite, c’est comme si mysql acceptait
toutes les connexions en plus celles du localhost.
A mon avis, ils (equipe d’Apache) devraient mettre une directive qui
autorise seulement les acces sur des pages / documents / images / …etc
du
site local, point barre. Apres, on peut mettre du mod_proxy si on veut.

2006/11/20, didier lafforgue [email protected]:

Merci pour vos reponses

Un peu plus d’infos: distribution debian-sarge (kernel: 2.6.15), apache2
2.0.54 installe par un apt-get install classique. Aucun module active
(donc
aucun mod_proxy). Aucun process apache2 “fantome”.

Mon fichier de conf (apache2.conf) que j’ai nettoye:

===============================
ServerRoot “/etc/apache2”

LockFile /var/lock/apache2/accept.lock
PidFile /var/run/apache2.pid

Timeout 300

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 20 MaxRequestsPerChild 0 StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 # MaxRequestsPerChild .. maximum number of connections per server process (then it dies) NumServers 5 StartThreads 5 MinSpareThreads 5 MaxSpareThreads 10 MaxThreadsPerChild 20 MaxRequestsPerChild 0 AcceptMutex fcntl

User www-data
Group www-data

The following directives define some format nicknames for use with

a CustomLog directive (see below).

LogFormat “%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"”
combined
LogFormat “%h %l %u %t "%r" %>s %b” common
LogFormat “%{Referer}i → %U” referer
LogFormat “%{User-agent}i” agent

Logs

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log common

Include module configuration:

#Include /etc/apache2/mods-enabled/.load
#Include /etc/apache2/mods-enabled/
.conf

Include all the user configurations:

#Include /etc/apache2/httpd.conf

Include ports listing

Include /etc/apache2/ports.conf

Include generic snippets of statements

Include /etc/apache2/conf.d/[^.#]*

<Directory /opt/web>
AllowOverride FileInfo AuthConfig Limit
Options Indexes SymLinksIfOwnerMatch IncludesNoExec

AccessFileName .htaccess

<Files ~ “^.ht”>
Order allow,deny
Deny from all

UseCanonicalName Off

TypesConfig /etc/mime.types
DefaultType text/plain

HostnameLookups Off
IndexOptions FancyIndexing VersionSort

#Include /etc/apache2/sites-enabled/[^.#]*

DocumentRoot /opt/web/

==============================

A priori, je fais faire comme Mathieu l’a signale, c’est a dire filtrer
mes
requetes, je ne vois que cela. Mais je ne comprendrai jamais pourquoi
Apache
traite toutes les requetes meme celles avec des URL de bandits ! Si
certains
veulent faire un test avec leur apache, je serais curieux de voir le
resultat (telnet 80 puis GET http://www.yahoo.com/ ou autre
chose).
==> Est ce que cela veut dire que tous les apaches sont des Open Relay
sans
le savoir ? Je suis au fond du trou la. Je suis en train de perdre mes
reperes ;-). La depression n’est pas loin
C’est fou !
Sinon merci encore.

Did

P.S.: je crois que je vais aller voir du cote de Pound.

Le 20/11/06, Eric D. < [email protected]> a écrit :

Bon je me reponds a moi meme.
En fait, evidemment qu’Apache peut traiter toutes les demandes car il ne
sait pas quel le nom du domaine associe au serveur donc il traite tout. Pour
moi, c’est quand meme un pb de securite, c’est comme si mysql acceptait
toutes les connexions en plus celles du localhost.

Pour MySQL c’est “un peu” different puisque les connexions sont
‘authentifié’ …

Mais si tu configure ta base pour qu’on puisse y accéder depuis autre
part que localhost (intéressant si tu as un dédié pour ton SQL) alors
ta base traitera tout ce qui essaye de s’y connecter … comme le SSH
… en renvoyant une erreur d’authentification le cas échéant.

Perso un telnet ipdemabox 80 m’amène sur un écran noir avec mon
curseur qui clignote … sans pouvoir taper quoi que ce soit d’autre
… (obligé de fermer la fenêtre pour quitter)

Le Lun 20 novembre 2006 16:54, didier lafforgue a écrit :

A mon avis, ils (equipe d’Apache) devraient mettre une directive qui
autorise seulement les acces sur des pages / documents / images / …etc
du site local, point barre. Apres, on peut mettre du mod_proxy si on
veut.

Je te rassure, par défaut, sans activation de proxy, Apache ne sert que
les documents locaux. Si ce n’est pas ton cas c’est forcément que
quelque part se planque une instruction contraire.

Regardes dans /etc/apache2/conf.d/ par exemple ou dans
/etc/apache2/mods-enabled/


Eric D.

On 11/20/06, didier lafforgue [email protected] wrote:

Mon fichier de conf (apache2.conf) que j’ai nettoye:

Alors là c’est du lourd. Je vois rien dans ta config qui pourrait
permettre le relay.

On sait jamais, ton test est-il fait depuis une ip distincte du serveur
?

Teste avec ‘ProxyRequests Off’ à la fin de ta config.

Es-tu certain que les requêtes extérieures sont servies, càd que ton
apache va bien rechercher pour tes “clients” le contenu demandé ?

Et dernier point tu n’as pas un .htacess qui traine et qui ouvre en
grand le proxy avec les directives à on ?

Alors là c’est du lourd. Je vois rien dans ta config qui pourrait
permettre le relay.

Je sais :-((((

On sait jamais, ton test est-il fait depuis une ip distincte du serveur
?

Pas trop compris, en fait mon test se resume a allumer mon serveur et
voir
dans /var/log/apache2/access.log tous les “connards” (desole) qui
tentent
d’acceder a d’autres sites.

Teste avec ‘ProxyRequests Off’ Ã la fin de ta config.

Ne marche car le module mod_proxy n’est pas charge donc il ne reconnait
pas
cette directive.

Es-tu certain que les requêtes extérieures sont servies, cà d que ton

apache va bien rechercher pour tes “clients” le contenu demandé ?

Absolument. Ca marche bien les qq premieres minutes puis apres, tout
devient
tres tres lent.

Et dernier point tu n’as pas un .htacess qui traine et qui ouvre en

grand le proxy avec les directives à on ?

Nop malheureusement (cf mod_proxy non charge)

Merci !

Je te rassure, par défaut, sans activation de proxy, Apache ne sert que

les documents locaux. Si ce n’est pas ton cas c’est forcément que
quelque part se planque une instruction contraire.

Je suis d’accord avec toi avec a 100%. Effectivement, quand je fais mes
tests sur un apache de base (avec telnet), j’ai bien un message d’erreur
comme resultat. MAIS si je regarde dans les logs, je vois bien que la
requete bidon a ete traitee avec un code 200. C’est la ou je comprends
plus
trop.

Regardes dans /etc/apache2/conf.d/ par exemple ou dans

/etc/apache2/mods-enabled/

/etc/apache2/mods-enabled/ repertoire est vide et de toute maniere, j’ai
desactive le chargement des modules. Quant au premier, rien la-dedans
non
plus.

Perso un telnet ipdemabox 80 m’amène sur un écran noir avec mon
curseur qui clignote … sans pouvoir taper quoi que ce soit d’autre
… (obligé de fermer la fenêtre pour quitter)

Ca c’est interessant ! Est ce que tu pourrais m’avoir la version de ton
apache + fichier de configuration s’il te plait ? Merci d’avance !!!

On sait jamais, ton test est-il fait depuis une ip distincte du serveur ?

Pas trop compris, en fait mon test se resume a allumer mon serveur et voir
dans /var/log/apache2/access.log tous les “connards” (desole) qui tentent
d’acceder a d’autres sites.

Je parlais de ton test ‘telnet ipserveur 80’ puis GET http://apache.org/

Aucune raison que le proxy soit ouvert pour localhost, mais bon…

2006/11/20, didier lafforgue [email protected]:

Ca c’est interessant ! Est ce que tu pourrais m’avoir la version de ton
apache + fichier de configuration s’il te plait ? Merci d’avance !!!

Server version: Apache/2.0.58 (Gentoo Oblige)

Sinon pour le conf c’est un peu trop long pour le poster ici, mais
j’ai regardé en diag et rien n’as l’air bien différent du tiens :wink:

tu peux essayer ma box est dispo a cette url stackover.net voir si tu
arrive a te connecter en telnet dessus!

Salut,

Merci Jonathan, je pense que ton explication est tout a fait logique, le
code 200 est super trompeur dans ce cas. Bon, je pense avoir resolu mon
probleme, il ne me reste plus qu’a filtrer un tout petit peu les
requetes
pour faire diminuer la charge sur le serveur.
Je vous dis un grand merci a tous pour vos reponses. Super sympa.
Et faites gaffe a mod_proxy !

Did

Le 20 nov. 06 à 17:25, Julien ALEXANDRE a écrit :

tu peux essayer ma box est dispo a cette url stackover.net voir si tu
arrive a te connecter en telnet dessus!

Salut,
ton serveur n’est pas un open relay, la 200 c’est normal (je dis
normal, pas logique), tu demandes un site qui n’est pas hébergé par
le serveur apache, il te retourne donc la page d’index du domaine par
défaut du-dit serveur.

Je disais normal mais pas logique dans la mesure ou ça devrait faire
une erreur, sauf qu’à ma connaissance il n’y a pas vraiment de code
de status http qui indique : “le domaine n’est pas géré” (à la limite
une 404 serait le plus logique, maintenant si les gens d’apache ne le
font pas il doit y avoir une bonne raison).

Jonathan
http://jonathan.tron.name

On 11/20/06, didier lafforgue [email protected] wrote:

J’avais pas d’apache sous la main tout à l’heure.

192.168.65.117 - - [20/Nov/2006:18:42:41 +0100] “GET
http://www.ibm.com” 200 6772 “-” “-” 0
www.choucroute_et_cancoillotte.net

Mouais, ca donne la page racine de mon serveur
choucroute_et_cancoillotte.net

T’en es pas au fdisk ? :slight_smile:

un petit script iptable pour filtrer tout ca :slight_smile:

on est obligé de faire ça aussi avec apache2.2?
Moi je ne l’ai pas mis et ils en parlent dans aucun tutoriel en ligne.
http://bliki.rimuhosting.com/space/knowledgebase/linux/miscapplications/ruby+on+rails

ici ils disent de le mettre pour apache 2.0 mais pas pour 2.2.

Donc pour le 2.2 ya pas de souci?

Merci d’avance

Pat

Patrick, je ne comprends pas tres bien ta question. Tu es en train de
dire
que Apache 2.2 possede deja un filtrage d’url integre qui resoudrait
automatiquement mon pb ? Si c’est oui, cela change bcp de choses !

2006/11/20, Patrick A. [email protected]:

Dans le proxy.conf de mon apache2.2 j’ai un proxy.conf qui contient ça:
############################################################

#turning ProxyRequests on and allowing proxying from all may
allow
#spammers to use your proxy to send email.

    ProxyRequests Off

    <Proxy *>
            AddDefaultCharset off
            Order deny,allow
            Deny 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
################################################

Patrick, je ne comprends pas tres bien ta question. Tu es en train de dire
que Apache 2.2 possede deja un filtrage d’url integre qui resoudrait
automatiquement mon pb ? Si c’est oui, cela change bcp de choses !

Je ne sais pas trop ce que tu veux dire pas filtrage mais en tout cas
la 2.2 est plutot bien configuré anti-spam par défaut. Si tu as une
debian sarge tu peux faire une upgrade vers une etch en quelques
minutes. Etch vient avec apache2.2 et en plus etch c’est super stable
vue que la version finale devrait sortir dès le mois de décembre2006.

HTH

Pat