Apache - écouter uniquement sur un domaine spécifique, pas IP

9

Comment puis-je configurer apache afin qu'il refuse les connexions venant directement à l'adresse IP ( http://xxx.xxx.xxx.xxx ) au lieu du nom de l'hôte http://example.com ?

Ma configuration VirtualHost:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

        DocumentRoot /var/www/           
        <Directory /var/www/>                    
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>
Alex
la source

Réponses:

25

Vous ne pouvez pas lui faire refuser les connexions, car le nom d'hôte (ou IP) que l'utilisateur essaie d'utiliser comme hôte HTTP n'est pas connu du serveur jusqu'à ce que le client envoie réellement une demande HTTP. L'écouteur TCP est toujours lié à l'adresse IP.

Une réponse d'erreur HTTP serait-elle acceptable à la place?

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>
Shane Madden
la source
Eh bien, thin fait apparaître un 403 Forbidden pour les demandes ne provenant pas du domaine, ce qui n'est pas mal dans ma situation. Cependant, je veux que le serveur soit "inexistant" pour ces demandes. Je suis sûr que cela peut être fait d'une manière ou d'une autre, peut-être pas avec apache mais au niveau du système?
Alex
3
@Alex Non, c'est complètement impossible. La connexion TCP doit être établie et le client doit envoyer sa demande HTTP (ou son en-tête SNI, je suppose) avant qu'il n'y ait un moyen pour le serveur de déterminer s'il essaie de frapper le nom de domaine ou l'adresse IP dans sa demande HTTP .
Shane Madden
@ShaneMadden Complètement impossible? Je comprends que le serveur doit connaître l'IP de l'utilisateur avant de pouvoir choisir quoi en faire, mais est-il totalement impossible de ne pas répondre à ce hit une fois qu'il connaît son identité? Le serveur ne peut-il pas simplement suspendre la connexion jusqu'à l'expiration du délai?
HelpingHand
3
@HelpingHand Pas l'IP de l'utilisateur. Le serveur doit connaître l'en-tête de l'hôte que l'utilisateur enverra dans la demande HTTP, ce qu'il n'a qu'après l'établissement complet de la connexion TCP.
Shane Madden du
1
@HelpingHand Non, il n'a pas de visibilité sur la communication HTTP qui se passe dans les connexions.
Shane Madden
0

Vous devez aller à la couche inférieure, cela ne me vient à l'esprit que dans la chaîne de pare-feu ayant une vérification de validation pour l'hôte de la demande et ce que vous avez avec Apache, cela permettra au paquet d'être ignoré ou abandonné

Chaddy
la source
Il est parfaitement possible de le faire au niveau apache, donc ce serait exagéré. Une méthode simple serait de s'assurer que le premier vhost est un fourre-tout qui refuse l'accès de manière conviviale HTTP.
Paul Dixon
0

Une façon propre de gérer cela est avec un RewriteRule comme suit

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Chuck Replogle
la source