Apache: escuche solo en un dominio específico, no en IP

9

¿Cómo puedo configurar Apache para que rechace las conexiones que llegan directamente a la dirección IP ( http://xxx.xxx.xxx.xxx ) en lugar del nombre de host http://example.com ?

Mi configuración de 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
fuente

Respuestas:

25

No puede hacer que rechace las conexiones, ya que el servidor no conoce el nombre de host (o IP) que el usuario está tratando de usar como su host HTTP hasta que el cliente realmente envía una solicitud HTTP. El escucha TCP siempre está vinculado a la dirección IP.

¿Sería aceptable una respuesta de error HTTP en su lugar?

<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
fuente
Bueno, thin trae un 403 Prohibido para solicitudes que no provienen del dominio, lo que no está mal en mi situación. Sin embargo, quiero que el servidor sea "inexistente" para esas solicitudes. Estoy seguro de que esto se puede hacer de alguna manera, ¿tal vez no con apache sino a nivel del sistema?
Alex
3
@ Alex No, es completamente imposible. La conexión TCP debe establecerse y el cliente debe enviar su solicitud HTTP (o su encabezado SNI, supongo) antes de que el servidor pueda determinar si están tratando de alcanzar el nombre de dominio o la dirección IP en su solicitud HTTP .
Shane Madden
@ShaneMadden ¿Completamente imposible? Entiendo que el servidor necesita conocer la IP del usuario antes de poder elegir qué hacer con él, pero ¿es completamente imposible no responder a este golpe una vez que conoce su identidad? ¿No puede el servidor colgar la conexión hasta que se agote el tiempo de espera?
HelpingHand
3
@HelpingHand No es la IP del usuario. El servidor necesita conocer el encabezado del host que el usuario enviará en la solicitud HTTP, que no tiene hasta después de que la conexión TCP esté completamente establecida.
Shane Madden
1
@HelpingHand No, no tiene visibilidad en la comunicación HTTP que ocurre en las conexiones.
Shane Madden
0

Tienes que ir a la capa inferior, solo me viene a la mente la cadena de firewall que tiene una verificación de validación para el SOLICITANTE HOST y lo que tienes con Apache, esto permitirá que el paquete sea ignorado o eliminado

Chaddy
fuente
Sin embargo, es perfectamente posible hacer esto en el nivel de apache, por lo que sería excesivo. Un método simple sería asegurar que el primer vhost fuera un gato que negara el acceso de una manera amigable con HTTP.
Paul Dixon
0

Una manera limpia de manejar esto es con una RewriteRule de la siguiente manera

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