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


13

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


Я думаю, вам не нужно использовать = ServerName 192.168.1.1
ADM

Пробовал это тоже, не имеет никакого эффекта.
Иван

Были ли виртуальные хосты переупорядочены? Был ли тот с ошибкой 403 первым (по умолчанию) vhost раньше?
Хокан Линдквист

Нет, порядок не изменился. Проблема началась после добавления SSL-сертификата, то есть последний был просто добавлен. Теперь, если я даже удаляю его полностью, он больше не будет работать, поэтому что-то еще определенно изменилось, но не могу понять, что именно.
Иван

вот решение через htaccess serverfault.com/a/171260/273980
jsHate

Ответы:


12

И вуаля, исправить:

<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-доступ.


Это приведет к проблемам с клиентами под управлением IE6 и IE8. Если вы согласны с этим, тогда это нормально. Они должны обновить свои древние браузеры в любом случае.
Василий Сиракис

6

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

Просто скопируйте это в нижнюю часть 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, он может получить доступ к серверу.


2

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

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

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


1
  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 для каждого хоста (см. Использование нескольких SSL-сертификатов в Apache с одним IP-адресом).

0

Я считаю, что это то, что вы ищете

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


1
Нет, это не имеет никакого отношения к моей проблеме. Я хочу заблокировать доступ к веб-сайту для тех, кто получает доступ к IP-адресу моего веб-сайта вместо его DNS.
Иван

именно это и делает ....
user155813

1
Нет, это блокирует доступ к сайту по IP-адресу клиента. Вопрос в том, чтобы найти способ заблокировать доступ к сайту, используя его IP-адрес.
DaveTheMinion

0

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


0

Это может быть легко, если вы не поместите свои файлы в каталог по умолчанию / 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

0

В настройке 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>

-3

Я написал этот простой код на 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 файл и наслаждайтесь!


1
Не могли бы вы объяснить преимущества этого по сравнению с другими ответами?
030

это самый простой метод, который вы можете использовать, чтобы ограничить прямой IP-доступ к вашему сайту, без редактирования настроек Apache!
Макс Марли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.