Apache на Ubuntu – попытка ограничить доступ только для клиентов локальной сети

Вопрос или проблема

Я прочитал много постов на форумах и руководств, но, похоже, не могу разобраться.
Это часть файла /etc/apache2/sites-available/dev.mysite.com-le-ssl.conf:

<Directory "/var/www/html/dev.mysite.com">
        Require all granted
        Require ip 192.168.0.0/24
</Directory>

это все еще позволяет мне открыть dev.mysite.com с телефона через мобильные данные (очевидно, не имея IP 192.168.0.x)

<Directory "/var/www/html/dev.mysite.com">
        Require ip 192.168.0.0/24
</Directory>

это не позволяет мне открыть его откуда угодно! Я хочу, чтобы только ПК в той же локальной сети, что и сервер, могли получить к нему доступ, но даже мой рабочий ПК с ip 192.168.0.129 не может его открыть.

<Directory "/var/www/html/dev.mysite.com">
        Require local
</Directory>

Замена Require ip на Require local тоже не помогает

<Directory "/var/www/html/dev.mysite.com">
        Require all granted
        Require local
</Directory>

Есть ли что-то не так во всем файле?

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName dev.mysite.com
        ServerAlias www.dev.mysite.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/dev.mysite.com
    <Directory "/var/www/html/dev.mysite.com">
        Require ip 192.168.0.129
    </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
# Некоторые правила перенаправления в этом файле были отключены на вашем HTTPS сайте,
# потому что они могут создать петли перенаправления.

# RewriteCond %{SERVER_NAME} =www.dev.mysite.com [OR]
# RewriteCond %{SERVER_NAME} =dev.mysite.com
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Ответ или решение

Ваша задача состоит в том, чтобы ограничить доступ к веб-сайту, работающему на Apache на сервере Ubuntu, только для клиентов в локальной сети (LAN). Хотя это может показаться простой задачей, вы столкнулись с рядом проблем в конфигурации Apache. Давайте подробно рассмотрим каждую из возможных причин вашей проблемы и способы их устранения.

Теоретическая часть

Apache поддерживает различные директивы для ограничения доступа к ресурсам сервера, такие как Require all granted, Require ip и Require local. Каждая из них работает по-своему:

  1. Require all granted: Эта директива позволяет доступ всем пользователям без исключения. Это эффективно "открывает ворота" для всех запросов.

  2. Require ip: Позволяет ограничивать доступ к ресурсам, принимая только IP-адреса, которые соответствуют заданному шаблону или сетевому диапазону. Например, Require ip 192.168.0.0/24 разрешает доступ только для IP-адресов в диапазоне от 192.168.0.1 до 192.168.0.254.

  3. Require local: Эта директива разрешает доступ только для локальных соединений, обычно таких, которые исходят от сервера (localhost).

Пример настройки

По умолчанию Apache будет последовательно применять все правила в заданном порядке. Например, если сначала указана директива Require all granted, а затем — Require ip, то все запросы будут сначала разрешены первой директивой, и вторая директория будет игнорироваться.

Ваши попытки настройки приводили к тому, что либо доступ был открыт для всех (Require all granted), либо закрыт для всех, включая разрешенные IP (Require ip 192.168.0.0/24). Проблема может заключаться в логической ошибке, которая возникает из-за одновременного использования противоречивых правил.

Применение

  1. Проверка модулей:
    Убедитесь, что модуль mod_authz_core загружен, так как он необходим для использования директив Require. Это можно сделать, используя команду:

    sudo a2enmod authz_core
    sudo systemctl restart apache2
  2. Конфигурация участка <Directory>:
    Внесите изменения в файл /etc/apache2/sites-available/dev.mysite.com-le-ssl.conf:

    <Directory "/var/www/html/dev.mysite.com">
       # Удалите 'Require all granted'
       Require ip 192.168.0.0/24
    </Directory>
  3. Проверка конфигурации VirtualHost:
    Убедитесь, что ваша конфигурация файла .conf обработана правильно:

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
       ServerName dev.mysite.com
       ServerAlias www.dev.mysite.com
       ServerAdmin [email protected]
       DocumentRoot /var/www/html/dev.mysite.com
    
       <Directory "/var/www/html/dev.mysite.com">
           Require ip 192.168.0.0/24
       </Directory>
    
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
    
       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
    </VirtualHost>
    </IfModule>
  4. Проверка доступности:
    Сохраните изменения и перезапустите Apache:

    sudo systemctl restart apache2
  5. Тестирование:
    Проверьте доступ из локальной сети: попробуйте открыть сайт из разных устройств в сети 192.168.0.0/24. Обратите внимание, что кеш браузера иногда сохраняет старые данные доступа, перезагрузите страницу после очистки кеша или используйте другой браузер.

  6. Диагностика логов:
    Если после всех изменений проблема осталась, проверьте журналы ошибок Apache:

    tail -f /var/log/apache2/error.log

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

Также, не забывайте постоянно проверять актуальные сетевые настройки и маршрутизацию, чтобы удостовериться в отсутствии конфликтов и ошибок на уровне сетевой инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...