Apache: ascolta solo su un dominio specifico, non su IP


9

Come posso configurare apache in modo che rifiuti le connessioni che arrivano direttamente all'indirizzo IP ( http://xxx.xxx.xxx.xxx ) invece del nome vhost http://example.com ?

La mia configurazione 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>

Risposte:


25

Non è possibile rifiutare le connessioni, poiché il nome host (o IP) che l'utente sta tentando di utilizzare come host HTTP non è noto al server fino a quando il client non invia effettivamente una richiesta HTTP. Il listener TCP è sempre associato all'indirizzo IP.

Una risposta di errore HTTP sarebbe accettabile invece?

<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>

Bene, thin riporta un 403 Forbidden per richieste che non provengono dal dominio, il che non è male nella mia situazione. Tuttavia, desidero che il server sia "inesistente" per tali richieste. Sono sicuro che questo può essere fatto in qualche modo, forse non con Apache ma a livello di sistema?
Alex

3
@Alex No, è completamente impossibile. La connessione TCP deve essere stabilita e il client deve inviare la sua richiesta HTTP (o la sua intestazione SNI, suppongo) prima che ci sia modo per il server di determinare se stanno provando a colpire il nome di dominio o l'indirizzo IP nella loro richiesta HTTP .
Shane Madden,

@ShaneMadden Completamente impossibile? Capisco che il server deve conoscere l'IP dell'utente prima di poter scegliere cosa farne, ma è assolutamente impossibile non rispondere a questo hit una volta che conosce la sua identità? Il server non può semplicemente interrompere la connessione fino al timeout?
HelpingHand,

3
@HelpingHand Non l'IP dell'utente. Il server deve conoscere l'intestazione host che l'utente invierà nella richiesta HTTP, che non avrà fino a quando la connessione TCP non sarà completamente stabilita.
Shane Madden,

1
@HelpingHand No, non ha visibilità sulla comunicazione HTTP che si verifica nelle connessioni.
Shane Madden,

0

Devi andare al livello inferiore mi viene in mente solo nella catena di firewall con un controllo di convalida per l'HOST RICHIESTA e ciò che hai con Apache questo permetterà al pacchetto di essere ignorato o eliminato


È perfettamente possibile farlo a livello di apache, quindi sarebbe eccessivo. Un metodo semplice sarebbe quello di garantire che il primo vhost fosse un catchall che negava l'accesso in modo HTTP.
Paul Dixon,

0

Un modo pulito per gestire questo è con una RewriteRule come segue

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.