Назад | Перейти на главную страницу

Ограничить прямой IP-доступ к сайту

Я хочу ограничить прямой IP-доступ к моему сайту. Я нашел несколько решений, связанных с .htaccess, но ни одно из них не работает. Я также нашел одно решение через конфигурацию виртуальных хостов apache, которая работала нормально до тех пор, пока я не установил сертификат SSL через CPanel. Я понятия не имею, что было изменено в файле httpd.conf, но теперь настройка перенаправления не работает, даже если я удалю сертификат SSL.

Вот мои текущие настройки виртуальных хостов:

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 и имена были заменены на родовые. Часть «Перенаправить 403 /» не работает с момента установки SSL-сертификата. Буду признателен, если кто-нибудь сможет пролить свет на то, что я здесь делаю не так. Спасибо.

И вуаля, исправление:

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

Решением было просто заменить IP-адрес доменным именем для всех настроек виртуального хоста, за исключением того, который должен перенаправлять / ограничивать прямой IP-доступ.

Ответ мог быть намного проще.

Просто скопируйте это в нижнюю часть httpd.conf (обычно находится в / 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>

Только тогда, когда посетители заходят на www.example.com, он может получить доступ к серверу.

Вы не можете отключить прямой IP-доступ к вашему серверу через HTTPS, потому что имя хоста для вашего виртуального хоста зашифровано внутри сертификата SSL.

Клиенты должны подключиться к вашему IP-адресу, загрузить сертификат, прочитать содержимое, а затем они смогут проверить правильность имени хоста.

Единственный другой способ - принудить SNI, но вы создадите проблемы для пользователей, которые просматривают более старые версии Internet Explorer.

  1. Вероятно, ваш сертификат выдан на example.com, а не на 192.168.1.1 или на оба сразу; Итак, посетители, которые используют https://192.168.1.1 должна иметь ошибку SSL (потому что URL отличается от сертификата).
  2. У вас нет веб-сайта с SSL по умолчанию <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. Вы должны использовать apache с поддержкой SNI (существуют некоторые требования к версии libSSL и Apache), чтобы использовать SSL-per-hostname (см. Использование нескольких сертификатов SSL в Apache с одним IP-адресом

В установке Apcahe с несколькими .conf файлов, приоритет отдается первому загруженному файлу, а затем второму… аналогично. Итак, если вы используете Ubuntu, файлы загружаются в лексикографическом порядке, поэтому самый "первый" .conf файл, который будет загружен, будет 000-default.conf (следовательно 000 в его названии) проживающие под /etc/apache2/sites-available/ каталог.

Итак, чтобы предотвратить применение любого другого правила, нам нужно поместить наше правило в начало этого первого файла.

и вы можете просто добавить к этому файлу следующее правило.

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

Испытано и протестировано на Ubuntu 16.4 x64 версии Apache > 2.4

Если вы используете более раннюю версию Apache, попробуйте заменить Require all denied из приведенного выше кода в ...

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

Я верю, что это то, что ты ищешь

http://www.htaccess-guide.com/deny-visitors-by-ip-address/

Чтобы добавить еще один ответ, mod_security, если вам стоит его настроить, имеет правила, запрещающие доступ к серверу по IP-адресу.

Это может быть легко, если вы не поместите свои файлы в каталог по умолчанию / var / www / html. Просто создайте другой каталог, например, / web:

mkdir /web 
mkdir /web/example

скопируйте свои файлы и измените chown:

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

Затем создайте виртуальный хост со следующей конфигурацией:

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

Не забудьте включить виртуальный хост, например:

sudo a2ensite example.com.conf

Я написал этот простой код на PHP, чтобы ограничить прямой доступ по IP!

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

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

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

просто вставьте в свой php файл и наслаждайтесь!