Перенаправление основного домена Apache2 на субдомен, когда порт используется в основном домене

Все мои перенаправления http> https работают отлично.

Я установил отдельный субдомен и порт для использования с PHPMyAdmin для доступа к базе данных MySQL, поэтому вероятность того, что она будет сканироваться ботами и т. Д., Будет меньше. Примеры ниже предназначены только для демонстрационных целей.

У меня возникла проблема. если я введу порт, используемый в поддомене PHPMyAdmin после основного домена без префикса https, чтобы он стал http://example.com:8080 , после того, что начинается как веб-страница таймаута, она в конечном итоге перенаправляет меня на сайт https, но в субдомене по адресу https://phpmyadmin.example.com:8081 .

Как мне остановить перенаправление основного домена на субдомен, а вместо этого тайм-аут, как на обычном сервере? Если кто-то угадывает каждый порт в основном домене, кто-то в конечном итоге найдет поддомен.

/etc/apache2/sites-enabled/example.com

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    Redirect permanent / https://example.com
    DocumentRoot /var/www/example.com
    # <Directory />
    #     DirectoryIndex index.html index.php
    #     Require all denied
    #     Options FollowSymLinks
    #     AllowOverride All
    # </Directory>
    #ErrorLog ${APACHE_LOG_DIR}/error.log
    #CustomLog ${APACHE_LOG_DIR}/access.log combined    
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/example.com
    # <Directory />
    #     DirectoryIndex index.html index.php
    #     Require all denied
    #     Options FollowSymLinks
    #     AllowOverride All
    # </Directory>
    #ErrorLog ${APACHE_LOG_DIR}/error.log
    #CustomLog ${APACHE_LOG_DIR}/access.log combined
    SSLEngine On
    SSLCertificateFile "/etc/ssl/certs/example.com.crt"
    SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
    SSLCertificateChainFile "/etc/ssl/certs/example.com.ca-bundle"
</VirtualHost>


/etc/apache2/sites-enabled/phpmyadmin.example .com

<VirtualHost *:8080>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    Redirect permanent / https://phpmyadmin.example.com:8081
</VirtualHost>

<VirtualHost *:8081>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    DocumentRoot /usr/share/phpmyadmin
#    RewriteEngine On
#    RewriteCond %{HTTPS} off
#    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    <Directory />
        Require all denied
        Options FollowSymLinks
        AllowOverride All
    </Directory>
    LogLevel notice
    CustomLog /var/log/apache2/access.log combined
    ErrorLog /var/log/apache2/error.log
    Include /etc/phpmyadmin/apache.conf
    SSLEngine On
    SSLCertificateFile "/etc/letsencrypt/live/phpmyadmin.example.com/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/phpmyadmin.example.com/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/phpmyadmin.example.com/chain.pem"
</VirtualHost>

ОБНОВЛЕНИЕ 1

Я думаю, что проблема вообще между переадресацией http на https. Вместо этого вводя HTTP-порт для поддомена в основной домен, VirtualHost Apache видит, что это инициатор для перенаправления http на https, но полностью игнорирует, что домен должен это делать. Есть ли способ изолировать переадресацию http на https в зависимости от префиксов домена?

ОБНОВЛЕНИЕ 2

Существуют ли какие-либо правила / условия перезаписи, которые я мог бы использовать на каждом из виртуальных хостов http, чтобы отвечать только на порт, который он слушает? Мои знания правил перезаписи и т. Д. Отсутствуют, поэтому я полагаюсь на хорошие исследовательские навыки Google, чтобы найти мне сайты для записи. Я наткнулся на это.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^yourdomain\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

ОБНОВЛЕНИЕ 3

Я устранил проблему.

Однако, если мне нужно было получить доступ к URL-адресу примера http://example.com:8080 я получить сообщение об ошибке 403 запрещено

Forbidden

You don't have permission to access this resource.

Как мне заставить Apache отключать соединение по таймауту, а не просто полностью отказываться от него?

Теперь два файла VirtualHost становятся следующими:

/ etc / apache2 / sites-enabled / example. com

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/example.com
    RewriteEngine On
    RewriteCond %{HTTP_HOST} example.com [NC]
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://www.example.com$1 [R,L]
    <Directory />
        DirectoryIndex index.html index.php
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined    
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/example.com
    <Directory />
    DirectoryIndex index.html index.php
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    SSLEngine On
    SSLCertificateFile "/etc/ssl/certs/example.com.crt"
    SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
    SSLCertificateChainFile "/etc/ssl/certs/example.com.ca-bundle"
</VirtualHost>

/etc/apache2/sites-enabled/phpmyadmin.example.com

<VirtualHost *:8080>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    RewriteEngine On
    RewriteCond %{HTTP_HOST} phpmyadmin.example.com [NC]
    RewriteCond %{SERVER_PORT} 8080
    RewriteRule ^(.*)$ https://phpmyadmin.example.com:8081$1 [R,L]
</VirtualHost>

<VirtualHost *:8081>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    DocumentRoot /usr/share/phpmyadmin
    <Directory />
        DirectoryIndex index.html index.php
    </Directory>
    LogLevel notice
    CustomLog /var/log/apache2/access.log combined
    ErrorLog /var/log/apache2/error.log
    Include /etc/phpmyadmin/apache.conf
    SSLEngine On
    SSLCertificateFile "/etc/letsencrypt/live/phpmyadmin.example.com/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/phpmyadmin.example.com/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/phpmyadmin.example.com/chain.pem"
</VirtualHost>
0
задан 25 September 2020 в 13:15
1 ответ

лично я бы предпочел решение, использующее либо брандмауэр, либо переадресацию портов ssh и локальный хост, чтобы безопасно предоставлять службу phpmyadmin доверенным хостам и определенно использовать достойную аутентификацию, а не « безопасность безвестности». Однако, чтобы попытаться ответить на поставленный вопрос...

Поскольку у вас есть только один виртуальный хост на каждом порту, первый определенный становится по умолчанию для запросов к этому порту, независимо от того, какое доменное имя устанавливается в ServerName и ServerAlias.

<VirtualHost *:8080>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>

Это сопоставит любой запрос с *:8080, в том числе:

и перенаправит их на служба на порту 8081.

Чтобы различать запросы, я бы добавил второй VirtualHost на порту 8080, который ловит все остальное (включая http://example.com:8080) и перенаправляет его где-то не существует, что может привести к тайм-ауту.

<VirtualHost *:8080>
    ServerName example.com
    # redirect to somewhere non-existing will cause timeout
    Redirect permanent / https://192.168.99.99/
</VirtualHost>

<VirtualHost *:8080>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>

(обратите внимание, что значение по умолчанию должно стоять первым)

Примечание:

Как остановить перенаправление основного домена на поддомен и вместо тайм-аута, как это сделал бы обычный сервер?

К сожалению, к тому времени, когда apache получает запрос и обрабатывает его, точка, в которой он может определить, направлен ли запрос на http://phpadmin.example.com:8080 или http://example.com:8080, для самого apache уже слишком поздно разорвать начальное соединение и вызвать тайм-аут.

Я обычно использую для этой цели брандмауэр, либо непосредственно в iptables, либо в ufw/firewalld, в зависимости от вашего дистрибутива, чтобы ограничить доступ к порту 8080 только известными доверенными хостами.

Обновление: использование mod_security

Похоже, можно использовать модуль mod_security для имитации тайм-аута: https://serverfault.com/a/401592/47650

что-то вроде этого отправит пакет FIN для разрыва соединения после обработки заголовка запроса...

<VirtualHost *:8080>
  ServerName example.com
  SecRuleEngine On
  SecAction id:1,phase:1,nolog,drop
</VirtualHost>

<VirtualHost *:8080>
    ServerName phpmyadmin.example.com
    ServerAlias phpmyadmin.example.com
    Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>

https://github. com/SpiderLabs/ModSecurity/wiki/Reference-Manual-%28v2.x%29#drop

0
ответ дан 24 September 2020 в 19:30

Теги

Похожие вопросы