Ogranicz bezpośredni dostęp IP do strony internetowej


13

Chcę ograniczyć bezpośredni dostęp IP do mojej witryny. Znalazłem kilka rozwiązań obejmujących .htaccess, ale żadne z nich nie działa. Znalazłem również jedno rozwiązanie poprzez konfigurację wirtualnych hostów Apache, które działało dobrze, dopóki nie zainstalowałem certyfikatu SSL przez CPanel. Absolutnie nie mam pojęcia, co zostało zmienione w pliku httpd.conf, ale teraz ustawienie przekierowania nie działa, nawet jeśli odinstaluję certyfikat SSL.

Oto moja obecna konfiguracja hostów wirtualnych:

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>

Adres IP i nazwy zostały zastąpione ogólnymi. Część „Przekierowanie 403 /” nie działa od momentu zainstalowania certyfikatu SSL. Byłbym wdzięczny, gdyby ktoś mógł rzucić nieco światła na to, co robię tutaj źle. Dzięki.


chyba nie musisz używać = nazwa_serwera 192.168.1.1
— ADM

Próbowałem też, że nie ma żadnego efektu.
— Ivan

Czy zmieniono kolejność VirtualHosts? Czy ten z błędem 403 był pierwszym (domyślnym) vhostem wcześniej?
— Håkan Lindqvist

Nie, zamówienie się nie zmieniło. Problem zaczął się po dodaniu certyfikatu SSL, co oznacza, że ​​ostatni został po prostu dodany. Teraz, jeśli nawet go całkowicie usunę, nie będzie już działać, więc coś innego zostało zdecydowanie zmienione, ale wydaje się, że nie wiem, co.
— Ivan

oto rozwiązanie za pośrednictwem htaccess serverfault.com/a/171260/273980
— jsHate

Odpowiedzi:


12

I voila, poprawka:

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

Rozwiązaniem było po prostu zastąpienie adresu IP nazwą domeny dla wszystkich ustawień wirtualnego hosta, z wyjątkiem tego, który musi przekierować / ograniczyć bezpośredni dostęp do adresu IP.


Spowoduje to problemy z klientami z IE6 i IE8. Jeśli nie masz nic przeciwko, to jest w porządku. W każdym razie powinni zaktualizować swoje starożytne przeglądarki.
— Vasili Syrakis

6

Odpowiedź może być znacznie prostsza.

Po prostu skopiuj to na dół strony httpd.conf (zwykle znajduje się w / 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>

Tylko wtedy, gdy odwiedzający wejdą na www.example.com, może uzyskać dostęp do serwera.


2

Nie można wyłączyć bezpośredniego dostępu IP do serwera przez HTTPS, ponieważ nazwa hosta wirtualnego hosta jest zaszyfrowana w certyfikacie SSL.

Klienci muszą połączyć się z twoim adresem IP, pobrać certyfikat, przeczytać zawartość, a następnie mogą sprawdzić, czy nazwa hosta jest poprawna.

Jedynym innym sposobem jest wymuszanie SNI , ale będziesz powodować problemy dla użytkowników, którzy przeglądają starsze wersje Internet Explorera.


1
  1. Prawdopodobnie twój certyfikat jest wystawiony na example.com, a nie 192.168.1.1, ani na oba; Dlatego użytkownicy, którzy korzystają, https://192.168.1.1powinni mieć błąd SSL (ponieważ URL różni się od adresu certyfikatu).
  2. Nie masz witryny z domyślnym protokołem SSL <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. Powinieneś używać Apache z obsługą SNI (istnieją pewne wymagania wersji libSSL i Apache), aby używać SSL na nazwę hosta (patrz Używanie wielu certyfikatów SSL w Apache z jednym adresem IP


0

Aby dodać kolejną odpowiedź, mod_security, jeśli warto go skonfigurować, ma reguły zabraniające dostępu do serwera przez adres IP.


0

Może to być łatwe, jeśli nie umieścisz swoich plików w domyślnym katalogu / var / www / html. Wystarczy utworzyć inny katalog, powiedzmy na przykład / web:

mkdir /web 
mkdir /web/example

skopiuj swoje pliki i zmień chown:

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

Następnie utwórz wirtualny host z następującą konfiguracją:

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

Nie zapomnij włączyć wirtualnego hosta, na przykład:

sudo a2ensite example.com.conf

0

W konfiguracji Apcahe zawierającej wiele .confplików pierwszeństwo ma pierwszy załadowany plik, a następnie drugi ... podobny. Jeśli więc korzystasz z systemu Ubuntu, pliki są ładowane w kolejności leksykograficznej, więc „pierwszym” .confplikiem, który zostanie załadowany, będzie 000-default.conf( stąd nazwa 000 ) rezydujący w /etc/apache2/sites-available/katalogu.

Aby więc nie zastosować żadnej innej reguły, musimy umieścić naszą regułę na początku pierwszego pliku.

i możesz po prostu dołączyć do tego pliku następującą regułę.

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

Wypróbowany i przetestowany na wersji Apache Ubuntu 16.4 x64 > 2.4

Jeśli korzystasz z niższej wersji Apache, spróbuj zastąpić Require all deniedpowyższy kod na ...

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

-3

Napisałem ten prosty kod w PHP, aby ograniczyć bezpośredni dostęp do ip!

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

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

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

po prostu wklej do pliku php i ciesz się!


1
Czy możesz wyjaśnić zalety tego rozwiązania w porównaniu z innymi odpowiedziami?
— 030

jest to najprostsza metoda, której możesz użyć, aby ograniczyć bezpośredni dostęp ip do swojej witryny, bez edytowania ustawień apache!
— Max Marley,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.