Restrinja el acceso IP directo al sitio web


13

Quiero restringir el acceso IP directo a mi sitio web. Encontré varias soluciones que involucran .htaccess pero ninguna funciona. También encontré una solución a través de la configuración de hosts virtuales apache que funcionaba bien hasta que instalé un certificado SSL a través de CPanel. No tengo ni idea de qué se modificó en el archivo httpd.conf, pero ahora la configuración de redireccionamiento no funciona incluso si desinstalo el certificado SSL.

Aquí está mi configuración actual de hosts virtuales:

NameVirtualHost 192.168.1.1:80 NameVirtualHost *

<VirtualHost 192.168.1.1:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    ## User rotate # Needed for Cpanel::ApacheConf
    UserDir disabled
    UserDir enabled rotate
    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
</VirtualHost>

<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost 192.168.1.1:443
<VirtualHost 192.168.1.1:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    UserDir disabled
    UserDir enabled rotate

    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
    SSLEngine on
    #SSL stuff here
</VirtualHost>

IP y nombres fueron sustituidos por genéricos. La parte "Redirect 403 /" no funciona desde que instaló el certificado SSL. Estaría agradecido si alguien puede arrojar algo de luz sobre lo que estoy haciendo mal aquí. Gracias.


supongo que no tienes que usar = ServerName 192.168.1.1
ADM

Intenté eso también, no tiene ningún efecto.
Ivan

¿Se reordenaron los VirtualHosts? ¿Fue el que tenía el error 403 el primer vhost (predeterminado) antes?
Håkan Lindqvist

No, el orden no ha cambiado. El problema comenzó después de agregar el certificado SSL, lo que significa que el último simplemente se agregó. Ahora, incluso si lo elimino por completo, ya no funcionará, por lo que definitivamente también se cambió algo más, pero parece que no puedo entender qué.
Ivan

Aquí está la solución a través de htaccess serverfault.com/a/171260/273980
jsHate

Respuestas:


12

Y voila, la solución:

<VirtualHost mysite.com:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

NameVirtualHost mysite.com:80
<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost mysite.com:443
<VirtualHost mysite.com:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

La solución fue simplemente reemplazar la IP con el nombre de dominio para todas las configuraciones de host virtual, excepto la que necesita redirigir / restringir el acceso directo a IP.


Esto causará problemas con los clientes que ejecutan IE6 e IE8. Si estás de acuerdo con eso, entonces está bien. Deberían actualizar sus navegadores antiguos de todos modos.
Vasili Syrakis

6

La respuesta podría ser mucho más simple.

Simplemente copie esto en la parte inferior de httpd.conf (generalmente ubicado en / etc / httpd / conf)

<VirtualHost *:80>
ServerName localhost
Redirect 403 /
UseCanonicalName Off
UserDir disabled
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
</VirtualHost>

Entonces, solo cuando los visitantes acceden a través de www.example.com, él puede obtener acceso al servidor.


2

No puede deshabilitar el acceso IP directo a su servidor a través de HTTPS porque el nombre de host para su host virtual está encriptado dentro del certificado SSL.

Los clientes deben conectarse a su dirección IP, descargar el certificado, leer el contenido y luego pueden verificar que el nombre de host sea correcto.

La única otra forma es imponer SNI , pero provocará problemas a los usuarios que naveguen con versiones anteriores de Internet Explorer.


1
  1. Probablemente su certificado se expida a example.com, no a 192.168.1.1, ni a ambos; Entonces, los visitantes que usan https://192.168.1.1deben tener un error SSL (porque la URL difiere de la del certificado).
  2. No tienes un sitio web 'SSL predeterminado' <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. Debe usar apache con soporte SNI (hay algunos requisitos de versión de libSSL y Apache) para usar SSL por nombre de host (consulte Uso de múltiples certificados SSL en Apache con una dirección IP

0

1
No, eso no tiene nada que ver con mi problema. Quiero bloquear el acceso al sitio web para aquellos que acceden a la IP de mi sitio web en lugar de a su DNS.
Ivan

eso hace exactamente eso ...
user155813

1
No, esto bloquea el acceso al sitio por la dirección IP del cliente. La pregunta está buscando una forma de bloquear el acceso al sitio utilizando su dirección IP.
DaveTheMinion

0

Para agregar otra respuesta, mod_security, si vale la pena configurarlo, tiene reglas para prohibir el acceso al servidor por dirección IP.


0

Esto puede ser fácil si no coloca sus archivos en el directorio predeterminado / var / www / html. Simplemente cree otro directorio, digamos / web por ejemplo:

mkdir /web 
mkdir /web/example

copia tus archivos y cambia el chown:

sudo chown -R www-data:www-data /web

Luego cree un host virtual con la siguiente configuración:

<Directory /web/example>
  Require all granted
</Directory>

<VirtualHost *:80>

    DocumentRoot /web/example
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com

    # Force SSL, you can remove this line
    Redirect permanent / https://example.com/

    ServerAdmin webmaster@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# If you use SSL
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        DocumentRoot /web/example
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin webmaster@example.com

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # adapt this to your paths
        SSLEngine on
        SSLCertificateFile /etc/ssl/example/example_com.crt
        SSLCertificateKeyFile /etc/ssl/example/example.key
        SSLCertificateChainFile /etc/ssl/example/example_com.ca-bundle

    </VirtualHost>
</IfModule>

No olvide habilitar su host virtual, por ejemplo:

sudo a2ensite example.com.conf

0

En una configuración de Apcahe que tiene varios .confarchivos, la prioridad va al primer archivo cargado y luego al segundo ... del mismo modo. Entonces, si está en Ubuntu, los archivos se cargan en orden lexicográfico, por lo que el "primer" .confarchivo que se cargará será el 000-default.conf(de ahí el 000 en su nombre ) que reside en el /etc/apache2/sites-available/directorio.

Entonces, para evitar que se aplique cualquier otra regla, necesitamos colocar nuestra regla en la parte superior de ese primer archivo.

y solo puede anteponer la siguiente regla a ese archivo.

<VirtualHost *:80>
    ServerName default
    DocumentRoot /var/www/html
    #This part here, is crucial.
    <Location />
        Require all denied
    </Location>
</VirtualHost>

Probado y probado en Ubuntu 16.4 x64 versión Apache > 2.4

Si está ejecutando una versión inferior de Apache, intente reemplazar Require all deniedel código anterior para ...

<Location />
    Order deny,allow
    Deny from all
</Location>

-3

¡Escribí este código simple en PHP para restringir el acceso IP directo!

$servername =  $_SERVER['SERVER_NAME'];
if($servername == 'your-domain.com'){

}elseif($servername == 'your-domain-with-www.com'){

}else{
    die("Direct ip access not allowed!");
}

solo pegue en su archivo php y disfrute!


1
¿Podría explicar las ventajas de esto sobre las otras respuestas?
030

¡Este es el método más simple que puede usar para restringir el acceso IP directo a su sitio web, sin editar la configuración de Apache!
Max Marley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.