Apache - Hören Sie nur auf eine bestimmte Domain, nicht auf die IP

9

Wie kann ich Apache so konfigurieren, dass Verbindungen direkt zur IP-Adresse ( http://xxx.xxx.xxx.xxx ) anstelle des vhost-Namens http://example.com abgelehnt werden ?

Meine VirtualHost-Konfiguration:

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
quelle

Antworten:

25

Sie können keine Verbindungen verweigern, da der Hostname (oder die IP), die der Benutzer als HTTP-Host verwenden möchte, dem Server erst bekannt ist, wenn der Client tatsächlich eine HTTP-Anforderung sendet. Der TCP-Listener ist immer an die IP-Adresse gebunden.

Wäre stattdessen eine HTTP-Fehlerantwort akzeptabel?

<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
quelle
Nun, Thin ruft eine 403 Forbidden für Anfragen auf, die nicht von der Domain kommen, was in meiner Situation nicht schlecht ist. Ich möchte jedoch, dass der Server für diese Anforderungen "nicht vorhanden" ist. Ich bin sicher, dass dies irgendwie möglich ist, vielleicht nicht mit Apache, sondern auf Systemebene?
Alex
3
@ Alex Nein, das ist völlig unmöglich. Die TCP-Verbindung muss hergestellt sein und der Client muss seine HTTP-Anfrage (oder seinen SNI-Header, nehme ich an) senden, bevor der Server feststellen kann, ob er versucht, den Domänennamen oder die IP-Adresse in seiner HTTP-Anfrage zu treffen .
Shane Madden
@ ShaneMadden Völlig unmöglich? Ich verstehe, dass der Server die IP des Benutzers kennen muss, bevor er entscheiden kann, was damit geschehen soll, aber es ist völlig unmöglich, auf diesen Treffer nicht zu reagieren, sobald er seine Identität kennt. Kann der Server die Verbindung nicht einfach bis zum Timeout hängen lassen?
HelpingHand
3
@HelpingHand Nicht die IP des Benutzers. Der Server muss den Host-Header kennen, den der Benutzer in der HTTP-Anforderung sendet, die er erst hat, nachdem die TCP-Verbindung vollständig hergestellt wurde.
Shane Madden
1
@HelpingHand Nein, es hat keinen Einblick in die HTTP-Kommunikation, die in den Verbindungen stattfindet.
Shane Madden
0

Sie müssen zur unteren Ebene gehen, es fällt mir nur in der Firewall-Kette ein, eine Validierungsprüfung für den ANFRAGE-HOST durchzuführen und was Sie mit Apache haben, damit das Paket ignoriert oder verworfen werden kann

Chaddy
quelle
Es ist jedoch durchaus möglich, dies auf Apache-Ebene zu tun, also wäre dies übertrieben. Eine einfache Methode wäre, sicherzustellen, dass der erste vhost ein Catchall ist, der den Zugriff auf HTTP-freundliche Weise verweigert.
Paul Dixon
0

Ein sauberer Weg, dies zu handhaben, ist mit einer RewriteRule wie folgt

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